76 lines
1.9 KiB
TypeScript
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
|
|
);
|
|
});
|
|
});
|