create([ 'name' => 'Run Tenant', 'workspace_id' => null, ]); [$user, $runTenant] = createUserWithTenant(tenant: $runTenant, role: 'owner'); $currentTenant = Tenant::factory()->create([ 'name' => 'Current Tenant', 'workspace_id' => (int) $runTenant->workspace_id, ]); createUserWithTenant(tenant: $currentTenant, user: $user, role: 'owner'); $run = OperationRun::factory()->create([ 'workspace_id' => (int) $runTenant->workspace_id, 'tenant_id' => (int) $runTenant->getKey(), 'type' => 'policy.sync', 'status' => OperationRunStatus::Completed->value, 'outcome' => OperationRunOutcome::Succeeded->value, ]); Filament::setTenant($currentTenant, true); $this->actingAs($user) ->withSession([WorkspaceContext::SESSION_KEY => (int) $runTenant->workspace_id]) ->get(route('admin.operations.view', ['run' => (int) $run->getKey()])) ->assertOk() ->assertSee('Current tenant context differs from this run') ->assertSee('Current tenant context: Current Tenant.') ->assertSee('Run tenant: Run Tenant.') ->assertSee('canonical workspace view'); } public function test_frames_tenantless_runs_as_workspace_level_even_when_tenant_context_is_selected(): void { $selectedTenant = Tenant::factory()->create([ 'name' => 'Selected Tenant', ]); [$user, $selectedTenant] = createUserWithTenant(tenant: $selectedTenant, role: 'owner'); $run = OperationRun::factory()->create([ 'workspace_id' => (int) $selectedTenant->workspace_id, 'tenant_id' => null, 'type' => 'provider.connection.check', 'status' => OperationRunStatus::Completed->value, 'outcome' => OperationRunOutcome::Succeeded->value, ]); Filament::setTenant($selectedTenant, true); $this->actingAs($user) ->withSession([WorkspaceContext::SESSION_KEY => (int) $selectedTenant->workspace_id]) ->get(route('admin.operations.view', ['run' => (int) $run->getKey()])) ->assertOk() ->assertSee('Workspace-level run') ->assertSee('This canonical workspace view is not tied to the current tenant context (Selected Tenant).'); } public function test_keeps_onboarding_tenant_runs_viewable_with_lifecycle_aware_context(): void { $tenant = Tenant::factory()->create([ 'name' => 'Onboarding Tenant', 'status' => Tenant::STATUS_ONBOARDING, ]); [$user, $tenant] = createUserWithTenant(tenant: $tenant, role: 'owner'); $run = OperationRun::factory()->create([ 'workspace_id' => (int) $tenant->workspace_id, 'tenant_id' => (int) $tenant->getKey(), 'type' => 'inventory_sync', 'status' => OperationRunStatus::Completed->value, 'outcome' => OperationRunOutcome::Succeeded->value, ]); Filament::setTenant(null, true); $this->actingAs($user) ->withSession([WorkspaceContext::SESSION_KEY => (int) $tenant->workspace_id]) ->get(route('admin.operations.view', ['run' => (int) $run->getKey()])) ->assertOk() ->assertSee('Run tenant is not available in the current tenant selector') ->assertSee('Run tenant: Onboarding Tenant.') ->assertSee('This tenant is currently onboarding') ->assertSee('Back to Operations') ->assertDontSee('This tenant is currently active') ->assertDontSee('← Back to Onboarding Tenant'); } public function test_keeps_archived_tenant_runs_viewable_with_lifecycle_aware_context(): void { $activeTenant = Tenant::factory()->create([ 'name' => 'Active Tenant', ]); [$user, $activeTenant] = createUserWithTenant(tenant: $activeTenant, role: 'owner'); $archivedTenant = Tenant::factory()->create([ 'name' => 'Archived Tenant', 'workspace_id' => (int) $activeTenant->workspace_id, 'status' => Tenant::STATUS_ACTIVE, ]); createUserWithTenant(tenant: $archivedTenant, user: $user, role: 'owner'); $archivedTenant->delete(); $run = OperationRun::factory()->create([ 'workspace_id' => (int) $activeTenant->workspace_id, 'tenant_id' => (int) $archivedTenant->getKey(), 'type' => 'inventory_sync', 'status' => OperationRunStatus::Completed->value, 'outcome' => OperationRunOutcome::Succeeded->value, ]); Filament::setTenant(null, true); $this->actingAs($user) ->withSession([WorkspaceContext::SESSION_KEY => (int) $activeTenant->workspace_id]) ->get(route('admin.operations.view', ['run' => (int) $run->getKey()])) ->assertOk() ->assertSee('Run tenant is not available in the current tenant selector') ->assertSee('Run tenant: Archived Tenant.') ->assertSee('This tenant is currently archived') ->assertSee('Back to Operations') ->assertDontSee('deactivated') ->assertDontSee('← Back to Archived Tenant'); } public function test_keeps_selector_excluded_draft_tenant_runs_viewable_with_lifecycle_aware_context(): void { $tenant = Tenant::factory()->create([ 'name' => 'Draft Tenant', 'status' => Tenant::STATUS_DRAFT, ]); [$user, $tenant] = createUserWithTenant(tenant: $tenant, role: 'owner'); $run = OperationRun::factory()->create([ 'workspace_id' => (int) $tenant->workspace_id, 'tenant_id' => (int) $tenant->getKey(), 'type' => 'policy.sync', 'status' => OperationRunStatus::Completed->value, 'outcome' => OperationRunOutcome::Succeeded->value, ]); Filament::setTenant(null, true); $this->actingAs($user) ->withSession([WorkspaceContext::SESSION_KEY => (int) $tenant->workspace_id]) ->get(route('admin.operations.view', ['run' => (int) $run->getKey()])) ->assertOk() ->assertSee('Run tenant is not available in the current tenant selector') ->assertSee('Run tenant: Draft Tenant.') ->assertSee('This tenant is currently draft') ->assertDontSee('Resume onboarding'); } }