ui_test.go

 1package model
 2
 3import (
 4	"testing"
 5
 6	"charm.land/catwalk/pkg/catwalk"
 7	"github.com/charmbracelet/crush/internal/config"
 8	"github.com/charmbracelet/crush/internal/csync"
 9	"github.com/charmbracelet/crush/internal/ui/common"
10	"github.com/charmbracelet/crush/internal/workspace"
11	"github.com/stretchr/testify/require"
12)
13
14func TestCurrentModelSupportsImages(t *testing.T) {
15	t.Parallel()
16
17	t.Run("returns false when config is nil", func(t *testing.T) {
18		t.Parallel()
19
20		ui := newTestUIWithConfig(t, nil)
21		require.False(t, ui.currentModelSupportsImages())
22	})
23
24	t.Run("returns false when coder agent is missing", func(t *testing.T) {
25		t.Parallel()
26
27		cfg := &config.Config{
28			Providers: csync.NewMap[string, config.ProviderConfig](),
29			Agents:    map[string]config.Agent{},
30		}
31		ui := newTestUIWithConfig(t, cfg)
32		require.False(t, ui.currentModelSupportsImages())
33	})
34
35	t.Run("returns false when model is not found", func(t *testing.T) {
36		t.Parallel()
37
38		cfg := &config.Config{
39			Providers: csync.NewMap[string, config.ProviderConfig](),
40			Agents: map[string]config.Agent{
41				config.AgentCoder: {Model: config.SelectedModelTypeLarge},
42			},
43		}
44		ui := newTestUIWithConfig(t, cfg)
45		require.False(t, ui.currentModelSupportsImages())
46	})
47
48	t.Run("returns true when current model supports images", func(t *testing.T) {
49		t.Parallel()
50
51		providers := csync.NewMap[string, config.ProviderConfig]()
52		providers.Set("test-provider", config.ProviderConfig{
53			ID: "test-provider",
54			Models: []catwalk.Model{
55				{ID: "test-model", SupportsImages: true},
56			},
57		})
58
59		cfg := &config.Config{
60			Models: map[config.SelectedModelType]config.SelectedModel{
61				config.SelectedModelTypeLarge: {
62					Provider: "test-provider",
63					Model:    "test-model",
64				},
65			},
66			Providers: providers,
67			Agents: map[string]config.Agent{
68				config.AgentCoder: {Model: config.SelectedModelTypeLarge},
69			},
70		}
71
72		ui := newTestUIWithConfig(t, cfg)
73		require.True(t, ui.currentModelSupportsImages())
74	})
75}
76
77func newTestUIWithConfig(t *testing.T, cfg *config.Config) *UI {
78	t.Helper()
79
80	return &UI{
81		com: &common.Common{
82			Workspace: &testWorkspace{cfg: cfg},
83		},
84	}
85}
86
87// testWorkspace is a minimal [workspace.Workspace] stub for unit tests.
88type testWorkspace struct {
89	workspace.Workspace
90	cfg *config.Config
91}
92
93func (w *testWorkspace) Config() *config.Config {
94	return w.cfg
95}