Skip to content

Commit 045e811

Browse files
mdpoulterisama92
andcommitted
Merge OData query params at boot time so user overrides take precedence
Closes #2 Co-Authored-By: isama92 <isama92@users.noreply.github.com>
1 parent b998610 commit 045e811

3 files changed

Lines changed: 20 additions & 11 deletions

File tree

src/Concerns/HasODataQuery.php

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44

55
namespace SimpleSquid\SaloonOData\Concerns;
66

7-
use Saloon\Enums\PipeOrder;
87
use Saloon\Http\PendingRequest;
98
use SimpleSquid\SaloonOData\Enums\ODataVersion;
109
use SimpleSquid\SaloonOData\ODataQueryBuilder;
@@ -23,8 +22,10 @@
2322
* applied consistently to all chained calls. (Pre-encoded `filterRaw()`
2423
* fragments are version-baked by the caller.)
2524
*
26-
* Registers a request middleware that merges the builder's rendered params
27-
* into the PendingRequest's query bag immediately before send.
25+
* Merges the builder's rendered params into the PendingRequest's query bag
26+
* at boot time — before Saloon's `MergeRequestProperties` step overlays
27+
* `$request->query()` and `defaultQuery()`. This means user-set query
28+
* params always take precedence over the builder for same-key conflicts.
2829
*/
2930
trait HasODataQuery
3031
{
@@ -77,12 +78,6 @@ public function bootHasODataQuery(PendingRequest $pendingRequest): void
7778
}
7879
}
7980

80-
$pendingRequest->middleware()->onRequest(
81-
static function (PendingRequest $request) use ($builder): void {
82-
$request->query()->merge($builder->toArray());
83-
},
84-
'odata-merge-query',
85-
PipeOrder::LAST,
86-
);
81+
$pendingRequest->query()->merge($builder->toArray());
8782
}
8883
}

tests/Feature/HasODataQueryTraitTest.php

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,20 @@
3434
]);
3535
});
3636

37+
it('lets user query params override OData builder params for the same key', function (): void {
38+
$mock = new MockClient([MockResponse::make([])]);
39+
$connector = new TestConnector;
40+
$connector->withMockClient($mock);
41+
42+
$request = new TestRequest;
43+
$request->odataQuery()->top(10);
44+
$request->query()->add('$top', '5');
45+
46+
$connector->send($request);
47+
48+
expect($mock->getLastPendingRequest()?->query()->get('$top'))->toBe('5');
49+
});
50+
3751
it('does not override params explicitly added by the user', function (): void {
3852
$mock = new MockClient([MockResponse::make([])]);
3953
$connector = new TestConnector;

tests/Feature/SkipMiddlewareTest.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
use SimpleSquid\SaloonOData\Tests\Fixtures\TestConnector;
88
use SimpleSquid\SaloonOData\Tests\Fixtures\TestRequest;
99

10-
it('does not register middleware when no OData params and no attributes apply', function (): void {
10+
it('does not merge query params when no OData params and no attributes apply', function (): void {
1111
$mock = new MockClient([MockResponse::make([])]);
1212
$connector = new TestConnector;
1313
$connector->withMockClient($mock);

0 commit comments

Comments
 (0)