diff --git a/src/Database/Concerns/InvalidatesResolverCache.php b/src/Database/Concerns/InvalidatesResolverCache.php index 7dff35ad..2da00e52 100644 --- a/src/Database/Concerns/InvalidatesResolverCache.php +++ b/src/Database/Concerns/InvalidatesResolverCache.php @@ -18,13 +18,16 @@ trait InvalidatesResolverCache public static function bootInvalidatesResolverCache() { - static::saved(function (Tenant $tenant) { + $invalidateCache = static function (Tenant $tenant) { foreach (static::$resolvers as $resolver) { /** @var CachedTenantResolver $resolver */ $resolver = app($resolver); $resolver->invalidateCache($tenant); } - }); + }; + + static::saved($invalidateCache); + static::deleting($invalidateCache); } } diff --git a/src/Database/Concerns/InvalidatesTenantsResolverCache.php b/src/Database/Concerns/InvalidatesTenantsResolverCache.php index 555aceeb..4101faa7 100644 --- a/src/Database/Concerns/InvalidatesTenantsResolverCache.php +++ b/src/Database/Concerns/InvalidatesTenantsResolverCache.php @@ -21,13 +21,16 @@ trait InvalidatesTenantsResolverCache public static function bootInvalidatesTenantsResolverCache() { - static::saved(function (Model $model) { + $invalidateCache = static function (Model $model) { foreach (static::$resolvers as $resolver) { /** @var CachedTenantResolver $resolver */ $resolver = app($resolver); $resolver->invalidateCache($model->tenant); } - }); + }; + + static::saved($invalidateCache); + static::deleting($invalidateCache); } } diff --git a/tests/CachedTenantResolverTest.php b/tests/CachedTenantResolverTest.php index e7eb52d3..940c950f 100644 --- a/tests/CachedTenantResolverTest.php +++ b/tests/CachedTenantResolverTest.php @@ -5,6 +5,7 @@ declare(strict_types=1); namespace Stancl\Tenancy\Tests; use Illuminate\Support\Facades\DB; +use Stancl\Tenancy\Exceptions\TenantCouldNotBeIdentifiedOnDomainException; use Stancl\Tenancy\Resolvers\DomainTenantResolver; use Stancl\Tenancy\Tests\Etc\Tenant; @@ -80,6 +81,33 @@ class CachedTenantResolverTest extends TestCase $this->assertNotEmpty(DB::getQueryLog()); // not empty } + /** @test */ + public function cache_is_invalidated_when_the_tenant_is_deleted() + { + $tenant = Tenant::create(); + $tenant->createDomain([ + 'domain' => 'acme', + ]); + + DB::enableQueryLog(); + + DomainTenantResolver::$shouldCache = true; + + $this->assertTrue($tenant->is(app(DomainTenantResolver::class)->resolve('acme'))); + DB::flushQueryLog(); + $this->assertTrue($tenant->is(app(DomainTenantResolver::class)->resolve('acme'))); + $this->assertEmpty(DB::getQueryLog()); // empty + + $tenant->delete(); + DB::flushQueryLog(); + + $this->assertThrows(function () { + app(DomainTenantResolver::class)->resolve('acme'); + }, TenantCouldNotBeIdentifiedOnDomainException::class); + + $this->assertNotEmpty(DB::getQueryLog()); // not empty - cache cleared so the DB was queried + } + /** @test */ public function cache_is_invalidated_when_a_tenants_domain_is_changed() { @@ -109,4 +137,31 @@ class CachedTenantResolverTest extends TestCase $this->assertTrue($tenant->is(app(DomainTenantResolver::class)->resolve('bar'))); $this->assertNotEmpty(DB::getQueryLog()); // not empty } + + /** @test */ + public function cache_is_invalidated_when_a_tenants_domain_is_deleted() + { + $tenant = Tenant::create(); + $tenant->createDomain([ + 'domain' => 'acme', + ]); + + DB::enableQueryLog(); + + DomainTenantResolver::$shouldCache = true; + + $this->assertTrue($tenant->is(app(DomainTenantResolver::class)->resolve('acme'))); + DB::flushQueryLog(); + $this->assertTrue($tenant->is(app(DomainTenantResolver::class)->resolve('acme'))); + $this->assertEmpty(DB::getQueryLog()); // empty + + $tenant->domains->first()->delete(); + DB::flushQueryLog(); + + $this->assertThrows(function () { + app(DomainTenantResolver::class)->resolve('acme'); + }, TenantCouldNotBeIdentifiedOnDomainException::class); + + $this->assertNotEmpty(DB::getQueryLog()); // not empty - cache cleared so the DB was queried + } }