Files
memby/server/internal/api/trickplay_test.go
T

79 lines
2.5 KiB
Go
Raw Normal View History

2026-08-07 10:44:17 +12:00
package api
import (
"encoding/json"
"net/http"
"net/http/httptest"
"testing"
"github.com/ponzischeme89/memby/server/internal/store"
)
// The television decodes this into GatewayTrickplay; the matching Kotlin test is
// `decodes a seek preview layout` in GatewayPayloadTest. Rename a field on either side and
// one of them fails before a TV ever sees it.
func TestTrickplayManifestShape(t *testing.T) {
raw, err := json.Marshal(trickplayManifest{
Available: true, IntervalMs: 10_000, Count: 817, Width: 320, Height: 172,
})
if err != nil {
t.Fatalf("marshal: %v", err)
}
want := `{"available":true,"intervalMs":10000,"count":817,"width":320,"height":172}`
if string(raw) != want {
t.Fatalf("manifest = %s, want %s", raw, want)
}
}
func TestTrickplayManifestOmitsTheRestWhenUnavailable(t *testing.T) {
// A title with no thumbnails, an operator who has turned the feature off and a gateway
// with no Emby all mean the same thing to a television, so they must all look the same
// on the wire — and none of them may carry a count it would try to draw from.
raw, err := json.Marshal(trickplayManifest{})
if err != nil {
t.Fatalf("marshal: %v", err)
}
if string(raw) != `{"available":false}` {
t.Fatalf("manifest = %s", raw)
}
}
func TestTrickplayAnswersUnavailableRatherThanFailing(t *testing.T) {
// A gateway with no Emby configured still answers, with 200 and "no previews". The
// seek indicator is a complete answer without a thumbnail, and an error here would be
// one nobody could act on, logged once per press of Right.
s := &Server{}
req := httptest.NewRequest(http.MethodGet, "/v1/items/42/trickplay", nil)
req.SetPathValue("id", "42")
rec := httptest.NewRecorder()
s.handleTrickplay(rec, req, store.Session{EmbyUserID: "user-1"})
if rec.Code != http.StatusOK {
t.Fatalf("status = %d, want 200", rec.Code)
}
var manifest trickplayManifest
if err := json.Unmarshal(rec.Body.Bytes(), &manifest); err != nil {
t.Fatalf("unmarshal: %v", err)
}
if manifest.Available {
t.Fatal("a gateway with no Emby offered seek previews")
}
}
func TestTrickplayFrameRejectsAnUnreadableIndex(t *testing.T) {
s := &Server{}
for _, frame := range []string{"", "-1", "twelve", "12.png.jpg"} {
req := httptest.NewRequest(http.MethodGet, "/v1/items/42/trickplay/"+frame, nil)
req.SetPathValue("id", "42")
req.SetPathValue("frame", frame)
rec := httptest.NewRecorder()
s.handleTrickplayFrame(rec, req, store.Session{EmbyUserID: "user-1"})
if rec.Code != http.StatusNotFound {
t.Fatalf("frame %q: status = %d, want 404", frame, rec.Code)
}
}
}