diff --git a/src/Processors/RouteProcessor.php b/src/Processors/RouteProcessor.php index 4fafafe..3876c3a 100644 --- a/src/Processors/RouteProcessor.php +++ b/src/Processors/RouteProcessor.php @@ -84,11 +84,7 @@ protected function processRoute(Route $route) $routeHeaders[] = $this->authentication->toArray(); } - $uri = Str::of($route->uri())->replaceMatches('/{([[:alnum:]]+)}/', ':$1'); - - // if (!$uri->toString()) { - // return []; - // } + $uri = Str::of($route->uri())->replaceMatches('/{([[:alnum:]_]+)}/', ':$1'); if ($this->config['include_doc_comments']) { $description = (new DocBlockProcessor)($reflectionMethod); diff --git a/tests/Feature/ExportPostmanTest.php b/tests/Feature/ExportPostmanTest.php index 603f781..5a7ef38 100644 --- a/tests/Feature/ExportPostmanTest.php +++ b/tests/Feature/ExportPostmanTest.php @@ -2,12 +2,15 @@ namespace AndreasElia\PostmanGenerator\Tests\Feature; +use AndreasElia\PostmanGenerator\Tests\Fixtures\CollectionHelpersTrait; use AndreasElia\PostmanGenerator\Tests\TestCase; use Illuminate\Support\Arr; use Illuminate\Support\Facades\Storage; class ExportPostmanTest extends TestCase { + use CollectionHelpersTrait; + protected function setUp(): void { parent::setUp(); @@ -32,14 +35,25 @@ public function test_standard_export_works(bool $formDataEnabled) $collectionItems = $collection['item']; - $this->assertCount(count($routes), $collectionItems); + $totalCollectionItems = $this->countCollectionItems($collection['item']); + + $this->assertEquals(count($routes), $totalCollectionItems); foreach ($routes as $route) { - $collectionRoute = Arr::first($collectionItems, function ($item) use ($route) { + $methods = $route->methods(); + + $collectionRoutes = Arr::where($collectionItems, function ($item) use ($route) { return $item['name'] == $route->uri(); }); + + $collectionRoute = Arr::first($collectionRoutes); + + if (! in_array($collectionRoute['request']['method'], $methods)) { + $methods = collect($collectionRoutes)->pluck('request.method')->toArray(); + } + $this->assertNotNull($collectionRoute); - $this->assertTrue(in_array($collectionRoute['request']['method'], $route->methods())); + $this->assertTrue(in_array($collectionRoute['request']['method'], $methods)); } } @@ -68,16 +82,25 @@ public function test_bearer_export_works(bool $formDataEnabled) $this->assertCount(2, $collectionVariables); - $collectionItems = $collection['item']; + $totalCollectionItems = $this->countCollectionItems($collection['item']); - $this->assertCount(count($routes), $collectionItems); + $this->assertEquals(count($routes), $totalCollectionItems); foreach ($routes as $route) { - $collectionRoute = Arr::first($collectionItems, function ($item) use ($route) { + $methods = $route->methods(); + + $collectionRoutes = Arr::where($collection['item'], function ($item) use ($route) { return $item['name'] == $route->uri(); }); + + $collectionRoute = Arr::first($collectionRoutes); + + if (! in_array($collectionRoute['request']['method'], $methods)) { + $methods = collect($collectionRoutes)->pluck('request.method')->toArray(); + } + $this->assertNotNull($collectionRoute); - $this->assertTrue(in_array($collectionRoute['request']['method'], $route->methods())); + $this->assertTrue(in_array($collectionRoute['request']['method'], $methods)); } } @@ -106,16 +129,25 @@ public function test_basic_export_works(bool $formDataEnabled) $this->assertCount(2, $collectionVariables); - $collectionItems = $collection['item']; + $totalCollectionItems = $this->countCollectionItems($collection['item']); - $this->assertCount(count($routes), $collectionItems); + $this->assertEquals(count($routes), $totalCollectionItems); foreach ($routes as $route) { - $collectionRoute = Arr::first($collectionItems, function ($item) use ($route) { + $methods = $route->methods(); + + $collectionRoutes = Arr::where($collection['item'], function ($item) use ($route) { return $item['name'] == $route->uri(); }); + + $collectionRoute = Arr::first($collectionRoutes); + + if (! in_array($collectionRoute['request']['method'], $methods)) { + $methods = collect($collectionRoutes)->pluck('request.method')->toArray(); + } + $this->assertNotNull($collectionRoute); - $this->assertTrue(in_array($collectionRoute['request']['method'], $route->methods())); + $this->assertTrue(in_array($collectionRoute['request']['method'], $methods)); } } @@ -135,9 +167,9 @@ public function test_structured_export_works(bool $formDataEnabled) $routes = $this->app['router']->getRoutes(); - $collectionItems = $collection['item']; + $totalCollectionItems = $this->countCollectionItems($collection['item']); - $this->assertCount(count($routes), $collectionItems[0]['item']); + $this->assertEquals(count($routes), $totalCollectionItems); } public function test_rules_printing_export_works() @@ -301,6 +333,51 @@ public function test_uri_is_correct() $this->assertEquals($targetRequest['request']['url']['raw'], '{{base_url}}/example/phpDocRoute'); } + public function test_api_resource_routes_set_parameters_correctly_with_hyphens() + { + $this->artisan('export:postman')->assertExitCode(0); + + $collection = collect(json_decode(Storage::get('postman/'.config('api-postman.filename')), true)['item']); + + $targetRequest = $collection + ->where('name', 'example/users/{user}/audit-logs/{audit_log}') + ->where('request.method', 'PATCH') + ->first(); + + $this->assertEquals($targetRequest['name'], 'example/users/{user}/audit-logs/{audit_log}'); + $this->assertEquals($targetRequest['request']['url']['raw'], '{{base_url}}/example/users/:user/audit-logs/:audit_log'); + } + + public function test_api_resource_routes_set_parameters_correctly_with_underscores() + { + $this->artisan('export:postman')->assertExitCode(0); + + $collection = collect(json_decode(Storage::get('postman/'.config('api-postman.filename')), true)['item']); + + $targetRequest = $collection + ->where('name', 'example/users/{user}/other_logs/{other_log}') + ->where('request.method', 'PATCH') + ->first(); + + $this->assertEquals($targetRequest['name'], 'example/users/{user}/other_logs/{other_log}'); + $this->assertEquals($targetRequest['request']['url']['raw'], '{{base_url}}/example/users/:user/other_logs/:other_log'); + } + + public function test_api_resource_routes_set_parameters_correctly_with_camel_case() + { + $this->artisan('export:postman')->assertExitCode(0); + + $collection = collect(json_decode(Storage::get('postman/'.config('api-postman.filename')), true)['item']); + + $targetRequest = $collection + ->where('name', 'example/users/{user}/someLogs/{someLog}') + ->where('request.method', 'PATCH') + ->first(); + + $this->assertEquals($targetRequest['name'], 'example/users/{user}/someLogs/{someLog}'); + $this->assertEquals($targetRequest['request']['url']['raw'], '{{base_url}}/example/users/:user/someLogs/:someLog'); + } + public static function providerFormDataEnabled(): array { return [ diff --git a/tests/Fixtures/AuditLogController.php b/tests/Fixtures/AuditLogController.php new file mode 100644 index 0000000..bebaa28 --- /dev/null +++ b/tests/Fixtures/AuditLogController.php @@ -0,0 +1,29 @@ +retrieveRoutes($item); + } + + return $sum; + } + + return 1; + } + + private function countCollectionItems(array $collectionItems) + { + $sum = 0; + + foreach ($collectionItems as $item) { + $sum += $this->retrieveRoutes($item); + } + + return $sum; + } +} diff --git a/tests/Fixtures/ExampleModel.php b/tests/Fixtures/ExampleModel.php new file mode 100644 index 0000000..641b5ef --- /dev/null +++ b/tests/Fixtures/ExampleModel.php @@ -0,0 +1,9 @@ +post('storeWithFormRequest', [ExampleController::class, 'storeWithFormRequest'])->name('store-with-form-request'); $router->get('getWithFormRequest', [ExampleController::class, 'getWithFormRequest'])->name('get-with-form-request'); $router->get('phpDocRoute', [ExampleController::class, 'phpDocRoute'])->name('php-doc-route'); + $router->apiResource('users.audit-logs', AuditLogController::class); + $router->apiResource('users.other_logs', AuditLogController::class); + $router->apiResource('users.someLogs', AuditLogController::class); }); } }