返回 DeepSeek-Reasonix
workspace_removal_admission_test.go
根目录 / desktop / workspace_removal_admission_test.go
1 package main
2
3 import (
4 "testing"
5
6 "reasonix/internal/control"
7 )
8
9 func TestRemoveWorkspaceBlocksNewProjectRuntimeAdmissionDuringSnapshot(t *testing.T) {
10 isolateDesktopUserDirs(t)
11 projectRoot := t.TempDir()
12 siblingRoot := t.TempDir()
13 if err := addProject(projectRoot, "Project"); err != nil {
14 t.Fatal(err)
15 }
16 app := &App{
17 tabs: map[string]*WorkspaceTab{
18 "project": {ID: "project", Scope: "project", WorkspaceRoot: projectRoot, Ready: true, disabledMCP: map[string]ServerView{}},
19 "global": {ID: "global", Scope: "global", WorkspaceRoot: globalTabWorkspaceRoot(), Ready: true, disabledMCP: map[string]ServerView{}},
20 },
21 tabOrder: []string{"project", "global"}, activeTabID: "project",
22 detachedSessions: map[string]*WorkspaceTab{},
23 }
24 admitted, siblingAdmitted := false, false
25 app.tabs["project"].Ctrl = &snapshotObservingSession{
26 SessionAPI: control.New(control.Options{Label: "project"}),
27 onSnapshot: func() {
28 release, err := app.beginProjectRuntimeAdmission("project", projectRoot)
29 if err == nil {
30 admitted = true
31 release()
32 }
33 release, err = app.beginProjectRuntimeAdmission("project", siblingRoot)
34 if err == nil {
35 siblingAdmitted = true
36 release()
37 }
38 },
39 }
40 if err := app.RemoveWorkspace(projectRoot); err != nil {
41 t.Fatal(err)
42 }
43 if admitted {
44 t.Fatal("new project runtime was admitted while its workspace was being removed")
45 }
46 if !siblingAdmitted {
47 t.Fatal("an unrelated project runtime was blocked by workspace removal")
48 }
49 }
50
50 lines GO