Skip to content

Commit 383887f

Browse files
author
Bastian Schwarz
committed
Added lazy factory that creates the client at build time so we don't need the client until we use it
Signed-off-by: Bastian Schwarz <bastian@repareo.de>
1 parent 484aa7a commit 383887f

2 files changed

Lines changed: 103 additions & 0 deletions

File tree

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
<?php declare(strict_types=1);
2+
3+
namespace de\codenamephp\platform\secretsManager\base\Secret\Proxy\String\Factory;
4+
5+
use Closure;
6+
use de\codenamephp\platform\secretsManager\base\Client\ClientInterface;
7+
use de\codenamephp\platform\secretsManager\base\Secret\Proxy\String\StringProxyInterface;
8+
use de\codenamephp\platform\secretsManager\base\Secret\SecretInterface;
9+
10+
/**
11+
* Wrapper for the WithClientAsClassMemberFactory that uses a callback to create the client lazy instead of passing it in the constructor. This makes it
12+
* possible to only create the client when it is actually needed which is useful when some users never need to use anything that needs the client. So they
13+
* don't even need to install the client library with auth etc.
14+
*/
15+
final class LazyWithClientAsClassMemberFactory implements StringProxyFactoryInterface {
16+
17+
public WithClientAsClassMemberFactory $proxyFactory;
18+
19+
/**
20+
* @param Closure():ClientInterface $clientFactory A closure that returns the client when called. This is used to create the client lazy instead of passing it
21+
*/
22+
public function __construct(
23+
public readonly Closure $clientFactory,
24+
) {}
25+
26+
/**
27+
* @psalm-suppress RedundantPropertyInitializationCheck that's what makes it lazy!
28+
*/
29+
public function getProxyFactory() : WithClientAsClassMemberFactory {
30+
return $this->proxyFactory ??= new WithClientAsClassMemberFactory(($this->clientFactory)());
31+
}
32+
33+
public function build(SecretInterface $secret) : StringProxyInterface {
34+
return $this->getProxyFactory()->build($secret);
35+
}
36+
37+
public function buildMultiple(SecretInterface ...$secrets) : array {
38+
return $this->getProxyFactory()->buildMultiple(...$secrets);
39+
}
40+
}
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
<?php declare(strict_types=1);
2+
3+
namespace de\codenamephp\platform\secretsManager\base\test\Secret\Proxy\String\Factory;
4+
5+
use de\codenamephp\platform\secretsManager\base\Client\ClientInterface;
6+
use de\codenamephp\platform\secretsManager\base\Secret\Proxy\String\Factory\LazyWithClientAsClassMemberFactory;
7+
use de\codenamephp\platform\secretsManager\base\Secret\Proxy\String\WithClientAsClassMember;
8+
use de\codenamephp\platform\secretsManager\base\Secret\SecretInterface;
9+
use PHPUnit\Framework\TestCase;
10+
11+
final class LazyWithClientAsClassMemberFactoryTest extends TestCase {
12+
13+
public function testBuild() : void {
14+
$client = $this->createMock(ClientInterface::class);
15+
$secret = $this->createMock(SecretInterface::class);
16+
17+
$sut = new LazyWithClientAsClassMemberFactory(static fn() => $client);
18+
19+
$proxy = $sut->build($secret);
20+
21+
self::assertInstanceOf(WithClientAsClassMember::class, $proxy);
22+
self::assertSame($client, $proxy->client);
23+
self::assertSame($secret, $proxy->secret);
24+
}
25+
26+
public function test__construct() : void {
27+
$closure = static fn() => null;
28+
29+
$sut = new LazyWithClientAsClassMemberFactory($closure);
30+
31+
self::assertSame($closure, $sut->clientFactory);
32+
}
33+
34+
public function testGetProxyFactory() : void {
35+
$client = $this->createMock(ClientInterface::class);
36+
37+
$sut = new LazyWithClientAsClassMemberFactory(static fn() => $client);
38+
$proxyFactory = $sut->getProxyFactory();
39+
40+
self::assertSame($client, $proxyFactory->client);
41+
self::assertSame($proxyFactory, $sut->getProxyFactory());
42+
}
43+
44+
public function testBuildMultiple() : void {
45+
$client = $this->createMock(ClientInterface::class);
46+
$secret1 = $this->createMock(SecretInterface::class);
47+
$secret2 = $this->createMock(SecretInterface::class);
48+
$secret3 = $this->createMock(SecretInterface::class);
49+
50+
$sut = new LazyWithClientAsClassMemberFactory(static fn() => $client);
51+
52+
$proxies = $sut->buildMultiple($secret1, $secret2, $secret3);
53+
54+
self::assertContainsOnlyInstancesOf(WithClientAsClassMember::class, $proxies);
55+
self::assertCount(3, $proxies);
56+
self::assertSame($client, $proxies[0]->client);
57+
self::assertSame($secret1, $proxies[0]->secret);
58+
self::assertSame($client, $proxies[1]->client);
59+
self::assertSame($secret2, $proxies[1]->secret);
60+
self::assertSame($client, $proxies[2]->client);
61+
self::assertSame($secret3, $proxies[2]->secret);
62+
}
63+
}

0 commit comments

Comments
 (0)