返回 DeepSeek-Reasonix
session_workspace_registry_windows_test.go
根目录 / desktop / session_workspace_registry_windows_test.go
1 package main
2
3 import (
4 "os"
5 "strings"
6 "testing"
7
8 "reasonix/desktop/internal/instanceidentity"
9 "reasonix/desktop/internal/workspacestate"
10 "reasonix/internal/config"
11 "reasonix/internal/provider"
12 )
13
14 func TestGlobalWorkspaceSurvivesWindowsUpdateEnvironment(t *testing.T) {
15 isolateDesktopUserDirs(t)
16 t.Setenv("REASONIX_HOME", "")
17 t.Setenv("REASONIX_STATE_HOME", "")
18 normalHome := config.ReasonixHomeDir()
19 updateHome := ""
20 for _, entry := range instanceidentity.UpdateEnvironment(os.Environ(), normalHome) {
21 if value, ok := strings.CutPrefix(entry, "REASONIX_HOME="); ok {
22 updateHome = value
23 }
24 }
25 if updateHome != instanceidentity.AccessHome(normalHome) {
26 t.Fatalf("updater rewrote the access spelling: %q -> %q", normalHome, updateHome)
27 }
28
29 // v1.38.10 wrote the lowercase comparison key into REASONIX_HOME. Seed that
30 // historical state, then verify the fixed ordinary launch can reuse it.
31 legacyUpdateHome := strings.ToLower(updateHome)
32 if legacyUpdateHome == normalHome || !strings.EqualFold(legacyUpdateHome, normalHome) {
33 t.Fatalf("fixture must exercise legacy update/normal casing: %q -> %q", normalHome, legacyUpdateHome)
34 }
35 t.Setenv("REASONIX_HOME", legacyUpdateHome)
36 first := NewApp()
37 t.Cleanup(first.closeSessionServices)
38 service := first.desktopSessionService("")
39 ref, workspaceID, err := first.bindFreshDesktopSession(t.Context(), "global", "", registrySessionCreator{service})
40 if err != nil {
41 t.Fatal(err)
42 }
43 live, ok := service.Runtime(ref)
44 if !ok {
45 t.Fatal("new session runtime missing")
46 }
47 appendSessionTestMessage(t, live, "saved-turn", provider.Message{ID: "saved-turn", Role: provider.RoleUser, Content: "history before ordinary relaunch"})
48 first.closeSessionServices()
49
50 t.Setenv("REASONIX_HOME", "")
51 second := NewApp()
52 t.Cleanup(second.closeSessionServices)
53 if id, err := second.attachDesktopSession(t.Context(), "global", "", ref); err != nil || id != workspaceID {
54 t.Fatalf("reopen after update: workspace=%q, err=%v", id, err)
55 }
56 page, err := second.ReadSessionHistory(ref, "", 10)
57 if err != nil || len(page.Messages) != 1 || page.Messages[0].Content != "history before ordinary relaunch" {
58 t.Fatalf("reopened history=%+v, err=%v", page, err)
59 }
60 if _, err := second.canonicalSessionWorkspace(t.Context(), ref); err != nil {
61 t.Fatalf("reopened workspace/header membership: %v", err)
62 }
63 newRef, newWorkspaceID, err := second.bindFreshDesktopSession(t.Context(), "global", "", registrySessionCreator{second.desktopSessionService("")})
64 if err != nil || newWorkspaceID != workspaceID || newRef == ref {
65 t.Fatalf("new session after update: ref=%v, workspace=%q, err=%v", newRef, newWorkspaceID, err)
66 }
67 state, err := second.workspaceRegistry().Load(t.Context())
68 if err != nil {
69 t.Fatal(err)
70 }
71 workspace := state.Workspaces[workspacestate.GlobalWorkspaceID]
72 if len(workspace.SessionIDs) != 2 || len(state.PendingCreates) != 0 {
73 t.Fatalf("relaunch lost sessions or left pending creates: %+v", state)
74 }
75 }
76
76 lines GO