all repos — sz-chrome-remote-cdp @ master

pi-browser-harness, patched to drive a Chrome on another host over CDP, with castle_cdp_search web search

test/domains/serp-parser-test.ts (view raw)

 1
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
import { test, describe } from "node:test";
import assert from "node:assert/strict";
import { readFileSync } from "node:fs";
import { join } from "node:path";
import { classifySerp, parseGoogleSerp, type SerpExtraction } from "../../src/domains/search/google-serp";

const fixture = (name: string): SerpExtraction =>
  JSON.parse(readFileSync(join(import.meta.dirname, "fixtures", name), "utf8")) as SerpExtraction;

const ok = fixture("google-serp-ok.json");
const captcha = fixture("google-serp-captcha.json");
const empty = fixture("google-serp-empty.json");

describe("pure Google SERP parser", () => {
  test("S1: /url?q= redirect is unwrapped to the real target", () => {
    const results = parseGoogleSerp(ok.anchors, 10);
    const urls = results.map((r) => r.url);
    assert.ok(urls.includes("https://real.example/x"));
  });

  test("S1: google-internal anchors are dropped", () => {
    const results = parseGoogleSerp(ok.anchors, 10);
    const urls = results.map((r) => r.url);
    assert.ok(!urls.some((u) => u.includes("google.com")));
  });

  test("S1: javascript: anchors are dropped", () => {
    const results = parseGoogleSerp(ok.anchors, 10);
    const urls = results.map((r) => r.url);
    assert.ok(!urls.some((u) => u.startsWith("javascript:")));
  });

  test("S2: trailing-slash duplicate collapses to one result", () => {
    const results = parseGoogleSerp(ok.anchors, 10);
    const realExampleCount = results.filter((r) => r.url.startsWith("https://real.example/x")).length;
    assert.equal(realExampleCount, 1);
  });

  test("S2: rank runs 1..n in input order", () => {
    const results = parseGoogleSerp(ok.anchors, 10);
    assert.ok(results.every((r, i) => r.rank === i + 1));
  });

  test("S2: limit truncates and ranks stay 1..limit", () => {
    const capped = parseGoogleSerp(ok.anchors, 2);
    assert.ok(capped.length === 2 && capped[capped.length - 1]?.rank === 2);
  });

  test("S3: populated SERP classifies as ok", () => {
    assert.equal(classifySerp(ok.pageText, parseGoogleSerp(ok.anchors, 10).length), "ok");
  });

  test("S3: captcha page classifies as captcha", () => {
    assert.equal(classifySerp(captcha.pageText, 0), "captcha");
  });

  test("S3: empty results classify as no_results", () => {
    assert.equal(classifySerp(empty.pageText, 0), "no_results");
  });
});