Skip to content

Commit 977c451

Browse files
authored
Merge pull request #103 from andreaselia/fix/102-route-param
Fix API params issue
2 parents 52b6de0 + f527115 commit 977c451

File tree

6 files changed

+170
-18
lines changed

6 files changed

+170
-18
lines changed

src/Processors/RouteProcessor.php

+1-5
Original file line numberDiff line numberDiff line change
@@ -84,11 +84,7 @@ protected function processRoute(Route $route)
8484
$routeHeaders[] = $this->authentication->toArray();
8585
}
8686

87-
$uri = Str::of($route->uri())->replaceMatches('/{([[:alnum:]]+)}/', ':$1');
88-
89-
// if (!$uri->toString()) {
90-
// return [];
91-
// }
87+
$uri = Str::of($route->uri())->replaceMatches('/{([[:alnum:]_]+)}/', ':$1');
9288

9389
if ($this->config['include_doc_comments']) {
9490
$description = (new DocBlockProcessor)($reflectionMethod);

tests/Feature/ExportPostmanTest.php

+90-13
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,15 @@
22

33
namespace AndreasElia\PostmanGenerator\Tests\Feature;
44

5+
use AndreasElia\PostmanGenerator\Tests\Fixtures\CollectionHelpersTrait;
56
use AndreasElia\PostmanGenerator\Tests\TestCase;
67
use Illuminate\Support\Arr;
78
use Illuminate\Support\Facades\Storage;
89

910
class ExportPostmanTest extends TestCase
1011
{
12+
use CollectionHelpersTrait;
13+
1114
protected function setUp(): void
1215
{
1316
parent::setUp();
@@ -32,14 +35,25 @@ public function test_standard_export_works(bool $formDataEnabled)
3235

3336
$collectionItems = $collection['item'];
3437

35-
$this->assertCount(count($routes), $collectionItems);
38+
$totalCollectionItems = $this->countCollectionItems($collection['item']);
39+
40+
$this->assertEquals(count($routes), $totalCollectionItems);
3641

3742
foreach ($routes as $route) {
38-
$collectionRoute = Arr::first($collectionItems, function ($item) use ($route) {
43+
$methods = $route->methods();
44+
45+
$collectionRoutes = Arr::where($collectionItems, function ($item) use ($route) {
3946
return $item['name'] == $route->uri();
4047
});
48+
49+
$collectionRoute = Arr::first($collectionRoutes);
50+
51+
if (! in_array($collectionRoute['request']['method'], $methods)) {
52+
$methods = collect($collectionRoutes)->pluck('request.method')->toArray();
53+
}
54+
4155
$this->assertNotNull($collectionRoute);
42-
$this->assertTrue(in_array($collectionRoute['request']['method'], $route->methods()));
56+
$this->assertTrue(in_array($collectionRoute['request']['method'], $methods));
4357
}
4458
}
4559

@@ -68,16 +82,25 @@ public function test_bearer_export_works(bool $formDataEnabled)
6882

6983
$this->assertCount(2, $collectionVariables);
7084

71-
$collectionItems = $collection['item'];
85+
$totalCollectionItems = $this->countCollectionItems($collection['item']);
7286

73-
$this->assertCount(count($routes), $collectionItems);
87+
$this->assertEquals(count($routes), $totalCollectionItems);
7488

7589
foreach ($routes as $route) {
76-
$collectionRoute = Arr::first($collectionItems, function ($item) use ($route) {
90+
$methods = $route->methods();
91+
92+
$collectionRoutes = Arr::where($collection['item'], function ($item) use ($route) {
7793
return $item['name'] == $route->uri();
7894
});
95+
96+
$collectionRoute = Arr::first($collectionRoutes);
97+
98+
if (! in_array($collectionRoute['request']['method'], $methods)) {
99+
$methods = collect($collectionRoutes)->pluck('request.method')->toArray();
100+
}
101+
79102
$this->assertNotNull($collectionRoute);
80-
$this->assertTrue(in_array($collectionRoute['request']['method'], $route->methods()));
103+
$this->assertTrue(in_array($collectionRoute['request']['method'], $methods));
81104
}
82105
}
83106

@@ -106,16 +129,25 @@ public function test_basic_export_works(bool $formDataEnabled)
106129

107130
$this->assertCount(2, $collectionVariables);
108131

109-
$collectionItems = $collection['item'];
132+
$totalCollectionItems = $this->countCollectionItems($collection['item']);
110133

111-
$this->assertCount(count($routes), $collectionItems);
134+
$this->assertEquals(count($routes), $totalCollectionItems);
112135

113136
foreach ($routes as $route) {
114-
$collectionRoute = Arr::first($collectionItems, function ($item) use ($route) {
137+
$methods = $route->methods();
138+
139+
$collectionRoutes = Arr::where($collection['item'], function ($item) use ($route) {
115140
return $item['name'] == $route->uri();
116141
});
142+
143+
$collectionRoute = Arr::first($collectionRoutes);
144+
145+
if (! in_array($collectionRoute['request']['method'], $methods)) {
146+
$methods = collect($collectionRoutes)->pluck('request.method')->toArray();
147+
}
148+
117149
$this->assertNotNull($collectionRoute);
118-
$this->assertTrue(in_array($collectionRoute['request']['method'], $route->methods()));
150+
$this->assertTrue(in_array($collectionRoute['request']['method'], $methods));
119151
}
120152
}
121153

@@ -135,9 +167,9 @@ public function test_structured_export_works(bool $formDataEnabled)
135167

136168
$routes = $this->app['router']->getRoutes();
137169

138-
$collectionItems = $collection['item'];
170+
$totalCollectionItems = $this->countCollectionItems($collection['item']);
139171

140-
$this->assertCount(count($routes), $collectionItems[0]['item']);
172+
$this->assertEquals(count($routes), $totalCollectionItems);
141173
}
142174

143175
public function test_rules_printing_export_works()
@@ -301,6 +333,51 @@ public function test_uri_is_correct()
301333
$this->assertEquals($targetRequest['request']['url']['raw'], '{{base_url}}/example/phpDocRoute');
302334
}
303335

336+
public function test_api_resource_routes_set_parameters_correctly_with_hyphens()
337+
{
338+
$this->artisan('export:postman')->assertExitCode(0);
339+
340+
$collection = collect(json_decode(Storage::get('postman/'.config('api-postman.filename')), true)['item']);
341+
342+
$targetRequest = $collection
343+
->where('name', 'example/users/{user}/audit-logs/{audit_log}')
344+
->where('request.method', 'PATCH')
345+
->first();
346+
347+
$this->assertEquals($targetRequest['name'], 'example/users/{user}/audit-logs/{audit_log}');
348+
$this->assertEquals($targetRequest['request']['url']['raw'], '{{base_url}}/example/users/:user/audit-logs/:audit_log');
349+
}
350+
351+
public function test_api_resource_routes_set_parameters_correctly_with_underscores()
352+
{
353+
$this->artisan('export:postman')->assertExitCode(0);
354+
355+
$collection = collect(json_decode(Storage::get('postman/'.config('api-postman.filename')), true)['item']);
356+
357+
$targetRequest = $collection
358+
->where('name', 'example/users/{user}/other_logs/{other_log}')
359+
->where('request.method', 'PATCH')
360+
->first();
361+
362+
$this->assertEquals($targetRequest['name'], 'example/users/{user}/other_logs/{other_log}');
363+
$this->assertEquals($targetRequest['request']['url']['raw'], '{{base_url}}/example/users/:user/other_logs/:other_log');
364+
}
365+
366+
public function test_api_resource_routes_set_parameters_correctly_with_camel_case()
367+
{
368+
$this->artisan('export:postman')->assertExitCode(0);
369+
370+
$collection = collect(json_decode(Storage::get('postman/'.config('api-postman.filename')), true)['item']);
371+
372+
$targetRequest = $collection
373+
->where('name', 'example/users/{user}/someLogs/{someLog}')
374+
->where('request.method', 'PATCH')
375+
->first();
376+
377+
$this->assertEquals($targetRequest['name'], 'example/users/{user}/someLogs/{someLog}');
378+
$this->assertEquals($targetRequest['request']['url']['raw'], '{{base_url}}/example/users/:user/someLogs/:someLog');
379+
}
380+
304381
public static function providerFormDataEnabled(): array
305382
{
306383
return [

tests/Fixtures/AuditLogController.php

+29
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
<?php
2+
3+
namespace AndreasElia\PostmanGenerator\Tests\Fixtures;
4+
5+
use Illuminate\Http\Request;
6+
use Illuminate\Routing\Controller;
7+
8+
class AuditLogController extends Controller
9+
{
10+
public function index()
11+
{
12+
}
13+
14+
public function store(Request $request)
15+
{
16+
}
17+
18+
public function show($id)
19+
{
20+
}
21+
22+
public function update(Request $request, ExampleModel $auditLog)
23+
{
24+
}
25+
26+
public function destroy($id)
27+
{
28+
}
29+
}
+37
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
<?php
2+
3+
namespace AndreasElia\PostmanGenerator\Tests\Fixtures;
4+
5+
trait CollectionHelpersTrait
6+
{
7+
private function retrieveRoutes(array $route)
8+
{
9+
// Skip patch routes
10+
if (isset($route['request']['method']) && $route['request']['method'] === 'PATCH') {
11+
return 0;
12+
}
13+
14+
if (isset($route['item'])) {
15+
$sum = 0;
16+
17+
foreach ($route['item'] as $item) {
18+
$sum += $this->retrieveRoutes($item);
19+
}
20+
21+
return $sum;
22+
}
23+
24+
return 1;
25+
}
26+
27+
private function countCollectionItems(array $collectionItems)
28+
{
29+
$sum = 0;
30+
31+
foreach ($collectionItems as $item) {
32+
$sum += $this->retrieveRoutes($item);
33+
}
34+
35+
return $sum;
36+
}
37+
}

tests/Fixtures/ExampleModel.php

+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
<?php
2+
3+
namespace AndreasElia\PostmanGenerator\Tests\Fixtures;
4+
5+
use Illuminate\Database\Eloquent\Model;
6+
7+
class ExampleModel extends Model
8+
{
9+
}

tests/TestCase.php

+4
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
namespace AndreasElia\PostmanGenerator\Tests;
44

5+
use AndreasElia\PostmanGenerator\Tests\Fixtures\AuditLogController;
56
use AndreasElia\PostmanGenerator\Tests\Fixtures\ExampleController;
67

78
class TestCase extends \Orchestra\Testbench\TestCase
@@ -22,6 +23,9 @@ protected function defineRoutes($router)
2223
$router->post('storeWithFormRequest', [ExampleController::class, 'storeWithFormRequest'])->name('store-with-form-request');
2324
$router->get('getWithFormRequest', [ExampleController::class, 'getWithFormRequest'])->name('get-with-form-request');
2425
$router->get('phpDocRoute', [ExampleController::class, 'phpDocRoute'])->name('php-doc-route');
26+
$router->apiResource('users.audit-logs', AuditLogController::class);
27+
$router->apiResource('users.other_logs', AuditLogController::class);
28+
$router->apiResource('users.someLogs', AuditLogController::class);
2529
});
2630
}
2731
}

0 commit comments

Comments
 (0)