Skip to content

Commit 65320d4

Browse files
Stephan Wentzpl-github
authored andcommitted
feat: Refactor http client mock
BREAKING CHANGE: Request matcher behaviour has changed for headers, queryParams, requestParams and multiparts
1 parent 0d82725 commit 65320d4

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

64 files changed

+4014
-1732
lines changed

README.http-client-trait.md

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,10 @@ To use the mock http client, configure the `MockRequestBuilderCollection` as `mo
77
Example symfony config:
88

99
```yaml
10-
# config/packages/http_client.yaml
10+
# config/packages/mock_request_builder.yaml
1111
when@test:
1212
services:
13-
Brainbits\FunctionalTestHelpers\HttpClientMock\MockRequestBuilderCollection:
14-
arguments:
15-
- '@Brainbits\FunctionalTestHelpers\HttpClientMock\SymfonyMockResponseFactory'
16-
17-
Brainbits\FunctionalTestHelpers\HttpClientMock\SymfonyMockResponseFactory: ~
13+
Brainbits\FunctionalTestHelpers\HttpClientMock\MockRequestBuilderCollection: ~
1814
```
1915
2016
```yaml

TODO.md

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,2 @@
11
- Make firewall context configurable in RequestBuilder
22
- Mark RequestBuilderFactory as Symfony specific
3-
- Remove json()-deprecation from MockRequestBuilder
4-
- Create better fail-description for missing MockRequestCollection in test case
5-
- Make match immutable

UPGRADE-7.0.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
UPGRADE FROM 6.x to 7.0
2+
=======================
3+
4+
HttpClientMock
5+
--------------
6+
7+
* Remove `SymfonyMockResponseFactory` definition and argument from `MockRequestBuilderCollection` in mock_request_builder.yaml.

src/HttpClientMock/CallStack.php

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,13 @@
1515

1616
use const PHP_EOL;
1717

18-
/** @implements IteratorAggregate<MockRequestBuilder> */
18+
/** @implements IteratorAggregate<RealRequest> */
1919
final class CallStack implements Countable, IteratorAggregate
2020
{
21-
/** @var MockRequestBuilder[] */
21+
/** @var RealRequest[] */
2222
private array $calls;
2323

24-
public function __construct(MockRequestBuilder ...$calls)
24+
public function __construct(RealRequest ...$calls)
2525
{
2626
$this->calls = $calls;
2727
}
@@ -33,7 +33,7 @@ public static function fromCallStacks(CallStack ...$callStacks): self
3333
return new self(...$requests);
3434
}
3535

