From eea6aa3c0e04fc48385c26a5f35355f8cddcbdff Mon Sep 17 00:00:00 2001 From: Mikael Date: Sun, 3 Mar 2024 14:03:14 +0100 Subject: [PATCH] Updated test and benchmark dependencies and fixed issue with unresolved promise while handling invalid or unsupported feed formats (#53) --- README.md | 2 +- bench.ts | 25 +++++++++++++++++++++++ benchmark.ts | 29 -------------------------- scripts.json | 2 +- src/deserializer.ts | 14 +++++++++++++ src/deserializer_test.ts | 44 +++++++++++++++++++++++++++++++++++++++- test_deps.ts | 8 ++------ 7 files changed, 86 insertions(+), 38 deletions(-) create mode 100644 bench.ts delete mode 100644 benchmark.ts diff --git a/README.md b/README.md index 3c31de7..747d676 100644 --- a/README.md +++ b/README.md @@ -128,7 +128,7 @@ denon benchmark Using Deno ```shell -deno run --allow-read ./benchmark.ts +deno bench --allow-read bench.ts ``` ### Memory footprint test diff --git a/bench.ts b/bench.ts new file mode 100644 index 0000000..f8f2beb --- /dev/null +++ b/bench.ts @@ -0,0 +1,25 @@ +import { parseFeed } from "./mod.ts"; + +Deno.bench('Parse RSS1', async (b) => { + let source = await Deno.readTextFile(`./samples/rss1.xml`); + b.start(); + await parseFeed(source); + b.end(); + source = ''; +}); + +Deno.bench('Parse RSS2', async (b) => { + let source = await Deno.readTextFile(`./samples/rss2.xml`); + b.start(); + await parseFeed(source); + b.end(); + source = ''; +}); + +Deno.bench('Parse ATOM', async (b) => { + let source = await Deno.readTextFile(`./samples/atom.xml`); + b.start(); + await parseFeed(source); + b.end(); + source = ''; +}); diff --git a/benchmark.ts b/benchmark.ts deleted file mode 100644 index ca485a2..0000000 --- a/benchmark.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { bench, runBenchmarks } from "./test_deps.ts"; -import { parseFeed } from "./mod.ts"; - -[ - { - name: "RSS1", - source: await Deno.readTextFile(`./samples/rss1.xml`), - }, - { - name: "RSS2", - source: await Deno.readTextFile(`./samples/rss2.xml`), - }, - { - name: "ATOM", - source: await Deno.readTextFile(`./samples/atom.xml`), - }, -].forEach((feed) => { - bench({ - name: `ParseFeed ${feed.name}, Chars: ${feed.source.length}`, - runs: 10000, - func: async (watch) => { - watch.start(); - await parseFeed(feed.source); - watch.stop(); - }, - }); -}); - -await runBenchmarks(); diff --git a/scripts.json b/scripts.json index 976312d..6f5c65f 100644 --- a/scripts.json +++ b/scripts.json @@ -6,7 +6,7 @@ "scripts": { "start": "deno run dev.ts atom", "test": "deno test", - "benchmark": "deno run benchmark.ts", + "benchmark": "deno bench bench.ts", "memory": "deno run dev_memory_usage.ts" } } diff --git a/src/deserializer.ts b/src/deserializer.ts index 722a8e2..d1b3b6e 100644 --- a/src/deserializer.ts +++ b/src/deserializer.ts @@ -228,6 +228,20 @@ const parse = (input: string) => parser.onopentag = onOpenTag; }; + parser.onend = () => { + if (!feedType) { + Object.assign(parser, { + onopentag: undefined, + onclosetag: undefined, + ontext: undefined, + oncdata: undefined, + onend: undefined + }); + + reject(new Error(`Invalid or unsupported feed format`)); + } + } + parser .write(input) .close() diff --git a/src/deserializer_test.ts b/src/deserializer_test.ts index 789c43b..f738b6a 100644 --- a/src/deserializer_test.ts +++ b/src/deserializer_test.ts @@ -1,4 +1,4 @@ -import { assertEquals, assertNotEquals } from "../test_deps.ts"; +import { assertEquals, assertNotEquals, assertRejects } from "../test_deps.ts"; import { parseFeed } from "./deserializer.ts"; import { Feed, MediaRss } from "../mod.ts"; import { FeedType } from "../mod.ts"; @@ -726,3 +726,45 @@ const rss2DublinCoreTestSample = await Deno.readTextFile("./samples/rss2_dublin- }); }); }); + +Deno.test('Should throw error on invalid feed format', async () => { + await assertRejects(() => parseFeed('Invalid feed string'), Error, "Invalid or unsupported feed format"); +}); + +Deno.test('Should throw error on unsupported feed format', async () => { + const futureRSSFormat = ` + + + + Future RSS Feed + https://example.com + An RSS feed from the future + en-us + [Last updated timestamp] + FutureRSSGenerator v1.0 + [Publication timestamp] + Copyright © [Year] by [Your Organization] + [Editor's email] + [Webmaster's email] + + https://example.com/logo.png + Future RSS Feed + https://example.com + + + [Title of the article] + [Link to the article] + [Description of the article] + [Author's name] + [Category of the article] + [Publication timestamp] + + 360-degree video + Oculus Rift + + + + + `; + await assertRejects(() => parseFeed(futureRSSFormat), Error, "Type xrss is not supported"); +}); \ No newline at end of file diff --git a/test_deps.ts b/test_deps.ts index 9aada2e..590628d 100644 --- a/test_deps.ts +++ b/test_deps.ts @@ -2,9 +2,5 @@ export { assert, assertEquals, assertNotEquals, - assertThrowsAsync, -} from "https://deno.land/std@0.86.0/testing/asserts.ts"; -export { - bench, - runBenchmarks, -} from "https://deno.land/std@0.86.0/testing/bench.ts"; + assertRejects +} from "https://deno.land/std@0.218.2/assert/mod.ts";