Skip to content

Commit 824b581

Browse files
committed
Add Storybook for groups page
This ensures it is using the right endpoint for the add member dropdown.
1 parent 60e165c commit 824b581

File tree

5 files changed

+146
-7
lines changed

5 files changed

+146
-7
lines changed

site/src/api/queries/groups.ts

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ export const groups = (organization: string) => {
2121
} satisfies UseQueryOptions<Group[]>;
2222
};
2323

24-
const getGroupQueryKey = (organization: string, groupName: string) => [
24+
export const getGroupQueryKey = (organization: string, groupName: string) => [
2525
"organization",
2626
organization,
2727
"group",
@@ -77,9 +77,15 @@ export function groupsForUser(organization: string, userId: string) {
7777
} as const satisfies UseQueryOptions<Group[], unknown, readonly Group[]>;
7878
}
7979

80+
export const groupPermissionsKey = (groupId: string) => [
81+
"group",
82+
groupId,
83+
"permissions",
84+
];
85+
8086
export const groupPermissions = (groupId: string) => {
8187
return {
82-
queryKey: ["group", groupId, "permissions"],
88+
queryKey: groupPermissionsKey(groupId),
8389
queryFn: () =>
8490
API.checkAuthorization({
8591
checks: {

site/src/api/queries/organizations.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,10 +47,16 @@ export const deleteOrganization = (queryClient: QueryClient) => {
4747
};
4848
};
4949

50+
export const organizationMembersKey = (id: string) => [
51+
"organization",
52+
id,
53+
"members",
54+
];
55+
5056
export const organizationMembers = (id: string) => {
5157
return {
5258
queryFn: () => API.getOrganizationMembers(id),
53-
queryKey: ["organization", id, "members"],
59+
queryKey: organizationMembersKey(id),
5460
};
5561
};
5662

site/src/components/UserAutocomplete/UserAutocomplete.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ export const UserAutocomplete: FC<UserAutocompleteProps> = (props) => {
4141

4242
const usersQuery = useQuery({
4343
...users({
44-
q: filter !== undefined ? prepareQuery(encodeURI(filter)) : "",
44+
q: prepareQuery(encodeURI(filter ?? "")),
4545
limit: 25,
4646
}),
4747
enabled: filter !== undefined,
Lines changed: 129 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,129 @@
1+
import type { Meta, StoryObj } from "@storybook/react";
2+
import { userEvent, within } from "@storybook/test";
3+
import { getGroupQueryKey, groupPermissionsKey } from "api/queries/groups";
4+
import { organizationMembersKey } from "api/queries/organizations";
5+
import { reactRouterParameters } from "storybook-addon-remix-react-router";
6+
import {
7+
MockDefaultOrganization,
8+
MockGroup,
9+
MockOrganizationMember,
10+
MockOrganizationMember2,
11+
} from "testHelpers/entities";
12+
import GroupPage from "./GroupPage";
13+
14+
const meta: Meta<typeof GroupPage> = {
15+
title: "pages/OrganizationGroupsPage/GroupPage",
16+
component: GroupPage,
17+
parameters: {
18+
reactRouter: reactRouterParameters({
19+
location: {
20+
pathParams: {
21+
organization: MockDefaultOrganization.name,
22+
groupName: MockGroup.name,
23+
},
24+
},
25+
routing: { path: "/organizations/:organization/groups/:groupName" },
26+
}),
27+
},
28+
};
29+
30+
const groupQuery = (data: unknown) => ({
31+
key: getGroupQueryKey(MockDefaultOrganization.name, MockGroup.name),
32+
data,
33+
});
34+
35+
const permissionsQuery = (data: unknown, id?: string) => ({
36+
key: groupPermissionsKey(id ?? MockGroup.id),
37+
data,
38+
});
39+
40+
const membersQuery = (data: unknown) => ({
41+
key: organizationMembersKey(MockDefaultOrganization.id),
42+
data,
43+
});
44+
45+
export default meta;
46+
type Story = StoryObj<typeof GroupPage>;
47+
48+
export const LoadingGroup: Story = {
49+
parameters: {
50+
queries: [groupQuery(null), permissionsQuery({})],
51+
},
52+
};
53+
54+
// Will show a 404 because the query is not mocked.
55+
export const GroupError: Story = {
56+
parameters: {
57+
queries: [permissionsQuery({})],
58+
},
59+
};
60+
61+
export const LoadingPermissions: Story = {
62+
parameters: {
63+
queries: [groupQuery(MockGroup), permissionsQuery(null)],
64+
},
65+
};
66+
67+
export const NoUpdatePermission: Story = {
68+
parameters: {
69+
queries: [
70+
groupQuery(MockGroup),
71+
permissionsQuery({ canUpdateGroup: false }),
72+
],
73+
},
74+
};
75+
76+
export const EveryoneGroup: Story = {
77+
parameters: {
78+
queries: [
79+
groupQuery({
80+
...MockGroup,
81+
// The everyone group has the same ID as the organization.
82+
id: MockDefaultOrganization.id,
83+
}),
84+
permissionsQuery({ canUpdateGroup: true }, MockDefaultOrganization.id),
85+
],
86+
},
87+
};
88+
89+
// Will show a 404 because the query is not mocked.
90+
export const MembersError: Story = {
91+
parameters: {
92+
queries: [
93+
groupQuery(MockGroup),
94+
permissionsQuery({ canUpdateGroup: true }),
95+
],
96+
},
97+
play: async ({ canvasElement }) => {
98+
const canvas = within(canvasElement);
99+
await userEvent.click(canvas.getByRole("button", { name: "Open" }));
100+
},
101+
};
102+
103+
export const NoMembers: Story = {
104+
parameters: {
105+
queries: [
106+
groupQuery(MockGroup),
107+
permissionsQuery({ canUpdateGroup: true }),
108+
membersQuery([]),
109+
],
110+
},
111+
play: async ({ canvasElement }) => {
112+
const canvas = within(canvasElement);
113+
await userEvent.click(canvas.getByRole("button", { name: "Open" }));
114+
},
115+
};
116+
117+
export const FiltersByMembers: Story = {
118+
parameters: {
119+
queries: [
120+
groupQuery(MockGroup),
121+
permissionsQuery({ canUpdateGroup: true }),
122+
membersQuery([MockOrganizationMember, MockOrganizationMember2]),
123+
],
124+
},
125+
play: async ({ canvasElement }) => {
126+
const canvas = within(canvasElement);
127+
await userEvent.click(canvas.getByRole("button", { name: "Open" }));
128+
},
129+
};

site/src/pages/ManagementSettingsPage/GroupsPage/GroupPage.tsx

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -62,9 +62,7 @@ export const GroupPage: FC = () => {
6262
const groupQuery = useQuery(group(organization, groupName));
6363
const groupData = groupQuery.data;
6464
const { data: permissions } = useQuery(
65-
groupData !== undefined
66-
? groupPermissions(groupData.id)
67-
: { enabled: false },
65+
groupData ? groupPermissions(groupData.id) : { enabled: false },
6866
);
6967
const addMemberMutation = useMutation(addMember(queryClient));
7068
const removeMemberMutation = useMutation(removeMember(queryClient));

0 commit comments

Comments
 (0)