[DatabaseTenancyBootstrapper::class], ]); DatabaseTenancyBootstrapper::$harden = true; Event::listen(TenantCreated::class, JobPipeline::make([CreateDatabase::class])->send(function (TenantCreated $event) { return $event->tenant; })->toListener()); $tenant = Tenant::create(); $tenant->update([ 'tenancy_db_name' => 'main', // Central database name ]); // Harden blocks initialization for tenants that use central database expect(fn () => tenancy()->initialize($tenant))->toThrow(RuntimeException::class); }); test('harden prevents tenants from using a database of another tenant', function () { config([ 'tenancy.bootstrappers' => [DatabaseTenancyBootstrapper::class], ]); DatabaseTenancyBootstrapper::$harden = true; Event::listen(TenantCreated::class, JobPipeline::make([CreateDatabase::class])->send(function (TenantCreated $event) { return $event->tenant; })->toListener()); $tenant = Tenant::create(); Tenant::create([ 'tenancy_db_name' => $tenantDbName = 'foo' . Str::random(8), ]); $tenant->update([ 'tenancy_db_name' => $tenantDbName, // Database of another tenant ]); // Harden blocks initialization for tenants that use a database of another tenant expect(fn () => tenancy()->initialize($tenant))->toThrow(RuntimeException::class); }); test('database tenancy bootstrapper throws an exception if DATABASE_URL is set', function (string|null $databaseUrl) { if ($databaseUrl) { config(['database.connections.central.url' => $databaseUrl]); pest()->expectException(Exception::class); } config(['tenancy.bootstrappers' => [DatabaseTenancyBootstrapper::class]]); $tenant1 = Tenant::create(); pest()->artisan('tenants:migrate'); tenancy()->initialize($tenant1); expect(true)->toBe(true); })->with(['abc.us-east-1.rds.amazonaws.com', null]);