Files
minstrel/internal/api/home_test.go
T
bvandeusen 00804cb974 feat(api): add GET /api/home composite handler
Wires recommendation.HomeData into handleGetHome; maps dbq row types to
the five HomePayload wire-type slices (AlbumRef/ArtistRef/TrackRef).
All slices are non-nil so the SPA never receives JSON null for empty sections.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-01 17:58:59 -04:00

80 lines
2.3 KiB
Go

package api
import (
"context"
"encoding/json"
"net/http"
"net/http/httptest"
"testing"
"github.com/go-chi/chi/v5"
"git.fabledsword.com/bvandeusen/minstrel/internal/db/dbq"
)
func newHomeRouter(h *handlers) chi.Router {
r := chi.NewRouter()
r.Get("/api/home", h.handleGetHome)
return r
}
func doGetHome(h *handlers, user dbq.User) *httptest.ResponseRecorder {
req := httptest.NewRequest(http.MethodGet, "/api/home", nil)
req = withUser(req, user)
w := httptest.NewRecorder()
newHomeRouter(h).ServeHTTP(w, req)
return w
}
func TestHome_EmptyForNewUser(t *testing.T) {
h, pool := testHandlers(t)
user := seedUser(t, pool, "alice", "pw", false)
w := doGetHome(h, user)
if w.Code != http.StatusOK {
t.Fatalf("status = %d, want 200; body = %s", w.Code, w.Body.String())
}
var got HomePayload
if err := json.Unmarshal(w.Body.Bytes(), &got); err != nil {
t.Fatalf("decode: %v", err)
}
// All slices must be non-nil so the SPA branches consistently on
// length rather than dealing with null.
if got.RecentlyAddedAlbums == nil || got.RediscoverAlbums == nil ||
got.RediscoverArtists == nil || got.MostPlayedTracks == nil ||
got.LastPlayedArtists == nil {
t.Errorf("payload has nil slice: %+v", got)
}
if len(got.RecentlyAddedAlbums) != 0 {
t.Errorf("RecentlyAddedAlbums len = %d, want 0", len(got.RecentlyAddedAlbums))
}
}
func TestHome_RecentlyAddedSurfacesAlbums(t *testing.T) {
h, pool := testHandlers(t)
user := seedUser(t, pool, "alice", "pw", false)
q := dbq.New(pool)
artist, _ := q.UpsertArtist(context.Background(), dbq.UpsertArtistParams{
Name: "ArtistOne", SortName: "ArtistOne",
})
_, _ = q.UpsertAlbum(context.Background(), dbq.UpsertAlbumParams{
Title: "Newest", SortTitle: "Newest", ArtistID: artist.ID,
})
w := doGetHome(h, user)
if w.Code != http.StatusOK {
t.Fatalf("status = %d, body = %s", w.Code, w.Body.String())
}
var got HomePayload
_ = json.Unmarshal(w.Body.Bytes(), &got)
if len(got.RecentlyAddedAlbums) != 1 {
t.Fatalf("len = %d, want 1", len(got.RecentlyAddedAlbums))
}
if got.RecentlyAddedAlbums[0].Title != "Newest" {
t.Errorf("title = %q, want Newest", got.RecentlyAddedAlbums[0].Title)
}
if got.RecentlyAddedAlbums[0].ArtistName != "ArtistOne" {
t.Errorf("artist_name = %q, want ArtistOne", got.RecentlyAddedAlbums[0].ArtistName)
}
}