package e2e
import (
"net/http"
"strconv"
. "github.com/onsi/ginkgo/v2"
. "github.com/onsi/gomega"
)
var _ = Describe("Sessions", func() {
BeforeEach(func() { setupTestDB() })
ticks := func(ms int64) int64 { return ms * 10_000 }
reportBody := func(itemID string, positionTicks int64) string {
return `{"ItemId":"` + enc(itemID) + `","PositionTicks":` + strconv.FormatInt(positionTicks, 10) + `}`
}
Describe("playback reporting", func() {
It("accepts a playback start report", func() {
Expect(post("/Sessions/Playing", reportBody(songID("Come Together"), 0)).Code).To(Equal(http.StatusNoContent))
})
It("accepts a playback progress report", func() {
Expect(post("/Sessions/Playing/Progress", reportBody(songID("Come Together"), ticks(5000))).Code).To(Equal(http.StatusNoContent))
})
It("counts a play stopped past the threshold", func() {
id := songID("So What")
mf, err := ds.MediaFile().Get(ctx, id)
Expect(err).ToNot(HaveOccurred())
Expect(post("/Sessions/Playing/Stopped", reportBody(id, ticks(int64(mf.Duration*1000)))).Code).To(Equal(http.StatusNoContent))
mf, err = ds.MediaFile().Get(ctx, id)
Expect(err).ToNot(HaveOccurred())
Expect(mf.PlayCount).To(BeNumerically(">=", 1))
})
It("acknowledges a playback session ping", func() {
Expect(post("/Sessions/Playing/Ping?playSessionId=abc", "").Code).To(Equal(http.StatusNoContent))
})
It("does not count a brief play stopped before the threshold", func() {
id := songID("Help!")
Expect(post("/Sessions/Playing/Stopped", reportBody(id, ticks(1000))).Code).To(Equal(http.StatusNoContent))
mf, err := ds.MediaFile().Get(ctx, id)
Expect(err).ToNot(HaveOccurred())
Expect(mf.PlayCount).To(Equal(int64(0)))
})
})
Describe("capabilities", func() {
It("acknowledges POST /Sessions/Capabilities", func() {
Expect(post("/Sessions/Capabilities", "{}").Code).To(Equal(http.StatusNoContent))
})
It("acknowledges POST /Sessions/Capabilities/Full", func() {
Expect(post("/Sessions/Capabilities/Full", "{}").Code).To(Equal(http.StatusNoContent))
})
})
})