Skip to content

Commit

Permalink
Improve testcoverage and add mock_client boolean parameter.
Browse files Browse the repository at this point in the history
Also: If you mock the default client then this choice becomes the
default for scoped clients
  • Loading branch information
tarjei committed May 10, 2024
1 parent 5fd1b32 commit 8b43395
Show file tree
Hide file tree
Showing 15 changed files with 112 additions and 112 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -1866,8 +1866,12 @@ private function addHttpClientSection(ArrayNodeDefinition $rootNode, callable $e
->append($this->createHttpClientRetrySection())
->end()
->end()
->booleanNode('mock_client')
->info('Inject a mock client.')
->end()
->scalarNode('mock_response_factory')
->info('The id of the service that should generate mock responses. It should be either an invokable or an iterable or a boolean to just inject the mock client.')
->defaultNull()
->info('The id of the service that should generate mock responses. It should be either an invokable or an iterable. Requires mock_client = true')
->end()
->arrayNode('scoped_clients')
->useAttributeAsKey('name')
Expand Down Expand Up @@ -2006,8 +2010,11 @@ private function addHttpClientSection(ArrayNodeDefinition $rootNode, callable $e
->variableNode('md5')->end()
->end()
->end()
->booleanNode('mock_client')
->info('Inject a mock client.')
->end()
->scalarNode('mock_response_factory')
->info('The id of the service that should generate mock responses. It should be either an invokable or an iterable or a boolean to just inject the mock client.')
->info('The id of the service that should generate mock responses. It should be either an invokable or an iterable')
->end()
->arrayNode('extra')
->info('Extra options for specific HTTP client')
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2456,6 +2456,14 @@ private function registerHttpClientConfiguration(array $config, ContainerBuilder
->getDefinition('http_client.uri_template')
->setArgument(2, $defaultUriTemplateVars);

$mockByDefault = $config['mock_client'] ?? false;
$defaultMockResponseFactory = $config['mock_response_factory'] ?? null;
if ($mockByDefault) {
$container->register('http_client.mock_client', MockHttpClient::class)
->setDecoratedService('http_client.transport', null, -10) // lower priority than TraceableHttpClient (5)
->setArguments($defaultMockResponseFactory === null ? [] : [new Reference($defaultMockResponseFactory)]);
}

foreach ($config['scoped_clients'] as $name => $scopeConfig) {
if ($container->has($name)) {
throw new InvalidArgumentException(sprintf('Invalid scope name: "%s" is reserved.', $name));
Expand All @@ -2470,11 +2478,12 @@ private function registerHttpClientConfiguration(array $config, ContainerBuilder

$httpClientTransport = new Reference('http_client.transport');

if ($responseFactoryId = $scopeConfig['mock_response_factory'] ?? null) {
if ($scopeConfig['mock_client'] ?? $mockByDefault) {
$mockResponseFactory = $scopeConfig['mock_response_factory'] ?? $defaultMockResponseFactory;
$mockClientArguments = ($mockResponseFactory) ? [new Reference($mockResponseFactory)]: [];
$container->register('http_client.mock_client.'.$name, MockHttpClient::class)
->setDecoratedService($httpClientTransport, null, -10) // lower priority than TraceableHttpClient (5)
->setArguments(
true === $responseFactoryId ? [] : [new Reference($responseFactoryId)]);
->setArguments($mockClientArguments);
}

if (null === $scope) {
Expand Down Expand Up @@ -2510,6 +2519,7 @@ private function registerHttpClientConfiguration(array $config, ContainerBuilder
$defaultUriTemplateVars,
]);


$container->registerAliasForArgument($name, HttpClientInterface::class);

if ($hasPsr18) {
Expand All @@ -2527,11 +2537,7 @@ private function registerHttpClientConfiguration(array $config, ContainerBuilder
}
}

if ($responseFactoryId = $config['mock_response_factory'] ?? null) {
$container->register('http_client.mock_client', MockHttpClient::class)
->setDecoratedService('http_client.transport', null, -10) // lower priority than TraceableHttpClient (5)
->setArguments(true === $responseFactoryId ? [] : [new Reference($responseFactoryId)]);
}

}

private function registerThrottlingHttpClient(string $rateLimiter, string $name, ContainerBuilder $container): void
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -640,6 +640,7 @@
</xsd:sequence>
<xsd:attribute name="enabled" type="xsd:boolean" />
<xsd:attribute name="max-host-connections" type="xsd:integer" />
<xsd:attribute name="mock-client" type="xsd:boolean" />
<xsd:attribute name="mock-response-factory" type="xsd:string" />
</xsd:complexType>

Expand Down Expand Up @@ -697,7 +698,8 @@
<xsd:attribute name="local-pk" type="xsd:string" />
<xsd:attribute name="passphrase" type="xsd:string" />
<xsd:attribute name="ciphers" type="xsd:string" />
<xsd:attribute name="mock_response_factory" type="xsd:string" />
<xsd:attribute name="mock-client" type="xsd:boolean" />
<xsd:attribute name="mock-response-factory" type="xsd:string" />
<xsd:attribute name="rate-limiter" type="xsd:string" />
</xsd:complexType>

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
<?php
d<?php

$container->loadFromExtension('framework', [
'annotations' => false,
Expand All @@ -7,14 +7,20 @@
'php_errors' => ['log' => true],
'http_client' => [
'default_options' => null,
'mock_client' => true,
'scoped_clients' => [
'notMocked' => [
'base_uri' => 'https://symfony.com'
'base_uri' => 'https://symfony.com',
'mock_client' => false,
],
'mocked' => [
'base_uri' => 'https://symfony.com'
],
'mocked_with_factory' => [
'base_uri' => 'https://symfony.com',
'mock_response_factory' => 'my_response_factory'
],

]
],
]);
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,20 @@
'php_errors' => ['log' => true],
'http_client' => [
'default_options' => null,
'mock_response_factory' => true,
'mock_client' => true,
'mock_response_factory' => 'my_factory',
'scoped_clients' => [
'notMocked' => [
'base_uri' => 'https://symfony.com',
'mock_client' => false,
],
'mocked' => [
'base_uri' => 'https://symfony.com'
],
'mocked_custom_factory' => [
'base_uri' => 'https://symfony.com',
'mock_response_factory' => 'my_other_factory'
]
]
],
]);

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,11 @@
<framework:config http-method-override="false" handle-all-throwables="true">
<framework:annotations enabled="false" />
<framework:php-errors log="true" />
<framework:http-client mock-response-factory="my_response_factory">
<framework:http-client mock-client="true">
<framework:default-options />
<framework:scoped-client name="notMocked" base-uri="https://symfony.com" />
<framework:scoped-client name="mocked" base-uri="https://symfony.com" mock_response_factory="true" />
<framework:scoped-client name="notMocked" base-uri="https://symfony.com" mock-client="false"/>
<framework:scoped-client name="mocked" base-uri="https://symfony.com" />
<framework:scoped-client name="mocked_with_factory" base-uri="https://symfony.com" mock-response-factory="my_response_factory" />
</framework:http-client>
</framework:config>
</container>
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,12 @@
<framework:config http-method-override="false" handle-all-throwables="true">
<framework:annotations enabled="false" />
<framework:php-errors log="true" />
<framework:http-client mock-response-factory="true">
<framework:http-client mock-response-factory="my_factory" mock-client="true">
<framework:default-options />
<framework:scoped-client name="notMocked" base-uri="https://symfony.com" mock-client="false" />
<framework:scoped-client name="mocked" base-uri="https://symfony.com" mock-client="true" />
<framework:scoped-client name="mocked_custom_factory" base-uri="https://symfony.com" mock-client="true" mock-response-factory="my_other_factory" />

</framework:http-client>
</framework:config>
</container>

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
framework:
annotations: false
http_method_override: false
handle_all_throwables: true
php_errors:
log: true
http_client:
default_options: ~
mock_client: true
scoped_clients:
notMocked:
base_uri : https://symfony.com
mock_client : false
mocked:
base_uri: https://symfony.com
mocked_with_factory:
base_uri: https://symfony.com
mock_response_factory: 'my_response_factory'
Original file line number Diff line number Diff line change
Expand Up @@ -6,4 +6,14 @@ framework:
log: true
http_client:
default_options: ~
mock_response_factory: true
mock_client: true
mock_response_factory: 'my_factory'
scoped_clients:
notMocked:
base_uri : https://symfony.com
mock_client : false
mocked:
base_uri: https://symfony.com
mocked_custom_factory:
base_uri: https://symfony.com
mock_response_factory: 'my_other_factory'

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -2095,21 +2095,19 @@ public function testMailerWithSpecificMessageBus()
$this->assertEquals(new Reference('app.another_bus'), $container->getDefinition('mailer.mailer')->getArgument(1));
}

public function testHttpClientMockResponseFactoryNoService()
public function testHttpClientNoMock()
{
$container = $this->createContainerFromFile('http_client_scoped_mock_response_factory');

$this->assertFalse($container->hasDefinition('http_client.mock_client.notMocked'));
$container = $this->createContainerFromFile('http_client_scoped_without_query_option');

$definition = $container->getDefinition('http_client.mock_client.mocked');
$this->assertFalse($container->hasDefinition('http_client.mock_client.foo'));
$this->assertFalse($container->hasDefinition('http_client.mock_client'));

$this->assertSame(MockHttpClient::class, $definition->getClass());
$this->assertCount(0, $definition->getArguments());
}

public function testHttpClientMockResponseFactoryWithService()
public function testHttpClientMockResponseFactory()
{
$container = $this->createContainerFromFile('http_client_scoped_mock_response_factory_service');
$container = $this->createContainerFromFile('http_client_mock_response_factory');

$this->assertFalse($container->hasDefinition('http_client.mock_client.notMocked'));

$definition = $container->getDefinition('http_client.mock_client.mocked');
Expand All @@ -2118,36 +2116,42 @@ public function testHttpClientMockResponseFactoryWithService()
$this->assertCount(1, $definition->getArguments());

$argument = $definition->getArgument(0);

$this->assertInstanceOf(Reference::class, $argument);
$this->assertSame('http_client.transport', current($definition->getDecoratedService()));
$this->assertSame('my_response_factory', (string) $argument);
}
$this->assertSame('my_factory', (string) $argument);

public function testHttpClientMockResponseFactoryService()
{
$container = $this->createContainerFromFile('http_client_mock_response_factory_service');

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

$this->assertSame(MockHttpClient::class, $definition->getClass());
$this->assertCount(1, $definition->getArguments());

$argument = $definition->getArgument(0);

$this->assertInstanceOf(Reference::class, $argument);
$this->assertSame('http_client.transport', current($definition->getDecoratedService()));
$this->assertSame('my_response_factory', (string) $argument);
$this->assertSame('my_other_factory', (string) $argument);
}

public function testHttpClientUseMockResponseFactory()
public function testHttpClientUseMockClientButOverrideInScopedClientsAndEnableFactories()
{
$container = $this->createContainerFromFile('http_client_mock_response_factory');
$container = $this->createContainerFromFile('http_client_mock');

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

$this->assertSame(MockHttpClient::class, $definition->getClass());
$this->assertCount(0, $definition->getArguments());

$this->assertFalse($container->hasDefinition('http_client.mock_client.notMocked'));

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

$this->assertSame(MockHttpClient::class, $definition->getClass());
$this->assertCount(0, $definition->getArguments());

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

$this->assertSame(MockHttpClient::class, $definition->getClass());
$this->assertCount(1, $definition->getArguments());

}

public function testRegisterParameterCollectingBehaviorDescribingTags()
Expand Down

0 comments on commit 8b43395

Please sign in to comment.