test: Add test for rss

Signed-off-by: Tim Hårek Andreassen <tim@harek.no>
This commit is contained in:
Tim Hårek Andreassen 2024-04-07 22:16:40 +02:00
parent ab138034a3
commit 552de8260e
No known key found for this signature in database
GPG Key ID: E59C7734F0E10EB5
4 changed files with 39 additions and 24 deletions

View File

@ -6,7 +6,8 @@
"tasks": { "tasks": {
"start": "deno run -A --watch=static/,routes/ dev.ts", "start": "deno run -A --watch=static/,routes/ dev.ts",
"check": "deno fmt --check && deno lint && deno check **/*.ts && deno check **/*.tsx", "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": [ "unstable": [
"kv" "kv"

View File

@ -1,6 +1,14 @@
import { assertEquals, assertExists } from "$std/assert/mod.ts"; import { assertEquals, assertExists } from "$std/assert/mod.ts";
import { testUtils } from "./test-utils.ts"; import { testUtils } from "./test-utils.ts";
import { rss } from "./rss.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", () => { Deno.test("generated rss contains the series title", () => {
const series = testUtils.generateSeries(); const series = testUtils.generateSeries();

View File

@ -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 { getHostName } from "../utils.ts";
import { Episode, Series } from "./storage.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 // Originally adapted from https://raw.githubusercontent.com/olaven/paperpod/1cde9abd3174b26e126aa74fc5a3b63fd078c0fd/packages/converter/src/rss.ts
return serialize( return serialize(
declaration([ 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 }) { function assembleEpisode(episode: Episode, seriesId: Series["id"]): Tag {
const { series, episode } = options;
const description = episode.subtitle || ""; const description = episode.subtitle || "";
return tag("item", [ return tag("item", [
@ -73,7 +71,7 @@ function assembleEpisode(options: { series: Series; episode: Episode }) {
tag("podcast:chapters", "", [ tag("podcast:chapters", "", [
[ [
"url", "url",
`${getHostName()}/api/feeds/${series.id}/${episode.id}/chapters`, `${getHostName()}/api/feeds/${seriesId}/${episode.id}/chapters`,
], ],
["type", "application/json+chapters"], ["type", "application/json+chapters"],
]), ]),
@ -88,3 +86,7 @@ function assembleEpisode(options: { series: Series; episode: Episode }) {
export const rss = { export const rss = {
assembleFeed, assembleFeed,
}; };
export const forTestingOnly = {
assembleEpisode,
};

View File

@ -1,5 +1,5 @@
import { fakerNB_NO as faker } from "npm:@faker-js/faker"; 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> = {}): Series { function generateSeries(overrides: Partial<Series> = {}): Series {
return { return {
@ -10,13 +10,17 @@ function generateSeries(overrides: Partial<Series> = {}): Series {
imageUrl: faker.image.url(), imageUrl: faker.image.url(),
lastFetchedAt: faker.date.recent(), lastFetchedAt: faker.date.recent(),
episodes: new Array(faker.number.int({ min: 0, max: 100 })) episodes: new Array(faker.number.int({ min: 0, max: 100 }))
.fill(null).map(() => ({ .fill(null).map(() => (generateEpisode(overrides))),
};
}
function generateEpisode(overrides: Partial<Series> = {}): Episode {
return {
title: faker.word.words(3), title: faker.word.words(3),
subtitle: faker.word.words(3), subtitle: faker.word.words(3),
link: faker.internet.url(), link: faker.internet.url(),
url: faker.internet.url(), url: faker.internet.url(),
shareLink: faker.internet.url(), shareLink: faker.internet.url(),
description: faker.lorem.paragraphs(2),
id: faker.string.uuid(), id: faker.string.uuid(),
date: faker.date.recent(), date: faker.date.recent(),
durationInSeconds: faker.number.int({ durationInSeconds: faker.number.int({
@ -24,10 +28,10 @@ function generateSeries(overrides: Partial<Series> = {}): Series {
max: 3600, max: 3600,
}), }),
...overrides, ...overrides,
})),
}; };
} }
export const testUtils = { export const testUtils = {
generateSeries, generateSeries,
generateEpisode,
}; };