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/headers-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
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
import { describe, test } from "node:test";
import assert from "node:assert/strict";
import { Compile } from "typebox/compile";
import { clearHeadersTool, setHeadersTool } from "../../src/domains/headers";
import type { HandlerContext } from "../../src/util/tool";
import { createFakeClient, type FakeClient } from "./fake-client";

const ctxFor = (fake: FakeClient): HandlerContext => ({
  client: fake.client,
  signal: undefined,
  onUpdate: () => {},
  extensionCtx: undefined as never,
});

describe("browser_set_headers", () => {
  test("sets headers on the current owned tab without echoing values", async () => {
    const fake = await createFakeClient();
    const result = await setHeadersTool.handler(
      {
        headers: {
          "x-tt-env": "ppe_mini_game_rating_phase4",
          "x-use-ppe": "1",
        },
      },
      ctxFor(fake),
    );

    assert.equal(result.success, true);
    if (!result.success) return;
    assert.doesNotMatch(result.data.text, /ppe_mini_game_rating_phase4/);
    assert.deepEqual(result.data.details, {
      targetId: "t1",
      headerNames: ["x-tt-env", "x-use-ppe"],
      count: 2,
    });
    assert.deepEqual(fake.callsTo("Network.setExtraHTTPHeaders"), [
      {
        method: "Network.setExtraHTTPHeaders",
        params: {
          headers: {
            "x-tt-env": "ppe_mini_game_rating_phase4",
            "x-use-ppe": "1",
          },
        },
        sessionId: "s1",
      },
    ]);
  });

  test("refuses a current tab that is not owned by the harness", async () => {
    const fake = await createFakeClient();
    fake.ownership.remove("t1");
    const result = await setHeadersTool.handler({ headers: { "x-test": "value" } }, ctxFor(fake));

    assert.equal(result.success, false);
    if (result.success) return;
    assert.equal(result.error.kind, "invalid_state");
    assert.match(result.error.message, /not owned/);
    assert.equal(fake.callsTo("Network.setExtraHTTPHeaders").length, 0);
  });

  test("schema rejects empty or malformed header sets", () => {
    const validate = Compile(setHeadersTool.parameters);
    assert.equal(validate.Check({ headers: {} }), false);
    assert.equal(validate.Check({ headers: { "x-test": "line one\nline two" } }), false);
    assert.equal(validate.Check({ headers: { "x-test": "value" } }), true);
  });

  test("handler rejects invalid HTTP header names", async () => {
    const fake = await createFakeClient();
    const result = await setHeadersTool.handler({ headers: { "bad name": "value" } }, ctxFor(fake));

    assert.equal(result.success, false);
    if (result.success) return;
    assert.equal(result.error.kind, "invalid_state");
    assert.match(result.error.message, /Invalid HTTP header name/);
    assert.equal(fake.callsTo("Network.setExtraHTTPHeaders").length, 0);
  });
});

describe("browser_clear_headers", () => {
  test("clears extra headers on the current owned tab", async () => {
    const fake = await createFakeClient();
    const result = await clearHeadersTool.handler({}, ctxFor(fake));

    assert.equal(result.success, true);
    assert.deepEqual(fake.callsTo("Network.setExtraHTTPHeaders"), [
      {
        method: "Network.setExtraHTTPHeaders",
        params: { headers: {} },
        sessionId: "s1",
      },
    ]);
  });
});