🏡 index : quine-global/quintodrome.git

package e2e

import (
	"net/http/httptest"
	"net/url"

	"github.com/navidrome/navidrome/model"
	"github.com/navidrome/navidrome/model/request"
	"github.com/navidrome/navidrome/server/subsonic/responses"
	. "github.com/onsi/ginkgo/v2"
	. "github.com/onsi/gomega"
)

var _ = Describe("API key authentication", func() {
	var key string

	BeforeEach(func() {
		setupTestDB()
		userCtx := request.WithUser(ctx, regularUser)
		player := &model.Player{ID: "apikey-player", Name: "Phone", UserId: regularUser.ID, Client: "test-client"}
		Expect(ds.Player().Put(userCtx, player)).To(Succeed())
		key = "nds_0123456789abcdefghijkl"
		Expect(ds.Player().SetAPIKey(userCtx, player.ID, key)).To(Succeed())
	})

	doKeyReq := func(endpoint, apiKey string) *responses.Subsonic {
		q := url.Values{"apiKey": {apiKey}, "v": {"1.16.1"}, "c": {"test-client"}, "f": {"json"}}
		w := httptest.NewRecorder()
		router.ServeHTTP(w, httptest.NewRequest("GET", "/"+endpoint+"?"+q.Encode(), nil))
		return parseJSONResponse(w)
	}

	It("authenticates ping with only the key", func() {
		resp := doKeyReq("ping", key)

		Expect(resp.Status).To(Equal(responses.StatusOK))
	})

	It("reports the key owner in tokenInfo", func() {
		resp := doKeyReq("tokenInfo", key)

		Expect(resp.Status).To(Equal(responses.StatusOK))
		Expect(resp.TokenInfo).ToNot(BeNil())
		Expect(resp.TokenInfo.Username).To(Equal(regularUser.UserName))
	})

	It("rejects an unknown key with error 44", func() {
		resp := doKeyReq("ping", "nds_unknown")

		Expect(resp.Status).To(Equal(responses.StatusFailed))
		Expect(resp.Error).ToNot(BeNil())
		Expect(resp.Error.Code).To(Equal(int32(44)))
	})
})