From d7536ce0af29e9c9e2703ea94a91dd0789d06f46 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Samuel=20=C5=A0tancl?= Date: Wed, 20 May 2020 20:34:16 +0200 Subject: [PATCH] CachedTenantResolver --- src/Resolvers/CachedTenantResolver.php | 38 +++++++++++++++++++++++++ tests/CachedResolutionTest.php | 0 tests/CachedTenantResolverTest.php | 39 ++++++++++++++++++++++++++ 3 files changed, 77 insertions(+) create mode 100644 src/Resolvers/CachedTenantResolver.php delete mode 100644 tests/CachedResolutionTest.php create mode 100644 tests/CachedTenantResolverTest.php diff --git a/src/Resolvers/CachedTenantResolver.php b/src/Resolvers/CachedTenantResolver.php new file mode 100644 index 00000000..c09e54d8 --- /dev/null +++ b/src/Resolvers/CachedTenantResolver.php @@ -0,0 +1,38 @@ +cache = $cache; + } + + public function resolve(...$args): Tenant + { + $resolverClass = $args[0]; + $data = $args[1]; + + /** @var TenantResolver $resolver */ + $resolver = app($resolverClass); + $encodedData = json_encode($data); + + if ($this->cache->has($key = "_tenancy_resolver:$resolverClass:$encodedData")) { + return $this->cache->get($key); + } + + $this->cache->put($key, + $resolved = $resolver->resolve(...$data) + ); + + return $resolved; + } +} diff --git a/tests/CachedResolutionTest.php b/tests/CachedResolutionTest.php deleted file mode 100644 index e69de29b..00000000 diff --git a/tests/CachedTenantResolverTest.php b/tests/CachedTenantResolverTest.php new file mode 100644 index 00000000..4a0ea8a8 --- /dev/null +++ b/tests/CachedTenantResolverTest.php @@ -0,0 +1,39 @@ +domains()->create([ + 'domain' => 'acme', + ]); + + $this->assertTrue($tenant->is(app(DomainTenantResolver::class)->resolve('acme'))); + $this->assertTrue($tenant->is(app(CachedTenantResolver::class)->resolve(DomainTenantResolver::class, ['acme']))); + } + + /** @test */ + public function the_underlying_resolver_is_not_touched_when_using_the_cached_resolver() + { + $tenant = Tenant::create(); + $tenant->domains()->create([ + 'domain' => 'acme', + ]); + + $this->assertTrue($tenant->is(app(CachedTenantResolver::class)->resolve(DomainTenantResolver::class, ['acme']))); + + $this->mock(DomainTenantResolver::class, function ($mock) { + return $mock->shouldNotReceive('resolve'); + }); + + $this->assertTrue($tenant->is(app(CachedTenantResolver::class)->resolve(DomainTenantResolver::class, ['acme']))); + } +} \ No newline at end of file