arnaucube
arnaucube/configsPublic Self-hosted repository
configs/server-dockers/jellyfin-news/jellyfin_test.go
server-dockers/jellyfin-news/jellyfin_test.goRaw
 1package main
 2
 3import (
 4	"context"
 5	"io"
 6	"net/http"
 7	"strings"
 8	"testing"
 9	"time"
10)
11
12type roundTripFunc func(*http.Request) (*http.Response, error)
13
14func (f roundTripFunc) RoundTrip(r *http.Request) (*http.Response, error) { return f(r) }
15
16func TestAddedBetween(t *testing.T) {
17	httpClient := &http.Client{Transport: roundTripFunc(func(r *http.Request) (*http.Response, error) {
18		if r.Header.Get("Authorization") != `MediaBrowser Token="secret"` || r.Header.Get("X-Emby-Token") != "" {
19			t.Error("expected MediaBrowser API key authorization without legacy token header")
20		}
21		if r.URL.Query().Get("IncludeItemTypes") != "Movie,Episode" {
22			t.Error("wrong item filter")
23		}
24		body := `{"Items":[
25            {"Id":"new","Type":"Movie","Name":"New","DateCreated":"2026-08-24T10:00:00Z"},
26            {"Id":"old","Type":"Movie","Name":"Old","DateCreated":"2026-08-17T09:00:00Z"}
27        ],"TotalRecordCount":2}`
28		return &http.Response{StatusCode: http.StatusOK, Body: io.NopCloser(strings.NewReader(body)), Header: make(http.Header)}, nil
29	})}
30	c, err := New("http://jellyfin.test", "secret", "", httpClient)
31	if err != nil {
32		t.Fatal(err)
33	}
34	start := time.Date(2026, 8, 18, 0, 0, 0, 0, time.UTC)
35	end := time.Date(2026, 8, 25, 0, 0, 0, 0, time.UTC)
36	items, err := c.AddedBetween(context.Background(), start, end)
37	if err != nil {
38		t.Fatal(err)
39	}
40	if len(items) != 1 || items[0].Name != "New" || items[0].ID != "new" {
41		t.Fatalf("items = %#v", items)
42	}
43}
44
45func TestFindPosterTitleMatchesKindNameAndYear(t *testing.T) {
46	client, err := New("http://jellyfin.test", "secret", "user", &http.Client{Transport: roundTripFunc(func(r *http.Request) (*http.Response, error) {
47		q := r.URL.Query()
48		if r.URL.Path != "/Items" || (q.Get("SearchTerm") != "Dune" && q.Get("SearchTerm") != "Missing") || q.Get("IncludeItemTypes") != "Movie" || q.Get("Recursive") != "true" || q.Get("UserId") != "user" || r.Header.Get("Authorization") != `MediaBrowser Token="secret"` || r.Header.Get("X-Emby-Token") != "" {
49			t.Errorf("unexpected search request: %s", r.URL)
50		}
51		body := `{"Items":[{"Id":"series","Type":"Series","Name":"Dune"},{"Id":"old","Type":"Movie","Name":"Dune","ProductionYear":1984},{"Id":"new","Type":"Movie","Name":"Dune","ProductionYear":2021}]}`
52		return &http.Response{StatusCode: 200, Body: io.NopCloser(strings.NewReader(body)), Header: make(http.Header)}, nil
53	})})
54	if err != nil {
55		t.Fatal(err)
56	}
57	id, err := client.FindPosterTitle(context.Background(), "Movie", "Dune", 2021)
58	if err != nil || id != "new" {
59		t.Fatalf("match = %q, %v", id, err)
60	}
61	id, err = client.FindPosterTitle(context.Background(), "Movie", "Missing", 2021)
62	if err != nil || id != "" {
63		t.Fatalf("missing = %q, %v", id, err)
64	}
65}