36-
public function first(): MockRequestBuilder|null
36+
public function first(): RealRequest|null
3737
{
3838
if (!count($this->calls)) {
3939
return null;
@@ -52,7 +52,7 @@ public function count(): int
5252
return count($this->calls);
5353
}
5454

55-
/** @return Traversable<MockRequestBuilder>|MockRequestBuilder[] */
55+
/** @return Traversable<RealRequest> */
5656
public function getIterator(): Traversable
5757
{
5858
yield from $this->calls;

src/HttpClientMock/Compare.php

Lines changed: 0 additions & 57 deletions
This file was deleted.

src/HttpClientMock/Exception/NoMatchingMockRequest.php

Lines changed: 97 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,25 +4,114 @@
44

55
namespace Brainbits\FunctionalTestHelpers\HttpClientMock\Exception;
66

7-
use Brainbits\FunctionalTestHelpers\HttpClientMock\MockRequestBuilder;
8-
use Brainbits\FunctionalTestHelpers\HttpClientMock\MockRequestMatch;
7+
use Brainbits\FunctionalTestHelpers\HttpClientMock\Matcher\Hit;
8+
use Brainbits\FunctionalTestHelpers\HttpClientMock\Matcher\MatchResult;
9+
use Brainbits\FunctionalTestHelpers\HttpClientMock\Matcher\Mismatch;
10+
use Brainbits\FunctionalTestHelpers\HttpClientMock\Matcher\Missing;
11+
use Brainbits\FunctionalTestHelpers\HttpClientMock\RealRequest;
912
use RuntimeException;
1013

14+
use function array_map;
15+
use function explode;
16+
use function implode;
1117
use function sprintf;
1218

1319
use const PHP_EOL;
1420

1521
final class NoMatchingMockRequest extends RuntimeException implements HttpClientMockException
1622
{
17-
/** @param MockRequestMatch[] $matches */
18-
public static function fromMockRequest(MockRequestBuilder $request, array $matches): self
23+
public static function noBuilders(RealRequest $request): self
24+
{
25+
$message = sprintf('No mock request builders given for:%s%s%s', PHP_EOL, $request, PHP_EOL);
26+
27+
return new self($message);
28+
}
29+
30+
/** @param MatchResult[] $matchResults */
31+
public static function fromResults(RealRequest $request, array $matchResults): self
1932
{
2033
$message = sprintf('No matching mock request builder found for:%s%s%s', PHP_EOL, $request, PHP_EOL);
34+
$message .= sprintf('%sMock request builders:%s', PHP_EOL, PHP_EOL);
35+
36+
$tick = '';
37+
$cross = '';
38+
39+
foreach ($matchResults as $key => $matchResult) {
40+
$no = $key + 1;
41+
$name = $matchResult->getName();
42+
43+
$message .= sprintf(
44+
'#%s %s%s',
45+
$no,
46+
$name ?? '(unnamed)',
47+
PHP_EOL,
48+
);
49+
50+
foreach ($matchResult->getResults() as $result) {
51+
if ($result instanceof Hit) {
52+
if ($result->key) {
53+
$line = sprintf(
54+
'%s %s %s matches "%s"',
55+
$tick,
56+
$result->matcher,
57+
$result->key,
58+
$result->actual,
59+
);
60+
} else {
61+
$line = sprintf(
62+
'%s %s matches "%s"',
63+
$tick,
64+
$result->matcher,
65+
$result->actual,
66+
);
67+
}
68+
} elseif ($result instanceof Mismatch) {
69+
if ($result->key) {
70+
$line = sprintf(
71+
'%s %s %s "%s" does not match "%s"',
72+
$cross,
73+
$result->matcher,
74+
$result->key,
75+
$result->actual ?? 'NULL',
76+
$result->expected,
77+
);
78+
} else {
79+
$line = sprintf(
80+
'%s %s "%s" does not match "%s"',
81+
$cross,
82+
$result->matcher,
83+
$result->actual ?? 'NULL',
84+
$result->expected,
85+
);
86+
}
87+
} elseif ($result instanceof Missing) {
88+
$line = sprintf(
89+
'%s %s %s missing',
90+
$cross,
91+
$result->matcher,
92+
$result->key,
93+
);
94+
} else {
95+
continue;
96+
}
97+
98+
$message .= sprintf(
99+
' %s (%s)%s',
100+
$line,
101+
$result->score,
102+
PHP_EOL,
103+
);
21104

22-
if ($matches) {
23-
$message .= sprintf('%sReasons:%s', PHP_EOL, PHP_EOL);
24-
foreach ($matches as $match) {
25-
$message .= sprintf('- %s%s', $match->getReason(), PHP_EOL);
105+
if ($result instanceof Mismatch && $result->diff) { // phpcs:ignore
106+
$diff = implode(
107+
PHP_EOL,
108+
array_map(
109+
static fn ($line) => ' ' . $line,
110+
explode(PHP_EOL, $result->diff),
111+
),
112+
);
113+
$message .= $diff . PHP_EOL;
114+
}
26115
}
27116
}
28117

src/HttpClientMock/Exception/NoResponseMock.php

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,15 @@ public static function allResponsesProcessed(): self
2323
return new self('All responses have already been processed');
2424
}
2525

26-
public static function withRequest(self $decorated, MockRequestBuilder $request): self
26+
public static function withRequest(self $decorated, MockRequestBuilder $requestBuilder): self
2727
{
28-
$message = sprintf('%s for:%s%s%s', $decorated->getMessage(), PHP_EOL, $request, PHP_EOL);
28+
$message = sprintf(
29+
'%s for:%s%s%s',
30+
$decorated->getMessage(),
31+
PHP_EOL,
32+
$requestBuilder,
33+
PHP_EOL,
34+
);
2935

3036
return new self($message, $decorated->getCode(), $decorated->getPrevious());
3137
}

src/HttpClientMock/Exception/NoUriConfigured.php

Lines changed: 0 additions & 17 deletions
This file was deleted.
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Brainbits\FunctionalTestHelpers\HttpClientMock\Exception;
6+
7+
use RuntimeException;
8+
9+
use function sprintf;
10+
11+
final class UriContainsQueryParameters extends RuntimeException implements HttpClientMockException
12+
{
13+
public static function fromUri(string $uri): self
14+
{
15+
return new self(sprintf('Given uri %s conts query parameters, use queryParam() calls instead.', $uri));
16+
}
17+
}

0 commit comments

Comments
 (0)