A community based topic aggregation platform built on atproto
1package imageproxy
2
3import (
4 "testing"
5
6 "github.com/stretchr/testify/assert"
7 "github.com/stretchr/testify/require"
8)
9
10func TestGetPreset(t *testing.T) {
11 tests := []struct {
12 name string
13 presetName string
14 wantWidth int
15 wantHeight int
16 wantFit FitMode
17 wantQuality int
18 wantErr error
19 }{
20 {
21 name: "avatar preset returns correct dimensions",
22 presetName: "avatar",
23 wantWidth: 1000,
24 wantHeight: 1000,
25 wantFit: FitCover,
26 wantQuality: 85,
27 wantErr: nil,
28 },
29 {
30 name: "avatar_small preset returns correct dimensions",
31 presetName: "avatar_small",
32 wantWidth: 360,
33 wantHeight: 360,
34 wantFit: FitCover,
35 wantQuality: 80,
36 wantErr: nil,
37 },
38 {
39 name: "banner preset returns correct dimensions",
40 presetName: "banner",
41 wantWidth: 640,
42 wantHeight: 300,
43 wantFit: FitCover,
44 wantQuality: 85,
45 wantErr: nil,
46 },
47 {
48 name: "content_preview preset returns correct dimensions",
49 presetName: "content_preview",
50 wantWidth: 800,
51 wantHeight: 0,
52 wantFit: FitContain,
53 wantQuality: 80,
54 wantErr: nil,
55 },
56 {
57 name: "content_full preset returns correct dimensions",
58 presetName: "content_full",
59 wantWidth: 1600,
60 wantHeight: 0,
61 wantFit: FitContain,
62 wantQuality: 90,
63 wantErr: nil,
64 },
65 {
66 name: "embed_thumbnail preset returns correct dimensions",
67 presetName: "embed_thumbnail",
68 wantWidth: 720,
69 wantHeight: 360,
70 wantFit: FitCover,
71 wantQuality: 80,
72 wantErr: nil,
73 },
74 {
75 name: "invalid preset returns error",
76 presetName: "invalid",
77 wantErr: ErrInvalidPreset,
78 },
79 {
80 name: "empty preset name returns error",
81 presetName: "",
82 wantErr: ErrInvalidPreset,
83 },
84 {
85 name: "case sensitive - AVATAR should not match",
86 presetName: "AVATAR",
87 wantErr: ErrInvalidPreset,
88 },
89 }
90
91 for _, tt := range tests {
92 t.Run(tt.name, func(t *testing.T) {
93 preset, err := GetPreset(tt.presetName)
94
95 if tt.wantErr != nil {
96 require.Error(t, err)
97 assert.ErrorIs(t, err, tt.wantErr)
98 return
99 }
100
101 require.NoError(t, err)
102 assert.Equal(t, tt.presetName, preset.Name)
103 assert.Equal(t, tt.wantWidth, preset.Width)
104 assert.Equal(t, tt.wantHeight, preset.Height)
105 assert.Equal(t, tt.wantFit, preset.Fit)
106 assert.Equal(t, tt.wantQuality, preset.Quality)
107 })
108 }
109}
110
111func TestAllPresetsHaveValidDimensions(t *testing.T) {
112 presetNames := []string{
113 "avatar",
114 "avatar_small",
115 "banner",
116 "content_preview",
117 "content_full",
118 "embed_thumbnail",
119 }
120
121 for _, name := range presetNames {
122 t.Run(name, func(t *testing.T) {
123 preset, err := GetPreset(name)
124 require.NoError(t, err)
125
126 // Width must always be positive
127 assert.Greater(t, preset.Width, 0, "preset %s must have positive width", name)
128
129 // Height can be 0 for contain fit (proportional scaling)
130 if preset.Fit == FitCover {
131 assert.Greater(t, preset.Height, 0, "cover fit preset %s must have positive height", name)
132 }
133
134 // Quality must be between 1 and 100
135 assert.GreaterOrEqual(t, preset.Quality, 1, "preset %s quality must be >= 1", name)
136 assert.LessOrEqual(t, preset.Quality, 100, "preset %s quality must be <= 100", name)
137
138 // Name must match
139 assert.Equal(t, name, preset.Name)
140 })
141 }
142}
143
144func TestFitModeString(t *testing.T) {
145 tests := []struct {
146 mode FitMode
147 want string
148 }{
149 {FitCover, "cover"},
150 {FitContain, "contain"},
151 }
152
153 for _, tt := range tests {
154 t.Run(tt.want, func(t *testing.T) {
155 assert.Equal(t, tt.want, tt.mode.String())
156 })
157 }
158}
159
160func TestListPresets(t *testing.T) {
161 presets := ListPresets()
162
163 // Should have all 6 presets
164 assert.Len(t, presets, 6)
165
166 // Verify all expected presets are present
167 expectedNames := map[string]bool{
168 "avatar": false,
169 "avatar_small": false,
170 "banner": false,
171 "content_preview": false,
172 "content_full": false,
173 "embed_thumbnail": false,
174 }
175
176 for _, p := range presets {
177 if _, exists := expectedNames[p.Name]; exists {
178 expectedNames[p.Name] = true
179 }
180 }
181
182 for name, found := range expectedNames {
183 assert.True(t, found, "expected preset %s to be in list", name)
184 }
185}
186
187func TestPreset_Validate(t *testing.T) {
188 tests := []struct {
189 name string
190 preset Preset
191 wantErr bool
192 }{
193 {
194 name: "valid avatar preset",
195 preset: Preset{Name: "avatar", Width: 1000, Height: 1000, Fit: FitCover, Quality: 85},
196 wantErr: false,
197 },
198 {
199 name: "valid contain preset with zero height",
200 preset: Preset{Name: "content", Width: 800, Height: 0, Fit: FitContain, Quality: 80},
201 wantErr: false,
202 },
203 {
204 name: "invalid empty name",
205 preset: Preset{Name: "", Width: 160, Height: 160, Fit: FitCover, Quality: 85},
206 wantErr: true,
207 },
208 {
209 name: "invalid zero width",
210 preset: Preset{Name: "test", Width: 0, Height: 160, Fit: FitCover, Quality: 85},
211 wantErr: true,
212 },
213 {
214 name: "invalid negative width",
215 preset: Preset{Name: "test", Width: -100, Height: 160, Fit: FitCover, Quality: 85},
216 wantErr: true,
217 },
218 {
219 name: "invalid cover fit with zero height",
220 preset: Preset{Name: "test", Width: 160, Height: 0, Fit: FitCover, Quality: 85},
221 wantErr: true,
222 },
223 {
224 name: "invalid quality zero",
225 preset: Preset{Name: "test", Width: 160, Height: 160, Fit: FitCover, Quality: 0},
226 wantErr: true,
227 },
228 {
229 name: "invalid quality over 100",
230 preset: Preset{Name: "test", Width: 160, Height: 160, Fit: FitCover, Quality: 101},
231 wantErr: true,
232 },
233 {
234 name: "valid quality at boundary 1",
235 preset: Preset{Name: "test", Width: 160, Height: 160, Fit: FitCover, Quality: 1},
236 wantErr: false,
237 },
238 {
239 name: "valid quality at boundary 100",
240 preset: Preset{Name: "test", Width: 160, Height: 160, Fit: FitCover, Quality: 100},
241 wantErr: false,
242 },
243 {
244 name: "invalid unknown fit mode",
245 preset: Preset{Name: "test", Width: 160, Height: 160, Fit: FitMode("unknown"), Quality: 85},
246 wantErr: true,
247 },
248 }
249
250 for _, tt := range tests {
251 t.Run(tt.name, func(t *testing.T) {
252 err := tt.preset.Validate()
253 if tt.wantErr {
254 assert.Error(t, err)
255 assert.ErrorIs(t, err, ErrInvalidPreset)
256 } else {
257 assert.NoError(t, err)
258 }
259 })
260 }
261}
262
263func TestAllPresetsValidate(t *testing.T) {
264 // All built-in presets should pass validation
265 for _, preset := range ListPresets() {
266 t.Run(preset.Name, func(t *testing.T) {
267 err := preset.Validate()
268 assert.NoError(t, err, "built-in preset %s should be valid", preset.Name)
269 })
270 }
271}