GenerateDocumentationTest.php 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. <?php
  2. namespace Mpociot\ApiDoc\Tests;
  3. use Dingo\Api\Provider\LaravelServiceProvider;
  4. use Illuminate\Contracts\Console\Kernel;
  5. use Illuminate\Routing\Route;
  6. use Mpociot\ApiDoc\ApiDocGeneratorServiceProvider;
  7. use Mpociot\ApiDoc\Generators\LaravelGenerator;
  8. use Mpociot\ApiDoc\Tests\Fixtures\DingoTestController;
  9. use Orchestra\Testbench\TestCase;
  10. use Mpociot\ApiDoc\Tests\Fixtures\TestController;
  11. use Illuminate\Support\Facades\Route as RouteFacade;
  12. class GenerateDocumentationTest extends TestCase
  13. {
  14. /**
  15. * @var \Mpociot\ApiDoc\AbstractGenerator
  16. */
  17. protected $generator;
  18. /**
  19. * Setup the test environment.
  20. */
  21. public function setUp()
  22. {
  23. parent::setUp();
  24. $this->generator = new LaravelGenerator();
  25. }
  26. public function tearDown()
  27. {
  28. exec('rm -rf '.__DIR__.'/../public/docs');
  29. }
  30. /**
  31. * @param \Illuminate\Foundation\Application $app
  32. *
  33. * @return array
  34. */
  35. protected function getPackageProviders($app)
  36. {
  37. return [
  38. LaravelServiceProvider::class,
  39. ApiDocGeneratorServiceProvider::class,
  40. ];
  41. }
  42. public function testConsoleCommandNeedsAPrefixOrRoute()
  43. {
  44. $output = $this->artisan('api:generate');
  45. $this->assertEquals('You must provide either a route prefix or a route or a middleware to generate the documentation.'.PHP_EOL, $output);
  46. }
  47. public function testConsoleCommandDoesNotWorkWithClosure()
  48. {
  49. RouteFacade::get('/api/closure', function () {
  50. return 'foo';
  51. });
  52. RouteFacade::get('/api/test', TestController::class.'@parseMethodDescription');
  53. $output = $this->artisan('api:generate', [
  54. '--routePrefix' => 'api/*',
  55. ]);
  56. $this->assertContains('Skipping route: [GET,HEAD] api/closure', $output);
  57. $this->assertContains('Processed route: [GET,HEAD] api/test', $output);
  58. }
  59. public function testConsoleCommandDoesNotWorkWithClosureUsingDingo()
  60. {
  61. $api = app('Dingo\Api\Routing\Router');
  62. $api->version('v1', function ($api) {
  63. $api->get('/closure', function () {
  64. return 'foo';
  65. });
  66. $api->get('/test', DingoTestController::class.'@parseMethodDescription');
  67. $output = $this->artisan('api:generate', [
  68. '--router' => 'dingo',
  69. '--routePrefix' => 'v1',
  70. ]);
  71. $this->assertContains('Skipping route: [GET,HEAD] closure', $output);
  72. $this->assertContains('Processed route: [GET,HEAD] test', $output);
  73. });
  74. }
  75. public function testCanSkipSingleRoutesCommandDoesNotWorkWithClosure()
  76. {
  77. RouteFacade::get('/api/skip', TestController::class.'@skip');
  78. RouteFacade::get('/api/test', TestController::class.'@parseMethodDescription');
  79. $output = $this->artisan('api:generate', [
  80. '--routePrefix' => 'api/*',
  81. ]);
  82. $this->assertContains('Skipping route: [GET,HEAD] api/skip', $output);
  83. $this->assertContains('Processed route: [GET,HEAD] api/test', $output);
  84. }
  85. public function testGeneratedMarkdownFileIsCorrect()
  86. {
  87. RouteFacade::get('/api/test', TestController::class.'@parseMethodDescription');
  88. RouteFacade::get('/api/fetch', TestController::class.'@fetchRouteResponse');
  89. $output = $this->artisan('api:generate', [
  90. '--routePrefix' => 'api/*',
  91. ]);
  92. $generatedMarkdown = file_get_contents(__DIR__.'/../public/docs/source/index.md');
  93. $compareMarkdown = file_get_contents(__DIR__.'/../public/docs/source/.compare.md');
  94. $fixtureMarkdown = file_get_contents(__DIR__.'/Fixtures/index.md');
  95. $this->assertSame($generatedMarkdown, $fixtureMarkdown);
  96. $this->assertSame($compareMarkdown, $fixtureMarkdown);
  97. }
  98. public function testAddsBindingsToGetRouteRules()
  99. {
  100. RouteFacade::get('/api/test/{foo}', TestController::class.'@addRouteBindingsToRequestClass');
  101. $this->artisan('api:generate', [
  102. '--routePrefix' => 'api/*',
  103. '--bindings' => 'foo,bar',
  104. ]);
  105. $generatedMarkdown = file_get_contents(__DIR__.'/../public/docs/source/index.md');
  106. $this->assertContains('Not in: `bar`', $generatedMarkdown);
  107. }
  108. public function testGeneratedPostmanCollectionFileIsCorrect()
  109. {
  110. RouteFacade::get('/api/test', TestController::class.'@parseMethodDescription');
  111. RouteFacade::post('/api/fetch', TestController::class.'@fetchRouteResponse');
  112. $output = $this->artisan('api:generate', [
  113. '--routePrefix' => 'api/*',
  114. ]);
  115. $generatedCollection = json_decode(file_get_contents(__DIR__.'/../public/docs/collection.json'));
  116. $generatedCollection->info->_postman_id = '';
  117. $fixtureCollection = json_decode(file_get_contents(__DIR__.'/Fixtures/collection.json'));
  118. $this->assertEquals($generatedCollection, $fixtureCollection);
  119. }
  120. public function testCanAppendCustomHttpHeaders()
  121. {
  122. RouteFacade::get('/api/headers', TestController::class.'@checkCustomHeaders');
  123. $output = $this->artisan('api:generate', [
  124. '--routePrefix' => 'api/*',
  125. '--header' => [
  126. 'Authorization: customAuthToken',
  127. 'X-Custom-Header: foobar',
  128. ],
  129. ]);
  130. $generatedMarkdown = file_get_contents(__DIR__.'/../public/docs/source/index.md');
  131. $this->assertContains('"authorization": [
  132. "customAuthToken"
  133. ],
  134. "x-custom-header": [
  135. "foobar"
  136. ]', $generatedMarkdown);
  137. }
  138. /**
  139. * @param string $command
  140. * @param array $parameters
  141. *
  142. * @return mixed
  143. */
  144. public function artisan($command, $parameters = [])
  145. {
  146. $this->app[Kernel::class]->call($command, $parameters);
  147. return $this->app[Kernel::class]->output();
  148. }
  149. }