Add test for empty result view bug

This commit is contained in:
Koen Vlaswinkel
2023-04-06 14:09:09 +02:00
parent 2a4a91207a
commit 84928fa2fe

View File

@@ -1,5 +1,5 @@
import * as React from "react"; import * as React from "react";
import { render as reactRender, screen } from "@testing-library/react"; import { act, render as reactRender, screen } from "@testing-library/react";
import { ResultsApp } from "../results"; import { ResultsApp } from "../results";
import { import {
Interpretation, Interpretation,
@@ -20,18 +20,20 @@ const exampleSarif = fs.readJSONSync(
describe(ResultsApp.name, () => { describe(ResultsApp.name, () => {
const render = () => reactRender(<ResultsApp />); const render = () => reactRender(<ResultsApp />);
const postMessage = async (msg: IntoResultsViewMsg) => { const postMessage = async (msg: IntoResultsViewMsg) => {
// window.postMessage doesn't set the origin correctly, see await act(async () => {
// https://github.com/jsdom/jsdom/issues/2745 // window.postMessage doesn't set the origin correctly, see
window.dispatchEvent( // https://github.com/jsdom/jsdom/issues/2745
new MessageEvent("message", { window.dispatchEvent(
source: window, new MessageEvent("message", {
origin: window.location.origin, source: window,
data: msg, origin: window.location.origin,
}), data: msg,
); }),
);
// The event is dispatched asynchronously, so we need to wait for it to be handled. // The event is dispatched asynchronously, so we need to wait for it to be handled.
await new Promise((resolve) => setTimeout(resolve, 0)); await new Promise((resolve) => setTimeout(resolve, 0));
});
}; };
it("renders results", async () => { it("renders results", async () => {
@@ -95,6 +97,7 @@ describe(ResultsApp.name, () => {
}, },
}, },
}; };
await postMessage(message); await postMessage(message);
expect( expect(
@@ -117,4 +120,84 @@ describe(ResultsApp.name, () => {
screen.getByText("'x' is assigned a value but never used."), screen.getByText("'x' is assigned a value but never used."),
).toBeInTheDocument(); ).toBeInTheDocument();
}); });
it("renders results when switching between queries with different result set names", async () => {
render();
await postMessage({
t: "setState",
interpretation: undefined,
origResultsPaths: {
resultsPath: "/a/b/c/results.bqrs",
interpretedResultsPath: "/a/b/c/interpretedResults.sarif",
},
resultsPath: "/a/b/c/results.bqrs",
parsedResultSets: {
pageNumber: 0,
pageSize: 200,
numPages: 1,
numInterpretedPages: 0,
resultSet: {
schema: {
name: "#select",
rows: 1,
columns: [{ kind: "s" }],
pagination: { "step-size": 200, offsets: [13] },
},
rows: [["foobar1"]],
t: "RawResultSet",
},
resultSetNames: ["#select"],
},
sortedResultsMap: {},
database: {
name: "test-db",
databaseUri: "test-db-uri",
},
shouldKeepOldResultsWhileRendering: false,
metadata: {},
queryName: "empty.ql",
queryPath: "/a/b/c/empty.ql",
});
expect(screen.getByText("foobar1")).toBeInTheDocument();
await postMessage({
t: "setState",
interpretation: undefined,
origResultsPaths: {
resultsPath: "/a/b/c/results.bqrs",
interpretedResultsPath: "/a/b/c/interpretedResults.sarif",
},
resultsPath: "/a/b/c/results.bqrs",
parsedResultSets: {
pageNumber: 0,
pageSize: 200,
numPages: 1,
numInterpretedPages: 0,
resultSet: {
schema: {
name: "#Quick_evaluation_of_expression",
rows: 1,
columns: [{ name: "#expr_result", kind: "s" }],
pagination: { "step-size": 200, offsets: [49] },
},
rows: [["foobar2"]],
t: "RawResultSet",
},
resultSetNames: ["#Quick_evaluation_of_expression"],
},
sortedResultsMap: {},
database: {
name: "test-db",
databaseUri: "test-db-uri",
},
shouldKeepOldResultsWhileRendering: false,
metadata: {},
queryName: "Quick evaluation of empty.ql:1",
queryPath: "/a/b/c/empty.ql",
});
expect(screen.getByText("foobar2")).toBeInTheDocument();
});
}); });