143 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			PHP
		
	
	
		
		
			
		
	
	
			143 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			PHP
		
	
	
| 
								 | 
							
								<?php declare(strict_types=1);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * @license Apache 2.0
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								namespace OpenApi\Tests\Annotations;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								use OpenApi\Annotations\Get;
							 | 
						||
| 
								 | 
							
								use OpenApi\Annotations\Parameter;
							 | 
						||
| 
								 | 
							
								use OpenApi\Annotations\Schema;
							 | 
						||
| 
								 | 
							
								use OpenApi\Tests\OpenApiTestCase;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class AbstractAnnotationTest extends OpenApiTestCase
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    public function testVendorFields()
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        $annotations = $this->parseComment('@OA\Get(x={"internal-id": 123})');
							 | 
						||
| 
								 | 
							
								        $output = $annotations[0]->jsonSerialize();
							 | 
						||
| 
								 | 
							
								        $prefixedProperty = 'x-internal-id';
							 | 
						||
| 
								 | 
							
								        $this->assertSame(123, $output->$prefixedProperty);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    public function testInvalidField()
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        $this->assertOpenApiLogEntryContains('Unexpected field "doesnot" for @OA\Get(), expecting');
							 | 
						||
| 
								 | 
							
								        $this->parseComment('@OA\Get(doesnot="exist")');
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    public function testUmergedAnnotation()
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        $openapi = $this->createOpenApiWithInfo();
							 | 
						||
| 
								 | 
							
								        $openapi->merge($this->parseComment('@OA\Items()'));
							 | 
						||
| 
								 | 
							
								        $this->assertOpenApiLogEntryContains('Unexpected @OA\Items(), expected to be inside @OA\\');
							 | 
						||
| 
								 | 
							
								        $openapi->validate();
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    public function testConflictedNesting()
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        $comment = <<<END
							 | 
						||
| 
								 | 
							
								@OA\Info(
							 | 
						||
| 
								 | 
							
								    title="Info only has one contact field..",
							 | 
						||
| 
								 | 
							
								    version="test",
							 | 
						||
| 
								 | 
							
								    @OA\Contact(name="first"),
							 | 
						||
| 
								 | 
							
								    @OA\Contact(name="second")
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								END;
							 | 
						||
| 
								 | 
							
								        $annotations = $this->parseComment($comment);
							 | 
						||
| 
								 | 
							
								        $this->assertOpenApiLogEntryContains('Only one @OA\Contact() allowed for @OA\Info() multiple found in:');
							 | 
						||
| 
								 | 
							
								        $annotations[0]->validate();
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    public function testKey()
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        $comment = <<<END
							 | 
						||
| 
								 | 
							
								@OA\Response(
							 | 
						||
| 
								 | 
							
								    @OA\Header(header="X-CSRF-Token",description="Token to prevent Cross Site Request Forgery")
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								END;
							 | 
						||
| 
								 | 
							
								        $annotations = $this->parseComment($comment);
							 | 
						||
| 
								 | 
							
								        $this->assertEquals('{"headers":{"X-CSRF-Token":{"description":"Token to prevent Cross Site Request Forgery"}}}', json_encode($annotations[0]));
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    public function testConflictingKey()
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        $comment = <<<END
							 | 
						||
| 
								 | 
							
								@OA\Response(
							 | 
						||
| 
								 | 
							
								    description="The headers in response must have unique header values",
							 | 
						||
| 
								 | 
							
								    @OA\Header(header="X-CSRF-Token", @OA\Schema(type="string"), description="first"),
							 | 
						||
| 
								 | 
							
								    @OA\Header(header="X-CSRF-Token", @OA\Schema(type="string"), description="second")
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								END;
							 | 
						||
| 
								 | 
							
								        $annotations = $this->parseComment($comment);
							 | 
						||
| 
								 | 
							
								        $this->assertOpenApiLogEntryContains('Multiple @OA\Header() with the same header="X-CSRF-Token":');
							 | 
						||
| 
								 | 
							
								        $annotations[0]->validate();
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    public function testRequiredFields()
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        $annotations = $this->parseComment('@OA\Info()');
							 | 
						||
| 
								 | 
							
								        $info = $annotations[0];
							 | 
						||
| 
								 | 
							
								        $this->assertOpenApiLogEntryContains('Missing required field "title" for @OA\Info() in ');
							 | 
						||
| 
								 | 
							
								        $this->assertOpenApiLogEntryContains('Missing required field "version" for @OA\Info() in ');
							 | 
						||
| 
								 | 
							
								        $info->validate();
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    public function testTypeValidation()
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        $comment = <<<END
							 | 
						||
| 
								 | 
							
								@OA\Parameter(
							 | 
						||
| 
								 | 
							
								    name=123,
							 | 
						||
| 
								 | 
							
								    in="dunno",
							 | 
						||
| 
								 | 
							
								    required="maybe",
							 | 
						||
| 
								 | 
							
								    @OA\Schema(
							 | 
						||
| 
								 | 
							
								      type="strig",
							 | 
						||
| 
								 | 
							
								    )
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								END;
							 | 
						||
| 
								 | 
							
								        $annotations = $this->parseComment($comment);
							 | 
						||
| 
								 | 
							
								        $parameter = $annotations[0];
							 | 
						||
| 
								 | 
							
								        $this->assertOpenApiLogEntryContains('@OA\Parameter(name=123,in="dunno")->name is a "integer", expecting a "string" in ');
							 | 
						||
| 
								 | 
							
								        $this->assertOpenApiLogEntryContains('@OA\Parameter(name=123,in="dunno")->in "dunno" is invalid, expecting "query", "header", "path", "cookie" in ');
							 | 
						||
| 
								 | 
							
								        $this->assertOpenApiLogEntryContains('@OA\Parameter(name=123,in="dunno")->required is a "string", expecting a "boolean" in ');
							 | 
						||
| 
								 | 
							
								//        $this->assertOpenApiLogEntryStartsWith('@OA\Parameter(name=123,in="dunno")->maximum is a "string", expecting a "number" in ');
							 | 
						||
| 
								 | 
							
								//        $this->assertOpenApiLogEntryStartsWith('@OA\Parameter(name=123,in="dunno")->type must be "string", "number", "integer", "boolean", "array", "file" when @OA\Parameter()->in != "body" in ');
							 | 
						||
| 
								 | 
							
								        $parameter->validate();
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    public function nestedMatches()
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        $parameterMatch = (object) ['key' => Parameter::class, 'value' => ['parameters']];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        return [
							 | 
						||
| 
								 | 
							
								            'unknown' => [self::class, null],
							 | 
						||
| 
								 | 
							
								            'simple-match' => [Parameter::class, $parameterMatch],
							 | 
						||
| 
								 | 
							
								            'invalid-annotation' => [Schema::class, null],
							 | 
						||
| 
								 | 
							
								            'sub-annotation' => [SubParameter::class, $parameterMatch],
							 | 
						||
| 
								 | 
							
								            'sub-sub-annotation' => [SubSubParameter::class, $parameterMatch],
							 | 
						||
| 
								 | 
							
								            'sub-invalid' => [SubSchema::class, null],
							 | 
						||
| 
								 | 
							
								        ];
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /**
							 | 
						||
| 
								 | 
							
								     * @dataProvider nestedMatches
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    public function testMatchNested($class, $expected)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        $this->assertEquals($expected, Get::matchNested($class));
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class SubSchema extends Schema
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class SubParameter extends Parameter
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class SubSubParameter extends SubParameter
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								}
							 |