125 lines
4.1 KiB
PHP
125 lines
4.1 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
use App\Models\OperationRun;
|
|
use App\Models\ProviderConnection;
|
|
use App\Services\Verification\StartVerification;
|
|
use App\Support\OperationRunStatus;
|
|
use App\Support\Verification\PreviousVerificationReportResolver;
|
|
use Filament\Facades\Filament;
|
|
use Illuminate\Support\Facades\Queue;
|
|
|
|
it('resolves the previous report id for the same identity (including provider_connection_id)', function (): void {
|
|
[$user, $tenant] = createUserWithTenant(role: 'operator');
|
|
$this->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);
|
|
});
|
|
|