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

Commit3fbcdb0

Browse files
chore(site): add e2e tests for groups (#12866)
1 parentbc9ea61 commit3fbcdb0

File tree

12 files changed

+240
-26
lines changed

12 files changed

+240
-26
lines changed

‎site/e2e/api.ts

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
importtype{Page}from"@playwright/test";
2+
import*asAPIfrom"api/api";
3+
import{coderPort}from"./constants";
4+
import{findSessionToken,randomName}from"./helpers";
5+
6+
letcurrentOrgId:string;
7+
8+
exportconstsetupApiCalls=async(page:Page)=>{
9+
consttoken=awaitfindSessionToken(page);
10+
API.setSessionToken(token);
11+
API.setHost(`http://127.0.0.1:${coderPort}`);
12+
};
13+
14+
exportconstgetCurrentOrgId=async():Promise<string>=>{
15+
if(currentOrgId){
16+
returncurrentOrgId;
17+
}
18+
constcurrentUser=awaitAPI.getAuthenticatedUser();
19+
currentOrgId=currentUser.organization_ids[0];
20+
returncurrentOrgId;
21+
};
22+
23+
exportconstcreateUser=async(orgId:string)=>{
24+
constname=randomName();
25+
constuser=awaitAPI.createUser({
26+
email:`${name}@coder.com`,
27+
username:name,
28+
password:"s3cure&password!",
29+
login_type:"password",
30+
disable_login:false,
31+
organization_id:orgId,
32+
});
33+
returnuser;
34+
};
35+
36+
exportconstcreateGroup=async(orgId:string)=>{
37+
constname=randomName();
38+
constgroup=awaitAPI.createGroup(orgId,{
39+
name,
40+
display_name:`Display${name}`,
41+
avatar_url:"/emojis/1f60d.png",
42+
quota_allowance:0,
43+
});
44+
returngroup;
45+
};

‎site/e2e/helpers.ts

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import capitalize from "lodash/capitalize";
77
importpathfrom"path";
88
import*assshfrom"ssh2";
99
import{Duplex}from"stream";
10-
import*asAPIfrom"api/api";
1110
importtype{
1211
WorkspaceBuildParameter,
1312
UpdateTemplateMeta,
@@ -826,9 +825,3 @@ export async function openTerminalWindow(
826825

827826
returnterminal;
828827
}
829-
830-
exportconstsetupApiCalls=async(page:Page)=>{
831-
consttoken=awaitfindSessionToken(page);
832-
API.setSessionToken(token);
833-
API.setHost(`http://127.0.0.1:${coderPort}`);
834-
};
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
import{test,expect}from"@playwright/test";
2+
import{
3+
createGroup,
4+
createUser,
5+
getCurrentOrgId,
6+
setupApiCalls,
7+
}from"../../api";
8+
import{requiresEnterpriseLicense}from"../../helpers";
9+
import{beforeCoderTest}from"../../hooks";
10+
11+
test.beforeEach(async({ page})=>awaitbeforeCoderTest(page));
12+
13+
test("add members",async({ page, baseURL})=>{
14+
requiresEnterpriseLicense();
15+
awaitsetupApiCalls(page);
16+
constorgId=awaitgetCurrentOrgId();
17+
constgroup=awaitcreateGroup(orgId);
18+
constnumberOfMembers=3;
19+
constusers=awaitPromise.all(
20+
Array.from({length:numberOfMembers},()=>createUser(orgId)),
21+
);
22+
23+
awaitpage.goto(`${baseURL}/groups/${group.id}`,{
24+
waitUntil:"domcontentloaded",
25+
});
26+
awaitexpect(page).toHaveTitle(`${group.display_name} - Coder`);
27+
28+
for(constuserofusers){
29+
awaitpage.getByPlaceholder("User email or username").fill(user.username);
30+
awaitpage.getByRole("option",{name:user.email}).click();
31+
awaitpage.getByRole("button",{name:"Add user"}).click();
32+
awaitexpect(page.getByRole("row",{name:user.username})).toBeVisible();
33+
}
34+
});
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
import{test,expect}from"@playwright/test";
2+
import{createUser,getCurrentOrgId,setupApiCalls}from"../../api";
3+
import{requiresEnterpriseLicense}from"../../helpers";
4+
import{beforeCoderTest}from"../../hooks";
5+
6+
test.beforeEach(async({ page})=>awaitbeforeCoderTest(page));
7+
8+
constDEFAULT_GROUP_NAME="Everyone";
9+
10+
test(`Every user should be automatically added to the default '${DEFAULT_GROUP_NAME}' group upon creation`,async({
11+
page,
12+
baseURL,
13+
})=>{
14+
requiresEnterpriseLicense();
15+
awaitsetupApiCalls(page);
16+
constorgId=awaitgetCurrentOrgId();
17+
constnumberOfMembers=3;
18+
constusers=awaitPromise.all(
19+
Array.from({length:numberOfMembers},()=>createUser(orgId)),
20+
);
21+
22+
awaitpage.goto(`${baseURL}/groups`,{waitUntil:"domcontentloaded"});
23+
awaitexpect(page).toHaveTitle("Groups - Coder");
24+
25+
constgroupRow=page.getByRole("row",{name:DEFAULT_GROUP_NAME});
26+
awaitgroupRow.click();
27+
awaitexpect(page).toHaveTitle(`${DEFAULT_GROUP_NAME} - Coder`);
28+
29+
for(constuserofusers){
30+
awaitexpect(page.getByRole("row",{name:user.username})).toBeVisible();
31+
}
32+
});
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
import{test,expect}from"@playwright/test";
2+
import{randomName,requiresEnterpriseLicense}from"../../helpers";
3+
import{beforeCoderTest}from"../../hooks";
4+
5+
test.beforeEach(async({ page})=>awaitbeforeCoderTest(page));
6+
7+
test("create group",async({ page, baseURL})=>{
8+
requiresEnterpriseLicense();
9+
awaitpage.goto(`${baseURL}/groups`,{waitUntil:"domcontentloaded"});
10+
awaitexpect(page).toHaveTitle("Groups - Coder");
11+
12+
awaitpage.getByText("Create group").click();
13+
awaitexpect(page).toHaveTitle("Create Group - Coder");
14+
15+
constname=randomName();
16+
constgroupValues={
17+
name:name,
18+
displayName:`Display Name for${name}`,
19+
avatarURL:"/emojis/1f60d.png",
20+
};
21+
22+
awaitpage.getByLabel("Name",{exact:true}).fill(groupValues.name);
23+
awaitpage.getByLabel("Display Name").fill(groupValues.displayName);
24+
awaitpage.getByLabel("Avatar URL").fill(groupValues.avatarURL);
25+
awaitpage.getByRole("button",{name:"Submit"}).click();
26+
27+
awaitexpect(page).toHaveTitle(`${groupValues.displayName} - Coder`);
28+
awaitexpect(page.getByText(groupValues.displayName)).toBeVisible();
29+
awaitexpect(page.getByText("No members yet")).toBeVisible();
30+
});
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import{test,expect}from"@playwright/test";
2+
import{createGroup,getCurrentOrgId,setupApiCalls}from"../../api";
3+
import{requiresEnterpriseLicense}from"../../helpers";
4+
import{beforeCoderTest}from"../../hooks";
5+
6+
test.beforeEach(async({ page})=>awaitbeforeCoderTest(page));
7+
8+
test("navigate to group page",async({ page, baseURL})=>{
9+
requiresEnterpriseLicense();
10+
awaitsetupApiCalls(page);
11+
constorgId=awaitgetCurrentOrgId();
12+
constgroup=awaitcreateGroup(orgId);
13+
14+
awaitpage.goto(`${baseURL}/users`,{waitUntil:"domcontentloaded"});
15+
awaitexpect(page).toHaveTitle("Users - Coder");
16+
17+
awaitpage.getByRole("link",{name:"Groups"}).click();
18+
awaitexpect(page).toHaveTitle("Groups - Coder");
19+
20+
constgroupRow=page.getByRole("row",{name:group.display_name});
21+
awaitgroupRow.click();
22+
awaitexpect(page).toHaveTitle(`${group.display_name} - Coder`);
23+
});
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import{test,expect}from"@playwright/test";
2+
import{createGroup,getCurrentOrgId,setupApiCalls}from"../../api";
3+
import{requiresEnterpriseLicense}from"../../helpers";
4+
import{beforeCoderTest}from"../../hooks";
5+
6+
test.beforeEach(async({ page})=>awaitbeforeCoderTest(page));
7+
8+
test("remove group",async({ page, baseURL})=>{
9+
requiresEnterpriseLicense();
10+
awaitsetupApiCalls(page);
11+
constorgId=awaitgetCurrentOrgId();
12+
constgroup=awaitcreateGroup(orgId);
13+
14+
awaitpage.goto(`${baseURL}/groups/${group.id}`,{
15+
waitUntil:"domcontentloaded",
16+
});
17+
awaitexpect(page).toHaveTitle(`${group.display_name} - Coder`);
18+
19+
awaitpage.getByRole("button",{name:"Delete"}).click();
20+
constdialog=page.getByTestId("dialog");
21+
awaitdialog.getByLabel("Name of the group to delete").fill(group.name);
22+
awaitdialog.getByRole("button",{name:"Delete"}).click();
23+
awaitexpect(page.getByText("Group deleted successfully.")).toBeVisible();
24+
25+
awaitexpect(page).toHaveTitle("Groups - Coder");
26+
});
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
import{test,expect}from"@playwright/test";
2+
import*asAPIfrom"api/api";
3+
import{
4+
createGroup,
5+
createUser,
6+
getCurrentOrgId,
7+
setupApiCalls,
8+
}from"../../api";
9+
import{requiresEnterpriseLicense}from"../../helpers";
10+
import{beforeCoderTest}from"../../hooks";
11+
12+
test.beforeEach(async({ page})=>awaitbeforeCoderTest(page));
13+
14+
test("remove member",async({ page, baseURL})=>{
15+
requiresEnterpriseLicense();
16+
awaitsetupApiCalls(page);
17+
constorgId=awaitgetCurrentOrgId();
18+
const[group,member]=awaitPromise.all([
19+
createGroup(orgId),
20+
createUser(orgId),
21+
]);
22+
awaitAPI.addMember(group.id,member.id);
23+
24+
awaitpage.goto(`${baseURL}/groups/${group.id}`,{
25+
waitUntil:"domcontentloaded",
26+
});
27+
awaitexpect(page).toHaveTitle(`${group.display_name} - Coder`);
28+
29+
constuserRow=page.getByRole("row",{name:member.username});
30+
awaituserRow.getByRole("button",{name:"More options"}).click();
31+
32+
constmenu=page.locator("#more-options");
33+
awaitmenu.getByText("Remove").click({timeout:1_000});
34+
35+
awaitexpect(page.getByText("Member removed successfully.")).toBeVisible();
36+
});

‎site/e2e/tests/users/removeUser.spec.ts

Lines changed: 6 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,21 @@
11
import{test,expect}from"@playwright/test";
2-
import*asAPIfrom"api/api";
3-
import{randomName,setupApiCalls}from"../../helpers";
2+
import{createUser,getCurrentOrgId,setupApiCalls}from"../../api";
43
import{beforeCoderTest}from"../../hooks";
54

65
test.beforeEach(async({ page})=>awaitbeforeCoderTest(page));
76

87
test("remove user",async({ page, baseURL})=>{
98
awaitsetupApiCalls(page);
10-
constcurrentUser=awaitAPI.getAuthenticatedUser();
11-
constname=randomName();
12-
constuser=awaitAPI.createUser({
13-
email:`${name}@coder.com`,
14-
username:name,
15-
password:"s3cure&password!",
16-
login_type:"password",
17-
disable_login:false,
18-
organization_id:currentUser.organization_ids[0],
19-
});
9+
constorgId=awaitgetCurrentOrgId();
10+
constuser=awaitcreateUser(orgId);
2011

2112
awaitpage.goto(`${baseURL}/users`,{waitUntil:"domcontentloaded"});
2213
awaitexpect(page).toHaveTitle("Users - Coder");
2314

24-
constuserRow=page.locator("tr",{hasText:user.email});
15+
constuserRow=page.getByRole("row",{name:user.email});
2516
awaituserRow.getByRole("button",{name:"More options"}).click();
26-
awaituserRow.getByText("Delete",{exact:false}).click();
17+
constmenu=page.locator("#more-options");
18+
awaitmenu.getByText("Delete").click();
2719

2820
constdialog=page.getByTestId("dialog");
2921
awaitdialog.getByLabel("Name of the user to delete").fill(user.username);

‎site/src/api/api.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1147,7 +1147,6 @@ export const patchGroup = async (
11471147
exportconstaddMember=async(groupId:string,userId:string)=>{
11481148
returnpatchGroup(groupId,{
11491149
name:"",
1150-
display_name:"",
11511150
add_users:[userId],
11521151
remove_users:[],
11531152
});

‎site/src/pages/GroupsPage/GroupPage.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -197,6 +197,7 @@ export const GroupPage: FC = () => {
197197
onConfirm={async()=>{
198198
try{
199199
awaitdeleteGroupMutation.mutateAsync(groupId);
200+
displaySuccess("Group deleted successfully.");
200201
navigate("/groups");
201202
}catch(error){
202203
displayError(getErrorMessage(error,"Failed to delete group."));

‎site/src/pages/UsersPage/UsersLayout.tsx

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
importGroupAddfrom"@mui/icons-material/GroupAddOutlined";
22
importPersonAddfrom"@mui/icons-material/PersonAddOutlined";
33
importButtonfrom"@mui/material/Button";
4-
importLinkfrom"@mui/material/Link";
54
import{typeFC,Suspense}from"react";
65
import{
76
LinkasRouterLink,
@@ -43,9 +42,13 @@ export const UsersLayout: FC = () => {
4342
</Button>
4443
)}
4544
{canCreateGroup&&isTemplateRBACEnabled&&(
46-
<Linkcomponent={RouterLink}to="/groups/create">
47-
<ButtonstartIcon={<GroupAdd/>}>Create group</Button>
48-
</Link>
45+
<Button
46+
component={RouterLink}
47+
startIcon={<GroupAdd/>}
48+
to="/groups/create"
49+
>
50+
Create group
51+
</Button>
4952
)}
5053
</>
5154
}

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp