Skip to content

Commit 2594df6

Browse files
Merge pull request #5 from codenamephp/feature/lazyFactory
Lazy factory that builds client only when needed
2 parents 484aa7a + 383887f commit 2594df6

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)