visualizer fixes
This commit is contained in:
72
tests/feed-for-episode.test.ts
Normal file
72
tests/feed-for-episode.test.ts
Normal file
@@ -0,0 +1,72 @@
|
||||
/**
|
||||
* Unit test for feedForEpisode: resolving the feed behind an episode.
|
||||
*
|
||||
* The critical case is the reported regression — an iTunes show's episode has
|
||||
* `podcastId` set to the RSS feed url (rss-parser:163) while the feed's
|
||||
* `podcast.id` is the iTunes directory id. Those differ, so a strict
|
||||
* `podcast.id` match loses the feed (and its cover, stalling Now Playing art).
|
||||
*/
|
||||
|
||||
import { describe, expect, test } from "bun:test";
|
||||
import { feedForEpisode } from "../src/utils/feed-resolve";
|
||||
import { FeedVisibility } from "../src/types/feed";
|
||||
import type { Episode } from "../src/types/episode";
|
||||
import type { Feed } from "../src/types/feed";
|
||||
|
||||
function makeFeed(id: string, feedUrl: string, title = `Show ${id}`): Feed {
|
||||
return {
|
||||
id,
|
||||
podcast: {
|
||||
id,
|
||||
title,
|
||||
description: "",
|
||||
feedUrl,
|
||||
coverUrl: `https://cover/${id}.jpg`,
|
||||
lastUpdated: new Date(),
|
||||
isSubscribed: true,
|
||||
},
|
||||
episodes: [],
|
||||
visibility: FeedVisibility.PUBLIC,
|
||||
sourceId: "test",
|
||||
lastUpdated: new Date(),
|
||||
isPinned: false,
|
||||
};
|
||||
}
|
||||
|
||||
const episode = (podcastId: string, id = "ep"): Episode => ({
|
||||
id,
|
||||
podcastId,
|
||||
title: "Episode",
|
||||
description: "",
|
||||
audioUrl: "https://audio/ep.mp3",
|
||||
duration: 60,
|
||||
pubDate: new Date(),
|
||||
});
|
||||
|
||||
describe("feedForEpisode", () => {
|
||||
test("matches when episode.podcastId equals the feed's podcast.id", () => {
|
||||
const f = makeFeed("id-a", "http://a/feed.xml");
|
||||
expect(feedForEpisode([f], episode("id-a"))?.podcast.id).toBe("id-a");
|
||||
});
|
||||
|
||||
test("matches an iTunes show by feed url (podcastId != podcast.id)", () => {
|
||||
// The regression: feed.podcast.id is the directory id, podcastId the
|
||||
// RSS url — a strict id match loses the feed.
|
||||
const feedUrl = "http://itunes.example/feed.xml";
|
||||
const f = makeFeed("itunes-1177068388", feedUrl);
|
||||
const got = feedForEpisode([f], episode(feedUrl));
|
||||
expect(got?.podcast.id).toBe("itunes-1177068388");
|
||||
});
|
||||
|
||||
test("falls back to episode membership when neither id nor feedUrl match", () => {
|
||||
const f = makeFeed("id-b", "http://b/feed.xml");
|
||||
const ep = episode("unrelated", "ep-42");
|
||||
f.episodes = [ep];
|
||||
expect(feedForEpisode([f], ep)?.podcast.id).toBe("id-b");
|
||||
});
|
||||
|
||||
test("returns undefined when no feed matches", () => {
|
||||
const f = makeFeed("id-c", "http://c/feed.xml");
|
||||
expect(feedForEpisode([f], episode("nowhere"))).toBeUndefined();
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user