Skip to content

Commit

Permalink
Merge pull request #103 from andreaselia/fix/102-route-param
Browse files Browse the repository at this point in the history
Fix API params issue
  • Loading branch information
tomirons committed May 9, 2024
2 parents 52b6de0 + f527115 commit 977c451
Show file tree
Hide file tree
Showing 6 changed files with 170 additions and 18 deletions.
6 changes: 1 addition & 5 deletions src/Processors/RouteProcessor.php
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
103 changes: 90 additions & 13 deletions tests/Feature/ExportPostmanTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand All @@ -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));
}
}

Expand Down Expand Up @@ -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));
}
}

Expand Down Expand Up @@ -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));
}
}

Expand All @@ -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()
Expand Down Expand Up @@ -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 [
Expand Down
29 changes: 29 additions & 0 deletions tests/Fixtures/AuditLogController.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
<?php

namespace AndreasElia\PostmanGenerator\Tests\Fixtures;

use Illuminate\Http\Request;
use Illuminate\Routing\Controller;

class AuditLogController extends Controller
{
public function index()
{
}

public function store(Request $request)
{
}

public function show($id)
{
}

public function update(Request $request, ExampleModel $auditLog)
{
}

public function destroy($id)
{
}
}
37 changes: 37 additions & 0 deletions tests/Fixtures/CollectionHelpersTrait.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
<?php

namespace AndreasElia\PostmanGenerator\Tests\Fixtures;

trait CollectionHelpersTrait
{
private function retrieveRoutes(array $route)
{
// Skip patch routes
if (isset($route['request']['method']) && $route['request']['method'] === 'PATCH') {
return 0;
}

if (isset($route['item'])) {
$sum = 0;

foreach ($route['item'] as $item) {
$sum += $this->retrieveRoutes($item);
}

return $sum;
}

return 1;
}

private function countCollectionItems(array $collectionItems)
{
$sum = 0;

foreach ($collectionItems as $item) {
$sum += $this->retrieveRoutes($item);
}

return $sum;
}
}
9 changes: 9 additions & 0 deletions tests/Fixtures/ExampleModel.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
<?php

namespace AndreasElia\PostmanGenerator\Tests\Fixtures;

use Illuminate\Database\Eloquent\Model;

class ExampleModel extends Model
{
}
4 changes: 4 additions & 0 deletions tests/TestCase.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

namespace AndreasElia\PostmanGenerator\Tests;

use AndreasElia\PostmanGenerator\Tests\Fixtures\AuditLogController;
use AndreasElia\PostmanGenerator\Tests\Fixtures\ExampleController;

class TestCase extends \Orchestra\Testbench\TestCase
Expand All @@ -22,6 +23,9 @@ protected function defineRoutes($router)
$router->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);
});
}
}

0 comments on commit 977c451

Please sign in to comment.