create(); $schema = FormSchema::factory()->create(['organisation_id' => $org->id]); $field = FormField::factory()->create(['form_schema_id' => $schema->id]); $root = FormFieldConditionalLogicGroup::factory()->forField($field)->create(); $child = FormFieldConditionalLogicGroup::factory()->nestedUnder($root, 0)->create(); FormFieldConditionalLogicCondition::factory()->inGroup($root, 0)->create(); FormFieldConditionalLogicCondition::factory()->inGroup($child, 0)->create(); $this->assertSame(2, FormFieldConditionalLogicGroup::query()->count()); $this->assertSame(2, FormFieldConditionalLogicCondition::query()->count()); // Hard delete via raw query bypasses SoftDeletes — exercises the // DB-level `ON DELETE CASCADE` on `form_field_id`. DB::table('form_fields')->where('id', $field->id)->delete(); $this->assertSame(0, FormFieldConditionalLogicGroup::query()->count()); $this->assertSame(0, FormFieldConditionalLogicCondition::query()->count()); } public function test_field_soft_delete_cascades_via_observer(): void { $org = Organisation::factory()->create(); $schema = FormSchema::factory()->create(['organisation_id' => $org->id]); $field = FormField::factory()->create(['form_schema_id' => $schema->id]); $root = FormFieldConditionalLogicGroup::factory()->forField($field)->create(); FormFieldConditionalLogicCondition::factory()->inGroup($root, 0)->create(); $field->delete(); // Soft delete keeps the `form_fields` row (deleted_at set) but the // cascade observer physically clears child rows — conditional-logic // state is current state, not audit. $this->assertNotNull($field->fresh()->deleted_at); $this->assertSame(0, FormFieldConditionalLogicGroup::query()->count()); $this->assertSame(0, FormFieldConditionalLogicCondition::query()->count()); } public function test_parent_group_delete_cascades_to_children_and_conditions(): void { $org = Organisation::factory()->create(); $schema = FormSchema::factory()->create(['organisation_id' => $org->id]); $field = FormField::factory()->create(['form_schema_id' => $schema->id]); $root = FormFieldConditionalLogicGroup::factory()->forField($field)->create(); $child = FormFieldConditionalLogicGroup::factory()->nestedUnder($root, 0)->create(); FormFieldConditionalLogicCondition::factory()->inGroup($root, 0)->create(); FormFieldConditionalLogicCondition::factory()->inGroup($child, 0)->create(); $this->assertSame(2, FormFieldConditionalLogicGroup::query()->count()); $this->assertSame(2, FormFieldConditionalLogicCondition::query()->count()); $root->delete(); $this->assertSame(0, FormFieldConditionalLogicGroup::query()->count()); $this->assertSame(0, FormFieldConditionalLogicCondition::query()->count()); } }