[ MyBootstrapper::class, ]]); $tenant = Tenant::create([ 'id' => 'acme', ]); tenancy()->initialize($tenant); expect(app('tenancy_initialized_for_tenant'))->toBe('acme'); tenancy()->end(); expect(app('tenancy_ended'))->toBe(true); }); test('context is switched when tenancy is reinitialized', function () { config(['tenancy.bootstrappers' => [ MyBootstrapper::class, ]]); $tenant = Tenant::create([ 'id' => 'acme', ]); tenancy()->initialize($tenant); expect(app('tenancy_initialized_for_tenant'))->toBe('acme'); $tenant2 = Tenant::create([ 'id' => 'foobar', ]); tenancy()->initialize($tenant2); expect(app('tenancy_initialized_for_tenant'))->toBe('foobar'); }); test('central helper runs callbacks in the central state', function () { withTenantDatabases(); tenancy()->initialize($tenant = Tenant::create()); tenancy()->central(function () { expect(tenant())->toBe(null); }); expect(tenant())->toBe($tenant); }); test('central helper returns the value from the callback', function () { withTenantDatabases(); tenancy()->initialize(Tenant::create()); pest()->assertSame('foo', tenancy()->central(function () { return 'foo'; })); }); test('central helper reverts back to tenant context', function () { withTenantDatabases(); tenancy()->initialize($tenant = Tenant::create()); tenancy()->central(function () { // }); expect(tenant())->toBe($tenant); }); test('central helper doesnt change tenancy state when called in central context', function () { expect(tenancy()->initialized)->toBeFalse(); expect(tenant())->toBeNull(); tenancy()->central(function () { // }); expect(tenancy()->initialized)->toBeFalse(); expect(tenant())->toBeNull(); }); test('reinitialize method does nothing in the central context', function () { expect(tenancy()->initialized)->toBe(false); expect(fn () => tenancy()->reinitialize())->not()->toThrow(\Throwable::class); expect(tenancy()->initialized)->toBe(false); }); test('reinitialize method runs bootstrappers again for the current tenant', function () { config(['tenancy.bootstrappers' => [ ReinitBootstrapper::class, ]]); tenancy()->initialize($tenant = Tenant::create(['reinit_bootstrapper_key' => 'foo'])); expect(tenant()->getKey())->toBe($tenant->getKey()); expect(app('tenancy_reinit_bootstrapper_key'))->toBe('foo'); $tenant->update(['reinit_bootstrapper_key' => 'bar']); // Unchanged until we reinitialize... expect(app('tenancy_reinit_bootstrapper_key'))->toBe('foo'); tenancy()->reinitialize(); expect(tenant()->getKey())->toBe($tenant->getKey()); expect(app('tenancy_reinit_bootstrapper_key'))->toBe('bar'); }); class MyBootstrapper implements TenancyBootstrapper { public function bootstrap(\Stancl\Tenancy\Contracts\Tenant $tenant): void { app()->instance('tenancy_initialized_for_tenant', $tenant->getTenantKey()); } public function revert(): void { app()->instance('tenancy_ended', true); } } class ReinitBootstrapper implements TenancyBootstrapper { public function bootstrap(\Stancl\Tenancy\Contracts\Tenant $tenant): void { app()->instance('tenancy_reinit_bootstrapper_key', $tenant->getAttribute('reinit_bootstrapper_key')); } public function revert(): void { app()->instance('tenancy_reinit_bootstrapper_key', null); } }