generator = new LaravelGenerator(); } public function tearDown() { exec('rm -rf '.__DIR__.'/../public/docs'); } /** * @param \Illuminate\Foundation\Application $app * * @return array */ protected function getPackageProviders($app) { return [ApiDocGeneratorServiceProvider::class]; } public function testConsoleCommandNeedsAPrefixOrRoute() { $output = $this->artisan('api:generate'); $this->assertEquals('You must provide either a route prefix or a route to generate the documentation.'.PHP_EOL, $output); } public function testConsoleCommandDoesNotWorkWithClosure() { RouteFacade::get('/api/closure', function () { return 'foo'; }); RouteFacade::get('/api/test', TestController::class.'@parseMethodDescription'); $output = $this->artisan('api:generate', [ '--routePrefix' => 'api/*', ]); $this->assertContains('Skipping route: api/closure', $output); $this->assertContains('Processed route: api/test', $output); } public function testCanSkipSingleRoutesCommandDoesNotWorkWithClosure() { RouteFacade::get('/api/skip', TestController::class.'@skip'); RouteFacade::get('/api/test', TestController::class.'@parseMethodDescription'); $output = $this->artisan('api:generate', [ '--routePrefix' => 'api/*', ]); $this->assertContains('Skipping route: api/skip', $output); $this->assertContains('Processed route: api/test', $output); } public function testGeneratedMarkdownFileIsCorrect() { RouteFacade::get('/api/test', TestController::class.'@parseMethodDescription'); RouteFacade::get('/api/fetch', TestController::class.'@fetchRouteResponse'); $output = $this->artisan('api:generate', [ '--routePrefix' => 'api/*', ]); $generatedMarkdown = file_get_contents(__DIR__.'/../public/docs/source/index.md'); $compareMarkdown = file_get_contents(__DIR__.'/../public/docs/source/.compare.md'); $fixtureMarkdown = file_get_contents(__DIR__.'/Fixtures/index.md'); $this->assertSame($generatedMarkdown, $fixtureMarkdown); $this->assertSame($compareMarkdown, $fixtureMarkdown); } public function testAddsBindingsToGetRouteRules() { RouteFacade::get('/api/test/{foo}', TestController::class.'@addRouteBindingsToRequestClass'); $this->artisan('api:generate', [ '--routePrefix' => 'api/*', '--bindings' => 'foo,bar', ]); $generatedMarkdown = file_get_contents(__DIR__.'/../public/docs/source/index.md'); $this->assertContains('Not in: `bar`', $generatedMarkdown); } public function testGeneratedPostmanCollectionFileIsCorrect() { RouteFacade::get('/api/test', TestController::class.'@parseMethodDescription'); RouteFacade::post('/api/fetch', TestController::class.'@fetchRouteResponse'); $output = $this->artisan('api:generate', [ '--routePrefix' => 'api/*', ]); $generatedCollection = json_decode(file_get_contents(__DIR__.'/../public/docs/collection.json')); $generatedCollection->info->_postman_id = ''; $fixtureCollection = json_decode(file_get_contents(__DIR__.'/Fixtures/collection.json')); $this->assertEquals($generatedCollection, $fixtureCollection); } /** * @param string $command * @param array $parameters * * @return mixed */ public function artisan($command, $parameters = []) { $this->app[Kernel::class]->call($command, $parameters); return $this->app[Kernel::class]->output(); } }