create([ 'tenant_id' => (int) $tenant->getKey(), 'workspace_id' => (int) $tenant->workspace_id, 'type' => 'inventory_sync', 'status' => 'completed', 'outcome' => 'failed', 'context' => [ 'inventory' => [ 'coverage' => InventoryCoveragePayload::buildPayload([ 'deviceConfiguration' => [ 'status' => InventoryCoveragePayload::StatusFailed, 'item_count' => 0, 'error_code' => 'graph_forbidden', ], ], []), ], ], 'completed_at' => now(), ]); } it('shows the basis run and tenant-scoped history path on the coverage report for authorized viewers', function (): void { $tenant = Tenant::factory()->create(); [$user, $tenant] = createUserWithTenant(tenant: $tenant, role: 'owner'); $run = seedCoverageBasisRun($tenant); $historyUrl = route('admin.operations.index', [ 'tenant_id' => (int) $tenant->getKey(), 'tableFilters' => [ 'type' => [ 'value' => 'inventory_sync', ], ], ]); $this->actingAs($user) ->get(InventoryCoverage::getUrl(tenant: $tenant)) ->assertOk() ->assertSee('Latest coverage-bearing sync completed') ->assertSee('Open basis run') ->assertSee(route('admin.operations.view', ['run' => (int) $run->getKey()]), false) ->assertSee($historyUrl, false) ->assertSee('Review the cited inventory sync to inspect provider or permission issues in detail.'); }); it('degrades basis-run links safely for viewers who cannot open inventory-sync runs', function (): void { $tenant = Tenant::factory()->create(); [$user, $tenant] = createUserWithTenant(tenant: $tenant, role: 'readonly'); seedCoverageBasisRun($tenant); $this->actingAs($user) ->get(InventoryCoverage::getUrl(tenant: $tenant)) ->assertOk() ->assertSee('The coverage basis is current, but your role cannot open the cited run detail.') ->assertDontSee('Open basis run'); $this->actingAs($user) ->get(InventoryItemResource::getUrl('index', tenant: $tenant)) ->assertOk() ->assertSee('Latest run detail is not available with your current role.') ->assertDontSee('Open basis run'); }); it('keeps the no-basis fallback explicit on the inventory items list', function (): void { $tenant = Tenant::factory()->create(); [$user, $tenant] = createUserWithTenant(tenant: $tenant, role: 'owner'); $this->actingAs($user) ->get(InventoryItemResource::getUrl('index', tenant: $tenant)) ->assertOk() ->assertSee('No current result') ->assertSee('Run Inventory Sync from Inventory Items to establish current coverage truth.'); });