TenantAtlas/tests/Feature/Workspaces/WorkspaceLifecycleTest.php
2026-02-01 12:19:57 +01:00

69 lines
2.5 KiB
PHP

<?php
use App\Models\User;
use App\Models\Workspace;
use App\Models\WorkspaceMembership;
use App\Support\Workspaces\WorkspaceContext;
it('invalidates selection and redirects to no-access when the only membership workspace is archived', function () {
$user = User::factory()->create();
$workspace = Workspace::factory()->create();
WorkspaceMembership::factory()->for($workspace)->for($user)->create(['role' => 'owner']);
$workspace->forceFill(['archived_at' => now()])->save();
$this->actingAs($user);
session([WorkspaceContext::SESSION_KEY => $workspace->getKey()]);
$this->get('/admin/_test/workspace-context')
->assertRedirect('/admin/no-access');
expect(session()->get(WorkspaceContext::SESSION_KEY))->toBeNull();
expect($user->fresh()->last_workspace_id)->toBeNull();
});
it('auto-selects another active workspace when the current selection becomes archived', function () {
$user = User::factory()->create();
$archived = Workspace::factory()->create();
$active = Workspace::factory()->create();
WorkspaceMembership::factory()->for($archived)->for($user)->create(['role' => 'owner']);
WorkspaceMembership::factory()->for($active)->for($user)->create(['role' => 'owner']);
$archived->forceFill(['archived_at' => now()])->save();
$this->actingAs($user);
session([WorkspaceContext::SESSION_KEY => $archived->getKey()]);
$user->forceFill(['last_workspace_id' => $archived->getKey()])->save();
$this->get('/admin/_test/workspace-context')
->assertSuccessful()
->assertJson([
'workspace_id' => $active->getKey(),
]);
expect(session()->get(WorkspaceContext::SESSION_KEY))->toBe($active->getKey());
expect($user->fresh()->last_workspace_id)->toBe($active->getKey());
});
it('invalidates selection and redirects to no-access when membership is removed', function () {
$user = User::factory()->create();
$workspace = Workspace::factory()->create();
$membership = WorkspaceMembership::factory()->for($workspace)->for($user)->create(['role' => 'owner']);
$this->actingAs($user);
session([WorkspaceContext::SESSION_KEY => $workspace->getKey()]);
$user->forceFill(['last_workspace_id' => $workspace->getKey()])->save();
$membership->delete();
$this->get('/admin/_test/workspace-context')
->assertRedirect('/admin/no-access');
expect(session()->get(WorkspaceContext::SESSION_KEY))->toBeNull();
expect($user->fresh()->last_workspace_id)->toBeNull();
});