2026-10-14 08:10:04 +08:00
|
|
|
import { describe, expect, it } from "vitest";
|
|
|
|
|
|
|
|
|
|
import { analyzeJavaScriptStaticSource } from "./javascriptStaticAnalysis.js";
|
|
|
|
|
|
|
|
|
|
const endpoints = (source: string) =>
|
|
|
|
|
analyzeJavaScriptStaticSource(source).endpoints.map(
|
|
|
|
|
({ kind, value, mechanism }) => ({ kind, value, mechanism }),
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
describe("server-sent event endpoints", () => {
|
|
|
|
|
it("reports EventSource URLs like WebSocket URLs", () => {
|
|
|
|
|
expect(
|
|
|
|
|
endpoints(`
|
|
|
|
|
new WebSocket("wss://chat.example/ws");
|
|
|
|
|
new EventSource("/api/chat/stream");
|
|
|
|
|
new window.EventSource("https://chat.example/events", { withCredentials: true });
|
|
|
|
|
`),
|
|
|
|
|
).toEqual([
|
|
|
|
|
{
|
|
|
|
|
kind: "network",
|
|
|
|
|
value: "wss://chat.example/ws",
|
|
|
|
|
mechanism: "call:WebSocket",
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
kind: "network",
|
|
|
|
|
value: "/api/chat/stream",
|
|
|
|
|
mechanism: "call:EventSource",
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
kind: "network",
|
|
|
|
|
value: "https://chat.example/events",
|
|
|
|
|
mechanism: "call:window.EventSource",
|
|
|
|
|
},
|
|
|
|
|
]);
|
|
|
|
|
});
|
|
|
|
|
|
2026-10-16 08:14:52 +08:00
|
|
|
it("retains a dynamic EventSource target as partial source evidence", () => {
|
|
|
|
|
expect(
|
|
|
|
|
analyzeJavaScriptStaticSource("new EventSource(url);").endpoints,
|
|
|
|
|
).toEqual([
|
|
|
|
|
expect.objectContaining({
|
|
|
|
|
value: "url",
|
|
|
|
|
mechanism: "call:EventSource",
|
|
|
|
|
resolution: "partial",
|
|
|
|
|
}),
|
|
|
|
|
]);
|
2026-10-14 08:10:04 +08:00
|
|
|
});
|
|
|
|
|
});
|