返回 DeepSeek-Reasonix
deepseek_catalog_downgrade_test.go
根目录 / internal / config / deepseek_catalog_downgrade_test.go
1 package config
2
3 import (
4 "encoding/json"
5 "os"
6 "os/exec"
7 "path/filepath"
8 "strings"
9 "testing"
10 )
11
12 // Point this at an isolated pre-v11 source checkout for actual cross-version
13 // read/write acceptance. The overlay adds only a disposable test to that code.
14 func TestDeepSeekCatalogPreviousReaderRoundTrip(t *testing.T) {
15 checkout := os.Getenv("REASONIX_DEEPSEEK_PREVIOUS_CHECKOUT")
16 if checkout == "" {
17 t.Skip("set REASONIX_DEEPSEEK_PREVIOUS_CHECKOUT for previous-reader acceptance")
18 }
19 var err error
20 checkout, err = filepath.EvalSymlinks(checkout)
21 if err != nil {
22 t.Fatal(err)
23 }
24 checkout, err = filepath.Abs(checkout)
25 if err != nil {
26 t.Fatal(err)
27 }
28 dir := t.TempDir()
29 t.Setenv("REASONIX_HOME", dir)
30 path := filepath.Join(dir, "config.toml")
31 const raw = `config_version = 10
32 default_model = "deepseek/deepseek-v4-flash"
33 [[providers]]
34 name = "deepseek"
35 kind = "openai"
36 base_url = "https://api.deepseek.com"
37 models = ["deepseek-v4-flash", "deepseek-v4-pro"]
38 default = "deepseek-v4-flash"
39 `
40 if err := os.WriteFile(path, []byte(raw), 0o600); err != nil {
41 t.Fatal(err)
42 }
43 if _, err := ApplyUserConfigUpgradesOnStartup(path); err != nil {
44 t.Fatal(err)
45 }
46 probe := filepath.Join(dir, "previous_reader_test.go")
47 const source = `package config
48 import ("os"; "slices"; "testing")
49 func TestDeepSeekPreviousReaderProbe(t *testing.T) {
50 if Default().ConfigVersion != 10 { t.Fatal("probe requires a schema-v10 reader") }
51 path := os.Getenv("REASONIX_COMPAT_CONFIG")
52 c := LoadForEdit(path)
53 p,ok := c.Provider("deepseek")
54 if !ok || p.DefaultModel() != "deepseek-v4-flash" || c.ConfigVersion != 11 { t.Fatal("old reader lost selection or marker") }
55 if os.Getenv("REASONIX_COMPAT_DELETE_FLASH") == "1" {
56 p.Models = slices.DeleteFunc(p.Models,func(m string) bool { return m == "deepseek-flash" })
57 } else if !p.HasModel("deepseek-flash") { t.Fatal("old reader lost the new option") }
58 p.DisplayName = "old-reader-edited"
59 if err := c.SaveToScope(path,RenderScopeFull); err != nil { t.Fatal(err) }
60 }`
61 if err := os.WriteFile(probe, []byte(source), 0o600); err != nil {
62 t.Fatal(err)
63 }
64 overlay := filepath.Join(dir, "overlay.json")
65 data, err := json.Marshal(map[string]any{"Replace": map[string]string{filepath.Join(checkout, "internal/config/deepseek_previous_probe_test.go"): probe}})
66 if err != nil {
67 t.Fatal(err)
68 }
69 if err := os.WriteFile(overlay, data, 0o600); err != nil {
70 t.Fatal(err)
71 }
72 for _, deleted := range []string{"0", "1"} {
73 cmd := exec.Command("go", "test", "-overlay", overlay, "./internal/config", "-run", "^TestDeepSeekPreviousReaderProbe$", "-v", "-count=1")
74 cmd.Dir = checkout
75 cmd.Env = append(os.Environ(), "REASONIX_COMPAT_CONFIG="+path, "REASONIX_COMPAT_DELETE_FLASH="+deleted)
76 output, err := cmd.CombinedOutput()
77 if err != nil || !strings.Contains(string(output), "--- PASS: TestDeepSeekPreviousReaderProbe") {
78 t.Fatalf("old reader: %v\n%s", err, output)
79 }
80 if changed, err := ApplyUserConfigUpgradesOnStartup(path); err != nil || changed {
81 t.Fatalf("old writer lost migration marker: %v %v", changed, err)
82 }
83 c := LoadForEdit(path)
84 p, ok := c.Provider("deepseek")
85 if !ok || c.ConfigVersion != Default().ConfigVersion || p.DisplayName != "old-reader-edited" ||
86 p.DefaultModel() != "deepseek-v4-flash" || p.HasModel("deepseek-flash") != (deleted == "0") {
87 t.Fatalf("old reader round-trip lost choices: %+v", p)
88 }
89 if ref, ok := c.ResolveModel(c.DefaultModel); !ok || ref.Model != "deepseek-v4-flash" {
90 t.Fatalf("old reader round-trip lost current reference: %+v", ref)
91 }
92 }
93 }
94
94 lines GO