GeneratorPluginSystemTestCase.php 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235
  1. <?php
  2. namespace Mpociot\ApiDoc\Tests\Unit;
  3. use Illuminate\Routing\Route;
  4. use Mpociot\ApiDoc\ApiDocGeneratorServiceProvider;
  5. use Mpociot\ApiDoc\Extracting\Generator;
  6. use Mpociot\ApiDoc\Extracting\Strategies\Strategy;
  7. use Mpociot\ApiDoc\Tests\Fixtures\TestController;
  8. use Mpociot\ApiDoc\Tools\DocumentationConfig;
  9. use ReflectionClass;
  10. use ReflectionMethod;
  11. class GeneratorPluginSystemTestCase extends LaravelGeneratorTest
  12. {
  13. /**
  14. * @var \Mpociot\ApiDoc\Extracting\Generator
  15. */
  16. protected $generator;
  17. protected function getPackageProviders($app)
  18. {
  19. return [
  20. ApiDocGeneratorServiceProvider::class,
  21. ];
  22. }
  23. /** @test */
  24. public function only_specified_strategies_are_loaded()
  25. {
  26. $config = [
  27. 'strategies' => [
  28. 'metadata' => [EmptyStrategy1::class],
  29. 'bodyParameters' => [
  30. EmptyStrategy1::class,
  31. EmptyStrategy2::class,
  32. ],
  33. 'responses' => [EmptyStrategy1::class],
  34. ],
  35. ];
  36. $route = $this->createRoute('GET', '/api/test', 'dummy', true, TestController::class);
  37. $generator = new Generator(new DocumentationConfig($config));
  38. $generator->processRoute($route);
  39. // Probably not the best way to do this, but 🤷‍♂️
  40. $this->assertTrue(EmptyStrategy1::$called['metadata']);
  41. $this->assertTrue(EmptyStrategy1::$called['bodyParameters']);
  42. $this->assertTrue(EmptyStrategy2::$called['bodyParameters']);
  43. $this->assertArrayNotHasKey('queryParameters', EmptyStrategy1::$called);
  44. $this->assertTrue(EmptyStrategy1::$called['responses']);
  45. }
  46. /** @test */
  47. public function combines_responses_from_different_strategies()
  48. {
  49. $config = [
  50. 'strategies' => [
  51. 'responses' => [DummyResponseStrategy200::class, DummyResponseStrategy400::class],
  52. ],
  53. ];
  54. $route = $this->createRoute('GET', '/api/test', 'dummy', true, TestController::class);
  55. $generator = new Generator(new DocumentationConfig($config));
  56. $parsed = $generator->processRoute($route);
  57. $this->assertTrue($parsed['showresponse']);
  58. $this->assertCount(2, $parsed['responses']);
  59. $first = array_shift($parsed['responses']);
  60. $this->assertTrue(is_array($first));
  61. $this->assertEquals(200, $first['status']);
  62. $this->assertEquals('dummy', $first['content']);
  63. $second = array_shift($parsed['responses']);
  64. $this->assertTrue(is_array($second));
  65. $this->assertEquals(400, $second['status']);
  66. $this->assertEquals('dummy2', $second['content']);
  67. }
  68. // This is a generalized test, as opposed to the one above for responses only
  69. /** @test */
  70. public function combines_results_from_different_strategies_in_same_stage()
  71. {
  72. $config = [
  73. 'strategies' => [
  74. 'metadata' => [PartialDummyMetadataStrategy1::class, PartialDummyMetadataStrategy2::class],
  75. ],
  76. ];
  77. $route = $this->createRoute('GET', '/api/test', 'dummy', true, TestController::class);
  78. $generator = new Generator(new DocumentationConfig($config));
  79. $parsed = $generator->processRoute($route);
  80. $expectedMetadata = [
  81. 'groupName' => 'dummy',
  82. 'groupDescription' => 'dummy',
  83. 'title' => 'dummy',
  84. 'description' => 'dummy',
  85. 'authenticated' => false,
  86. ];
  87. $this->assertArraySubset($expectedMetadata, $parsed['metadata']);
  88. }
  89. /** @test */
  90. public function missing_metadata_is_filled_in()
  91. {
  92. $config = [
  93. 'strategies' => [
  94. 'metadata' => [PartialDummyMetadataStrategy2::class],
  95. ],
  96. ];
  97. $route = $this->createRoute('GET', '/api/test', 'dummy', true, TestController::class);
  98. $generator = new Generator(new DocumentationConfig($config));
  99. $parsed = $generator->processRoute($route);
  100. $expectedMetadata = [
  101. 'groupName' => '',
  102. 'groupDescription' => 'dummy',
  103. 'title' => '',
  104. 'description' => 'dummy',
  105. 'authenticated' => false,
  106. ];
  107. $this->assertArraySubset($expectedMetadata, $parsed['metadata']);
  108. }
  109. /** @test */
  110. public function overwrites_metadat_from_previous_strategies_in_same_stage()
  111. {
  112. $config = [
  113. 'strategies' => [
  114. 'metadata' => [NotDummyMetadataStrategy::class, PartialDummyMetadataStrategy1::class],
  115. ],
  116. ];
  117. $route = $this->createRoute('GET', '/api/test', 'dummy', true, TestController::class);
  118. $generator = new Generator(new DocumentationConfig($config));
  119. $parsed = $generator->processRoute($route);
  120. $expectedMetadata = [
  121. 'groupName' => 'dummy',
  122. 'groupDescription' => 'notdummy',
  123. 'title' => 'dummy',
  124. 'description' => 'dummy',
  125. 'authenticated' => false,
  126. ];
  127. $this->assertArraySubset($expectedMetadata, $parsed['metadata']);
  128. }
  129. public function dataResources()
  130. {
  131. return [
  132. [
  133. null,
  134. '{"data":{"id":1,"description":"Welcome on this test versions","name":"TestName"}}',
  135. ],
  136. [
  137. 'League\Fractal\Serializer\JsonApiSerializer',
  138. '{"data":{"type":null,"id":"1","attributes":{"description":"Welcome on this test versions","name":"TestName"}}}',
  139. ],
  140. ];
  141. }
  142. }
  143. class EmptyStrategy1 extends Strategy
  144. {
  145. public static $called = [];
  146. public function __invoke(Route $route, ReflectionClass $controller, ReflectionMethod $method, array $routeRules, array $context = [])
  147. {
  148. static::$called[$this->stage] = true;
  149. }
  150. }
  151. class EmptyStrategy2 extends Strategy
  152. {
  153. public static $called = [];
  154. public function __invoke(Route $route, ReflectionClass $controller, ReflectionMethod $method, array $routeRules, array $context = [])
  155. {
  156. static::$called[$this->stage] = true;
  157. }
  158. }
  159. class NotDummyMetadataStrategy extends Strategy
  160. {
  161. public function __invoke(Route $route, ReflectionClass $controller, ReflectionMethod $method, array $routeRules, array $context = [])
  162. {
  163. return [
  164. 'groupName' => 'notdummy',
  165. 'groupDescription' => 'notdummy',
  166. 'title' => 'notdummy',
  167. 'description' => 'notdummy',
  168. 'authenticated' => true,
  169. ];
  170. }
  171. }
  172. class PartialDummyMetadataStrategy1 extends Strategy
  173. {
  174. public function __invoke(Route $route, ReflectionClass $controller, ReflectionMethod $method, array $routeRules, array $context = [])
  175. {
  176. return [
  177. 'groupName' => 'dummy',
  178. 'title' => 'dummy',
  179. 'description' => 'dummy',
  180. 'authenticated' => false,
  181. ];
  182. }
  183. }
  184. class PartialDummyMetadataStrategy2 extends Strategy
  185. {
  186. public function __invoke(Route $route, ReflectionClass $controller, ReflectionMethod $method, array $routeRules, array $context = [])
  187. {
  188. return [
  189. 'description' => 'dummy',
  190. 'groupDescription' => 'dummy',
  191. ];
  192. }
  193. }
  194. class DummyResponseStrategy200 extends Strategy
  195. {
  196. public function __invoke(Route $route, ReflectionClass $controller, ReflectionMethod $method, array $routeRules, array $context = [])
  197. {
  198. return [['status' => 200, 'content' => 'dummy']];
  199. }
  200. }
  201. class DummyResponseStrategy400 extends Strategy
  202. {
  203. public function __invoke(Route $route, ReflectionClass $controller, ReflectionMethod $method, array $routeRules, array $context = [])
  204. {
  205. return [['status' => 400, 'content' => 'dummy2']];
  206. }
  207. }