requests[] = ['getPolicy', $policyType, $policyId]; return new GraphResponse(true, ['payload' => [ 'id' => $policyId, 'displayName' => 'Settings Catalog Alpha', '@odata.type' => '#microsoft.graph.deviceManagementConfigurationPolicy', ]]); } public function getOrganization(array $options = []): GraphResponse { return new GraphResponse(true, []); } public function applyPolicy(string $policyType, string $policyId, array $payload, array $options = []): GraphResponse { return new GraphResponse(true, []); } public function getServicePrincipalPermissions(array $options = []): GraphResponse { return new GraphResponse(true, []); } public function request(string $method, string $path, array $options = []): GraphResponse { $this->requests[] = [$method, $path]; if (str_contains($path, '/settings')) { return new GraphResponse(true, [ 'value' => [ ['displayName' => 'Setting A', 'value' => 'on'], ['displayName' => 'Setting B', 'value' => 'off'], ], ]); } return new GraphResponse(true, []); } } test('settings catalog snapshot hydrates configuration settings and renders in policy detail', function () { $client = new SettingsCatalogHydrationGraphClient; app()->instance(GraphClientInterface::class, $client); $tenant = Tenant::create([ 'tenant_id' => 'tenant-hydration', 'name' => 'Tenant One', 'metadata' => [], 'is_current' => true, ]); putenv('INTUNE_TENANT_ID='.$tenant->tenant_id); $_ENV['INTUNE_TENANT_ID'] = $tenant->tenant_id; $_SERVER['INTUNE_TENANT_ID'] = $tenant->tenant_id; $tenant->makeCurrent(); $policy = Policy::create([ 'tenant_id' => $tenant->id, 'external_id' => 'scp-hydrate', 'policy_type' => 'settingsCatalogPolicy', 'display_name' => 'Settings Catalog Alpha', 'platform' => 'windows', ]); /** @var BackupService $backupService */ $backupService = app(BackupService::class); $backupSet = $backupService->createBackupSet($tenant, [$policy->id], actorEmail: 'tester@example.com'); $item = $backupSet->items()->first(); expect($item->payload)->toHaveKey('settings'); expect(count($item->payload['settings']))->toBe(2); /** @var VersionService $versions */ $versions = app(VersionService::class); $versions->captureVersion( policy: $policy, payload: $item->payload, createdBy: 'tester@example.com', metadata: ['source' => 'test', 'backup_set_id' => $backupSet->id], ); $user = User::factory()->create(); $response = $this ->actingAs($user) ->get(route('filament.admin.resources.policies.view', ['record' => $policy])); $response->assertOk(); $response->assertSee('Setting A'); $response->assertSee('on'); $response->assertSee('Settings'); }); test('settings catalog version capture hydrates settings from graph', function () { $client = new SettingsCatalogHydrationGraphClient; app()->instance(GraphClientInterface::class, $client); $tenant = Tenant::create([ 'tenant_id' => 'tenant-hydration-version', 'name' => 'Tenant One', 'metadata' => [], 'is_current' => true, ]); putenv('INTUNE_TENANT_ID='.$tenant->tenant_id); $_ENV['INTUNE_TENANT_ID'] = $tenant->tenant_id; $_SERVER['INTUNE_TENANT_ID'] = $tenant->tenant_id; $tenant->makeCurrent(); $policy = Policy::create([ 'tenant_id' => $tenant->id, 'external_id' => 'scp-version', 'policy_type' => 'settingsCatalogPolicy', 'display_name' => 'Settings Catalog Beta', 'platform' => 'windows', ]); /** @var VersionService $versions */ $versions = app(VersionService::class); $versions->captureFromGraph($tenant, $policy, createdBy: 'tester@example.com'); $user = User::factory()->create(); $response = $this ->actingAs($user) ->get(route('filament.admin.resources.policies.view', ['record' => $policy])); $response->assertOk(); $response->assertSee('Setting A'); $response->assertSee('Setting B'); });