79 lines
2.5 KiB
Go
79 lines
2.5 KiB
Go
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)
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|