artisan('migrate:rollback', ['--step' => 12])->assertSuccessful(); $this->assertTrue(Schema::hasColumn('form_fields', 'validation_rules')); $fieldId = $this->seedField([ 'field_type' => 'TAG_PICKER', 'validation_rules' => [ 'tag_categories' => ['Veiligheid', 'Horeca'], 'storage_disk' => 's3', ], ]); $this->artisan('migrate')->assertSuccessful(); $rows = DB::table('form_field_configs') ->where('owner_id', $fieldId) ->get()->keyBy('config_type'); $this->assertTrue($rows->has('tag_categories')); $this->assertSame( ['Veiligheid', 'Horeca'], json_decode((string) $rows['tag_categories']->parameters, true)['categories'], ); $this->assertTrue($rows->has('storage_disk')); $this->assertSame( 's3', json_decode((string) $rows['storage_disk']->parameters, true)['disk'], ); } public function test_validation_rules_json_columns_are_dropped_after_migrations(): void { // Default state after RefreshDatabase: full migration applied. $this->assertFalse(Schema::hasColumn('form_fields', 'validation_rules')); $this->assertFalse(Schema::hasColumn('form_field_library', 'validation_rules')); } public function test_cascade_observer_cleans_up_configs_on_owner_delete(): void { // Integration-level: confirms the renamed cascade observer covers // the configs table too. $org = Organisation::factory()->create(); $schema = FormSchema::factory()->create(['organisation_id' => $org->id]); $field = \App\Models\FormBuilder\FormField::factory()->create(['form_schema_id' => $schema->id]); \App\Models\FormBuilder\FormFieldConfig::factory()->forField($field)->create(); $this->assertSame(1, \App\Models\FormBuilder\FormFieldConfig::query() ->withoutGlobalScopes() ->where('owner_id', $field->id) ->count()); $field->delete(); $this->assertSame(0, \App\Models\FormBuilder\FormFieldConfig::query() ->withoutGlobalScopes() ->where('owner_id', $field->id) ->count()); } /** @param array $attrs */ private function seedField(array $attrs): string { $org = Organisation::factory()->create(); $schema = FormSchema::factory()->create(['organisation_id' => $org->id]); $id = (string) Str::ulid(); DB::table('form_fields')->insert([[ 'id' => $id, 'form_schema_id' => $schema->id, 'field_type' => $attrs['field_type'], 'slug' => 'f-'.Str::lower(Str::random(4)), 'label' => 'field', 'validation_rules' => json_encode($attrs['validation_rules']), 'value_storage_hint' => 'json', 'sort_order' => 0, 'created_at' => now(), 'updated_at' => now(), ]]); return $id; } }