package api import ( "encoding/json" "testing" ) func TestDiscoveryQueryNormalisationCollapsesTheSameQuestion(t *testing.T) { same := []string{"Disclosure Day", "disclosure day", " disclosure day ", "DISCLOSURE Day"} want := normaliseDiscoveryQuery(same[0]) for _, query := range same[1:] { if got := normaliseDiscoveryQuery(query); got != want { t.Fatalf("%q normalised to %q, want %q", query, got, want) } } if normaliseDiscoveryQuery("disclosure") == want { t.Fatal("a materially different query must not share a cache key") } } func TestDiscoveryFloorIsCountedInRunes(t *testing.T) { for _, query := range []string{"", " ", "d", "di", " di "} { if discoveryQueryEligible(query) { t.Fatalf("%q should not reach Sonarr or Radarr", query) } } for _, query := range []string{"dis", "disclosure day", "君の名は"} { if !discoveryQueryEligible(query) { t.Fatalf("%q should be eligible for discovery", query) } } } func TestRequestableIsStampedOnTheWayOut(t *testing.T) { items := []json.RawMessage{ searchExternalItem("Disclosure Day", 2027, "", "Movie", "radarr", RequestStatusRequestable, "12", "", false), searchExternalItem("Something Tracked", 2020, "", "Series", "sonarr", RequestStatusProcessing, "34", "", false), } for _, canRequest := range []bool{true, false} { decorated := applyRequestable(append([]json.RawMessage{}, items...), canRequest) var requestable, processing map[string]any if err := json.Unmarshal(decorated[0], &requestable); err != nil { t.Fatal(err) } if err := json.Unmarshal(decorated[1], &processing); err != nil { t.Fatal(err) } if requestable["MembyRequestable"] != canRequest { t.Fatalf("canRequest=%v: requestable candidate got %v", canRequest, requestable["MembyRequestable"]) } // Only a title nothing has and nobody has asked for offers the button, whatever // this viewer is permitted to do. if processing["MembyRequestable"] != false { t.Fatalf("canRequest=%v: a tracked title must never offer Request", canRequest) } } } func TestDiscoveryMergeCollapsesOnProviderID(t *testing.T) { merged := []json.RawMessage{} one := searchExternalItem("Disclosure Day", 2027, "", "Movie", "radarr", RequestStatusRequestable, "12", "", false) merged = mergeSearchRaw(merged, one, 20) merged = mergeSearchRaw(merged, one, 20) if len(merged) != 1 { t.Fatalf("one title reported twice produced %d cards", len(merged)) } }