package web import ( "database/sql" "io" "net/http" "net/http/httptest" "testing" "git.noroutes.net/NoRoutes/vibetunes/internal/database" ) func TestPublicShareRequiresNoAuth(t *testing.T) { h, db := newTestWeb(t) seedShareFixture(t, h, db) srv := httptest.NewServer(h.NewRouter()) defer srv.Close() share, err := firstShare(db) if err != nil { t.Fatal(err) } resp, err := http.Get(srv.URL + "/share/" + share.Token) if err != nil { t.Fatal(err) } defer resp.Body.Close() if resp.StatusCode != http.StatusOK { t.Fatalf("public share page status = %d, want 200", resp.StatusCode) } body, _ := io.ReadAll(resp.Body) if len(body) == 0 { t.Fatal("empty share page body") } } func TestPublicShareUnknownToken404s(t *testing.T) { h, _ := newTestWeb(t) srv := httptest.NewServer(h.NewRouter()) defer srv.Close() resp, err := http.Get(srv.URL + "/share/does-not-exist") if err != nil { t.Fatal(err) } defer resp.Body.Close() if resp.StatusCode != http.StatusNotFound { t.Fatalf("status = %d, want 404", resp.StatusCode) } } func TestShareStreamRejectsSongNotInShare(t *testing.T) { h, db := newTestWeb(t) seedShareFixture(t, h, db) srv := httptest.NewServer(h.NewRouter()) defer srv.Close() share, err := firstShare(db) if err != nil { t.Fatal(err) } resp, err := http.Get(srv.URL + "/share/" + share.Token + "/stream/sg_not_in_this_share") if err != nil { t.Fatal(err) } defer resp.Body.Close() if resp.StatusCode != http.StatusNotFound { t.Fatalf("status = %d, want 404 for a song not part of the share", resp.StatusCode) } } func firstShare(db *sql.DB) (*database.Share, error) { shares, err := database.ListAllShares(db) if err != nil { return nil, err } return shares[0], nil } // seedShareFixture creates a user, a music folder/song row, and a share // containing that song, directly via the database (no scanner needed — // this package's tests don't exercise ffmpeg). func seedShareFixture(t *testing.T, h *Web, db *sql.DB) { t.Helper() owner, err := database.CreateUser(db, "shareowner", "", "", false) if err != nil { t.Fatal(err) } folder, err := database.CreateMusicFolder(db, "Music", t.TempDir(), "music") if err != nil { t.Fatal(err) } mf, err := database.CreateMediaFile(db, folder.ID, "song.mp3", 100, 0, "hash", "mp3", "song", 10, 128, 44100, 2) if err != nil { t.Fatal(err) } song, err := database.UpsertSong(db, database.UpsertSongInput{MediaFileID: mf.ID, Title: "Shared Song"}) if err != nil { t.Fatal(err) } share, err := database.CreateShare(db, owner.ID, "test-token-123", "A test share", sql.NullString{}) if err != nil { t.Fatal(err) } if err := database.AddShareItem(db, share.ID, sql.NullString{String: song.ID, Valid: true}, sql.NullString{}, 0); err != nil { t.Fatal(err) } }