bind(GraphClientInterface::class, fn () => new class implements GraphClientInterface { public function listPolicies(string $policyType, array $options = []): GraphResponse { return new GraphResponse(true, []); } public function getPolicy(string $policyType, string $policyId, array $options = []): GraphResponse { return new GraphResponse(true, []); } public function getOrganization(array $options = []): GraphResponse { return new GraphResponse(true, ['value' => [['id' => $options['tenant'] ?? 'tenant']]], 200); } public function applyPolicy(string $policyType, string $policyId, array $payload, array $options = []): GraphResponse { return new GraphResponse(true, []); } }); $user = User::factory()->create(); $this->actingAs($user); Livewire::test(CreateTenant::class) ->fillForm([ 'name' => 'Contoso', 'tenant_id' => 'tenant-guid', 'domain' => 'contoso.com', 'app_client_id' => 'client-123', 'app_notes' => 'Test tenant', ]) ->call('create') ->assertHasNoFormErrors(); $tenant = Tenant::first(); expect($tenant)->not->toBeNull(); Livewire::test(ViewTenant::class, ['record' => $tenant->getRouteKey()]) ->callAction('verify'); $tenant->refresh(); expect($tenant->app_status)->toBe('ok'); $this->assertDatabaseHas('audit_logs', [ 'tenant_id' => $tenant->id, 'action' => 'tenant.config.verified', 'status' => 'success', ]); $this->assertDatabaseHas('tenant_permissions', [ 'tenant_id' => $tenant->id, 'status' => 'ok', ]); }); test('verify configuration records error when graph fails', function () { app()->bind(GraphClientInterface::class, fn () => new class implements GraphClientInterface { public function listPolicies(string $policyType, array $options = []): GraphResponse { return new GraphResponse(true, []); } public function getPolicy(string $policyType, string $policyId, array $options = []): GraphResponse { return new GraphResponse(true, []); } public function getOrganization(array $options = []): GraphResponse { return new GraphResponse(false, [], 401, ['auth failed']); } public function applyPolicy(string $policyType, string $policyId, array $payload, array $options = []): GraphResponse { return new GraphResponse(true, []); } }); $user = User::factory()->create(); $this->actingAs($user); $tenant = Tenant::create([ 'tenant_id' => 'tenant-error', 'name' => 'Error Tenant', ]); Livewire::test(ViewTenant::class, ['record' => $tenant->getRouteKey()]) ->callAction('verify'); $tenant->refresh(); expect($tenant->app_status)->toBe('error'); $this->assertDatabaseHas('audit_logs', [ 'tenant_id' => $tenant->id, 'action' => 'tenant.config.verified', 'status' => 'error', ]); $this->assertDatabaseHas('tenant_permissions', [ 'tenant_id' => $tenant->id, 'status' => 'error', ]); }); test('tenant detail shows required permissions with statuses', function () { $user = User::factory()->create(); $this->actingAs($user); $tenant = Tenant::create([ 'tenant_id' => 'tenant-ui', 'name' => 'UI Tenant', ]); $permissions = config('intune_permissions.permissions', []); $firstKey = $permissions[0]['key'] ?? 'DeviceManagementConfiguration.ReadWrite.All'; TenantPermission::create([ 'tenant_id' => $tenant->id, 'permission_key' => $firstKey, 'status' => 'ok', ]); $response = $this->get(route('filament.admin.resources.tenants.view', $tenant)); $response->assertOk(); $response->assertSee($firstKey); $response->assertSee('ok'); $response->assertSee('missing'); });