Skip to content

Commit 37bb227

Browse files
authored
test: Check User Registration Status and Modify Admin Rights (#36597)
1 parent dc5b3d2 commit 37bb227

File tree

4 files changed

+260
-70
lines changed

4 files changed

+260
-70
lines changed
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
import { Users } from './fixtures/userStates';
2+
import { Admin } from './page-objects';
3+
import { ToastBar } from './page-objects/toastBar';
4+
import { test, expect } from './utils/test';
5+
import type { ITestUser } from './utils/user-helpers';
6+
import { createTestUser } from './utils/user-helpers';
7+
8+
let userWithoutAdminAccess: ITestUser;
9+
let userWithAdminAccess: ITestUser;
10+
let admin: Admin;
11+
let poToastBar: ToastBar;
12+
13+
test.describe('Admin > Users Role Management', () => {
14+
test.beforeAll('Create test users', async ({ api }) => {
15+
userWithoutAdminAccess = await createTestUser(api);
16+
userWithAdminAccess = await createTestUser(api, { roles: ['admin'] });
17+
});
18+
19+
test.afterAll('Delete test users', async () => {
20+
await userWithoutAdminAccess.delete();
21+
await userWithAdminAccess.delete();
22+
});
23+
24+
test.describe('Admin Role Management', () => {
25+
test.use({ storageState: Users.admin.state });
26+
27+
test.beforeEach('Go to /admin/users', async ({ page }) => {
28+
admin = new Admin(page);
29+
poToastBar = new ToastBar(page);
30+
await page.goto('/admin/users');
31+
});
32+
33+
test('Make a newly created user as admin', async () => {
34+
await admin.tabs.users.inputSearch.fill(userWithoutAdminAccess.data.username);
35+
36+
await test.step('should be visible in the All tab', async () => {
37+
await admin.tabs.users.tabAll.click();
38+
await expect(admin.getUserRowByUsername(userWithoutAdminAccess.data.username)).toBeVisible();
39+
});
40+
41+
await test.step('make a user admin', async () => {
42+
await admin.tabs.users.openUserActionMenu(userWithoutAdminAccess.data.username);
43+
await admin.tabs.users.menuItemMakeAdmin.click();
44+
await expect(poToastBar.alert).toBeVisible();
45+
await expect(poToastBar.alert).toHaveText('User is now an admin');
46+
});
47+
48+
await test.step('verify user is admin', async () => {
49+
await admin.getUserRowByUsername(userWithoutAdminAccess.data.username).click();
50+
await expect(admin.tabs.users.userInfoDialog).toBeVisible();
51+
await expect(admin.tabs.users.userInfoDialog).toContainText('Admin');
52+
});
53+
});
54+
55+
test('Remove role as admin', async () => {
56+
await admin.tabs.users.inputSearch.fill(userWithAdminAccess.data.username);
57+
await test.step('User should be visible in the All tab', async () => {
58+
await admin.tabs.users.tabAll.click();
59+
await expect(admin.getUserRowByUsername(userWithAdminAccess.data.username)).toBeVisible();
60+
});
61+
62+
await test.step('remove admin role', async () => {
63+
await admin.tabs.users.openUserActionMenu(userWithAdminAccess.data.username);
64+
await admin.tabs.users.menuItemRemoveAdmin.click();
65+
await expect(poToastBar.alert).toBeVisible();
66+
await expect(poToastBar.alert).toHaveText('User is no longer an admin');
67+
});
68+
69+
await test.step('verify user role as admin is removed', async () => {
70+
await admin.getUserRowByUsername(userWithAdminAccess.data.username).click();
71+
await expect(admin.tabs.users.userInfoDialog).toBeVisible();
72+
await expect(admin.tabs.users.userInfoDialog).not.toHaveText('Admin');
73+
});
74+
});
75+
});
76+
});
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
import type { BrowserContext, Page } from '@playwright/test';
2+
3+
import { DEFAULT_USER_CREDENTIALS } from './config/constants';
4+
import { Users } from './fixtures/userStates';
5+
import { Admin, Registration, Utils } from './page-objects';
6+
import { test, expect } from './utils/test';
7+
import type { ITestUser } from './utils/user-helpers';
8+
import { createTestUser } from './utils/user-helpers';
9+
10+
let user: ITestUser;
11+
let admin: Admin;
12+
13+
test.describe.serial('Admin > Users', () => {
14+
test.beforeAll('Create a new user', async ({ api }) => {
15+
user = await createTestUser(api);
16+
});
17+
18+
test.afterAll('Delete the new user', async () => {
19+
await user.delete();
20+
});
21+
test.describe('Login', () => {
22+
let context: BrowserContext;
23+
let page: Page;
24+
let poRegistration: Registration;
25+
let poUtils: Utils;
26+
27+
test.beforeAll(async ({ browser }) => {
28+
context = await browser.newContext();
29+
page = await context.newPage();
30+
poRegistration = new Registration(page);
31+
poUtils = new Utils(page);
32+
});
33+
34+
test.afterAll(async () => {
35+
await context.close();
36+
});
37+
38+
test('Login as a newly created user and verify its status is active', async () => {
39+
await page.goto('/login');
40+
await test.step('should log in as the newly created user', async () => {
41+
await poRegistration.username.fill(user.data.username);
42+
await poRegistration.inputPassword.fill(DEFAULT_USER_CREDENTIALS.password);
43+
await poRegistration.btnLogin.click();
44+
});
45+
46+
await test.step('Assert user is logged in', async () => {
47+
await expect(poUtils.mainContent).toBeVisible();
48+
});
49+
});
50+
});
51+
52+
test.describe('Admin > Users Status Management', () => {
53+
test.use({ storageState: Users.admin.state });
54+
55+
test.beforeEach('Go to /admin/users', async ({ page }) => {
56+
admin = new Admin(page);
57+
await page.goto('/admin/users');
58+
});
59+
60+
test('After the first login, the user gets listed under the Active tab', async () => {
61+
await admin.tabs.users.inputSearch.fill(user.data.username);
62+
63+
await test.step('should be visible in the All tab', async () => {
64+
await admin.tabs.users.tabActive.click();
65+
await expect(admin.getUserRowByUsername(user.data.username)).toBeVisible();
66+
});
67+
68+
await test.step('should not be visible in the Pending tab', async () => {
69+
await admin.tabs.users.tabPending.click();
70+
await expect(admin.getUserRowByUsername(user.data.username)).not.toBeVisible();
71+
});
72+
73+
await test.step('should be visible in the Active tab', async () => {
74+
await admin.tabs.users.tabActive.click();
75+
await expect(admin.getUserRowByUsername(user.data.username)).toBeVisible();
76+
});
77+
78+
await test.step('should not be visible in the Deactivated tab', async () => {
79+
await admin.tabs.users.tabDeactivated.click();
80+
await expect(admin.getUserRowByUsername(user.data.username)).not.toBeVisible();
81+
});
82+
});
83+
});
84+
});
Lines changed: 48 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -1,88 +1,66 @@
1-
import { faker } from '@faker-js/faker';
2-
import type { IUser } from '@rocket.chat/core-typings';
3-
41
import { Users } from './fixtures/userStates';
5-
import { expect, test } from './utils/test';
2+
import { Admin } from './page-objects';
3+
import { test, expect } from './utils/test';
4+
import type { ITestUser } from './utils/user-helpers';
5+
import { createTestUser } from './utils/user-helpers';
6+
7+
let user: ITestUser;
8+
let admin: Admin;
69

710
test.use({ storageState: Users.admin.state });
811

912
test.describe('Admin > Users', () => {
10-
let user: IUser & { username: string };
11-
1213
test.beforeAll('Create a new user', async ({ api }) => {
13-
const response = await api.post('/users.create', {
14-
email: faker.internet.email(),
15-
name: faker.person.fullName(),
16-
password: faker.internet.password(),
17-
username: faker.internet.userName(),
18-
});
19-
expect(response.status()).toBe(200);
20-
const json = await response.json();
21-
user = json.user;
14+
user = await createTestUser(api);
2215
});
2316

24-
test.beforeEach('Go to /admin/users', async ({ page }) => {
25-
await page.goto('/admin/users');
17+
test.afterAll('Delete the new user', async () => {
18+
await user.delete();
2619
});
2720

28-
test.afterAll('Delete the new user', async ({ api }) => {
29-
const response = await api.post('/users.delete', { userId: user._id });
30-
expect(response.status()).toBe(200);
21+
test.beforeEach('Go to /admin/users', async ({ page }) => {
22+
admin = new Admin(page);
23+
await page.goto('/admin/users');
3124
});
25+
test('New user shows in correct tabs when deactivated', async () => {
26+
await admin.tabs.users.inputSearch.fill(user.data.username);
3227

33-
test(
34-
'New user shows in correct tabs when deactivated',
35-
{
36-
tag: '@admin',
37-
annotation: {
38-
type: 'issue',
39-
description: 'https://rocketchat.atlassian.net/browse/SUP-775',
40-
},
41-
},
42-
async ({ page }) => {
43-
const { username } = user;
44-
45-
await page.getByPlaceholder('Search Users').fill(username);
46-
47-
await test.step('is visible in the All tab', async () => {
48-
await page.getByRole('tab', { name: 'All' }).click();
49-
await expect(page.getByRole('link', { name: username })).toBeVisible();
50-
});
51-
52-
await test.step('is visible in the Pending tab', async () => {
53-
await page.getByRole('tab', { name: 'Pending' }).click();
54-
await expect(page.getByRole('link', { name: username })).toBeVisible();
55-
});
56-
57-
await test.step('is not visible in the Active tab', async () => {
58-
await page.getByRole('tab', { name: 'Active' }).click();
59-
await expect(page.getByRole('link', { name: username })).not.toBeVisible();
60-
});
28+
await test.step('should be visible in the All tab', async () => {
29+
await admin.tabs.users.tabAll.click();
30+
await expect(admin.getUserRowByUsername(user.data.username)).toBeVisible();
31+
});
6132

62-
await test.step('is not visible in the Deactivated tab', async () => {
63-
await page.getByRole('tab', { name: 'Deactivated' }).click();
64-
await expect(page.getByRole('link', { name: username })).not.toBeVisible();
65-
});
33+
await test.step('should be visible in the Pending tab', async () => {
34+
await admin.tabs.users.tabPending.click();
35+
await expect(admin.getUserRowByUsername(user.data.username)).toBeVisible();
36+
});
6637

67-
await test.step('moves from Pending to Deactivated tab', async () => {
68-
await page.getByRole('tab', { name: 'Pending' }).click();
69-
await page.getByRole('button', { name: 'More actions' }).click();
70-
await page.getByRole('menuitem', { name: 'Deactivate' }).click();
71-
await expect(page.getByRole('link', { name: username })).not.toBeVisible();
38+
await test.step('should not be visible in the Active tab', async () => {
39+
await admin.tabs.users.tabActive.click();
40+
await expect(admin.getUserRowByUsername(user.data.username)).not.toBeVisible();
41+
});
7242

73-
await page.getByRole('tab', { name: 'Deactivated' }).click();
74-
await expect(page.getByRole('link', { name: username })).toBeVisible();
75-
});
43+
await test.step('should not be visible in the Deactivated tab', async () => {
44+
await admin.tabs.users.tabDeactivated.click();
45+
await expect(admin.getUserRowByUsername(user.data.username)).not.toBeVisible();
46+
});
7647

77-
await test.step('moves from Deactivated to Pending tab', async () => {
78-
await page.getByRole('tab', { name: 'Deactivated' }).click();
79-
await page.getByRole('button', { name: 'More actions' }).click();
80-
await page.getByRole('menuitem', { name: 'Activate' }).click();
81-
await expect(page.getByRole('link', { name: username })).not.toBeVisible();
48+
await test.step('should move from Pending to Deactivated tab', async () => {
49+
await admin.tabs.users.tabPending.click();
50+
await admin.tabs.users.btnMoreActionsMenu.click();
51+
await admin.tabs.users.menuItemDeactivated.click();
52+
await expect(admin.getUserRowByUsername(user.data.username)).not.toBeVisible();
53+
await admin.tabs.users.tabDeactivated.click();
54+
await expect(admin.getUserRowByUsername(user.data.username)).toBeVisible();
55+
});
8256

83-
await page.getByRole('tab', { name: 'Pending' }).click();
84-
await expect(page.getByRole('link', { name: username })).toBeVisible();
85-
});
86-
},
87-
);
57+
await test.step('should move from Deactivated to Pending tab', async () => {
58+
await admin.tabs.users.tabDeactivated.click();
59+
await admin.tabs.users.btnMoreActionsMenu.click();
60+
await admin.tabs.users.menuItemActivate.click();
61+
await expect(admin.getUserRowByUsername(user.data.username)).not.toBeVisible();
62+
await admin.tabs.users.tabPending.click();
63+
await expect(admin.getUserRowByUsername(user.data.username)).toBeVisible();
64+
});
65+
});
8866
});

apps/meteor/tests/e2e/page-objects/fragments/admin-flextab-users.ts

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,58 @@ export class AdminFlextabUsers {
7171
return this.page.locator('button[data-qa="ContextualbarActionClose"]');
7272
}
7373

74+
get btnMoreActionsMenu(): Locator {
75+
return this.page.getByRole('button', { name: 'More actions' });
76+
}
77+
78+
get menuItemDeactivated(): Locator {
79+
return this.page.getByRole('menuitem', { name: 'Deactivate' });
80+
}
81+
82+
get menuItemActivate(): Locator {
83+
return this.page.getByRole('menuitem', { name: 'Activate' });
84+
}
85+
86+
get tabActive(): Locator {
87+
return this.page.getByRole('tab', { name: 'Active' });
88+
}
89+
90+
get tabDeactivated(): Locator {
91+
return this.page.getByRole('tab', { name: 'Deactivated' });
92+
}
93+
94+
get tabPending(): Locator {
95+
return this.page.getByRole('tab', { name: 'Pending' });
96+
}
97+
98+
get tabAll(): Locator {
99+
return this.page.getByRole('tab', { name: 'All' });
100+
}
101+
102+
get inputSearch(): Locator {
103+
return this.page.getByRole('textbox', { name: 'Search Users' });
104+
}
105+
106+
get menuItemMakeAdmin(): Locator {
107+
return this.page.getByRole('menuitem', { name: 'Make Admin' });
108+
}
109+
110+
get menuItemRemoveAdmin(): Locator {
111+
return this.page.getByRole('menuitem', { name: 'Remove Admin' });
112+
}
113+
114+
get userInfoDialog(): Locator {
115+
return this.page.getByRole('dialog');
116+
}
117+
118+
getUserRowByUsername(username: string): Locator {
119+
return this.page.getByRole('link', { name: username });
120+
}
121+
122+
async openUserActionMenu(username: string): Promise<void> {
123+
await this.getUserRowByUsername(username).getByRole('button', { name: 'More actions' }).click();
124+
}
125+
74126
getCustomField(fieldName: string): Locator {
75127
return this.page.getByRole('textbox', { name: fieldName });
76128
}

0 commit comments

Comments
 (0)