Skip to content

Commit f788f54

Browse files
authored
Add tests for working sets (#210)
* Add tests for working set commands. Fix tests after rebase. * Add db tests. * Lint fixes galore.
1 parent 8ba4b44 commit f788f54

File tree

11 files changed

+2836
-0
lines changed

11 files changed

+2836
-0
lines changed

pkg/db/workingset_test.go

Lines changed: 506 additions & 0 deletions
Large diffs are not rendered by default.

pkg/workingset/catalog_test.go

Lines changed: 130 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,130 @@
1+
package workingset
2+
3+
import (
4+
"testing"
5+
6+
"github.com/stretchr/testify/assert"
7+
)
8+
9+
func TestNewCatalogFromWorkingSet(t *testing.T) {
10+
workingSet := WorkingSet{
11+
Version: CurrentWorkingSetVersion,
12+
ID: "test-id",
13+
Name: "Test Working Set",
14+
Servers: []Server{
15+
{
16+
Type: ServerTypeRegistry,
17+
Source: "https://example.com/server",
18+
Config: map[string]any{"key": "value"},
19+
Tools: []string{"tool1", "tool2"},
20+
},
21+
{
22+
Type: ServerTypeImage,
23+
Image: "docker/test:latest",
24+
Tools: []string{"tool3"},
25+
},
26+
},
27+
Secrets: map[string]Secret{
28+
"default": {Provider: SecretProviderDockerDesktop},
29+
},
30+
}
31+
32+
catalog := NewCatalogFromWorkingSet(workingSet)
33+
34+
assert.Equal(t, "Test Working Set", catalog.Name)
35+
assert.Len(t, catalog.Servers, 2)
36+
37+
// Check registry server
38+
assert.Equal(t, "registry", catalog.Servers[0].Type)
39+
assert.Equal(t, "https://example.com/server", catalog.Servers[0].Source)
40+
assert.Equal(t, map[string]any{"key": "value"}, catalog.Servers[0].Config)
41+
assert.Equal(t, []string{"tool1", "tool2"}, catalog.Servers[0].Tools)
42+
43+
// Check image server
44+
assert.Equal(t, "image", catalog.Servers[1].Type)
45+
assert.Equal(t, "docker/test:latest", catalog.Servers[1].Image)
46+
assert.Equal(t, []string{"tool3"}, catalog.Servers[1].Tools)
47+
}
48+
49+
func TestCatalogToWorkingSet(t *testing.T) {
50+
catalog := Catalog{
51+
Name: "Test Catalog",
52+
Servers: []CatalogServer{
53+
{
54+
Type: "registry",
55+
Source: "https://example.com/server",
56+
Config: map[string]any{"key": "value"},
57+
Tools: []string{"tool1", "tool2"},
58+
},
59+
{
60+
Type: "image",
61+
Image: "docker/test:latest",
62+
Tools: []string{"tool3"},
63+
},
64+
},
65+
}
66+
67+
workingSet := catalog.ToWorkingSet()
68+
69+
assert.Equal(t, "Test Catalog", workingSet.Name)
70+
assert.Equal(t, CurrentWorkingSetVersion, workingSet.Version)
71+
assert.Len(t, workingSet.Servers, 2)
72+
73+
// Check registry server
74+
assert.Equal(t, ServerTypeRegistry, workingSet.Servers[0].Type)
75+
assert.Equal(t, "https://example.com/server", workingSet.Servers[0].Source)
76+
assert.Equal(t, map[string]any{"key": "value"}, workingSet.Servers[0].Config)
77+
assert.Equal(t, "default", workingSet.Servers[0].Secrets)
78+
assert.Equal(t, []string{"tool1", "tool2"}, workingSet.Servers[0].Tools)
79+
80+
// Check image server
81+
assert.Equal(t, ServerTypeImage, workingSet.Servers[1].Type)
82+
assert.Equal(t, "docker/test:latest", workingSet.Servers[1].Image)
83+
assert.Equal(t, "default", workingSet.Servers[1].Secrets)
84+
assert.Equal(t, []string{"tool3"}, workingSet.Servers[1].Tools)
85+
86+
// Check default secrets were added
87+
assert.Len(t, workingSet.Secrets, 1)
88+
assert.Equal(t, SecretProviderDockerDesktop, workingSet.Secrets["default"].Provider)
89+
}
90+
91+
func TestCatalogRoundTrip(t *testing.T) {
92+
original := Catalog{
93+
Name: "Test Catalog",
94+
Servers: []CatalogServer{
95+
{
96+
Type: "registry",
97+
Source: "https://example.com/server",
98+
Config: map[string]any{"key": "value"},
99+
Tools: []string{"tool1", "tool2"},
100+
},
101+
},
102+
}
103+
104+
// Convert to working set and back
105+
workingSet := original.ToWorkingSet()
106+
roundTripped := NewCatalogFromWorkingSet(workingSet)
107+
108+
// Name should be preserved
109+
assert.Equal(t, original.Name, roundTripped.Name)
110+
111+
// Servers should be preserved
112+
assert.Len(t, roundTripped.Servers, len(original.Servers))
113+
assert.Equal(t, original.Servers[0].Type, roundTripped.Servers[0].Type)
114+
assert.Equal(t, original.Servers[0].Source, roundTripped.Servers[0].Source)
115+
assert.Equal(t, original.Servers[0].Config, roundTripped.Servers[0].Config)
116+
assert.Equal(t, original.Servers[0].Tools, roundTripped.Servers[0].Tools)
117+
}
118+
119+
func TestCatalogWithEmptyServers(t *testing.T) {
120+
catalog := Catalog{
121+
Name: "Empty Catalog",
122+
Servers: []CatalogServer{},
123+
}
124+
125+
workingSet := catalog.ToWorkingSet()
126+
127+
assert.Equal(t, "Empty Catalog", workingSet.Name)
128+
assert.Empty(t, workingSet.Servers)
129+
assert.Len(t, workingSet.Secrets, 1) // Default secret should still be added
130+
}

pkg/workingset/create_test.go

Lines changed: 258 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,258 @@
1+
package workingset
2+
3+
import (
4+
"testing"
5+
6+
"github.com/stretchr/testify/assert"
7+
"github.com/stretchr/testify/require"
8+
)
9+
10+
func TestCreateWithDockerImages(t *testing.T) {
11+
dao := setupTestDB(t)
12+
ctx := t.Context()
13+
14+
err := Create(ctx, dao, "", "My Test Set", []string{
15+
"docker://myimage:latest",
16+
"docker://anotherimage:v1.0",
17+
})
18+
require.NoError(t, err)
19+
20+
// Verify the working set was created
21+
dbSet, err := dao.GetWorkingSet(ctx, "my-test-set")
22+
require.NoError(t, err)
23+
require.NotNil(t, dbSet)
24+
25+
assert.Equal(t, "my-test-set", dbSet.ID)
26+
assert.Equal(t, "My Test Set", dbSet.Name)
27+
assert.Len(t, dbSet.Servers, 2)
28+
29+
assert.Equal(t, "image", dbSet.Servers[0].Type)
30+
assert.Equal(t, "myimage:latest", dbSet.Servers[0].Image)
31+
32+
assert.Equal(t, "image", dbSet.Servers[1].Type)
33+
assert.Equal(t, "anotherimage:v1.0", dbSet.Servers[1].Image)
34+
}
35+
36+
func TestCreateWithRegistryServers(t *testing.T) {
37+
dao := setupTestDB(t)
38+
ctx := t.Context()
39+
40+
err := Create(ctx, dao, "", "Registry Set", []string{
41+
"https://example.com/server1",
42+
"http://example.com/server2",
43+
})
44+
require.NoError(t, err)
45+
46+
// Verify the working set was created
47+
dbSet, err := dao.GetWorkingSet(ctx, "registry-set")
48+
require.NoError(t, err)
49+
require.NotNil(t, dbSet)
50+
51+
assert.Len(t, dbSet.Servers, 2)
52+
53+
assert.Equal(t, "registry", dbSet.Servers[0].Type)
54+
assert.Equal(t, "https://example.com/server1", dbSet.Servers[0].Source)
55+
56+
assert.Equal(t, "registry", dbSet.Servers[1].Type)
57+
assert.Equal(t, "http://example.com/server2", dbSet.Servers[1].Source)
58+
}
59+
60+
func TestCreateWithMixedServers(t *testing.T) {
61+
dao := setupTestDB(t)
62+
ctx := t.Context()
63+
64+
err := Create(ctx, dao, "", "Mixed Set", []string{
65+
"docker://myimage:latest",
66+
"https://example.com/server",
67+
})
68+
require.NoError(t, err)
69+
70+
// Verify the working set was created
71+
dbSet, err := dao.GetWorkingSet(ctx, "mixed-set")
72+
require.NoError(t, err)
73+
require.NotNil(t, dbSet)
74+
75+
assert.Len(t, dbSet.Servers, 2)
76+
assert.Equal(t, "image", dbSet.Servers[0].Type)
77+
assert.Equal(t, "registry", dbSet.Servers[1].Type)
78+
}
79+
80+
func TestCreateWithCustomId(t *testing.T) {
81+
dao := setupTestDB(t)
82+
ctx := t.Context()
83+
84+
err := Create(ctx, dao, "custom-id", "Test Set", []string{
85+
"docker://myimage:latest",
86+
})
87+
require.NoError(t, err)
88+
89+
// Verify the working set was created with custom ID
90+
dbSet, err := dao.GetWorkingSet(ctx, "custom-id")
91+
require.NoError(t, err)
92+
require.NotNil(t, dbSet)
93+
94+
assert.Equal(t, "custom-id", dbSet.ID)
95+
assert.Equal(t, "Test Set", dbSet.Name)
96+
}
97+
98+
func TestCreateWithExistingId(t *testing.T) {
99+
dao := setupTestDB(t)
100+
ctx := t.Context()
101+
102+
// Create first working set
103+
err := Create(ctx, dao, "test-id", "Test Set 1", []string{
104+
"docker://myimage:latest",
105+
})
106+
require.NoError(t, err)
107+
108+
// Try to create another with the same ID
109+
err = Create(ctx, dao, "test-id", "Test Set 2", []string{
110+
"docker://anotherimage:latest",
111+
})
112+
require.Error(t, err)
113+
assert.Contains(t, err.Error(), "already exists")
114+
}
115+
116+
func TestCreateGeneratesUniqueIds(t *testing.T) {
117+
dao := setupTestDB(t)
118+
ctx := t.Context()
119+
120+
// Create first working set
121+
err := Create(ctx, dao, "", "Test Set", []string{
122+
"docker://myimage:latest",
123+
})
124+
require.NoError(t, err)
125+
126+
// Create second with same name
127+
err = Create(ctx, dao, "", "Test Set", []string{
128+
"docker://anotherimage:latest",
129+
})
130+
require.NoError(t, err)
131+
132+
// Create third with same name
133+
err = Create(ctx, dao, "", "Test Set", []string{
134+
"docker://thirdimage:latest",
135+
})
136+
require.NoError(t, err)
137+
138+
// List all working sets
139+
sets, err := dao.ListWorkingSets(ctx)
140+
require.NoError(t, err)
141+
assert.Len(t, sets, 3)
142+
143+
// Verify IDs are unique
144+
ids := make(map[string]bool)
145+
for _, set := range sets {
146+
assert.False(t, ids[set.ID], "ID %s should be unique", set.ID)
147+
ids[set.ID] = true
148+
}
149+
150+
// Verify ID pattern
151+
assert.Contains(t, ids, "test-set")
152+
assert.Contains(t, ids, "test-set-2")
153+
assert.Contains(t, ids, "test-set-3")
154+
}
155+
156+
func TestCreateWithInvalidServerFormat(t *testing.T) {
157+
dao := setupTestDB(t)
158+
ctx := t.Context()
159+
160+
err := Create(ctx, dao, "", "Test Set", []string{
161+
"invalid-format",
162+
})
163+
require.Error(t, err)
164+
assert.Contains(t, err.Error(), "invalid server value")
165+
}
166+
167+
func TestCreateWithEmptyName(t *testing.T) {
168+
dao := setupTestDB(t)
169+
ctx := t.Context()
170+
171+
err := Create(ctx, dao, "test-id", "", []string{
172+
"docker://myimage:latest",
173+
})
174+
require.Error(t, err)
175+
assert.Contains(t, err.Error(), "invalid working set")
176+
}
177+
178+
func TestCreateWithEmptyServers(t *testing.T) {
179+
dao := setupTestDB(t)
180+
ctx := t.Context()
181+
182+
err := Create(ctx, dao, "", "Empty Set", []string{})
183+
require.NoError(t, err)
184+
185+
// Verify the working set was created with no servers
186+
dbSet, err := dao.GetWorkingSet(ctx, "empty-set")
187+
require.NoError(t, err)
188+
require.NotNil(t, dbSet)
189+
190+
assert.Empty(t, dbSet.Servers)
191+
}
192+
193+
func TestCreateAddsDefaultSecrets(t *testing.T) {
194+
dao := setupTestDB(t)
195+
ctx := t.Context()
196+
197+
err := Create(ctx, dao, "", "Test Set", []string{
198+
"docker://myimage:latest",
199+
})
200+
require.NoError(t, err)
201+
202+
// Verify default secrets were added
203+
dbSet, err := dao.GetWorkingSet(ctx, "test-set")
204+
require.NoError(t, err)
205+
require.NotNil(t, dbSet)
206+
207+
assert.Len(t, dbSet.Secrets, 1)
208+
assert.Contains(t, dbSet.Secrets, "default")
209+
assert.Equal(t, "docker-desktop-store", dbSet.Secrets["default"].Provider)
210+
}
211+
212+
func TestCreateNameWithSpecialCharacters(t *testing.T) {
213+
tests := []struct {
214+
name string
215+
inputName string
216+
expectedID string
217+
}{
218+
{
219+
name: "name with spaces",
220+
inputName: "My Test Set",
221+
expectedID: "my-test-set",
222+
},
223+
{
224+
name: "name with special chars",
225+
inputName: "Test@Set#123!",
226+
expectedID: "test-set-123-",
227+
},
228+
{
229+
name: "name with multiple spaces",
230+
inputName: "Test Set",
231+
expectedID: "test-set",
232+
},
233+
{
234+
name: "name with underscores",
235+
inputName: "Test_Set_Name",
236+
expectedID: "test-set-name",
237+
},
238+
}
239+
240+
for _, tt := range tests {
241+
t.Run(tt.name, func(t *testing.T) {
242+
// Create a fresh database for each subtest to avoid ID conflicts
243+
dao := setupTestDB(t)
244+
ctx := t.Context()
245+
246+
err := Create(ctx, dao, "", tt.inputName, []string{
247+
"docker://myimage:latest",
248+
})
249+
require.NoError(t, err)
250+
251+
// Verify the ID was generated correctly
252+
dbSet, err := dao.GetWorkingSet(ctx, tt.expectedID)
253+
require.NoError(t, err)
254+
require.NotNil(t, dbSet)
255+
assert.Equal(t, tt.expectedID, dbSet.ID)
256+
})
257+
}
258+
}

0 commit comments

Comments
 (0)