test: Add test for rss
Signed-off-by: Tim Hårek Andreassen <tim@harek.no>
This commit is contained in:
parent
ab138034a3
commit
552de8260e
|
|
@ -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"
|
||||||
|
|
|
||||||
|
|
@ -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();
|
||||||
|
|
|
||||||
16
lib/rss.ts
16
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 { 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,
|
||||||
|
};
|
||||||
|
|
|
||||||
|
|
@ -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,24 +10,28 @@ 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))),
|
||||||
title: faker.word.words(3),
|
};
|
||||||
subtitle: faker.word.words(3),
|
}
|
||||||
link: faker.internet.url(),
|
|
||||||
url: faker.internet.url(),
|
function generateEpisode(overrides: Partial<Series> = {}): Episode {
|
||||||
shareLink: faker.internet.url(),
|
return {
|
||||||
description: faker.lorem.paragraphs(2),
|
title: faker.word.words(3),
|
||||||
id: faker.string.uuid(),
|
subtitle: faker.word.words(3),
|
||||||
date: faker.date.recent(),
|
link: faker.internet.url(),
|
||||||
durationInSeconds: faker.number.int({
|
url: faker.internet.url(),
|
||||||
min: 0,
|
shareLink: faker.internet.url(),
|
||||||
max: 3600,
|
id: faker.string.uuid(),
|
||||||
}),
|
date: faker.date.recent(),
|
||||||
...overrides,
|
durationInSeconds: faker.number.int({
|
||||||
})),
|
min: 0,
|
||||||
|
max: 3600,
|
||||||
|
}),
|
||||||
|
...overrides,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
export const testUtils = {
|
export const testUtils = {
|
||||||
generateSeries,
|
generateSeries,
|
||||||
|
generateEpisode,
|
||||||
};
|
};
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue