A community based topic aggregation platform built on atproto
at main 271 lines 6.6 kB view raw
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}