AutorÃa | Ultima modificación | Ver Log |
<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
namespace core\router\schema\parameters;
use core\param;
use core\router\route;
use core\router\schema\referenced_object;
use core\router\schema\specification;
use core\tests\router\route_testcase;
use invalid_parameter_exception;
use Psr\Http\Message\ServerRequestInterface;
use Slim\Routing\RouteContext;
/**
* Tests for the path parameter.
*
* @package core
* @copyright Andrew Lyons <andrew@nicols.co.uk>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
* @covers \core\router\schema\parameter
* @covers \core\router\schema\parameters\path_parameter
* @covers \core\router\schema\openapi_base
*/
final class path_parameter_test extends route_testcase {
public function test_in_path(): void {
$param = new path_parameter(name: 'example');
$this->assertEquals('path', $param->get_in());
$this->assertEquals('example', $param->get_name());
}
/**
* Test the is_required method.
*
* @dataProvider is_required_provider
* @param string $path
* @param bool $expected
*/
public function test_is_required(string $path, bool $expected): void {
$route = new route(
path: $path,
);
$param = new path_parameter(name: 'value');
$this->assertEquals($expected, $param->is_required($route));
}
/**
* Data provider for the is_required method.
*
* @return array
*/
public static function is_required_provider(): array {
return [
['/is/not/found', false],
['/is/not/found/{values}', false],
['/is/not/found/{values:.*}', false],
['/is/not/found/{values:.*?}', false],
['/is/required/{value}', true],
['/is/required/{value:.*}', true],
['/is/required/{value:.*?}/example', true],
['/is/optional/[{value}]', false],
['/is/[optional/[{value}]]', false],
['/is/[optional/[{value:.*}]]', false],
['/is/[optional/[{value:.*?}/example]]', false],
['/is/required/{value}[/example]', true],
];
}
/**
* Test fo the OPenAPI description in different configurations.
*
* @dataProvider openapi_required_values_provider
* @param string $path If the a value is a required part of the path
* @param bool $required If the value is expected to be required
*/
public function test_get_openapi_description_required_values(
string $path,
bool $required,
): void {
$param = new path_parameter(
name: 'value',
type: param::INT,
);
$api = new specification();
$result = $param->get_openapi_description($api, $path);
if ($required) {
$this->assertNotNull($result);
$this->assertTrue($result->required);
$this->assertEquals('value', $result->name);
} else {
$this->assertNull($result);
}
}
/**
* Data provider for OpenAPI Required values.
*
* @return array
*/
public static function openapi_required_values_provider(): array {
return [
['/is/required/{value}/with/children', true],
['/is/required/{value}', true],
['/is/optional', false],
];
}
/**
* Ensure that a validation failure results in an invalid_parameter_exception.
*/
public function test_validation_failure(): void {
$param = new path_parameter(
name: 'example',
type: param::INT,
);
$value = "example";
$request = $this->create_route(
'/example/{example}',
"/example/{$value}",
);
$route = $request->getAttribute(RouteContext::ROUTE);
$this->expectException(invalid_parameter_exception::class);
$param->validate($request, $route);
}
public function test_validation_success(): void {
$param = new path_parameter(
name: 'example',
type: param::INT,
);
$value = 12345;
$request = $this->create_route(
'/example/{example}',
"/example/{$value}",
);
$route = $request->getAttribute(RouteContext::ROUTE);
$validatedresult = $param->validate($request, $route);
$this->assertInstanceOf(ServerRequestInterface::class, $validatedresult);
}
public function test_referenced_object(): void {
$object = new class (
name: 'example',
type: param::INT,
) extends path_parameter implements referenced_object {
};
$schema = $object->get_openapi_description(new specification());
$this->assertObjectNotHasProperty('$ref', $schema);
$this->assertObjectHasProperty('schema', $schema);
$reference = $object->get_openapi_schema(new specification());
$this->assertObjectNotHasProperty('schema', $reference);
$this->assertObjectHasProperty('$ref', $reference);
}
}