package api import ( "bytes" "encoding/json" "net/http" "net/http/httptest" "testing" "github.com/go-chi/chi/v5" "git.fabledsword.com/bvandeusen/minstrel/internal/library" ) func TestMyNormalization_GetPut(t *testing.T) { h, pool := testHandlers(t) user := seedUser(t, pool, "norm1", "pw", false) r := chi.NewRouter() r.Get("/api/me/normalization", h.handleGetMyNormalization) r.Put("/api/me/normalization", h.handlePutMyNormalization) do := func(method, body string) (int, library.NormalizationPrefs) { t.Helper() req := withUser(httptest.NewRequest(method, "/api/me/normalization", bytes.NewBufferString(body)), user) rec := httptest.NewRecorder() r.ServeHTTP(rec, req) var p library.NormalizationPrefs if rec.Code == http.StatusOK { if err := json.Unmarshal(rec.Body.Bytes(), &p); err != nil { t.Fatalf("decode %s: %v", rec.Body.String(), err) } } return rec.Code, p } if code, p := do(http.MethodGet, ""); code != http.StatusOK || p != library.DefaultNormalizationPrefs { t.Fatalf("GET before any save = %d %+v, want 200 with the defaults", code, p) } want := library.NormalizationPrefs{Mode: "album", TargetLUFS: -16, Boost: "limiter"} if code, p := do(http.MethodPut, `{"mode":"album","target_lufs":-16,"boost":"limiter"}`); code != http.StatusOK || p != want { t.Fatalf("PUT = %d %+v, want 200 %+v", code, p, want) } if code, p := do(http.MethodGet, ""); code != http.StatusOK || p != want { t.Errorf("GET after PUT = %d %+v, want %+v", code, p, want) } // Bad values and partial bodies are refused, and the stored prefs stand. for _, body := range []string{ `{"mode":"loud","target_lufs":-16,"boost":"limiter"}`, `{"mode":"album","target_lufs":-23,"boost":"limiter"}`, `{"mode":"album","target_lufs":-16}`, `not json`, } { if code, _ := do(http.MethodPut, body); code != http.StatusBadRequest { t.Errorf("PUT %s = %d, want 400", body, code) } } if _, p := do(http.MethodGet, ""); p != want { t.Errorf("a refused PUT changed the prefs to %+v", p) } }