assertFalse( Schema::hasColumn('form_schemas', 'custom_purpose_slug'), 'form_schemas.custom_purpose_slug must be dropped by migration 2026_04_24_100001.', ); } public function test_form_subjects_config_file_is_deleted(): void { $this->assertFileDoesNotExist( base_path('config/form_subjects.php'), 'config/form_subjects.php must be removed in WS-2 (Q6 consolidation).', ); } public function test_form_purpose_enum_has_no_custom_case(): void { foreach (FormPurpose::cases() as $case) { $this->assertNotSame('custom', $case->value); } } public function test_store_endpoint_rejects_custom_purpose_value(): void { $this->seed(RoleSeeder::class); $org = Organisation::factory()->create(); $admin = User::factory()->create(); $org->users()->attach($admin, ['role' => 'org_admin']); $admin->assignRole('org_admin'); setPermissionsTeamId($org->id); Sanctum::actingAs($admin); $this->postJson("/api/v1/organisations/{$org->id}/forms/schemas", [ 'name' => 'X', 'purpose' => 'custom', ])->assertStatus(422); } public function test_schema_response_omits_custom_purpose_slug(): void { $this->seed(RoleSeeder::class); $org = Organisation::factory()->create(); $admin = User::factory()->create(); $org->users()->attach($admin, ['role' => 'org_admin']); $admin->assignRole('org_admin'); setPermissionsTeamId($org->id); Sanctum::actingAs($admin); $schema = FormSchema::factory()->create([ 'organisation_id' => $org->id, 'purpose' => FormPurpose::INCIDENT_REPORT, ]); $response = $this->getJson("/api/v1/organisations/{$org->id}/forms/schemas/{$schema->id}") ->assertOk(); $this->assertArrayNotHasKey('custom_purpose_slug', $response->json('data')); } }