Skip to content

Commit 5091cc6

Browse files
committed
Configure mockclient if mock_response_factory has been set on a scoped client.
This makes it possible to use different mock response factories on different services and also to easily test services that uses http client endpoints. It also generates an extra test service http_client.mock_client.$name that can be used to configure the MockHttpClient instance if you want to inject a different responsefactory.
1 parent fafbbfa commit 5091cc6

File tree

6 files changed

+95
-4
lines changed

6 files changed

+95
-4
lines changed

src/Symfony/Bundle/FrameworkBundle/CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ CHANGELOG
44
6.4
55
---
66

7+
* Add support for setting mock_response_factory per scoped http client
78
* Add `HttpClientAssertionsTrait`
89
* Add `AbstractController::renderBlock()` and `renderBlockView()`
910
* Add native return type to `Translator` and to `Application::reset()`

src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Configuration.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2082,6 +2082,9 @@ private function addHttpClientSection(ArrayNodeDefinition $rootNode, callable $e
20822082
->variableNode('md5')->end()
20832083
->end()
20842084
->end()
2085+
->scalarNode('mock_response_factory')
2086+
->info('The id of the service that should generate mock responses. It should be either an invokable or an iterable.')
2087+
->end()
20852088
->arrayNode('extra')
20862089
->info('Extra options for specific HTTP client')
20872090
->normalizeKeys(false)

src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2543,18 +2543,30 @@ private function registerHttpClientConfiguration(array $config, ContainerBuilder
25432543
$retryOptions = $scopeConfig['retry_failed'] ?? ['enabled' => false];
25442544
unset($scopeConfig['retry_failed']);
25452545

2546+
2547+
$httpClientTransport = new Reference('http_client.transport');
2548+
2549+
if ($responseFactoryId = $scopeConfig['mock_response_factory'] ?? null) {
2550+
2551+
2552+
$container->register('http_client.mock_client.' . $name, MockHttpClient::class)
2553+
->setDecoratedService($httpClientTransport, null, -10) // lower priority than TraceableHttpClient (5)
2554+
->setArguments(
2555+
$responseFactoryId === true ? [] : [new Reference($responseFactoryId)]);
2556+
}
2557+
25462558
if (null === $scope) {
25472559
$baseUri = $scopeConfig['base_uri'];
25482560
unset($scopeConfig['base_uri']);
25492561

25502562
$container->register($name, ScopingHttpClient::class)
25512563
->setFactory([ScopingHttpClient::class, 'forBaseUri'])
2552-
->setArguments([new Reference('http_client.transport'), $baseUri, $scopeConfig])
2564+
->setArguments([$httpClientTransport, $baseUri, $scopeConfig])
25532565
->addTag('http_client.client')
25542566
;
25552567
} else {
25562568
$container->register($name, ScopingHttpClient::class)
2557-
->setArguments([new Reference('http_client.transport'), [$scope => $scopeConfig], $scope])
2569+
->setArguments([$httpClientTransport, [$scope => $scopeConfig], $scope])
25582570
->addTag('http_client.client')
25592571
;
25602572
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
<?php
2+
3+
$container->loadFromExtension('framework', [
4+
'annotations' => false,
5+
'http_method_override' => false,
6+
'handle_all_throwables' => true,
7+
'php_errors' => ['log' => true],
8+
'http_client' => [
9+
'default_options' => null,
10+
'scoped_clients' => [
11+
'notMocked' => [
12+
'base_uri' => 'https://symfony.com'
13+
],
14+
'mocked' => [
15+
'base_uri' => 'https://symfony.com',
16+
'mock_response_factory' => true,
17+
],
18+
]
19+
],
20+
]);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
<?php
2+
3+
$container->loadFromExtension('framework', [
4+
'annotations' => false,
5+
'http_method_override' => false,
6+
'handle_all_throwables' => true,
7+
'php_errors' => ['log' => true],
8+
'http_client' => [
9+
'default_options' => null,
10+
'scoped_clients' => [
11+
'notMocked' => [
12+
'base_uri' => 'https://symfony.com'
13+
],
14+
'mocked' => [
15+
'base_uri' => 'https://symfony.com',
16+
'mock_response_factory' => 'my_response_factory'
17+
],
18+
]
19+
],
20+
]);

src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/FrameworkExtensionTestCase.php

Lines changed: 37 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2096,9 +2096,44 @@ public function testMailerWithSpecificMessageBus()
20962096
$this->assertEquals(new Reference('app.another_bus'), $container->getDefinition('mailer.mailer')->getArgument(1));
20972097
}
20982098

2099-
public function testHttpClientMockResponseFactory()
2099+
public function testHttpClientMockResponseFactoryNoService()
21002100
{
2101-
$container = $this->createContainerFromFile('http_client_mock_response_factory');
2101+
$container = $this->createContainerFromFile('http_client_scoped_mock_response_factory');
2102+
2103+
$notMocked = $container->getDefinition('http_client.mock_client.notMocked');
2104+
2105+
$this->assertNotSame(MockHttpClient::class, $notMocked->getClass());
2106+
2107+
$definition = $container->getDefinition('http_client.mock_client.mocked');
2108+
2109+
$this->assertSame(MockHttpClient::class, $definition->getClass());
2110+
$this->assertCount(0, $definition->getArguments());
2111+
2112+
}
2113+
2114+
public function testHttpClientMockResponseFactoryWithService()
2115+
{
2116+
$container = $this->createContainerFromFile('http_client_scoped_mock_response_factory_service');
2117+
2118+
$notMocked = $container->getDefinition('http_client.mock_client.notMocked');
2119+
2120+
$this->assertNotSame(MockHttpClient::class, $notMocked->getClass());
2121+
2122+
$definition = $container->getDefinition('http_client.mock_client.mocked');
2123+
2124+
$this->assertSame(MockHttpClient::class, $definition->getClass());
2125+
$this->assertCount(1, $definition->getArguments());
2126+
2127+
$argument = $definition->getArgument(0);
2128+
2129+
$this->assertInstanceOf(Reference::class, $argument);
2130+
$this->assertSame('http_client.transport', current($definition->getDecoratedService()));
2131+
$this->assertSame('my_response_factory', (string) $argument);
2132+
}
2133+
2134+
public function testHttpClientScopedMockResponseFactory()
2135+
{
2136+
$container = $this->createContainerFromFile('http_client_scoped_mock_response_factory');
21022137

21032138
$definition = $container->getDefinition('http_client.mock_client');
21042139

0 commit comments

Comments
 (0)