Skip to content

Commit c1f1b1c

Browse files
committed
chore: Add publisher members tests
1 parent e9385fb commit c1f1b1c

3 files changed

Lines changed: 135 additions & 1 deletion

File tree

Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
import { RecoilRoot } from "recoil";
2+
import { QueryClient, QueryClientProvider } from "react-query";
3+
import { BrowserRouter } from "react-router-dom";
4+
import { setupServer } from "msw/node";
5+
import { render, screen, waitFor } from "@testing-library/react";
6+
import userEvent from "@testing-library/user-event";
7+
import "@testing-library/jest-dom";
8+
9+
import {
10+
RecoilObserver,
11+
brandStoreRequests,
12+
storesResponse,
13+
} from "../../../test-utils";
14+
import { brandStoresState } from "../../../state/brandStoreState";
15+
16+
import Members from "../Members";
17+
18+
import type { MutableSnapshot } from "recoil";
19+
20+
jest.mock("react-router-dom", () => ({
21+
...jest.requireActual("react-router-dom"),
22+
useParams: () => ({
23+
id: "test-store-id",
24+
}),
25+
}));
26+
27+
function renderComponent() {
28+
const queryClient = new QueryClient();
29+
30+
render(
31+
<RecoilRoot
32+
initializeState={(snapshot: MutableSnapshot) => {
33+
return snapshot.set(brandStoresState, storesResponse);
34+
}}
35+
>
36+
<QueryClientProvider client={queryClient}>
37+
<BrowserRouter>
38+
<RecoilObserver node={brandStoresState} event={jest.fn()} />
39+
<Members />
40+
</BrowserRouter>
41+
</QueryClientProvider>
42+
</RecoilRoot>,
43+
);
44+
}
45+
46+
const server = setupServer();
47+
48+
beforeAll(() => {
49+
server.listen();
50+
});
51+
52+
beforeEach(() => {
53+
brandStoreRequests(server);
54+
});
55+
56+
afterEach(() => {
57+
server.resetHandlers();
58+
});
59+
60+
afterAll(() => {
61+
server.close();
62+
});
63+
64+
describe("Members", () => {
65+
test("shows correct store name in title", async () => {
66+
renderComponent();
67+
68+
await waitFor(() => {
69+
expect(
70+
screen.getByRole("heading", { level: 1, name: "Test store / Members" }),
71+
).toBeInTheDocument();
72+
});
73+
});
74+
75+
test("shows members table", async () => {
76+
renderComponent();
77+
78+
await waitFor(() => {
79+
expect(screen.getByText(/2 members/)).toBeInTheDocument();
80+
});
81+
});
82+
83+
test("shows invites table", async () => {
84+
renderComponent();
85+
86+
await waitFor(() => {
87+
expect(screen.getByText(/2 invites/)).toBeInTheDocument();
88+
});
89+
});
90+
91+
test("filters members table", async () => {
92+
renderComponent();
93+
94+
const user = userEvent.setup();
95+
96+
await waitFor(() => {
97+
user.type(screen.getByLabelText("Search and filter"), "joh");
98+
});
99+
100+
await waitFor(() => {
101+
expect(screen.getAllByText("john.doe@canonical.com")).toHaveLength(2);
102+
expect(screen.getAllByText("jane.doe@canonical.com")).toHaveLength(1);
103+
});
104+
});
105+
});

static/js/publisher/test-utils/brand-store-requests.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import {
66
membersResponse,
77
storesResponse,
88
searchResponse,
9+
invitesResponse,
910
} from "./brand-store-responses";
1011

1112
// @ts-expect-error - Unknown type
@@ -28,6 +29,12 @@ function brandStoreRequests(server) {
2829
}),
2930
);
3031

32+
server.use(
33+
http.get("/api/store/test-store-id/invites", () => {
34+
return HttpResponse.json(invitesResponse);
35+
}),
36+
);
37+
3138
server.use(
3239
http.get("/api/stores", () => {
3340
return HttpResponse.json({

static/js/publisher/test-utils/brand-store-responses.ts

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import type { Snap, Member, Store } from "../types/shared";
1+
import type { Snap, Member, Store, Invite } from "../types/shared";
22

33
export const accountResponse = {
44
publisher: {
@@ -86,6 +86,13 @@ export const membersResponse = [
8686
roles: ["admin", "review", "view", "access"],
8787
username: "johndoe",
8888
},
89+
{
90+
displayname: "Jane Doe",
91+
email: "jane.doe@canonical.com",
92+
id: "jane-doe-id",
93+
roles: ["admin"],
94+
username: "janedoe",
95+
},
8996
] as Member[];
9097

9198
export const storesResponse = [
@@ -126,3 +133,18 @@ export const searchResponse = [
126133
],
127134
},
128135
] as Snap[];
136+
137+
export const invitesResponse = [
138+
{
139+
email: "john.doe@canonical.com",
140+
"expiration-date": "2025-04-13T12:40:55Z",
141+
roles: ["admin"],
142+
status: "Expired",
143+
},
144+
{
145+
email: "jane.doe@canonical.com",
146+
"expiration-date": "2025-04-13T12:40:55Z",
147+
roles: ["view"],
148+
status: "Pending",
149+
},
150+
] as Invite[];

0 commit comments

Comments
 (0)