. 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 * @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); } }