package opencode import ( "os" "path/filepath" "testing" ) func TestReadModelRef_String(t *testing.T) { dir := t.TempDir() path := filepath.Join(dir, "opencode.jsonc") // конфиг с комментариями и trailing-запятыми (JSONC). src := `{ // комментарий "model": "tokentool/deepseek/deepseek-v4-flash-0731", /* и блочный */ "provider": { "tokentool": {"api": {"type": "aisdk", "package": "@ai-sdk/openai-compatible", "url": "https://x"}}, }, }` if err := os.WriteFile(path, []byte(src), 0o644); err != nil { t.Fatalf("write: %v", err) } m, err := ReadModelRef(path, "") if err != nil { t.Fatalf("ReadModelRef err: %v", err) } if m == nil || m.ProviderID != "tokentool" || m.ID != "deepseek/deepseek-v4-flash-0731" { t.Errorf("model = %+v, want tokentool/deepseek-v4-flash-0731", m) } } func TestReadModelRef_Object(t *testing.T) { dir := t.TempDir() path := filepath.Join(dir, "opencode.json") src := `{"model": {"providerID": "tokentool", "id": "deepseek/deepseek-v4-flash-0731"}}` if err := os.WriteFile(path, []byte(src), 0o644); err != nil { t.Fatalf("write: %v", err) } m, err := ReadModelRef(path, "") if err != nil { t.Fatalf("ReadModelRef err: %v", err) } if m == nil || m.ID != "deepseek/deepseek-v4-flash-0731" { t.Errorf("model = %+v, want object-форма", m) } } func TestReadModelRef_Missing(t *testing.T) { dir := t.TempDir() path := filepath.Join(dir, "opencode.json") src := `{"provider": {}}` if err := os.WriteFile(path, []byte(src), 0o644); err != nil { t.Fatalf("write: %v", err) } m, err := ReadModelRef(path, "") if err != nil { t.Fatalf("ReadModelRef err: %v", err) } if m != nil { t.Errorf("model = %+v, want nil (model не задан)", m) } } func TestReadModelRef_NoFile(t *testing.T) { dir := t.TempDir() m, err := ReadModelRef(filepath.Join(dir, "nope.json"), dir) if err != nil { t.Fatalf("ReadModelRef err: %v", err) } if m != nil { t.Errorf("model = %+v, want nil", m) } } func TestReadModelRef_Bad(t *testing.T) { dir := t.TempDir() path := filepath.Join(dir, "opencode.json") src := `{"model": 12345}` if err := os.WriteFile(path, []byte(src), 0o644); err != nil { t.Fatalf("write: %v", err) } if _, err := ReadModelRef(path, ""); err == nil { t.Error("ReadModelRef должен упасть на некорректной model") } }