Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Add Storybook for groups page
This ensures it is using the right endpoint for the add member dropdown.
  • Loading branch information
code-asher committed Aug 23, 2024
commit fd02c23fb689db47bbce07ba40630f836b9b9403
10 changes: 8 additions & 2 deletions site/src/api/queries/groups.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ export const groups = (organization: string) => {
} satisfies UseQueryOptions<Group[]>;
};

const getGroupQueryKey = (organization: string, groupName: string) => [
export const getGroupQueryKey = (organization: string, groupName: string) => [
"organization",
organization,
"group",
Expand Down Expand Up @@ -77,9 +77,15 @@ export function groupsForUser(organization: string, userId: string) {
} as const satisfies UseQueryOptions<Group[], unknown, readonly Group[]>;
}

export const groupPermissionsKey = (groupId: string) => [
"group",
groupId,
"permissions",
];

export const groupPermissions = (groupId: string) => {
return {
queryKey: ["group", groupId, "permissions"],
queryKey: groupPermissionsKey(groupId),
queryFn: () =>
API.checkAuthorization({
checks: {
Expand Down
8 changes: 7 additions & 1 deletion site/src/api/queries/organizations.ts
Original file line number Diff line number Diff line change
Expand Up @@ -47,10 +47,16 @@ export const deleteOrganization = (queryClient: QueryClient) => {
};
};

export const organizationMembersKey = (id: string) => [
"organization",
id,
"members",
];

export const organizationMembers = (id: string) => {
return {
queryFn: () => API.getOrganizationMembers(id),
queryKey: ["organization", id, "members"],
queryKey: organizationMembersKey(id),
};
};

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ export const UserAutocomplete: FC<UserAutocompleteProps> = (props) => {

const usersQuery = useQuery({
...users({
q: filter !== undefined ? prepareQuery(encodeURI(filter)) : "",
q: prepareQuery(encodeURI(filter ?? "")),
limit: 25,
}),
enabled: filter !== undefined,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,132 @@
import type { Meta, StoryObj } from "@storybook/react";
import { userEvent, within } from "@storybook/test";
import { getGroupQueryKey, groupPermissionsKey } from "api/queries/groups";
import { organizationMembersKey } from "api/queries/organizations";
import { reactRouterParameters } from "storybook-addon-remix-react-router";
import {
MockDefaultOrganization,
MockGroup,
MockOrganizationMember,
MockOrganizationMember2,
} from "testHelpers/entities";
import GroupPage from "./GroupPage";

const meta: Meta<typeof GroupPage> = {
title: "pages/OrganizationGroupsPage/GroupPage",
component: GroupPage,
parameters: {
reactRouter: reactRouterParameters({
location: {
pathParams: {
organization: MockDefaultOrganization.name,
groupName: MockGroup.name,
},
},
routing: { path: "/organizations/:organization/groups/:groupName" },
}),
},
};

const groupQuery = (data: unknown) => ({
key: getGroupQueryKey(MockDefaultOrganization.name, MockGroup.name),
data,
});

const permissionsQuery = (data: unknown, id?: string) => ({
key: groupPermissionsKey(id ?? MockGroup.id),
data,
});

const membersQuery = (data: unknown) => ({
key: organizationMembersKey(MockDefaultOrganization.id),
data,
});

export default meta;
type Story = StoryObj<typeof GroupPage>;

export const LoadingGroup: Story = {
parameters: {
queries: [groupQuery(null), permissionsQuery({})],
},
};

// Will show a 404 because the query is not mocked.
export const GroupError: Story = {
parameters: {
queries: [permissionsQuery({})],
},
};

export const LoadingPermissions: Story = {
parameters: {
queries: [groupQuery(MockGroup), permissionsQuery(null)],
},
};

export const NoUpdatePermission: Story = {
parameters: {
queries: [
groupQuery(MockGroup),
permissionsQuery({ canUpdateGroup: false }),
],
},
};

export const EveryoneGroup: Story = {
parameters: {
queries: [
groupQuery({
...MockGroup,
// The everyone group has the same ID as the organization.
id: MockDefaultOrganization.id,
}),
permissionsQuery({ canUpdateGroup: true }, MockDefaultOrganization.id),
],
},
};

// Will show a 404 because the query is not mocked.
export const MembersError: Story = {
parameters: {
queries: [
groupQuery(MockGroup),
permissionsQuery({ canUpdateGroup: true }),
],
},
play: async ({ canvasElement }) => {
const canvas = within(canvasElement);
await userEvent.click(canvas.getByRole("button", { name: "Open" }));
},
};

export const NoMembers: Story = {
parameters: {
queries: [
groupQuery({
...MockGroup,
members: [],
}),
permissionsQuery({ canUpdateGroup: true }),
membersQuery([]),
],
},
play: async ({ canvasElement }) => {
const canvas = within(canvasElement);
await userEvent.click(canvas.getByRole("button", { name: "Open" }));
},
};

export const FiltersByMembers: Story = {
parameters: {
queries: [
groupQuery(MockGroup),
permissionsQuery({ canUpdateGroup: true }),
membersQuery([MockOrganizationMember, MockOrganizationMember2]),
],
},
play: async ({ canvasElement }) => {
const canvas = within(canvasElement);
await userEvent.click(canvas.getByRole("button", { name: "Open" }));
},
};
Original file line number Diff line number Diff line change
Expand Up @@ -62,9 +62,7 @@ export const GroupPage: FC = () => {
const groupQuery = useQuery(group(organization, groupName));
const groupData = groupQuery.data;
const { data: permissions } = useQuery(
groupData !== undefined
? groupPermissions(groupData.id)
: { enabled: false },
groupData ? groupPermissions(groupData.id) : { enabled: false },
);
const addMemberMutation = useMutation(addMember(queryClient));
const removeMemberMutation = useMutation(removeMember(queryClient));
Expand Down
Loading