navidrome/server/public/handle_shares_test.go
Deluan Quintão 3f89baaec8
test(server): make the handleM3U spec independent of spec order (#6221)
It relied on another spec having set auth.PublicTokenAuth, so it panicked whenever Ginkgo ran it first.
2026-09-24 22:07:17 -04:00

55 lines
1.5 KiB
Go

package public
import (
"net/http"
"net/http/httptest"
"github.com/go-chi/jwtauth/v5"
"github.com/navidrome/navidrome/core"
"github.com/navidrome/navidrome/core/auth"
"github.com/navidrome/navidrome/model"
"github.com/navidrome/navidrome/tests"
. "github.com/onsi/ginkgo/v2"
. "github.com/onsi/gomega"
)
var _ = Describe("handleM3U", func() {
var ds *tests.MockDataStore
var shareRepo *tests.MockShareRepo
var pub *Router
BeforeEach(func() {
auth.PublicTokenAuth = jwtauth.New("HS256", []byte("test-secret"), nil)
ds = &tests.MockDataStore{}
shareRepo = &tests.MockShareRepo{}
ds.MockedShare = shareRepo
pub = &Router{ds: ds, share: core.NewShare(ds)}
})
makeRequest := func(id string) *httptest.ResponseRecorder {
r := httptest.NewRequest("GET", "/public/"+id+"/m3u?%3Aid="+id, nil)
w := httptest.NewRecorder()
pub.handleM3U(w, r)
return w
}
It("sets the M3U content type", func() {
share := &model.Share{ID: "abc123", Tracks: model.MediaFiles{{ID: "t1", Title: "Track 1"}}}
shareRepo.ID = share.ID
shareRepo.Entity = share
w := makeRequest("abc123")
Expect(w.Code).To(Equal(http.StatusOK))
// Result() has the headers sent at WriteHeader time, unlike w.Header()
Expect(w.Result().Header.Get("Content-Type")).To(Equal("audio/x-mpegurl"))
Expect(w.Body.String()).To(HavePrefix("#EXTM3U"))
})
It("returns 404 when the share does not exist", func() {
shareRepo.ID = "other"
shareRepo.Entity = &model.Share{ID: "other"}
Expect(makeRequest("missing").Code).To(Equal(http.StatusNotFound))
})
})