actingAs($user); $tenant->makeCurrent(); Filament::setTenant($tenant, true); $connectionId = (int) ProviderConnection::factory()->create([ 'tenant_id' => (int) $tenant->getKey(), ])->getKey(); $previous = OperationRun::factory()->create([ 'tenant_id' => (int) $tenant->getKey(), 'workspace_id' => (int) $tenant->workspace_id, 'type' => 'provider.connection.check', 'status' => OperationRunStatus::Completed->value, 'run_identity_hash' => 'same-hash', 'context' => [ 'provider_connection_id' => $connectionId, ], ]); $current = OperationRun::factory()->create([ 'tenant_id' => (int) $tenant->getKey(), 'workspace_id' => (int) $tenant->workspace_id, 'type' => 'provider.connection.check', 'status' => OperationRunStatus::Completed->value, 'run_identity_hash' => 'same-hash', 'context' => [ 'provider_connection_id' => $connectionId, ], ]); expect(PreviousVerificationReportResolver::resolvePreviousReportId($current)) ->toBe((int) $previous->getKey()); }); it('does not resolve previous report ids across provider connections', function (): void { [$user, $tenant] = createUserWithTenant(role: 'operator'); $this->actingAs($user); $tenant->makeCurrent(); Filament::setTenant($tenant, true); $connectionA = (int) ProviderConnection::factory()->create(['tenant_id' => (int) $tenant->getKey()])->getKey(); $connectionB = (int) ProviderConnection::factory()->create(['tenant_id' => (int) $tenant->getKey()])->getKey(); OperationRun::factory()->create([ 'tenant_id' => (int) $tenant->getKey(), 'workspace_id' => (int) $tenant->workspace_id, 'type' => 'provider.connection.check', 'status' => OperationRunStatus::Completed->value, 'run_identity_hash' => 'same-hash', 'context' => [ 'provider_connection_id' => $connectionA, ], ]); $current = OperationRun::factory()->create([ 'tenant_id' => (int) $tenant->getKey(), 'workspace_id' => (int) $tenant->workspace_id, 'type' => 'provider.connection.check', 'status' => OperationRunStatus::Completed->value, 'run_identity_hash' => 'same-hash', 'context' => [ 'provider_connection_id' => $connectionB, ], ]); expect(PreviousVerificationReportResolver::resolvePreviousReportId($current)) ->toBeNull(); }); it('includes provider_connection_id in the verification run identity hash (no cross-connection dedupe)', function (): void { Queue::fake(); [$user, $tenant] = createUserWithTenant(role: 'operator'); $this->actingAs($user); $tenant->makeCurrent(); Filament::setTenant($tenant, true); $connectionA = ProviderConnection::factory()->create([ 'tenant_id' => $tenant->getKey(), 'provider' => 'microsoft', 'entra_tenant_id' => fake()->uuid(), ]); $connectionB = ProviderConnection::factory()->create([ 'tenant_id' => $tenant->getKey(), 'provider' => 'microsoft', 'entra_tenant_id' => fake()->uuid(), ]); $starter = app(StartVerification::class); $runA = $starter->providerConnectionCheck( tenant: $tenant, connection: $connectionA, initiator: $user, )->run->refresh(); $runB = $starter->providerConnectionCheck( tenant: $tenant, connection: $connectionB, initiator: $user, )->run->refresh(); expect($runA->getKey())->not->toBe($runB->getKey()); expect($runA->run_identity_hash)->not->toBe($runB->run_identity_hash); });