109 lines
2.7 KiB
Go
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)
|
|
}
|
|
}
|