Skip to content

Commit effe2da

Browse files
committed
test(frontend): add tests for RetriggerWorkflow
1 parent 42ad220 commit effe2da

File tree

3 files changed

+80
-2
lines changed

3 files changed

+80
-2
lines changed

frontend/relay-workflows-lib/lib/query-components/RetriggerWorkflow.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import React from "react";
22
import Tooltip from "@mui/material/Tooltip";
33
import RefreshIcon from "@mui/icons-material/Refresh";
44
import { graphql } from "relay-runtime";
5-
import { useLazyLoadQuery } from "react-relay/hooks";
5+
import { useLazyLoadQuery } from "react-relay";
66
import { NavLink } from "react-router-dom";
77
import { RetriggerWorkflowQuery as RetriggerWorkflowQueryType } from "./__generated__/RetriggerWorkflowQuery.graphql";
88
import { Visit, visitToText } from "@diamondlightsource/sci-react-ui";
@@ -57,7 +57,7 @@ const RetriggerWorkflowBase: React.FC<RetriggerWorkflowProps> = ({
5757
);
5858
};
5959

60-
const RetriggerWorkflow: React.FC<RetriggerWorkflowProps> = (props) => (
60+
export const RetriggerWorkflow: React.FC<RetriggerWorkflowProps> = (props) => (
6161
<WorkflowsErrorBoundary fallback={<NoTemplateIcon />}>
6262
<RetriggerWorkflowBase {...props} />
6363
</WorkflowsErrorBoundary>
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
import { render, screen } from "@testing-library/react";
2+
import "@testing-library/jest-dom";
3+
import { RelayEnvironmentProvider } from "react-relay";
4+
import { getRelayEnvironment } from "dashboard/src/RelayEnvironment";
5+
import { MemoryRouter } from "react-router-dom";
6+
import { RetriggerWorkflowQuery$data } from "../../lib/query-components/__generated__/RetriggerWorkflowQuery.graphql";
7+
import { RetriggerWorkflow } from "../../lib/query-components/RetriggerWorkflow";
8+
import { mockLazyLoadQuery } from "../test-utils";
9+
10+
vi.mock("react-relay", async () => {
11+
const actual = await vi.importActual("react-relay");
12+
return {
13+
...actual,
14+
RelayEnvironmentProvider: actual.RelayEnvironmentProvider,
15+
useLazyLoadQuery: vi.fn(),
16+
};
17+
});
18+
19+
describe("RetriggerWorkflow", () => {
20+
afterEach(() => {
21+
vi.clearAllMocks();
22+
});
23+
const renderComponent = async () => {
24+
const environment = await getRelayEnvironment();
25+
render(
26+
<MemoryRouter initialEntries={["/workflows/abc1234-1"]}>
27+
<RelayEnvironmentProvider environment={environment}>
28+
<RetriggerWorkflow
29+
instrumentSession={{
30+
proposalCode: "abc",
31+
proposalNumber: 1234,
32+
number: 1,
33+
}}
34+
workflowName="mock-workflow"
35+
/>
36+
</RelayEnvironmentProvider>
37+
</MemoryRouter>,
38+
);
39+
};
40+
41+
it("renders a link to previous workflow submission page", async () => {
42+
mockLazyLoadQuery<RetriggerWorkflowQuery$data>({
43+
workflow: {
44+
templateRef: "mock-template",
45+
},
46+
});
47+
48+
await renderComponent();
49+
50+
const icon = await screen.findByTestId("RefreshIcon");
51+
expect(icon).toBeInTheDocument();
52+
const link = screen.getByRole("link", { name: "Rerun workflow" });
53+
expect(link).toBeInTheDocument();
54+
expect(link).toHaveAttribute(
55+
"href",
56+
"/templates/mock-template/abc1234-1-mock-workflow",
57+
);
58+
});
59+
60+
it("renders no template icon", async () => {
61+
mockLazyLoadQuery<RetriggerWorkflowQuery$data>({
62+
workflow: {
63+
templateRef: null,
64+
},
65+
});
66+
67+
await renderComponent();
68+
69+
const icon = await screen.findByTestId("RefreshIcon");
70+
expect(icon).toBeInTheDocument();
71+
expect(screen.getByLabelText("No template found")).toBeInTheDocument();
72+
});
73+
});
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import { useLazyLoadQuery } from "react-relay";
2+
3+
export function mockLazyLoadQuery<T>(response: T) {
4+
vi.mocked(useLazyLoadQuery as () => T).mockReturnValueOnce(response);
5+
}

0 commit comments

Comments
 (0)