Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit202f7f7

Browse files
authored
feat: create e2e tests for organization custom roles page (#15814)
Adds 5 premium tests and 1 non-premium test.
1 parent4c939a6 commit202f7f7

File tree

4 files changed

+253
-5
lines changed

4 files changed

+253
-5
lines changed

‎site/e2e/api.ts‎

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,43 @@ export const createOrganizationSyncSettings = async () => {
9393
returnsettings;
9494
};
9595

96+
exportconstcreateCustomRole=async(
97+
orgId:string,
98+
name:string,
99+
displayName:string,
100+
)=>{
101+
constrole=awaitAPI.createOrganizationRole(orgId,{
102+
name,
103+
display_name:displayName,
104+
organization_id:orgId,
105+
site_permissions:[],
106+
organization_permissions:[
107+
{
108+
negate:false,
109+
resource_type:"organization_member",
110+
action:"create",
111+
},
112+
{
113+
negate:false,
114+
resource_type:"organization_member",
115+
action:"delete",
116+
},
117+
{
118+
negate:false,
119+
resource_type:"organization_member",
120+
action:"read",
121+
},
122+
{
123+
negate:false,
124+
resource_type:"organization_member",
125+
action:"update",
126+
},
127+
],
128+
user_permissions:[],
129+
});
130+
returnrole;
131+
};
132+
96133
exportasyncfunctionverifyConfigFlagBoolean(
97134
page:Page,
98135
config:DeploymentConfig,

‎site/e2e/helpers.ts‎

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,10 @@ export function requiresLicense() {
4949
test.skip(!license);
5050
}
5151

52+
exportfunctionrequiresUnlicensed(){
53+
test.skip(license.length>0);
54+
}
55+
5256
/**
5357
* requireTerraformProvisioner by default is enabled.
5458
*/

‎site/e2e/tests/deployment/idpOrgSync.spec.ts‎

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import {
55
deleteOrganization,
66
setupApiCalls,
77
}from"../../api";
8-
import{requiresLicense}from"../../helpers";
8+
import{randomName,requiresLicense}from"../../helpers";
99
import{beforeCoderTest}from"../../hooks";
1010

1111
test.describe("IdpOrgSyncPage",()=>{
@@ -123,7 +123,9 @@ test.describe("IdpOrgSyncPage", () => {
123123
requiresLicense();
124124
awaitsetupApiCalls(page);
125125

126-
awaitcreateOrganizationWithName("developers");
126+
constorgName=randomName();
127+
128+
awaitcreateOrganizationWithName(orgName);
127129

128130
awaitpage.goto("/deployment/idp-org-sync",{
129131
waitUntil:"domcontentloaded",
@@ -141,7 +143,7 @@ test.describe("IdpOrgSyncPage", () => {
141143

142144
// Select Coder organization from combobox
143145
awaitorgSelector.click();
144-
awaitpage.getByRole("option",{name:"developers"}).click();
146+
awaitpage.getByRole("option",{name:orgName}).click();
145147

146148
// Add button should now be enabled
147149
awaitexpect(addButton).toBeEnabled();
@@ -152,12 +154,12 @@ test.describe("IdpOrgSyncPage", () => {
152154
constnewRow=page.getByTestId("idp-org-new-idp-org");
153155
awaitexpect(newRow).toBeVisible();
154156
awaitexpect(newRow.getByText("new-idp-org")).toBeVisible();
155-
awaitexpect(newRow.getByText("developers")).toBeVisible();
157+
awaitexpect(newRow.getByText(orgName)).toBeVisible();
156158

157159
awaitexpect(
158160
page.getByText("Organization sync settings updated."),
159161
).toBeVisible();
160162

161-
awaitdeleteOrganization("developers");
163+
awaitdeleteOrganization(orgName);
162164
});
163165
});
Lines changed: 205 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,205 @@
1+
import{expect,test}from"@playwright/test";
2+
import{
3+
createCustomRole,
4+
createOrganizationWithName,
5+
deleteOrganization,
6+
setupApiCalls,
7+
}from"../../../api";
8+
import{
9+
randomName,
10+
requiresLicense,
11+
requiresUnlicensed,
12+
}from"../../../helpers";
13+
import{beforeCoderTest}from"../../../hooks";
14+
15+
test.describe("CustomRolesPage",()=>{
16+
test.beforeEach(async({ page})=>awaitbeforeCoderTest(page));
17+
18+
test("create custom role and cancel edit changes",async({ page})=>{
19+
requiresLicense();
20+
awaitsetupApiCalls(page);
21+
22+
constorg=awaitcreateOrganizationWithName(randomName());
23+
24+
constcustomRole=awaitcreateCustomRole(
25+
org.id,
26+
"custom-role-test-1",
27+
"Custom Role Test 1",
28+
);
29+
30+
awaitpage.goto(`/organizations/${org.name}/roles`);
31+
constroleRow=page.getByTestId(`role-${customRole.name}`);
32+
awaitexpect(roleRow.getByText(customRole.display_name)).toBeVisible();
33+
awaitexpect(roleRow.getByText("organization_member")).toBeVisible();
34+
35+
awaitroleRow.getByRole("button",{name:"More options"}).click();
36+
constmenu=page.locator("#more-options");
37+
awaitmenu.getByText("Edit").click();
38+
39+
awaitexpect(page).toHaveURL(
40+
`/organizations/${org.name}/roles/${customRole.name}`,
41+
);
42+
43+
constcancelButton=page.getByRole("button",{name:"Cancel"}).first();
44+
awaitexpect(cancelButton).toBeVisible();
45+
awaitcancelButton.click();
46+
47+
awaitexpect(page).toHaveURL(`/organizations/${org.name}/roles`);
48+
49+
awaitdeleteOrganization(org.name);
50+
});
51+
52+
test("create custom role, edit role and save changes",async({ page})=>{
53+
requiresLicense();
54+
awaitsetupApiCalls(page);
55+
56+
constorg=awaitcreateOrganizationWithName(randomName());
57+
58+
constcustomRole=awaitcreateCustomRole(
59+
org.id,
60+
"custom-role-test-1",
61+
"Custom Role Test 1",
62+
);
63+
64+
awaitpage.goto(`/organizations/${org.name}/roles`);
65+
constroleRow=page.getByTestId(`role-${customRole.name}`);
66+
awaitexpect(roleRow.getByText(customRole.display_name)).toBeVisible();
67+
awaitexpect(roleRow.getByText("organization_member")).toBeVisible();
68+
69+
awaitpage.goto(`/organizations/${org.name}/roles/${customRole.name}`);
70+
71+
constdisplayNameInput=page.getByRole("textbox",{
72+
name:"Display name",
73+
});
74+
awaitdisplayNameInput.fill("Custom Role Test 2 Edited");
75+
76+
constgroupCheckbox=page.getByTestId("group").getByRole("checkbox");
77+
awaitexpect(groupCheckbox).toBeVisible();
78+
awaitgroupCheckbox.click();
79+
80+
constorganizationMemberCheckbox=page
81+
.getByTestId("organization_member")
82+
.getByRole("checkbox");
83+
awaitexpect(organizationMemberCheckbox).toBeVisible();
84+
awaitorganizationMemberCheckbox.click();
85+
86+
constsaveButton=page.getByRole("button",{name:"Save"}).first();
87+
awaitexpect(saveButton).toBeVisible();
88+
awaitsaveButton.click();
89+
90+
awaitexpect(roleRow.getByText("Custom Role Test 2 Edited")).toBeVisible();
91+
92+
constroleRow2=page.getByTestId(`role-${customRole.name}`);
93+
awaitexpect(roleRow2.getByText("organization_member")).not.toBeVisible();
94+
awaitexpect(roleRow2.getByText("group")).toBeVisible();
95+
96+
awaitexpect(page).toHaveURL(`/organizations/${org.name}/roles`);
97+
98+
awaitdeleteOrganization(org.name);
99+
});
100+
101+
test("displays built-in role without edit/delete options",async({
102+
page,
103+
})=>{
104+
requiresLicense();
105+
awaitsetupApiCalls(page);
106+
107+
constorg=awaitcreateOrganizationWithName(randomName());
108+
109+
awaitpage.goto(`/organizations/${org.name}/roles`);
110+
111+
constroleRow=page.getByTestId("role-organization-admin");
112+
awaitexpect(roleRow).toBeVisible();
113+
114+
awaitexpect(roleRow.getByText("Organization Admin")).toBeVisible();
115+
116+
// Verify that the more menu (three dots) is not present for built-in roles
117+
awaitexpect(
118+
roleRow.getByRole("button",{name:"More options"}),
119+
).not.toBeVisible();
120+
121+
awaitdeleteOrganization(org.name);
122+
});
123+
124+
test("create custom role with UI",async({ page})=>{
125+
requiresLicense();
126+
awaitsetupApiCalls(page);
127+
128+
constorg=awaitcreateOrganizationWithName(randomName());
129+
130+
awaitpage.goto(`/organizations/${org.name}/roles`);
131+
132+
awaitpage
133+
.getByRole("link",{name:"Create custom role"})
134+
.first()
135+
.click();
136+
137+
awaitexpect(page).toHaveURL(`/organizations/${org.name}/roles/create`);
138+
139+
constcustomRoleName="custom-role-test";
140+
constroleNameInput=page.getByRole("textbox",{
141+
exact:true,
142+
name:"Name",
143+
});
144+
awaitroleNameInput.fill(customRoleName);
145+
146+
constcustomRoleDisplayName="Custom Role Test";
147+
constdisplayNameInput=page.getByRole("textbox",{
148+
exact:true,
149+
name:"Display Name",
150+
});
151+
awaitdisplayNameInput.fill(customRoleDisplayName);
152+
153+
awaitpage.getByRole("button",{name:"Create Role"}).first().click();
154+
155+
awaitexpect(page).toHaveURL(`/organizations/${org.name}/roles`);
156+
157+
constroleRow=page.getByTestId(`role-${customRoleName}`);
158+
awaitexpect(roleRow.getByText(customRoleDisplayName)).toBeVisible();
159+
awaitexpect(roleRow.getByText("None")).toBeVisible();
160+
161+
awaitdeleteOrganization(org.name);
162+
});
163+
164+
test("delete custom role",async({ page})=>{
165+
requiresLicense();
166+
awaitsetupApiCalls(page);
167+
168+
constorg=awaitcreateOrganizationWithName(randomName());
169+
constcustomRole=awaitcreateCustomRole(
170+
org.id,
171+
"custom-role-test-1",
172+
"Custom Role Test 1",
173+
);
174+
awaitpage.goto(`/organizations/${org.name}/roles`);
175+
176+
constroleRow=page.getByTestId(`role-${customRole.name}`);
177+
awaitroleRow.getByRole("button",{name:"More options"}).click();
178+
179+
constmenu=page.locator("#more-options");
180+
awaitmenu.getByText("Delete…").click();
181+
182+
constinput=page.getByRole("textbox");
183+
awaitinput.fill(customRole.name);
184+
awaitpage.getByRole("button",{name:"Delete"}).click();
185+
186+
awaitexpect(
187+
page.getByText("Custom role deleted successfully!"),
188+
).toBeVisible();
189+
190+
awaitdeleteOrganization(org.name);
191+
});
192+
});
193+
194+
test("custom roles disabled",async({ page})=>{
195+
requiresUnlicensed();
196+
awaitpage.goto("/organizations/coder/roles");
197+
awaitexpect(page).toHaveURL("/organizations/coder/roles");
198+
199+
awaitexpect(
200+
page.getByText("Upgrade to a premium license to create a custom role"),
201+
).toBeVisible();
202+
awaitexpect(
203+
page.getByRole("link",{name:"Create custom role"}),
204+
).not.toBeVisible();
205+
});

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp