Skip to content

Commit 5b65016

Browse files
Fix setOperationId called in an operation transformer not working (#872)
* make sure not to override operation id set via `setOperationId` api * Fix styling --------- Co-authored-by: romalytvynenko <[email protected]>
1 parent e9ee147 commit 5b65016

File tree

2 files changed

+31
-0
lines changed

2 files changed

+31
-0
lines changed

src/Generator.php

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -295,10 +295,18 @@ private function setUniqueOperationId(OpenApi $openApi)
295295
$names = new UniqueNamesOptionsCollection;
296296

297297
$this->foreachOperation($openApi, function (Operation $operation) use ($names) {
298+
if ($operation->operationId) {
299+
return;
300+
}
301+
298302
$names->push($operation->getAttribute('operationId')); // @phpstan-ignore argument.type
299303
});
300304

301305
$this->foreachOperation($openApi, function (Operation $operation, $index) use ($names) {
306+
if ($operation->operationId) {
307+
return;
308+
}
309+
302310
$name = $operation->getAttribute('operationId');
303311

304312
$operation->setOperationId($names->getUniqueName($name, function (string $fallback) use ($index) { // @phpstan-ignore argument.type

tests/Generator/Operation/OperationIdTest.php

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
<?php
22

3+
namespace Dedoc\Scramble\Tests\Generator\Request;
4+
35
use Dedoc\Scramble\Scramble;
6+
use Dedoc\Scramble\Support\Generator\Operation;
7+
use Dedoc\Scramble\Support\RouteInfo;
8+
use Illuminate\Routing\Controller;
49
use Illuminate\Routing\Route;
510
use Illuminate\Support\Facades\Route as RouteFacade;
611

@@ -86,3 +91,21 @@ public function a(): Illuminate\Http\Resources\Json\JsonResource
8691
return $this->unknown_fn();
8792
}
8893
}
94+
95+
it('documents operation id with manual extension', function () {
96+
Scramble::configure()->withOperationTransformers(function (Operation $operation, RouteInfo $routeInfo): void {
97+
$operation->setOperationId('extensionOperationIdDocumentationTest');
98+
});
99+
100+
$openApiDocument = generateForRoute(function () {
101+
return RouteFacade::get('api/test', [ExtensionOperationIdDocumentationTestController::class, 'a']);
102+
});
103+
104+
expect($openApiDocument['paths']['/test']['get'])
105+
->toHaveKey('operationId', 'extensionOperationIdDocumentationTest');
106+
});
107+
108+
class ExtensionOperationIdDocumentationTestController extends Controller
109+
{
110+
public function a() {}
111+
}

0 commit comments

Comments
 (0)