Skip to content

Commit ab42630

Browse files
committed
feat: add custom roles e2e tests
1 parent c2268e4 commit ab42630

File tree

1 file changed

+98
-54
lines changed

1 file changed

+98
-54
lines changed

site/e2e/tests/organizations/customRoles/customRoles.spec.ts

Lines changed: 98 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
11
import { test, expect } from "@playwright/test";
2-
import { MockOrganization } from "testHelpers/entities";
32
import {
4-
createOrganization,
53
createCustomRole,
6-
getCurrentOrgId,
4+
createOrganizationWithName,
75
setupApiCalls,
6+
deleteOrganization,
87
} from "../../../api";
98
import { requiresLicense } from "../../../helpers";
109
import { beforeCoderTest } from "../../../hooks";
@@ -13,25 +12,81 @@ test.describe("CustomRolesPage", () => {
1312

1413
test.beforeEach(async ({ page }) => await beforeCoderTest(page));
1514

16-
test("create custom role", async ({ page }) => {
15+
test("create custom role and cancel edit changes", async ({ page }) => {
1716
requiresLicense();
1817
await setupApiCalls(page);
1918

20-
const org = await createOrganization();
19+
const org = await createOrganizationWithName("developers");
20+
21+
const customRole = await createCustomRole(org.id, "custom-role-test-1", "Custom Role Test 1");
22+
23+
await page.goto(`/organizations/${org.name}/roles`);
24+
const roleRow = page.getByTestId(`role-${customRole.name}`);
25+
await expect(roleRow.getByText(customRole.display_name)).toBeVisible();
26+
await expect(roleRow.getByText("organization_member")).toBeVisible();
27+
28+
await roleRow.getByRole("button", { name: "More options" }).click()
29+
const menu = page.locator("#more-options");
30+
await menu.getByText("Edit").click();
31+
32+
await expect(page).toHaveURL(`/organizations/${org.name}/roles/${customRole.name}`);
33+
34+
const cancelButton = page.getByRole("button", { name: "Cancel" }).first();
35+
await expect(cancelButton).toBeVisible();
36+
await cancelButton.click();
37+
38+
await expect(page).toHaveURL(`/organizations/${org.name}/roles`);
39+
40+
await deleteOrganization("developers");
41+
});
42+
43+
test("create custom role, edit role and save changes", async ({ page }) => {
44+
requiresLicense();
45+
await setupApiCalls(page);
46+
47+
const org = await createOrganizationWithName("developers");
48+
2149
const customRole = await createCustomRole(org.id, "custom-role-test-1", "Custom Role Test 1");
2250

2351
await page.goto(`/organizations/${org.name}/roles`);
2452
const roleRow = page.getByTestId(`role-${customRole.name}`);
2553
await expect(roleRow.getByText(customRole.display_name)).toBeVisible();
2654
await expect(roleRow.getByText("organization_member")).toBeVisible();
2755

56+
await page.goto(`/organizations/${org.name}/roles/${customRole.name}`);
57+
58+
const displayNameInput = page.getByRole("textbox", { name: "Display name" });
59+
await displayNameInput.fill("Custom Role Test 2 Edited");
60+
61+
const groupCheckbox = page.getByTestId("group").getByRole("checkbox");
62+
await expect(groupCheckbox).toBeVisible();
63+
await groupCheckbox.click();
64+
65+
const organizationMemberCheckbox = page.getByTestId("organization_member").getByRole("checkbox");
66+
await expect(organizationMemberCheckbox).toBeVisible();
67+
await organizationMemberCheckbox.click();
68+
69+
const saveButton = page.getByRole("button", { name: "Save" }).first();
70+
await expect(saveButton).toBeVisible();
71+
await saveButton.click();
72+
73+
await expect(roleRow.getByText("Custom Role Test 2 Edited")).toBeVisible();
74+
75+
const roleRow2 = page.getByTestId(`role-${customRole.name}`);
76+
await expect(roleRow2.getByText("organization_member")).not.toBeVisible();
77+
await expect(roleRow2.getByText("group")).toBeVisible();
78+
79+
await expect(page).toHaveURL(`/organizations/${org.name}/roles`);
80+
81+
await deleteOrganization("developers");
2882
});
2983

3084
test("displays built-in role without edit/delete options", async ({ page }) => {
3185
requiresLicense();
3286
await setupApiCalls(page);
3387

34-
const org = await createOrganization();
88+
const org = await createOrganizationWithName("developers");
89+
3590
await page.goto(`/organizations/${org.name}/roles`);
3691

3792
const roleRow = page.getByTestId("role-organization-admin");
@@ -41,74 +96,63 @@ test.describe("CustomRolesPage", () => {
4196

4297
// Verify that the more menu (three dots) is not present for built-in roles
4398
await expect(roleRow.getByRole("button", { name: "More options" })).not.toBeVisible();
99+
100+
await deleteOrganization("developers");
44101
});
45102

46-
test("can navigate to create custom role", async ({ page }) => {
103+
test("create custom role with UI", async ({ page }) => {
47104
requiresLicense();
48105
await setupApiCalls(page);
49106

50-
const org = await createOrganization();
107+
const org = await createOrganizationWithName("developers");
108+
51109
await page.goto(`/organizations/${org.name}/roles`);
52110

53111
await page.getByRole("link", { name: "Create custom role" }).first().click();
112+
54113
await expect(page).toHaveURL(`/organizations/${org.name}/roles/create`);
55-
});
56114

57-
// test("delete custom role", async ({ page }) => {
58-
// requiresLicense();
59-
// await setupApiCalls(page);
115+
const customRoleName = "custom-role-test";
116+
const roleNameInput = page.getByRole("textbox", { exact: true, name: "Name" });
117+
await roleNameInput.fill(customRoleName);
60118

61-
// const org = await createOrganization();
62-
// const customRole = await createCustomRole(org.id, "custom-role-test-1", "Custom Role Test 1");
63-
// await page.goto(`/organizations/${org.name}/roles`);
119+
const customRoleDisplayName = "Custom Role Test";
120+
const displayNameInput = page.getByRole("textbox", { exact: true, name: "Display Name" });
121+
await displayNameInput.fill(customRoleDisplayName);
64122

65-
// // const roleRow = page.getByTestId("role-custom-role-test-1");
66-
// await page.getByRole("button", { name: "More options" }).click();
123+
await page.getByRole("button", { name: "Create Role" }).first().click();
67124

68-
// // Check menu items
69-
// await expect(page.getByRole("menuitem", { name: "Edit" })).toBeVisible();
70-
// await expect(page.getByText("Edit")).toBeVisible();
71-
// // const menu = page.getByRole("menu");
125+
await expect(page).toHaveURL(`/organizations/${org.name}/roles`);
72126

73-
// const deleteButton = page.getByRole("menuitem", { name: "Delete…" });
74-
// await expect(deleteButton).toBeVisible();
75-
// await deleteButton.click();
127+
const roleRow = page.getByTestId(`role-${customRoleName}`);
128+
await expect(roleRow.getByText(customRoleDisplayName)).toBeVisible();
129+
await expect(roleRow.getByText("None")).toBeVisible();
76130

77-
// const input = page.getByRole("textbox");
78-
// await input.fill(customRole.name);
79-
// await page.getByRole("button", { name: "Delete" }).click();
131+
await deleteOrganization("developers");
132+
});
80133

81-
// await expect(page.getByText("Custom role deleted successfully!")).toBeVisible();
82-
// });
134+
test("delete custom role", async ({ page }) => {
135+
requiresLicense();
136+
await setupApiCalls(page);
83137

84-
// test("shows delete confirmation dialog", async ({ page }) => {
85-
// // Click delete option
86-
// const roleRow = page.getByTestId("role-custom-role-test-1");
87-
// await roleRow.getByRole("button", { name: "More options" }).click();
88-
// await page.getByRole("menuitem", { name: "Delete…" }).click();
89-
90-
// // Check dialog content
91-
// await expect(page.getByRole("dialog")).toBeVisible();
92-
// await expect(page.getByText(/Are you sure you want to delete/)).toBeVisible();
93-
// await expect(page.getByRole("button", { name: "Cancel" })).toBeVisible();
94-
// await expect(page.getByRole("button", { name: "Delete" })).toBeVisible();
95-
// });
138+
const org = await createOrganizationWithName("developers");
139+
const customRole = await createCustomRole(org.id, "custom-role-test-1", "Custom Role Test 1");
140+
await page.goto(`/organizations/${org.name}/roles`);
96141

97-
// test("handles delete role successfully", async ({ page }) => {
98-
// // Mock delete API call
99-
// await page.route("**/api/v2/organizations/*/roles/*", (route) =>
100-
// route.fulfill(createMockApiResponse({}))
101-
// );
142+
const roleRow = page.getByTestId(`role-${customRole.name}`);
143+
await roleRow.getByRole("button", { name: "More options" }).click()
102144

103-
// // Perform delete
104-
// const roleRow = page.getByTestId("role-custom-role-test-1");
105-
// await roleRow.getByRole("button", { name: "More options" }).click();
106-
// await page.getByRole("menuitem", { name: "Delete…" }).click();
107-
// await page.getByRole("button", { name: "Delete" }).click();
145+
const menu = page.locator("#more-options");
146+
await menu.getByText("Delete…").click();
108147

109-
// // Check success message
110-
// await expect(page.getByText("Custom role deleted successfully!")).toBeVisible();
111-
// });
148+
const input = page.getByRole("textbox");
149+
await input.fill(customRole.name);
150+
await page.getByRole("button", { name: "Delete" }).click();
151+
152+
await expect(page.getByText("Custom role deleted successfully!")).toBeVisible();
153+
154+
await deleteOrganization("developers");
155+
});
112156

113157
// test("shows paywall when custom roles not enabled", async ({ page }) => {
114158
// // Mock feature flags to disable custom roles

0 commit comments

Comments
 (0)