aboutsummaryrefslogtreecommitdiff
path: root/test/deep-research/readability-test.ts
diff options
context:
space:
mode:
authoramankumarsingh77 <amankumarsingh7702@gmail.com>2026-07-27 00:27:08 +0530
committerAman Kumar <145339995+amankumarsingh77@users.noreply.github.com>2026-08-02 19:12:46 +0530
commit15a537a99efba614e6e108722462bcb78ec6c3c4 (patch)
tree2ff20907fee8ace7a071470d491fe7808dce6a63 /test/deep-research/readability-test.ts
parentce5d808cb4cc3581d85b829656d1d478dc43e3a6 (diff)
test: port remaining suites to node:test
Mechanical port of the hand-rolled check() harness. Import-after-env ordering preserved so suites still read their sandbox dirs. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Diffstat (limited to 'test/deep-research/readability-test.ts')
-rw-r--r--test/deep-research/readability-test.ts91
1 files changed, 56 insertions, 35 deletions
diff --git a/test/deep-research/readability-test.ts b/test/deep-research/readability-test.ts
index 10f9a8b..ba0e0e0 100644
--- a/test/deep-research/readability-test.ts
+++ b/test/deep-research/readability-test.ts
@@ -1,46 +1,67 @@
/**
* Unit tests for the pure readability extractor — no browser required.
*
- * Run: npx tsx test/deep-research/readability-test.ts
+ * Run: npm test
*/
+import { test, describe } from "node:test";
+import assert from "node:assert/strict";
import { readFileSync } from "node:fs";
import { join } from "node:path";
import { extractReadable, type PageCapture } from "../../src/domains/readpage/readability";
-let passed = 0;
-let failed = 0;
-const check = (cond: boolean, label: string): void => {
- if (cond) {
- passed++;
- console.log(` ✓ ${label}`);
- } else {
- failed++;
- console.error(` ✗ ${label}`);
- }
-};
-
const fixture = (name: string): PageCapture =>
JSON.parse(readFileSync(join(import.meta.dirname, "fixtures", name), "utf8")) as PageCapture;
-// S10: boilerplate stripped, article content preserved
-{
- const page = extractReadable(fixture("article-capture.json"));
- check(page.text.includes("Chrome DevTools Protocol lets tools instrument"), "S10: article body text is present");
- check(page.text.includes("Sessions and Targets"), "S10: article headings are preserved");
- check(!page.text.includes("Home Products Blog"), "S10: nav boilerplate is dropped");
- check(!page.text.includes("Copyright 2026"), "S10: footer boilerplate is dropped");
- check(!page.text.includes("Subscribe here for our newsletter"), "S10: high-link-density promo block is dropped");
- check(page.text.includes("## Sessions and Targets"), "S10: paragraph/heading structure preserved as markdown");
- check(page.title === "How the Chrome DevTools Protocol Works" && page.url.startsWith("https://"), "S10: title and url passed through");
- check(page.wordCount > 40, "S10: word count reflects the article body");
-}
-
-// S11: no clear article node falls back to bounded body text
-{
- const page = extractReadable(fixture("no-article-capture.json"));
- check(page.text.length > 0, "S11: structure-less page falls back to non-empty body text");
- check(page.text.includes("Your account is active"), "S11: fallback body text carries the real content");
-}
-
-console.log(`\n${passed} passed, ${failed} failed`);
-if (failed > 0) process.exit(1);
+describe("pure readability extractor", () => {
+ // S10: boilerplate stripped, article content preserved
+ test("S10: article body text is present", () => {
+ const page = extractReadable(fixture("article-capture.json"));
+ assert.ok(page.text.includes("Chrome DevTools Protocol lets tools instrument"));
+ });
+
+ test("S10: article headings are preserved", () => {
+ const page = extractReadable(fixture("article-capture.json"));
+ assert.ok(page.text.includes("Sessions and Targets"));
+ });
+
+ test("S10: nav boilerplate is dropped", () => {
+ const page = extractReadable(fixture("article-capture.json"));
+ assert.ok(!page.text.includes("Home Products Blog"));
+ });
+
+ test("S10: footer boilerplate is dropped", () => {
+ const page = extractReadable(fixture("article-capture.json"));
+ assert.ok(!page.text.includes("Copyright 2026"));
+ });
+
+ test("S10: high-link-density promo block is dropped", () => {
+ const page = extractReadable(fixture("article-capture.json"));
+ assert.ok(!page.text.includes("Subscribe here for our newsletter"));
+ });
+
+ test("S10: paragraph/heading structure preserved as markdown", () => {
+ const page = extractReadable(fixture("article-capture.json"));
+ assert.ok(page.text.includes("## Sessions and Targets"));
+ });
+
+ test("S10: title and url passed through", () => {
+ const page = extractReadable(fixture("article-capture.json"));
+ assert.ok(page.title === "How the Chrome DevTools Protocol Works" && page.url.startsWith("https://"));
+ });
+
+ test("S10: word count reflects the article body", () => {
+ const page = extractReadable(fixture("article-capture.json"));
+ assert.ok(page.wordCount > 40);
+ });
+
+ // S11: no clear article node falls back to bounded body text
+ test("S11: structure-less page falls back to non-empty body text", () => {
+ const page = extractReadable(fixture("no-article-capture.json"));
+ assert.ok(page.text.length > 0);
+ });
+
+ test("S11: fallback body text carries the real content", () => {
+ const page = extractReadable(fixture("no-article-capture.json"));
+ assert.ok(page.text.includes("Your account is active"));
+ });
+});