Files
vibesonic/internal/web/share_handlers_test.go
T

109 lines
2.7 KiB
Go

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)
}
}