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}