Skip to content

Commit a9df49b

Browse files
test(frontend): add tests for RenderSubmittedMessage component
1 parent 01d308b commit a9df49b

File tree

2 files changed

+114
-1
lines changed

2 files changed

+114
-1
lines changed

frontend/relay-workflows-lib/lib/components/RenderSubmittedMessage.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ const RenderSubmittedMessageFragment = graphql`
2626
}
2727
`;
2828

29-
interface RenderSubmittedMessagePropsList {
29+
export interface RenderSubmittedMessagePropsList {
3030
result:
3131
| SubmissionGraphQLErrorMessage
3232
| SubmissionNetworkErrorMessage
Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
import { render, screen } from "@testing-library/react";
2+
import "@testing-library/jest-dom";
3+
import {
4+
RenderSubmittedMessage,
5+
RenderSubmittedMessagePropsList,
6+
} from "../../lib/components/RenderSubmittedMessage";
7+
import { RelayEnvironmentProvider, useFragment } from "react-relay";
8+
import { getRelayEnvironment } from "dashboard/src/RelayEnvironment";
9+
import { MemoryRouter } from "react-router-dom";
10+
import userEvent from "@testing-library/user-event";
11+
import { PayloadError } from "relay-runtime";
12+
import { RenderSubmittedMessageFragment$data } from "relay-workflows-lib/lib/components/__generated__/RenderSubmittedMessageFragment.graphql";
13+
14+
vi.mock("react-relay", async () => {
15+
const actual = await vi.importActual("react-relay");
16+
return {
17+
...actual,
18+
RelayEnvironmentProvider: actual.RelayEnvironmentProvider,
19+
useFragment: vi.fn(),
20+
};
21+
});
22+
23+
describe("RenderSubmittedMessage", () => {
24+
const user = userEvent.setup();
25+
26+
const renderComponent = async (props: RenderSubmittedMessagePropsList) => {
27+
const environment = await getRelayEnvironment();
28+
render(
29+
<MemoryRouter
30+
initialEntries={["/templates/mock-workflow"]}
31+
initialIndex={0}
32+
>
33+
<RelayEnvironmentProvider environment={environment}>
34+
<RenderSubmittedMessage {...props} />
35+
</RelayEnvironmentProvider>
36+
</MemoryRouter>,
37+
);
38+
};
39+
40+
it("renders a success", async () => {
41+
const mockSuccess: RenderSubmittedMessageFragment$data = {
42+
status: { __typename: "WorkflowSucceededStatus" },
43+
" $fragmentType": "RenderSubmittedMessageFragment",
44+
};
45+
46+
vi.mocked(
47+
useFragment as () => RenderSubmittedMessageFragment$data,
48+
).mockReturnValueOnce(mockSuccess);
49+
50+
const successProps: RenderSubmittedMessagePropsList = {
51+
result: { type: "success", message: "ba54321-1/mock-workflow" },
52+
index: 0,
53+
};
54+
55+
await renderComponent(successProps);
56+
57+
const link = screen.getByText("ba54321-1/mock-workflow");
58+
expect(screen.getByTestId("status-icon-succeeded")).toBeInTheDocument();
59+
expect(link).toBeInTheDocument();
60+
expect(link).toHaveAttribute("href", "/workflows/ba54321-1/mock-workflow");
61+
62+
vi.clearAllMocks();
63+
});
64+
65+
it("renders a network error", async () => {
66+
const mockError: Error = {
67+
name: "Mock Network Error",
68+
message: "This is a mock error message",
69+
};
70+
71+
const errorProps: RenderSubmittedMessagePropsList = {
72+
result: { type: "networkError", error: mockError },
73+
index: 0,
74+
};
75+
76+
await renderComponent(errorProps);
77+
78+
const accordionInfo = screen.getByText(/Submission error type/);
79+
const accordionDetails = screen.getByText(/Submission error message/);
80+
81+
expect(accordionInfo).toHaveTextContent(mockError.name);
82+
expect(accordionDetails).not.toBeVisible();
83+
84+
await user.click(accordionInfo);
85+
86+
expect(accordionDetails).toBeVisible();
87+
expect(accordionDetails).toHaveTextContent(mockError.message);
88+
});
89+
90+
it("renders a graphql error", async () => {
91+
const mockError: PayloadError = {
92+
message: "This is a graphql error",
93+
};
94+
95+
const graphqlErrorProps: RenderSubmittedMessagePropsList = {
96+
result: { type: "graphQLError", errors: [mockError] },
97+
index: 0,
98+
};
99+
100+
await renderComponent(graphqlErrorProps);
101+
102+
const accordionInfo = screen.getByText("Submission error type GraphQL");
103+
const accordionDetails = screen.getByText(/Error 0/);
104+
105+
expect(accordionInfo).toBeInTheDocument();
106+
expect(accordionDetails).not.toBeVisible();
107+
expect(accordionDetails).toHaveTextContent(mockError.message);
108+
109+
await user.click(accordionInfo);
110+
111+
expect(accordionDetails).toBeVisible();
112+
});
113+
});

0 commit comments

Comments
 (0)