diff --git a/deno.json b/deno.json index 0b9fa23..4b89361 100644 --- a/deno.json +++ b/deno.json @@ -6,7 +6,8 @@ "tasks": { "start": "deno run -A --watch=static/,routes/ dev.ts", "check": "deno fmt --check && deno lint && deno check **/*.ts && deno check **/*.tsx", - "types:nrk": "deno run -A generate-types.ts && deno fmt ./lib" + "types:nrk": "deno run -A generate-types.ts && deno fmt ./lib", + "test": "deno test -A" }, "unstable": [ "kv" diff --git a/lib/rss.test.ts b/lib/rss.test.ts index 635c609..f3d0532 100644 --- a/lib/rss.test.ts +++ b/lib/rss.test.ts @@ -1,6 +1,14 @@ import { assertEquals, assertExists } from "$std/assert/mod.ts"; import { testUtils } from "./test-utils.ts"; import { rss } from "./rss.ts"; +import { forTestingOnly } from "./rss.ts"; + +// NOTE: Could probably be expanded upon. +Deno.test("generate tag for episode", () => { + const episode = testUtils.generateEpisode(); + const tag = forTestingOnly.assembleEpisode(episode, "someId"); + assertExists(tag); +}); Deno.test("generated rss contains the series title", () => { const series = testUtils.generateSeries(); diff --git a/lib/rss.ts b/lib/rss.ts index 7e2a025..75f5d83 100644 --- a/lib/rss.ts +++ b/lib/rss.ts @@ -1,8 +1,8 @@ -import { declaration, serialize, tag } from "serialize-xml"; +import { declaration, serialize, Tag, tag } from "serialize-xml"; import { getHostName } from "../utils.ts"; import { Episode, Series } from "./storage.ts"; -function assembleFeed(series: Series) { +function assembleFeed(series: Series): string { // Originally adapted from https://raw.githubusercontent.com/olaven/paperpod/1cde9abd3174b26e126aa74fc5a3b63fd078c0fd/packages/converter/src/rss.ts return serialize( declaration([ @@ -44,7 +44,7 @@ function assembleFeed(series: Series) { ]), ] : []), - ...series.episodes.map((episode) => assembleEpisode({ series, episode })), + ...series.episodes.map((episode) => assembleEpisode(episode, series.id)), ]), ], [ @@ -57,9 +57,7 @@ function assembleFeed(series: Series) { ); } -function assembleEpisode(options: { series: Series; episode: Episode }) { - const { series, episode } = options; - +function assembleEpisode(episode: Episode, seriesId: Series["id"]): Tag { const description = episode.subtitle || ""; return tag("item", [ @@ -73,7 +71,7 @@ function assembleEpisode(options: { series: Series; episode: Episode }) { tag("podcast:chapters", "", [ [ "url", - `${getHostName()}/api/feeds/${series.id}/${episode.id}/chapters`, + `${getHostName()}/api/feeds/${seriesId}/${episode.id}/chapters`, ], ["type", "application/json+chapters"], ]), @@ -88,3 +86,7 @@ function assembleEpisode(options: { series: Series; episode: Episode }) { export const rss = { assembleFeed, }; + +export const forTestingOnly = { + assembleEpisode, +}; diff --git a/lib/test-utils.ts b/lib/test-utils.ts index 64fcb37..5e28565 100644 --- a/lib/test-utils.ts +++ b/lib/test-utils.ts @@ -1,5 +1,5 @@ import { fakerNB_NO as faker } from "npm:@faker-js/faker"; -import { Series } from "./storage.ts"; +import { Episode, Series } from "./storage.ts"; function generateSeries(overrides: Partial = {}): Series { return { @@ -10,24 +10,28 @@ function generateSeries(overrides: Partial = {}): Series { imageUrl: faker.image.url(), lastFetchedAt: faker.date.recent(), episodes: new Array(faker.number.int({ min: 0, max: 100 })) - .fill(null).map(() => ({ - title: faker.word.words(3), - subtitle: faker.word.words(3), - link: faker.internet.url(), - url: faker.internet.url(), - shareLink: faker.internet.url(), - description: faker.lorem.paragraphs(2), - id: faker.string.uuid(), - date: faker.date.recent(), - durationInSeconds: faker.number.int({ - min: 0, - max: 3600, - }), - ...overrides, - })), + .fill(null).map(() => (generateEpisode(overrides))), + }; +} + +function generateEpisode(overrides: Partial = {}): Episode { + return { + title: faker.word.words(3), + subtitle: faker.word.words(3), + link: faker.internet.url(), + url: faker.internet.url(), + shareLink: faker.internet.url(), + id: faker.string.uuid(), + date: faker.date.recent(), + durationInSeconds: faker.number.int({ + min: 0, + max: 3600, + }), + ...overrides, }; } export const testUtils = { generateSeries, + generateEpisode, };