package handlers import ( "fmt" "log/slog" "net/http" "net/http/httptest" "strings" "testing" "sneak.berlin/go/pixa/internal/httpfetcher" "sneak.berlin/go/pixa/internal/imageprocessor" "sneak.berlin/go/pixa/internal/imgcache" ) // TestUnsupportedSourceFormatAnswers415 checks that both image routes answer // 415 with a clear error when the upstream answers with a content type pixa // does not accept, such as SVG, and when orig is asked of a source in a // format the processor cannot name, wrapped as the service wraps them. func TestUnsupportedSourceFormatAnswers415(t *testing.T) { t.Parallel() h := &Handlers{log: slog.New(slog.DiscardHandler)} req := &imgcache.ImageRequest{SourceHost: "img.example.com", SourcePath: "/a.svg"} for _, err := range []error{ fmt.Errorf("upstream fetch failed: %w: image/svg+xml", httpfetcher.ErrInvalidContentType), fmt.Errorf("image processing failed: %w: unknown", imageprocessor.ErrUnsupportedInputFormat), } { plain := httptest.NewRecorder() h.respondImageError(plain, req, err) encrypted := httptest.NewRecorder() h.handleImageError(encrypted, err) for route, rec := range map[string]*httptest.ResponseRecorder{ "HandleImage": plain, "HandleImageEnc": encrypted, } { t.Logf("%s for %v: %d %s", route, err, rec.Code, rec.Body.String()) if rec.Code != http.StatusUnsupportedMediaType { t.Errorf("%s for %v: status = %d, want %d", route, err, rec.Code, http.StatusUnsupportedMediaType) } if !strings.Contains(rec.Body.String(), "unsupported source format") { t.Errorf("%s for %v: body = %q, want the unsupported source format error", route, err, rec.Body.String()) } } } }