seed(RolePermissionSeeder::class); $admin = User::factory()->create(['is_active' => true]); $admin->assignRole('admin'); $response = $this->actingAs($admin)->getJson('/api/settings')->assertOk(); $items = collect($response->json())->flatten(1); $this->assertTrue($items->contains('key', 'company_name')); $this->assertFalse($items->contains('key', 'two_factor_enabled')); $this->assertFalse($items->contains(fn (array $setting) => ! $setting['is_runtime_enforced'])); $this->assertCount(collect(SettingsCatalog::definitions())->where('is_runtime_enforced', true)->count(), $items); $this->assertFalse($items->firstWhere('key', 'voip_provider')['allowed_values'] === ['mock', 'ami', 'api', 'socket']); } public function test_saved_security_settings_change_runtime_password_validation(): void { $this->seed(RolePermissionSeeder::class); $admin = User::factory()->create(['is_active' => true]); $admin->assignRole('admin'); $this->actingAs($admin)->putJson('/api/settings', ['settings' => [ ['key' => 'password_min_length', 'value' => '12', 'group' => 'security', 'type' => 'integer'], ['key' => 'password_require_numbers', 'value' => 'true', 'group' => 'security', 'type' => 'boolean'], ]])->assertOk(); $this->assertDatabaseHas('settings', ['key' => 'password_min_length', 'value' => '12']); $this->assertTrue(Validator::make(['password' => 'longpassword'], ['password' => PasswordPolicy::rules()])->fails()); $this->assertFalse(Validator::make(['password' => 'longpassword1'], ['password' => PasswordPolicy::rules()])->fails()); } public function test_production_voip_does_not_report_a_fake_success_when_unconfigured(): void { Setting::updateOrCreate(['key' => 'voip_provider'], ['value' => 'none', 'group' => 'voip', 'type' => 'string']); $result = (new DisabledProvider)->testConnection(); $this->assertFalse($result['ok']); $this->assertStringContainsString('پیکربندی نشده', $result['message']); } public function test_every_exposed_setting_declares_its_runtime_consumer(): void { $definitions = collect(SettingsCatalog::definitions())->where('is_runtime_enforced', true); $this->assertNotEmpty($definitions); $this->assertEmpty($definitions->filter(fn (array $setting) => empty($setting['used_by']))->all()); } }