requests[] = ['getPolicy', $policyType, $policyId, $options]; return new GraphResponse(success: true, data: [ 'payload' => [ 'id' => $policyId, 'displayName' => 'Compliance Alpha', '@odata.type' => '#microsoft.graph.windows10CompliancePolicy', ], ]); } public function getOrganization(array $options = []): GraphResponse { return new GraphResponse(success: true, data: []); } public function applyPolicy(string $policyType, string $policyId, array $payload, array $options = []): GraphResponse { return new GraphResponse(success: true, data: []); } public function getServicePrincipalPermissions(array $options = []): GraphResponse { return new GraphResponse(success: true, data: []); } public function request(string $method, string $path, array $options = []): GraphResponse { $this->requests[] = [$method, $path]; if (str_contains($path, 'scheduledActionsForRule')) { return new GraphResponse(success: true, data: [ 'value' => [ [ 'ruleName' => 'Default rule', 'scheduledActionConfigurations' => [ [ 'actionType' => 'notification', 'notificationTemplateId' => 'template-123', ], ], ], ], ]); } return new GraphResponse(success: true, data: []); } } it('hydrates compliance policy scheduled actions into snapshots', function () { $client = new PolicySnapshotGraphClient; app()->instance(GraphClientInterface::class, $client); $tenant = Tenant::factory()->create([ 'tenant_id' => 'tenant-compliance', 'app_client_id' => 'client-123', 'app_client_secret' => 'secret-123', 'is_current' => true, ]); $tenant->makeCurrent(); $policy = Policy::factory()->create([ 'tenant_id' => $tenant->id, 'external_id' => 'compliance-123', 'policy_type' => 'deviceCompliancePolicy', 'display_name' => 'Compliance Alpha', 'platform' => 'windows', ]); $service = app(PolicySnapshotService::class); $result = $service->fetch($tenant, $policy); expect($result)->toHaveKey('payload'); expect($result['payload'])->toHaveKey('scheduledActionsForRule'); expect($result['payload']['scheduledActionsForRule'])->toHaveCount(1); expect($result['payload']['scheduledActionsForRule'][0]['scheduledActionConfigurations'][0]['notificationTemplateId']) ->toBe('template-123'); expect($result['metadata']['compliance_actions_hydration'])->toBe('complete'); expect($client->requests[0][0])->toBe('getPolicy'); expect($client->requests[0][1])->toBe('deviceCompliancePolicy'); expect($client->requests[0][2])->toBe('compliance-123'); expect($client->requests[0][3]['expand'] ?? [])->toBe(['scheduledActionsForRule']); });