create(['slug' => 'tenant-lifecycle-ws']); $user = User::factory()->create(); WorkspaceMembership::factory()->create([ 'workspace_id' => (int) $workspace->getKey(), 'user_id' => (int) $user->getKey(), 'role' => 'owner', ]); $active = Tenant::factory()->active()->create([ 'workspace_id' => (int) $workspace->getKey(), 'name' => 'Active Tenant', ]); $onboarding = Tenant::factory()->onboarding()->create([ 'workspace_id' => (int) $workspace->getKey(), 'name' => 'Onboarding Tenant', ]); $archived = Tenant::factory()->archived()->create([ 'workspace_id' => (int) $workspace->getKey(), 'name' => 'Archived Tenant', ]); $user->tenants()->syncWithoutDetaching([ $active->getKey() => ['role' => 'owner'], $onboarding->getKey() => ['role' => 'owner'], $archived->getKey() => ['role' => 'owner'], ]); $this->actingAs($user) ->withSession([WorkspaceContext::SESSION_KEY => (int) $workspace->getKey()]) ->get(route('admin.workspace.managed-tenants.index', ['workspace' => $workspace])) ->assertSuccessful() ->assertSee('Active Tenant') ->assertSee('Onboarding Tenant') ->assertSee('Archived Tenant') ->assertSee('Active') ->assertSee('Onboarding') ->assertSee('Archived'); }); it('renders lifecycle summary on the tenant detail view', function (): void { [$user, $tenant] = createUserWithTenant(role: 'owner'); $this->actingAs($user); Filament::setTenant($tenant, true); Livewire::test(ViewTenant::class, ['record' => $tenant->getRouteKey()]) ->assertSee('Lifecycle summary') ->assertSee('This tenant is active and available across normal management, tenant selection, and operational follow-up flows.') ->assertSee('RBAC status') ->assertSee('App status'); }); it('renders the archived banner from the shared lifecycle presentation contract', function (): void { [$user, $tenant] = createUserWithTenant(role: 'owner'); $this->actingAs($user); $tenant->delete(); Filament::setTenant($tenant, true); Livewire::test(ViewTenant::class, ['record' => $tenant->getRouteKey()]) ->assertSee('Tenant archived') ->assertSee('This tenant remains available for inspection and audit history, but it is not selectable as active context until you restore it.'); });