Files
diegosouzapw--omniroute/tests/unit/browserBackedChat-matcher.test.ts
2026-07-13 13:39:12 +08:00

76 lines
1.9 KiB
TypeScript

import assert from "node:assert/strict";
import { describe, it } from "node:test";
import { chatUrlMatcher } from "../../open-sse/services/browserBackedChat.ts";
describe("chatUrlMatcher", () => {
it("matches exact URL", () => {
assert.equal(
chatUrlMatcher(
"https://claude.ai/api/org/chat_conv/abc/completion",
"claude.ai",
"https://claude.ai/api/org/chat_conv/abc/completion"
),
true
);
});
it("matches with dynamic conversation id", () => {
assert.equal(
chatUrlMatcher(
"https://claude.ai/api/organizations/o1/chat_conversations/2ae3a64b-7e38-4e80-9d0d-5717dc425a4b/completion",
"claude.ai",
"https://claude.ai/api/organizations/o1/chat_conversations/PLACEHOLDER/completion"
),
true
);
});
it("matches DDG chat URL exactly", () => {
assert.equal(
chatUrlMatcher(
"https://duck.ai/duckchat/v1/chat",
"duck.ai",
"https://duck.ai/duckchat/v1/chat"
),
true
);
});
it("rejects when domain differs", () => {
assert.equal(
chatUrlMatcher("https://attacker.com/api/x", "claude.ai", "https://claude.ai/api/x"),
false
);
});
it("rejects when path length differs", () => {
assert.equal(
chatUrlMatcher(
"https://claude.ai/api/chat/x",
"claude.ai",
"https://claude.ai/api/chat/x/y/z"
),
false
);
});
it("rejects when more than one segment differs", () => {
assert.equal(
chatUrlMatcher("https://claude.ai/api/A/B/C/D", "claude.ai", "https://claude.ai/api/A/X/Y/D"),
false
);
});
it("rejects when subdomain is a prefix but not the configured matchDomain", () => {
assert.equal(
chatUrlMatcher(
"https://claude.ai.attacker.com/api/x",
"claude.ai",
"https://claude.ai/api/x"
),
false
);
});
});