ContextTest.php 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. <?php declare(strict_types=1);
  2. /**
  3. * @license Apache 2.0
  4. */
  5. namespace OpenApiTests;
  6. use OpenApi\Context;
  7. class ContextTest extends OpenApiTestCase
  8. {
  9. public function testDetect()
  10. {
  11. $context = Context::detect();
  12. $line = __LINE__ - 1;
  13. $this->assertSame('ContextTest', $context->class);
  14. $this->assertSame('\OpenApiTests\ContextTest', $context->fullyQualifiedName($context->class));
  15. $this->assertSame('testDetect', $context->method);
  16. $this->assertSame(__FILE__, $context->filename);
  17. $this->assertSame($line, $context->line);
  18. $this->assertSame('OpenApiTests', $context->namespace);
  19. // $this->assertCount(1, $context->uses); // Context::detect() doesn't pick up USE statements (yet)
  20. }
  21. public function testFullyQualifiedName()
  22. {
  23. $this->assertOpenApiLogEntryStartsWith('Required @OA\PathItem() not found');
  24. $openapi = \OpenApi\scan(__DIR__.'/Fixtures/Customer.php');
  25. $context = $openapi->components->schemas[0]->_context;
  26. // resolve with namespace
  27. $this->assertSame('\FullyQualified', $context->fullyQualifiedName('\FullyQualified'));
  28. $this->assertSame('\OpenApiFixures\Unqualified', $context->fullyQualifiedName('Unqualified'));
  29. $this->assertSame('\OpenApiFixures\Namespace\Qualified', $context->fullyQualifiedName('Namespace\Qualified'));
  30. // respect use statements
  31. $this->assertSame('\Exception', $context->fullyQualifiedName('Exception'));
  32. $this->assertSame('\OpenApiFixures\Customer', $context->fullyQualifiedName('Customer'));
  33. $this->assertSame('\OpenApi\Logger', $context->fullyQualifiedName('Logger'));
  34. $this->assertSame('\OpenApi\Logger', $context->fullyQualifiedName('lOgGeR')); // php has case-insensitive class names :-(
  35. $this->assertSame('\OpenApi\Logger', $context->fullyQualifiedName('OpenApiLogger'));
  36. $this->assertSame('\OpenApi\Annotations\QualifiedAlias', $context->fullyQualifiedName('OA\QualifiedAlias'));
  37. }
  38. public function testPhpdocContent()
  39. {
  40. $singleLine = new Context(['comment' => <<<END
  41. /**
  42. * A single line.
  43. *
  44. * @OA\Get(path="api/test1", @OA\Response(response="200", description="a response"))
  45. */
  46. END
  47. ]);
  48. $this->assertEquals('A single line.', $singleLine->phpdocContent());
  49. $multiline = new Context(['comment' => <<<END
  50. /**
  51. * A description spread across
  52. * multiple lines.
  53. *
  54. * even blank lines
  55. *
  56. * @OA\Get(path="api/test1", @OA\Response(response="200", description="a response"))
  57. */
  58. END
  59. ]);
  60. $this->assertEquals("A description spread across\nmultiple lines.\n\neven blank lines", $multiline->phpdocContent());
  61. $escapedLinebreak = new Context(['comment' => <<<END
  62. /**
  63. * A single line spread across \
  64. * multiple lines.
  65. *
  66. * @OA\Get(path="api/test1", @OA\Response(response="200", description="a response"))
  67. */
  68. END
  69. ]);
  70. $this->assertEquals("A single line spread across multiple lines.", $escapedLinebreak->phpdocContent());
  71. }
  72. /**
  73. * https://phpdoc.org/docs/latest/guides/docblocks.html
  74. */
  75. public function testPhpdocSummaryAndDescription()
  76. {
  77. $single = new Context(['comment' => '/** This is a single line DocComment. */']);
  78. $this->assertEquals('This is a single line DocComment.', $single->phpdocContent());
  79. $multi = new Context(['comment' => "/**\n * This is a multi-line DocComment.\n */"]);
  80. $this->assertEquals('This is a multi-line DocComment.', $multi->phpdocContent());
  81. $emptyWhiteline = new Context(['comment' => <<<END
  82. /**
  83. * This is a summary
  84. *
  85. * This is a description
  86. */
  87. END
  88. ]);
  89. $this->assertEquals('This is a summary', $emptyWhiteline->phpdocSummary());
  90. $periodNewline = new Context(['comment' => <<<END
  91. /**
  92. * This is a summary.
  93. * This is a description
  94. */
  95. END
  96. ]);
  97. $this->assertEquals('This is a summary.', $periodNewline->phpdocSummary());
  98. $multilineSummary = new Context(['comment' => <<<END
  99. /**
  100. * This is a summary
  101. * but this is part of the summary
  102. */
  103. END
  104. ]);
  105. }
  106. }