Skip to content

Commit c2268e4

Browse files
committed
feat: wip
1 parent e4597ed commit c2268e4

File tree

2 files changed

+160
-0
lines changed

2 files changed

+160
-0
lines changed

site/e2e/api.ts

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,39 @@ export const createOrganizationSyncSettings = async () => {
9090
organization_assign_default: true,
9191
});
9292
return settings;
93+
}
94+
95+
export const createCustomRole = async (orgId: string, name: string, displayName: string) => {
96+
const role = await API.createOrganizationRole(orgId, {
97+
name,
98+
display_name: displayName,
99+
organization_id: orgId,
100+
site_permissions: [],
101+
organization_permissions: [
102+
{
103+
negate: false,
104+
resource_type: "organization_member",
105+
action: "create",
106+
},
107+
{
108+
negate: false,
109+
resource_type: "organization_member",
110+
action: "delete",
111+
},
112+
{
113+
negate: false,
114+
resource_type: "organization_member",
115+
action: "read",
116+
},
117+
{
118+
negate: false,
119+
resource_type: "organization_member",
120+
action: "update",
121+
},
122+
],
123+
user_permissions: [],
124+
});
125+
return role;
93126
};
94127

95128
export async function verifyConfigFlagBoolean(
Lines changed: 127 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,127 @@
1+
import { test, expect } from "@playwright/test";
2+
import { MockOrganization } from "testHelpers/entities";
3+
import {
4+
createOrganization,
5+
createCustomRole,
6+
getCurrentOrgId,
7+
setupApiCalls,
8+
} from "../../../api";
9+
import { requiresLicense } from "../../../helpers";
10+
import { beforeCoderTest } from "../../../hooks";
11+
12+
test.describe("CustomRolesPage", () => {
13+
14+
test.beforeEach(async ({ page }) => await beforeCoderTest(page));
15+
16+
test("create custom role", async ({ page }) => {
17+
requiresLicense();
18+
await setupApiCalls(page);
19+
20+
const org = await createOrganization();
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+
});
29+
30+
test("displays built-in role without edit/delete options", async ({ page }) => {
31+
requiresLicense();
32+
await setupApiCalls(page);
33+
34+
const org = await createOrganization();
35+
await page.goto(`/organizations/${org.name}/roles`);
36+
37+
const roleRow = page.getByTestId("role-organization-admin");
38+
await expect(roleRow).toBeVisible();
39+
40+
await expect(roleRow.getByText("Organization Admin")).toBeVisible();
41+
42+
// Verify that the more menu (three dots) is not present for built-in roles
43+
await expect(roleRow.getByRole("button", { name: "More options" })).not.toBeVisible();
44+
});
45+
46+
test("can navigate to create custom role", async ({ page }) => {
47+
requiresLicense();
48+
await setupApiCalls(page);
49+
50+
const org = await createOrganization();
51+
await page.goto(`/organizations/${org.name}/roles`);
52+
53+
await page.getByRole("link", { name: "Create custom role" }).first().click();
54+
await expect(page).toHaveURL(`/organizations/${org.name}/roles/create`);
55+
});
56+
57+
// test("delete custom role", async ({ page }) => {
58+
// requiresLicense();
59+
// await setupApiCalls(page);
60+
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`);
64+
65+
// // const roleRow = page.getByTestId("role-custom-role-test-1");
66+
// await page.getByRole("button", { name: "More options" }).click();
67+
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");
72+
73+
// const deleteButton = page.getByRole("menuitem", { name: "Delete…" });
74+
// await expect(deleteButton).toBeVisible();
75+
// await deleteButton.click();
76+
77+
// const input = page.getByRole("textbox");
78+
// await input.fill(customRole.name);
79+
// await page.getByRole("button", { name: "Delete" }).click();
80+
81+
// await expect(page.getByText("Custom role deleted successfully!")).toBeVisible();
82+
// });
83+
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+
// });
96+
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+
// );
102+
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();
108+
109+
// // Check success message
110+
// await expect(page.getByText("Custom role deleted successfully!")).toBeVisible();
111+
// });
112+
113+
// test("shows paywall when custom roles not enabled", async ({ page }) => {
114+
// // Mock feature flags to disable custom roles
115+
// await page.route("**/api/v2/features", (route) =>
116+
// route.fulfill(createMockApiResponse({
117+
// custom_roles: false
118+
// }))
119+
// );
120+
121+
// await page.reload();
122+
123+
// // Check paywall content
124+
// await expect(page.getByText("Upgrade to a premium license to create a custom role")).toBeVisible();
125+
// await expect(page.getByRole("link", { name: "Create custom role" })).not.toBeVisible();
126+
// });
127+
});

0 commit comments

Comments
 (0)