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(); });