117 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			PHP
		
	
	
		
		
			
		
	
	
			117 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			PHP
		
	
	
| 
								 | 
							
								<?php declare(strict_types=1);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * @license Apache 2.0
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								namespace OpenApi\Tests;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								use OpenApi\Context;
							 | 
						||
| 
								 | 
							
								use OpenApi\Generator;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class ContextTest extends OpenApiTestCase
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    public function testDetect()
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        $context = Context::detect();
							 | 
						||
| 
								 | 
							
								        $line = __LINE__ - 1;
							 | 
						||
| 
								 | 
							
								        $this->assertSame('ContextTest', $context->class);
							 | 
						||
| 
								 | 
							
								        $this->assertSame('\OpenApi\Tests\ContextTest', $context->fullyQualifiedName($context->class));
							 | 
						||
| 
								 | 
							
								        $this->assertSame('testDetect', $context->method);
							 | 
						||
| 
								 | 
							
								        $this->assertSame(__FILE__, $context->filename);
							 | 
						||
| 
								 | 
							
								        $this->assertSame($line, $context->line);
							 | 
						||
| 
								 | 
							
								        $this->assertSame('OpenApi\Tests', $context->namespace);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    public function testFullyQualifiedName()
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        $this->assertOpenApiLogEntryContains('Required @OA\PathItem() not found');
							 | 
						||
| 
								 | 
							
								        $openapi = Generator::scan([__DIR__ . '/Fixtures/Customer.php']);
							 | 
						||
| 
								 | 
							
								        $context = $openapi->components->schemas[0]->_context;
							 | 
						||
| 
								 | 
							
								        // resolve with namespace
							 | 
						||
| 
								 | 
							
								        $this->assertSame('\FullyQualified', $context->fullyQualifiedName('\FullyQualified'));
							 | 
						||
| 
								 | 
							
								        $this->assertSame('\OpenApi\Tests\Fixtures\Unqualified', $context->fullyQualifiedName('Unqualified'));
							 | 
						||
| 
								 | 
							
								        $this->assertSame('\OpenApi\Tests\Fixtures\Namespace\Qualified', $context->fullyQualifiedName('Namespace\Qualified'));
							 | 
						||
| 
								 | 
							
								        // respect use statements
							 | 
						||
| 
								 | 
							
								        $this->assertSame('\Exception', $context->fullyQualifiedName('Exception'));
							 | 
						||
| 
								 | 
							
								        $this->assertSame('\OpenApi\Tests\Fixtures\Customer', $context->fullyQualifiedName('Customer'));
							 | 
						||
| 
								 | 
							
								        $this->assertSame('\OpenApi\Logger', $context->fullyQualifiedName('Logger'));
							 | 
						||
| 
								 | 
							
								        $this->assertSame('\OpenApi\Logger', $context->fullyQualifiedName('lOgGeR')); // php has case-insensitive class names :-(
							 | 
						||
| 
								 | 
							
								        $this->assertSame('\OpenApi\Logger', $context->fullyQualifiedName('OpenApiLogger'));
							 | 
						||
| 
								 | 
							
								        $this->assertSame('\OpenApi\Annotations\QualifiedAlias', $context->fullyQualifiedName('OA\QualifiedAlias'));
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    public function testPhpdocContent()
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        $singleLine = new Context(['comment' => <<<END
							 | 
						||
| 
								 | 
							
								    /**
							 | 
						||
| 
								 | 
							
								     * A single line.
							 | 
						||
| 
								 | 
							
								     *
							 | 
						||
| 
								 | 
							
								     * @OA\Get(path="api/test1", @OA\Response(response="200", description="a response"))
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								END
							 | 
						||
| 
								 | 
							
								        ]);
							 | 
						||
| 
								 | 
							
								        $this->assertEquals('A single line.', $singleLine->phpdocContent());
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        $multiline = new Context(['comment' => <<<END
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * A description spread across
							 | 
						||
| 
								 | 
							
								 * multiple lines.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * even blank lines
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @OA\Get(path="api/test1", @OA\Response(response="200", description="a response"))
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								END
							 | 
						||
| 
								 | 
							
								        ]);
							 | 
						||
| 
								 | 
							
								        $this->assertEquals("A description spread across\nmultiple lines.\n\neven blank lines", $multiline->phpdocContent());
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        $escapedLinebreak = new Context(['comment' => <<<END
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * A single line spread across \
							 | 
						||
| 
								 | 
							
								 * multiple lines.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @OA\Get(path="api/test1", @OA\Response(response="200", description="a response"))
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								END
							 | 
						||
| 
								 | 
							
								        ]);
							 | 
						||
| 
								 | 
							
								        $this->assertEquals('A single line spread across multiple lines.', $escapedLinebreak->phpdocContent());
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /**
							 | 
						||
| 
								 | 
							
								     * https://phpdoc.org/docs/latest/guides/docblocks.html.
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    public function testPhpdocSummaryAndDescription()
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        $single = new Context(['comment' => '/** This is a single line DocComment. */']);
							 | 
						||
| 
								 | 
							
								        $this->assertEquals('This is a single line DocComment.', $single->phpdocContent());
							 | 
						||
| 
								 | 
							
								        $multi = new Context(['comment' => "/**\n * This is a multi-line DocComment.\n */"]);
							 | 
						||
| 
								 | 
							
								        $this->assertEquals('This is a multi-line DocComment.', $multi->phpdocContent());
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        $emptyWhiteline = new Context(['comment' => <<<END
							 | 
						||
| 
								 | 
							
								    /**
							 | 
						||
| 
								 | 
							
								     * This is a summary
							 | 
						||
| 
								 | 
							
								     *
							 | 
						||
| 
								 | 
							
								     * This is a description
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								END
							 | 
						||
| 
								 | 
							
								        ]);
							 | 
						||
| 
								 | 
							
								        $this->assertEquals('This is a summary', $emptyWhiteline->phpdocSummary());
							 | 
						||
| 
								 | 
							
								        $periodNewline = new Context(['comment' => <<<END
							 | 
						||
| 
								 | 
							
								     /**
							 | 
						||
| 
								 | 
							
								     * This is a summary.
							 | 
						||
| 
								 | 
							
								     * This is a description
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								END
							 | 
						||
| 
								 | 
							
								        ]);
							 | 
						||
| 
								 | 
							
								        $this->assertEquals('This is a summary.', $periodNewline->phpdocSummary());
							 | 
						||
| 
								 | 
							
								        $multilineSummary = new Context(['comment' => <<<END
							 | 
						||
| 
								 | 
							
								     /**
							 | 
						||
| 
								 | 
							
								     * This is a summary
							 | 
						||
| 
								 | 
							
								     * but this is part of the summary
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								END
							 | 
						||
| 
								 | 
							
								        ]);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								}
							 |