返回 DeepSeek-Reasonix
opencode_go_downgrade_test.go
根目录 / internal / config / opencode_go_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 // The ordinary suite skips external checkout work. Release acceptance sets
13 // REASONIX_V1382_CHECKOUT to an isolated checkout of the immutable v1.38.2 tag.
14 func TestOpenCodeGoV10OldReaderRoundTrip(t *testing.T) {
15 checkout := os.Getenv("REASONIX_V1382_CHECKOUT")
16 if checkout == "" {
17 t.Skip("set REASONIX_V1382_CHECKOUT for the actual old-reader acceptance gate")
18 }
19 var err error
20 checkout, err = filepath.EvalSymlinks(checkout)
21 if err != nil {
22 t.Fatal(err)
23 }
24 cmd := exec.Command("git", "rev-parse", "HEAD")
25 cmd.Dir = checkout
26 sha, err := cmd.Output()
27 if err != nil || strings.TrimSpace(string(sha)) != "f5745bae24a56578e68a81f13e89f09961782d33" {
28 t.Fatalf("checkout must be v1.38.2: %q %v", sha, err)
29 }
30 dir := t.TempDir()
31 path := filepath.Join(dir, "config.toml")
32 if err := os.WriteFile(path, []byte(openCodeGoUpgradeFixture), 0600); err != nil {
33 t.Fatal(err)
34 }
35 if _, err := ApplyUserConfigUpgradesOnStartup(path); err != nil {
36 t.Fatal(err)
37 }
38 probe := filepath.Join(dir, "old_reader_test.go")
39 const source = `package config
40 import ("os"; "testing")
41 func TestV1382OpenCodeRoundTripProbe(t *testing.T) {
42 path := os.Getenv("REASONIX_COMPAT_CONFIG")
43 c := LoadForEdit(path)
44 if len(c.Providers) != 5 { t.Fatalf("old reader lost models: %d", len(c.Providers)) }
45 p,ok := c.Provider("go"); if !ok { t.Fatal("missing source connection") }; p.DisplayName = "old-reader-edited"
46 if os.Getenv("REASONIX_COMPAT_WRITE_V9") == "1" { c.ConfigVersion = 9 }
47 if err := c.SaveToScope(path,RenderScopeFull); err != nil { t.Fatal(err) }
48 }`
49 if err := os.WriteFile(probe, []byte(source), 0600); err != nil {
50 t.Fatal(err)
51 }
52 overlay := filepath.Join(dir, "overlay.json")
53 data, _ := json.Marshal(map[string]any{"Replace": map[string]string{filepath.Join(checkout, "internal/config/opencode_v1382_probe_test.go"): probe}})
54 if err := os.WriteFile(overlay, data, 0600); err != nil {
55 t.Fatal(err)
56 }
57 for _, version := range []string{"0", "1"} {
58 cmd := exec.Command("go", "test", "-overlay", overlay, "./internal/config", "-run", "^TestV1382OpenCodeRoundTripProbe$", "-v", "-count=1")
59 cmd.Dir = checkout
60 cmd.Env = append(os.Environ(), "REASONIX_COMPAT_CONFIG="+path, "REASONIX_COMPAT_WRITE_V9="+version)
61 output, err := cmd.CombinedOutput()
62 if err != nil || !strings.Contains(string(output), "--- PASS: TestV1382OpenCodeRoundTripProbe") {
63 t.Fatalf("v1.38.2 reader/save did not pass its probe: %v\n%s", err, output)
64 }
65 if _, err := ApplyUserConfigUpgradesOnStartup(path); err != nil {
66 t.Fatal(err)
67 }
68 c := LoadForEdit(path)
69 p, ok := c.Provider("go")
70 if c.ConfigVersion != 10 || len(c.Providers) != 5 || !ok || p.DisplayName != "old-reader-edited" {
71 t.Fatalf("round-trip lost configuration: version=%d providers=%d old_output=%s", c.ConfigVersion, len(c.Providers), output)
72 }
73 if e, ok := c.ResolveModel("go/deepseek-v4-pro"); !ok || e.Name != "go-chat-2" || e.APIKeyEnv != "ACCOUNT_A_KEY" {
74 t.Fatalf("old save lost account/history mapping: %+v", e)
75 }
76 if target, err := c.resolveOpenCodeGoAlias("go/deepseek-v4-flash", true); err != nil || target != "go-search/deepseek-v4-flash" {
77 t.Fatalf("old save lost search mapping: %s %v", target, err)
78 }
79 }
80 }
81
81 lines GO