1
1
import { test , expect } from "@playwright/test" ;
2
- import { MockOrganization } from "testHelpers/entities" ;
3
2
import {
4
- createOrganization ,
5
3
createCustomRole ,
6
- getCurrentOrgId ,
4
+ createOrganizationWithName ,
7
5
setupApiCalls ,
6
+ deleteOrganization ,
8
7
} from "../../../api" ;
9
8
import { requiresLicense } from "../../../helpers" ;
10
9
import { beforeCoderTest } from "../../../hooks" ;
@@ -13,25 +12,81 @@ test.describe("CustomRolesPage", () => {
13
12
14
13
test . beforeEach ( async ( { page } ) => await beforeCoderTest ( page ) ) ;
15
14
16
- test ( "create custom role" , async ( { page } ) => {
15
+ test ( "create custom role and cancel edit changes " , async ( { page } ) => {
17
16
requiresLicense ( ) ;
18
17
await setupApiCalls ( page ) ;
19
18
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
+
21
49
const customRole = await createCustomRole ( org . id , "custom-role-test-1" , "Custom Role Test 1" ) ;
22
50
23
51
await page . goto ( `/organizations/${ org . name } /roles` ) ;
24
52
const roleRow = page . getByTestId ( `role-${ customRole . name } ` ) ;
25
53
await expect ( roleRow . getByText ( customRole . display_name ) ) . toBeVisible ( ) ;
26
54
await expect ( roleRow . getByText ( "organization_member" ) ) . toBeVisible ( ) ;
27
55
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" ) ;
28
82
} ) ;
29
83
30
84
test ( "displays built-in role without edit/delete options" , async ( { page } ) => {
31
85
requiresLicense ( ) ;
32
86
await setupApiCalls ( page ) ;
33
87
34
- const org = await createOrganization ( ) ;
88
+ const org = await createOrganizationWithName ( "developers" ) ;
89
+
35
90
await page . goto ( `/organizations/${ org . name } /roles` ) ;
36
91
37
92
const roleRow = page . getByTestId ( "role-organization-admin" ) ;
@@ -41,74 +96,63 @@ test.describe("CustomRolesPage", () => {
41
96
42
97
// Verify that the more menu (three dots) is not present for built-in roles
43
98
await expect ( roleRow . getByRole ( "button" , { name : "More options" } ) ) . not . toBeVisible ( ) ;
99
+
100
+ await deleteOrganization ( "developers" ) ;
44
101
} ) ;
45
102
46
- test ( "can navigate to create custom role" , async ( { page } ) => {
103
+ test ( "create custom role with UI " , async ( { page } ) => {
47
104
requiresLicense ( ) ;
48
105
await setupApiCalls ( page ) ;
49
106
50
- const org = await createOrganization ( ) ;
107
+ const org = await createOrganizationWithName ( "developers" ) ;
108
+
51
109
await page . goto ( `/organizations/${ org . name } /roles` ) ;
52
110
53
111
await page . getByRole ( "link" , { name : "Create custom role" } ) . first ( ) . click ( ) ;
112
+
54
113
await expect ( page ) . toHaveURL ( `/organizations/${ org . name } /roles/create` ) ;
55
- } ) ;
56
114
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 ) ;
60
118
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 ) ;
64
122
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 ( ) ;
67
124
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` ) ;
72
126
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 ( ) ;
76
130
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
+ } ) ;
80
133
81
- // await expect(page.getByText("Custom role deleted successfully!")).toBeVisible();
82
- // });
134
+ test ( "delete custom role" , async ( { page } ) => {
135
+ requiresLicense ( ) ;
136
+ await setupApiCalls ( page ) ;
83
137
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` ) ;
96
141
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 ( )
102
144
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 ( ) ;
108
147
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
+ } ) ;
112
156
113
157
// test("shows paywall when custom roles not enabled", async ({ page }) => {
114
158
// // Mock feature flags to disable custom roles
0 commit comments