From 7a3ed0a1b44a2dff7da4ef7e0dc9ac837c8c4741 Mon Sep 17 00:00:00 2001 From: Eva Ho Date: Mon, 13 Apr 2026 15:37:04 -0700 Subject: [PATCH] adding test --- cmd/launch/opencode_test.go | 136 ++++++++---------------------------- 1 file changed, 28 insertions(+), 108 deletions(-) diff --git a/cmd/launch/opencode_test.go b/cmd/launch/opencode_test.go index a8eb85312..048cfd86f 100644 --- a/cmd/launch/opencode_test.go +++ b/cmd/launch/opencode_test.go @@ -3,6 +3,8 @@ package launch import ( "encoding/json" "fmt" + "net/http" + "net/http/httptest" "os" "path/filepath" "runtime" @@ -241,10 +243,25 @@ func TestLookupCloudModelLimit(t *testing.T) { } } +// inlineConfigModel extracts a model entry from the inline config content. +func inlineConfigModel(t *testing.T, content, model string) map[string]any { + t.Helper() + var cfg map[string]any + if err := json.Unmarshal([]byte(content), &cfg); err != nil { + t.Fatalf("configContent is not valid JSON: %v", err) + } + provider, _ := cfg["provider"].(map[string]any) + ollama, _ := provider["ollama"].(map[string]any) + models, _ := ollama["models"].(map[string]any) + entry, ok := models[model].(map[string]any) + if !ok { + t.Fatalf("model %s not found in inline config", model) + } + return entry +} + func TestOpenCodeEdit_ReasoningOnThinkingModel(t *testing.T) { - o := &OpenCode{} - tmpDir := t.TempDir() - setTestHome(t, tmpDir) + setTestHome(t, t.TempDir()) srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { if r.URL.Path == "/api/show" { @@ -256,13 +273,12 @@ func TestOpenCodeEdit_ReasoningOnThinkingModel(t *testing.T) { defer srv.Close() t.Setenv("OLLAMA_HOST", srv.URL) - configPath := filepath.Join(tmpDir, ".config", "opencode", "opencode.json") - + o := &OpenCode{} if err := o.Edit([]string{"qwq"}); err != nil { t.Fatal(err) } - entry := readOpenCodeModel(t, configPath, "qwq") + entry := inlineConfigModel(t, o.configContent, "qwq") if entry["reasoning"] != true { t.Error("expected reasoning = true for thinking model") } @@ -291,9 +307,7 @@ func TestOpenCodeEdit_ReasoningOnThinkingModel(t *testing.T) { } func TestOpenCodeEdit_ReasoningLevelsOnGptOss(t *testing.T) { - o := &OpenCode{} - tmpDir := t.TempDir() - setTestHome(t, tmpDir) + setTestHome(t, t.TempDir()) srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { if r.URL.Path == "/api/show" { @@ -305,13 +319,12 @@ func TestOpenCodeEdit_ReasoningLevelsOnGptOss(t *testing.T) { defer srv.Close() t.Setenv("OLLAMA_HOST", srv.URL) - configPath := filepath.Join(tmpDir, ".config", "opencode", "opencode.json") - + o := &OpenCode{} if err := o.Edit([]string{"gpt-oss:120b-cloud"}); err != nil { t.Fatal(err) } - entry := readOpenCodeModel(t, configPath, "gpt-oss:120b-cloud") + entry := inlineConfigModel(t, o.configContent, "gpt-oss:120b-cloud") if entry["reasoning"] != true { t.Error("expected reasoning = true") } @@ -331,9 +344,7 @@ func TestOpenCodeEdit_ReasoningLevelsOnGptOss(t *testing.T) { } func TestOpenCodeEdit_NoReasoningOnNonThinkingModel(t *testing.T) { - o := &OpenCode{} - tmpDir := t.TempDir() - setTestHome(t, tmpDir) + setTestHome(t, t.TempDir()) srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { if r.URL.Path == "/api/show" { @@ -345,13 +356,12 @@ func TestOpenCodeEdit_NoReasoningOnNonThinkingModel(t *testing.T) { defer srv.Close() t.Setenv("OLLAMA_HOST", srv.URL) - configPath := filepath.Join(tmpDir, ".config", "opencode", "opencode.json") - + o := &OpenCode{} if err := o.Edit([]string{"llama3.2"}); err != nil { t.Fatal(err) } - entry := readOpenCodeModel(t, configPath, "llama3.2") + entry := inlineConfigModel(t, o.configContent, "llama3.2") if entry["reasoning"] != nil { t.Errorf("expected no reasoning for non-thinking model, got %v", entry["reasoning"]) } @@ -360,96 +370,6 @@ func TestOpenCodeEdit_NoReasoningOnNonThinkingModel(t *testing.T) { } } -func TestOpenCodeEdit_BackfillsReasoningOnExistingModel(t *testing.T) { - o := &OpenCode{} - tmpDir := t.TempDir() - setTestHome(t, tmpDir) - - srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - if r.URL.Path == "/api/show" { - fmt.Fprintf(w, `{"capabilities":["thinking"],"model_info":{}}`) - return - } - w.WriteHeader(http.StatusNotFound) - })) - defer srv.Close() - t.Setenv("OLLAMA_HOST", srv.URL) - - configDir := filepath.Join(tmpDir, ".config", "opencode") - configPath := filepath.Join(configDir, "opencode.json") - os.MkdirAll(configDir, 0o755) - os.WriteFile(configPath, []byte(`{ - "provider": { - "ollama": { - "models": { - "qwq": { - "name": "qwq", - "_launch": true - } - } - } - } - }`), 0o644) - - if err := o.Edit([]string{"qwq"}); err != nil { - t.Fatal(err) - } - - entry := readOpenCodeModel(t, configPath, "qwq") - if entry["reasoning"] != true { - t.Error("expected reasoning = true after backfill") - } - if entry["variants"] == nil { - t.Error("expected variants to be set after backfill") - } -} - -func TestOpenCodeEdit_RemovesStaleReasoning(t *testing.T) { - o := &OpenCode{} - tmpDir := t.TempDir() - setTestHome(t, tmpDir) - - srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - if r.URL.Path == "/api/show" { - fmt.Fprintf(w, `{"capabilities":[],"model_info":{}}`) - return - } - w.WriteHeader(http.StatusNotFound) - })) - defer srv.Close() - t.Setenv("OLLAMA_HOST", srv.URL) - - configDir := filepath.Join(tmpDir, ".config", "opencode") - configPath := filepath.Join(configDir, "opencode.json") - os.MkdirAll(configDir, 0o755) - os.WriteFile(configPath, []byte(`{ - "provider": { - "ollama": { - "models": { - "llama3.2": { - "name": "llama3.2", - "_launch": true, - "reasoning": true, - "variants": {"none": {"reasoningEffort": "none"}} - } - } - } - } - }`), 0o644) - - if err := o.Edit([]string{"llama3.2"}); err != nil { - t.Fatal(err) - } - - entry := readOpenCodeModel(t, configPath, "llama3.2") - if entry["reasoning"] != nil { - t.Errorf("expected reasoning removed, got %v", entry["reasoning"]) - } - if entry["variants"] != nil { - t.Errorf("expected variants removed, got %v", entry["variants"]) - } -} - func TestFindOpenCode(t *testing.T) { t.Run("fallback to ~/.opencode/bin", func(t *testing.T) { tmpDir := t.TempDir()