feat: add portable directory safeguards

This commit is contained in:
QiuSW
2026-07-28 00:12:29 +08:00
parent 92091a6690
commit 733954ddc8
15 changed files with 914 additions and 95 deletions
+49 -2
View File
@@ -618,6 +618,48 @@ func TestShellSettingsCanBeRestored(t *testing.T) {
}
}
func TestShellTracksPortableSettingsDirectoriesAndRestoresThem(t *testing.T) {
shell := NewShell(material.NewTheme())
root := t.TempDir()
portableData := filepath.Join(root, "user_data_dirs")
portableLogs := filepath.Join(root, "logs")
shell.SetPortableDirectoryDefaults(portableData, portableLogs)
shell.SetSettings(SettingsState{DefaultDir: portableData, DefaultDirMode: "portable", LogDir: portableLogs, LogDirMode: "portable", RemoteDebugStartPort: 9666, CloseOnExit: true})
shell.dataDir.SetText(filepath.Join(root, "custom"))
state, err := shell.settingsState()
if err != nil || state.DefaultDirMode != "custom" {
t.Fatalf("custom settings state = %#v, error = %v", state, err)
}
shell.restorePortableDirectory(PathDefaultUserData)
state, err = shell.settingsState()
if err != nil || state.DefaultDir != portableData || state.DefaultDirMode != "portable" {
t.Fatalf("restored settings state = %#v, error = %v", state, err)
}
}
func TestShellRejectsDuplicateInstanceNamesButAllowsEditingSelf(t *testing.T) {
shell := NewShell(material.NewTheme())
shell.SetInstances([]InstanceRow{
{ID: "one", Name: "Audit", Browser: "Chrome", UserDataDir: `C:\profiles\one`, Status: "已退出", PreferredRemoteDebugPort: 9666},
{ID: "two", Name: "投放", Browser: "Edge", UserDataDir: `C:\profiles\two`, Status: "已退出", PreferredRemoteDebugPort: 9667},
})
shell.instanceName.SetText("AUDIT")
shell.instanceDir.SetText(`C:\profiles\three`)
shell.instancePort.SetText("9668")
shell.createInstanceFromForm()
if len(shell.rows) != 2 || !strings.Contains(shell.formFeedback, "实例名称") {
t.Fatalf("duplicate instance create = rows %#v, feedback %q", shell.rows, shell.formFeedback)
}
shell.beginEdit("one")
shell.editName.SetText("Audit")
shell.editURL.SetText("https://example.com")
shell.saveEdit()
row, _ := shell.instanceRow("one")
if row.TargetURL != "https://example.com" || shell.editingID != "" {
t.Fatalf("self edit = %#v, feedback %q", row, shell.editFeedback)
}
}
func TestShellNormalizesRemoteDebugStartPort(t *testing.T) {
shell := NewShell(material.NewTheme())
shell.remoteDebugPort.SetText("")
@@ -1011,10 +1053,15 @@ func TestShellUsesDistinctDefaultDirectoriesForNewInstances(t *testing.T) {
shell.beginCreate()
firstID := shell.pendingCreateID
firstDir := shell.instanceDir.Text()
if firstID == "" || firstDir != filepath.Join(root, firstID) {
if firstID == "" || filepath.Dir(firstDir) != root || !strings.HasPrefix(filepath.Base(firstDir), "instance-新实例-") {
t.Fatalf("first default directory = %q for id %q", firstDir, firstID)
}
shell.instanceName.SetText("第一个实例")
shell.syncDefaultCreateDirectory()
firstDir = shell.instanceDir.Text()
if !strings.HasPrefix(filepath.Base(firstDir), "instance-第一个实例-") {
t.Fatalf("named default directory = %q", firstDir)
}
shell.createInstanceFromForm()
created := shell.rows[len(shell.rows)-1]
if created.ID != firstID || created.UserDataDir != firstDir {
@@ -1024,7 +1071,7 @@ func TestShellUsesDistinctDefaultDirectoriesForNewInstances(t *testing.T) {
shell.beginCreate()
secondID := shell.pendingCreateID
secondDir := shell.instanceDir.Text()
if secondID == "" || secondID == firstID || secondDir != filepath.Join(root, secondID) || secondDir == firstDir {
if secondID == "" || secondID == firstID || filepath.Dir(secondDir) != root || secondDir == firstDir {
t.Fatalf("second default directory = %q for id %q, first %q", secondDir, secondID, firstDir)
}
}