diff --git a/tests/PostgresTest.php b/tests/PostgresTest.php index 1c582d9f..2591257d 100644 --- a/tests/PostgresTest.php +++ b/tests/PostgresTest.php @@ -28,17 +28,54 @@ beforeEach(function () { config(['tenancy.bootstrappers' => [PostgresSingleDatabaseBootstrapper::class]]); config(['database.connections.central' => config('database.connections.pgsql')]); config(['tenancy.models.tenant_key_column' => 'tenant_id']); - config(['tenancy.models.tenant' => Tenant::class]); + config(['tenancy.models.tenant' => $tenantClass = Tenant::class]); config(['tenancy.models.rls' => [ - Post::class, // Primary model (directly belongs to tenant) - ScopedComment::class, // Secondary model (belongs to tenant through a primary model) + $primaryModelClass = Post::class, // Primary model (directly belongs to tenant) + $secondaryModelClass = ScopedComment::class, // Secondary model (belongs to tenant through a primary model) ]]); - // Drop all existing policies - DB::transaction(function () { + $tenantModel = new $tenantClass; + $primaryModel = new $primaryModelClass; + $secondaryModel = new $secondaryModelClass; + + $tenantTable = $tenantModel->getTable(); + + DB::transaction(function () use ($tenantTable, $primaryModel, $secondaryModel) { + // Drop all existing policies foreach (DB::select('select * from pg_policies') as $policy) { DB::statement("DROP POLICY IF EXISTS {$policy->policyname} ON {$policy->tablename}"); } + + // Drop tables of the tenant, primary and secondary model + Schema::dropIfExists('domains'); + DB::statement("DROP TABLE IF EXISTS {$secondaryModel->getTable()} CASCADE"); + DB::statement("DROP TABLE IF EXISTS {$primaryModel->getTable()} CASCADE"); + DB::statement("DROP TABLE IF EXISTS $tenantTable CASCADE"); + + // Manually create tables for the models + Schema::create($tenantTable, function (Blueprint $table) { + $table->string('id')->primary(); + $table->timestamps(); + $table->json('data')->nullable(); + }); + + Schema::create($primaryModel->getTable(), function (Blueprint $table) { + $table->id(); + $table->string('text'); + $table->string($tenantKeyColumn = config('tenancy.models.tenant_key_column')); + + $table->timestamps(); + $table->foreign($tenantKeyColumn)->references(tenancy()->model()->getKeyName())->on(tenancy()->model()->getTable())->onUpdate('cascade')->onDelete('cascade'); + }); + + Schema::create($secondaryModel->getTable(), function (Blueprint $table) use ($primaryModel) { + $table->id(); + $table->string('text'); + $table->unsignedBigInteger($primaryModel->getForeignKey()); + + $table->timestamps(); + $table->foreign($primaryModel->getForeignKey())->references($primaryModel->getKeyName())->on($primaryModel->getTable())->onUpdate('cascade')->onDelete('cascade'); + }); }); });