| 1 | package config |
| 2 | |
| 3 | import ( |
| 4 | "fmt" |
| 5 | "os" |
| 6 | "path/filepath" |
| 7 | "strings" |
| 8 | "testing" |
| 9 | ) |
| 10 | |
| 11 | func TestMigrateImportsLegacyV1TOMLBeforeJSON(t *testing.T) { |
| 12 | srcJSON, dest, _ := legacyHome(t) |
| 13 | legacyTOML := filepath.Join(filepath.Dir(dest), "reasonix.toml") |
| 14 | if err := os.MkdirAll(filepath.Dir(legacyTOML), 0o755); err != nil { |
| 15 | t.Fatal(err) |
| 16 | } |
| 17 | if err := os.WriteFile(legacyTOML, []byte(` |
| 18 | default_model = "deepseek-flash" |
| 19 | language = "en" |
| 20 | |
| 21 | [ui] |
| 22 | theme = "light" |
| 23 | theme_style = "glacier" |
| 24 | close_behavior = "quit" |
| 25 | |
| 26 | [[plugins]] |
| 27 | name = "legacy-v1" |
| 28 | command = "legacy-bin" |
| 29 | `), 0o644); err != nil { |
| 30 | t.Fatal(err) |
| 31 | } |
| 32 | writeLegacy(t, srcJSON, `{"apiKey":"sk-json-should-not-win"}`) |
| 33 | |
| 34 | res, err := MigrateLegacyIfNeeded() |
| 35 | if err != nil { |
| 36 | t.Fatalf("migrate: %v", err) |
| 37 | } |
| 38 | if res == nil || res.From != legacyTOML { |
| 39 | t.Fatalf("expected v1 TOML migration, got %+v", res) |
| 40 | } |
| 41 | |
| 42 | got, err := os.ReadFile(dest) |
| 43 | if err != nil { |
| 44 | t.Fatalf("read migrated config: %v", err) |
| 45 | } |
| 46 | text := string(got) |
| 47 | for _, want := range []string{fmt.Sprintf("config_version = %d", Default().ConfigVersion), `[desktop]`, `close_behavior = "quit"`, `name = "legacy-v1"`} { |
| 48 | if !strings.Contains(text, want) { |
| 49 | t.Fatalf("migrated TOML missing %q:\n%s", want, text) |
| 50 | } |
| 51 | } |
| 52 | if _, err := os.Stat(UserCredentialsPath()); !os.IsNotExist(err) { |
| 53 | t.Fatalf("v1 TOML migration should not import lower-priority JSON key, credentials stat err=%v", err) |
| 54 | } |
| 55 | } |
| 56 |