59 lines
1.6 KiB
TypeScript
59 lines
1.6 KiB
TypeScript
import { expect, it } from "vitest";
|
|||
|
|
|
||
|
|
import { analyzeJavaScriptSemantics } from "./javascriptSemanticAnalysis.js";
|
||
|
|
|
||
|
|
const responses = (source: string) =>
|
||
|
|
analyzeJavaScriptSemantics(source)
|
||
|
|
.requestOperations.filter(({ kind }) => kind === "response-consumer")
|
||
|
|
.map(({ method, endpoint, resolution }) => ({
|
||
|
|
method,
|
||
|
|
endpoint,
|
||
|
|
resolution,
|
||
|
|
}));
|
||
|
|
|
||
|
|
it("keeps the endpoint of a uniquely consumed request response", () => {
|
||
|
|
expect(
|
||
|
|
responses(`
|
||
|
|
async function load() {
|
||
|
|
const a = await fetch("https://example.test/a");
|
||
|
|
const b = await fetch("https://example.test/b");
|
||
|
|
return [await a.json(), await b.text()];
|
||
|
|
}
|
||
|
|
`),
|
||
|
|
).toEqual([
|
||
|
|
{
|
||
|
|
method: "json",
|
||
|
|
endpoint: "https://example.test/a",
|
||
|
|
resolution: "complete",
|
||
|
|
},
|
||
|
|
{
|
||
|
|
method: "text",
|
||
|
|
endpoint: "https://example.test/b",
|
||
|
|
resolution: "complete",
|
||
|
|
},
|
||
|
|
]);
|
||
|
|
});
|
||
|
|
|
||
|
|
it("leaves an ambiguous response consumer without an endpoint", () => {
|
||
|
|
expect(
|
||
|
|
responses(`
|
||
|
|
async function load(flag) {
|
||
|
|
let response = await fetch("https://example.test/a");
|
||
|
|
if (flag) response = await fetch("https://example.test/b");
|
||
|
|
return response.json();
|
||
|
|
}
|
||
|
|
`),
|
||
|
|
).toEqual([{ method: "json", endpoint: null, resolution: "partial" }]);
|
||
|
|
});
|
||
|
|
|
||
|
|
it("leaves a response replaced by a non-request value without an endpoint", () => {
|
||
|
|
expect(
|
||
|
|
responses(`
|
||
|
|
async function load(cachedResponse) {
|
||
|
|
let response = await fetch("https://example.test/a");
|
||
|
|
response = cachedResponse;
|
||
|
|
return response.json();
|
||
|
|
}
|
||
|
|
`),
|
||
|
|
).toEqual([expect.objectContaining({ method: "json", endpoint: null })]);
|
||
|
|
});
|