package launch import ( "context" "fmt" "net/http" "net/http/httptest" "net/url" "testing" "github.com/ollama/ollama/api" modelpkg "github.com/ollama/ollama/types/model" ) func TestModelInventoryResolveRefreshesLocalMiss(t *testing.T) { calls := 0 srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { if r.URL.Path != "/api/tags" { http.NotFound(w, r) return } calls++ if calls == 1 { fmt.Fprint(w, `{"models":[]}`) return } fmt.Fprint(w, `{"models":[{"name":"new-model","size":123,"details":{"context_length":65536,"embedding_length":1024},"capabilities":["vision","tools"]}]}`) })) defer srv.Close() u, _ := url.Parse(srv.URL) inventory := newModelInventory(api.NewClient(u, srv.Client())) got := inventory.Resolve(context.Background(), []string{"new-model"}) if calls != 2 { t.Fatalf("List calls = %d, want 2", calls) } if len(got) != 1 { t.Fatalf("Resolve returned %d models, want 1", len(got)) } if got[0].Name != "new-model" { t.Fatalf("Name = %q, want new-model", got[0].Name) } if got[0].ContextLength != 65_536 || got[0].EmbeddingLength != 1_024 { t.Fatalf("metadata = context %d embedding %d, want refreshed metadata", got[0].ContextLength, got[0].EmbeddingLength) } if !got[0].HasCapability(modelpkg.CapabilityVision) || !got[0].ToolCapable { t.Fatalf("capabilities = %v toolCapable=%v, want refreshed capabilities", got[0].Capabilities, got[0].ToolCapable) } } func TestModelInventoryResolveDoesNotRefreshCloudMiss(t *testing.T) { calls := 0 srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { if r.URL.Path != "/api/tags" { http.NotFound(w, r) return } calls++ fmt.Fprint(w, `{"models":[]}`) })) defer srv.Close() u, _ := url.Parse(srv.URL) inventory := newModelInventory(api.NewClient(u, srv.Client())) got := inventory.Resolve(context.Background(), []string{"glm-5.1:cloud"}) if calls != 1 { t.Fatalf("List calls = %d, want 1", calls) } if len(got) != 1 { t.Fatalf("Resolve returned %d models, want 1", len(got)) } if got[0].Name != "glm-5.1:cloud" || !got[0].Remote { t.Fatalf("resolved model = %#v, want cloud fallback", got[0]) } if got[0].ContextLength <= 0 || got[0].MaxOutputTokens <= 0 { t.Fatalf("cloud limits not applied: %#v", got[0]) } }