@mattermost/playwright-lib 10.7.0-0 → 10.7.0-1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/browser_context.js +14 -21
- package/dist/constant.js +3 -6
- package/dist/file.js +20 -20
- package/dist/flag.d.ts +2 -0
- package/dist/flag.js +49 -38
- package/dist/flag.js.map +1 -1
- package/dist/global_setup.js +14 -49
- package/dist/global_setup.js.map +1 -1
- package/dist/index.js +9 -42
- package/dist/mock_browser_api.js +2 -8
- package/dist/server/channel.js +3 -9
- package/dist/server/client.js +10 -16
- package/dist/server/default_config.js +9 -15
- package/dist/server/init.js +29 -36
- package/dist/server/plugins.d.ts +1 -1
- package/dist/server/plugins.js +13 -14
- package/dist/server/plugins.js.map +1 -1
- package/dist/server/post.js +3 -9
- package/dist/server/team.js +3 -9
- package/dist/server/user.js +8 -15
- package/dist/test_action.js +3 -14
- package/dist/test_config.js +4 -30
- package/dist/test_fixture.d.ts +2 -1
- package/dist/test_fixture.js +50 -68
- package/dist/test_fixture.js.map +1 -1
- package/dist/ui/components/channels/app_bar.js +3 -9
- package/dist/ui/components/channels/center_view.js +22 -28
- package/dist/ui/components/channels/delete_post_confirmation_dialog.js +8 -14
- package/dist/ui/components/channels/delete_post_modal.js +4 -10
- package/dist/ui/components/channels/emoji_gif_picker.js +9 -15
- package/dist/ui/components/channels/find_channels_modal.js +3 -9
- package/dist/ui/components/channels/generic_confirm_modal.js +5 -11
- package/dist/ui/components/channels/header.js +3 -9
- package/dist/ui/components/channels/message_priority.js +14 -20
- package/dist/ui/components/channels/post.js +10 -16
- package/dist/ui/components/channels/post_create.js +23 -29
- package/dist/ui/components/channels/post_dot_menu.js +3 -9
- package/dist/ui/components/channels/post_edit.js +16 -22
- package/dist/ui/components/channels/post_menu.js +3 -9
- package/dist/ui/components/channels/post_reminder_menu.js +3 -9
- package/dist/ui/components/channels/restore_post_confirmation_dialog.js +6 -12
- package/dist/ui/components/channels/scheduled_draft_menu.js +3 -9
- package/dist/ui/components/channels/scheduled_draft_modal.js +4 -10
- package/dist/ui/components/channels/search_popover.js +3 -9
- package/dist/ui/components/channels/settings/notification_settings.js +8 -14
- package/dist/ui/components/channels/settings/settings_modal.js +7 -13
- package/dist/ui/components/channels/sidebar_left.js +8 -14
- package/dist/ui/components/channels/sidebar_right.js +20 -26
- package/dist/ui/components/channels/thread_footer.js +3 -9
- package/dist/ui/components/channels/user_profile_popover.js +3 -9
- package/dist/ui/components/footer.js +3 -9
- package/dist/ui/components/global_header.js +7 -13
- package/dist/ui/components/index.js +72 -74
- package/dist/ui/components/main_header.js +3 -9
- package/dist/ui/components/system_console/navbar.js +3 -9
- package/dist/ui/components/system_console/sections/system_users/column_toggle_menu.js +4 -10
- package/dist/ui/components/system_console/sections/system_users/feature_discovery.js +4 -10
- package/dist/ui/components/system_console/sections/system_users/filter_menu.js +3 -9
- package/dist/ui/components/system_console/sections/system_users/filter_popover.js +8 -14
- package/dist/ui/components/system_console/sections/system_users/mobile_security.js +3 -9
- package/dist/ui/components/system_console/sections/system_users/system_users.js +10 -16
- package/dist/ui/components/system_console/sidebar.js +4 -10
- package/dist/ui/pages/channels.js +18 -24
- package/dist/ui/pages/drafts.js +17 -23
- package/dist/ui/pages/index.js +17 -30
- package/dist/ui/pages/landing_login.js +5 -11
- package/dist/ui/pages/login.js +8 -14
- package/dist/ui/pages/reset_password.js +9 -15
- package/dist/ui/pages/scheduled_draft.js +19 -25
- package/dist/ui/pages/signup.js +11 -17
- package/dist/ui/pages/system_console.js +16 -22
- package/dist/util.js +8 -19
- package/dist/visual/index.js +14 -20
- package/dist/visual/percy.js +4 -10
- package/package.json +1 -1
package/dist/ui/pages/index.js
CHANGED
|
@@ -1,34 +1,21 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
var channels = require('./channels.js');
|
|
4
|
-
var landing_login = require('./landing_login.js');
|
|
5
|
-
var login = require('./login.js');
|
|
6
|
-
var reset_password = require('./reset_password.js');
|
|
7
|
-
var signup = require('./signup.js');
|
|
8
|
-
var system_console = require('./system_console.js');
|
|
9
|
-
var scheduled_draft = require('./scheduled_draft.js');
|
|
10
|
-
var drafts = require('./drafts.js');
|
|
11
|
-
|
|
12
1
|
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
|
|
13
2
|
// See LICENSE.txt for license information.
|
|
3
|
+
import ChannelsPage from './channels';
|
|
4
|
+
import LandingLoginPage from './landing_login';
|
|
5
|
+
import LoginPage from './login';
|
|
6
|
+
import ResetPasswordPage from './reset_password';
|
|
7
|
+
import SignupPage from './signup';
|
|
8
|
+
import SystemConsolePage from './system_console';
|
|
9
|
+
import ScheduledDraftPage from './scheduled_draft';
|
|
10
|
+
import DraftPage from './drafts';
|
|
14
11
|
const pages = {
|
|
15
|
-
ChannelsPage
|
|
16
|
-
LandingLoginPage
|
|
17
|
-
LoginPage
|
|
18
|
-
ResetPasswordPage
|
|
19
|
-
SignupPage
|
|
20
|
-
ScheduledDraftPage
|
|
21
|
-
SystemConsolePage
|
|
22
|
-
DraftPage
|
|
12
|
+
ChannelsPage,
|
|
13
|
+
LandingLoginPage,
|
|
14
|
+
LoginPage,
|
|
15
|
+
ResetPasswordPage,
|
|
16
|
+
SignupPage,
|
|
17
|
+
ScheduledDraftPage,
|
|
18
|
+
SystemConsolePage,
|
|
19
|
+
DraftPage,
|
|
23
20
|
};
|
|
24
|
-
|
|
25
|
-
exports.ChannelsPage = channels;
|
|
26
|
-
exports.LandingLoginPage = landing_login;
|
|
27
|
-
exports.LoginPage = login;
|
|
28
|
-
exports.ResetPasswordPage = reset_password;
|
|
29
|
-
exports.SignupPage = signup;
|
|
30
|
-
exports.SystemConsolePage = system_console;
|
|
31
|
-
exports.ScheduledDraftPage = scheduled_draft;
|
|
32
|
-
exports.DraftPage = drafts;
|
|
33
|
-
exports.pages = pages;
|
|
34
|
-
//# sourceMappingURL=index.js.map
|
|
21
|
+
export { pages, ChannelsPage, LandingLoginPage, LoginPage, ResetPasswordPage, SignupPage, ScheduledDraftPage, SystemConsolePage, DraftPage, };
|
|
@@ -1,10 +1,7 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
var test = require('@playwright/test');
|
|
4
|
-
|
|
5
1
|
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
|
|
6
2
|
// See LICENSE.txt for license information.
|
|
7
|
-
|
|
3
|
+
import { expect } from '@playwright/test';
|
|
4
|
+
export default class LandingLoginPage {
|
|
8
5
|
page;
|
|
9
6
|
isMobile;
|
|
10
7
|
viewInAppButton;
|
|
@@ -20,17 +17,14 @@ class LandingLoginPage {
|
|
|
20
17
|
async toBeVisible() {
|
|
21
18
|
await this.page.waitForLoadState('networkidle');
|
|
22
19
|
if (this.isMobile) {
|
|
23
|
-
await
|
|
20
|
+
await expect(this.viewInAppButton).toBeVisible();
|
|
24
21
|
}
|
|
25
22
|
else {
|
|
26
|
-
await
|
|
23
|
+
await expect(this.viewInDesktopAppButton).toBeVisible();
|
|
27
24
|
}
|
|
28
|
-
await
|
|
25
|
+
await expect(this.viewInBrowserButton).toBeVisible();
|
|
29
26
|
}
|
|
30
27
|
async goto() {
|
|
31
28
|
await this.page.goto('/landing#/login');
|
|
32
29
|
}
|
|
33
30
|
}
|
|
34
|
-
|
|
35
|
-
module.exports = LandingLoginPage;
|
|
36
|
-
//# sourceMappingURL=landing_login.js.map
|
package/dist/ui/pages/login.js
CHANGED
|
@@ -1,11 +1,8 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
var test = require('@playwright/test');
|
|
4
|
-
var index = require('../components/index.js');
|
|
5
|
-
|
|
6
1
|
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
|
|
7
2
|
// See LICENSE.txt for license information.
|
|
8
|
-
|
|
3
|
+
import { expect } from '@playwright/test';
|
|
4
|
+
import { components } from '@/ui/components';
|
|
5
|
+
export default class LoginPage {
|
|
9
6
|
page;
|
|
10
7
|
title;
|
|
11
8
|
subtitle;
|
|
@@ -39,14 +36,14 @@ class LoginPage {
|
|
|
39
36
|
this.userErrorLabel = page.locator('text=Please enter your email or username');
|
|
40
37
|
this.fieldWithError = page.locator('.with-error');
|
|
41
38
|
this.formContainer = page.locator('.signup-team__container');
|
|
42
|
-
this.header = new
|
|
43
|
-
this.footer = new
|
|
39
|
+
this.header = new components.MainHeader(page.locator('.hfroute-header'));
|
|
40
|
+
this.footer = new components.Footer(page.locator('.hfroute-footer'));
|
|
44
41
|
}
|
|
45
42
|
async toBeVisible() {
|
|
46
43
|
await this.page.waitForLoadState('networkidle');
|
|
47
|
-
await
|
|
48
|
-
await
|
|
49
|
-
await
|
|
44
|
+
await expect(this.title).toBeVisible();
|
|
45
|
+
await expect(this.loginInput).toBeVisible();
|
|
46
|
+
await expect(this.passwordInput).toBeVisible();
|
|
50
47
|
}
|
|
51
48
|
async goto() {
|
|
52
49
|
await this.page.goto('/login');
|
|
@@ -57,6 +54,3 @@ class LoginPage {
|
|
|
57
54
|
await Promise.all([this.page.waitForNavigation(), this.signInButton.click()]);
|
|
58
55
|
}
|
|
59
56
|
}
|
|
60
|
-
|
|
61
|
-
module.exports = LoginPage;
|
|
62
|
-
//# sourceMappingURL=login.js.map
|
|
@@ -1,11 +1,8 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
var test = require('@playwright/test');
|
|
4
|
-
var index = require('../components/index.js');
|
|
5
|
-
|
|
6
1
|
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
|
|
7
2
|
// See LICENSE.txt for license information.
|
|
8
|
-
|
|
3
|
+
import { expect } from '@playwright/test';
|
|
4
|
+
import { components } from '@/ui/components';
|
|
5
|
+
export default class ResetPasswordPage {
|
|
9
6
|
page;
|
|
10
7
|
title;
|
|
11
8
|
subtitle;
|
|
@@ -21,15 +18,15 @@ class ResetPasswordPage {
|
|
|
21
18
|
this.emailInput = page.locator(`[placeholder="Email"]`);
|
|
22
19
|
this.resetButton = page.locator('#passwordResetButton');
|
|
23
20
|
this.formContainer = page.locator('.signup-team__container');
|
|
24
|
-
this.header = new
|
|
25
|
-
this.footer = new
|
|
21
|
+
this.header = new components.MainHeader(page.locator('.signup-header'));
|
|
22
|
+
this.footer = new components.Footer(page.locator('#footer_section'));
|
|
26
23
|
}
|
|
27
24
|
async toBeVisible() {
|
|
28
25
|
await this.page.waitForLoadState('networkidle');
|
|
29
|
-
await
|
|
30
|
-
await
|
|
31
|
-
await
|
|
32
|
-
await
|
|
26
|
+
await expect(this.title).toBeVisible();
|
|
27
|
+
await expect(this.subtitle).toBeVisible();
|
|
28
|
+
await expect(this.emailInput).toBeVisible();
|
|
29
|
+
await expect(this.resetButton).toBeVisible();
|
|
33
30
|
}
|
|
34
31
|
async goto() {
|
|
35
32
|
await this.page.goto('/reset_password');
|
|
@@ -39,6 +36,3 @@ class ResetPasswordPage {
|
|
|
39
36
|
await Promise.all([this.page.waitForNavigation(), this.resetButton.click()]);
|
|
40
37
|
}
|
|
41
38
|
}
|
|
42
|
-
|
|
43
|
-
module.exports = ResetPasswordPage;
|
|
44
|
-
//# sourceMappingURL=reset_password.js.map
|
|
@@ -1,10 +1,7 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
var test = require('@playwright/test');
|
|
4
|
-
|
|
5
1
|
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
|
|
6
2
|
// See LICENSE.txt for license information.
|
|
7
|
-
|
|
3
|
+
import { expect } from '@playwright/test';
|
|
4
|
+
export default class ScheduledDraftPage {
|
|
8
5
|
page;
|
|
9
6
|
badgeCountOnScheduledTab;
|
|
10
7
|
confirmbutton;
|
|
@@ -48,15 +45,15 @@ class ScheduledDraftPage {
|
|
|
48
45
|
}
|
|
49
46
|
async toBeVisible() {
|
|
50
47
|
await this.page.waitForLoadState('networkidle');
|
|
51
|
-
await
|
|
48
|
+
await expect(this.page).toHaveURL(/.*scheduled_posts/);
|
|
52
49
|
}
|
|
53
50
|
async assertBadgeCountOnTab(badgeCount) {
|
|
54
51
|
await this.badgeCountOnScheduledTab.isVisible();
|
|
55
|
-
await
|
|
52
|
+
await expect(this.badgeCountOnScheduledTab).toHaveText(badgeCount);
|
|
56
53
|
}
|
|
57
54
|
async assertscheduledDraftBody(draftMessage) {
|
|
58
|
-
await
|
|
59
|
-
await
|
|
55
|
+
await expect(this.scheduledDraftBody).toBeVisible();
|
|
56
|
+
await expect(this.scheduledDraftBody).toHaveText(draftMessage);
|
|
60
57
|
}
|
|
61
58
|
async verifyOnHoverActionItems(messageContent) {
|
|
62
59
|
await this.scheduledDraftPanel(messageContent).isVisible();
|
|
@@ -69,26 +66,26 @@ class ScheduledDraftPage {
|
|
|
69
66
|
async verifyDeleteIcon() {
|
|
70
67
|
await this.deleteIcon.isVisible();
|
|
71
68
|
await this.deleteIcon.hover();
|
|
72
|
-
await
|
|
73
|
-
await
|
|
69
|
+
await expect(this.deleteIconToolTip).toBeVisible();
|
|
70
|
+
await expect(this.deleteIconToolTip).toHaveText('Delete scheduled post');
|
|
74
71
|
}
|
|
75
72
|
async verifyCopyIcon() {
|
|
76
73
|
await this.copyIcon.isVisible();
|
|
77
74
|
await this.copyIcon.hover();
|
|
78
|
-
await
|
|
79
|
-
await
|
|
75
|
+
await expect(this.copyIconToolTip).toBeVisible();
|
|
76
|
+
await expect(this.copyIconToolTip).toHaveText('Copy text');
|
|
80
77
|
}
|
|
81
78
|
async verifyRescheduleIcon() {
|
|
82
|
-
await
|
|
79
|
+
await expect(this.rescheduleIcon).toBeVisible();
|
|
83
80
|
await this.rescheduleIcon.hover();
|
|
84
|
-
await
|
|
85
|
-
await
|
|
81
|
+
await expect(this.rescheduleIconToolTip).toBeVisible();
|
|
82
|
+
await expect(this.rescheduleIconToolTip).toHaveText('Reschedule post');
|
|
86
83
|
}
|
|
87
84
|
async verifySendNowIcon() {
|
|
88
85
|
await this.scheduledDraftSendNowButton.isVisible();
|
|
89
86
|
await this.scheduledDraftSendNowButton.hover();
|
|
90
|
-
await
|
|
91
|
-
await
|
|
87
|
+
await expect(this.scheduledDraftSendNowButtonToolTip).toBeVisible();
|
|
88
|
+
await expect(this.scheduledDraftSendNowButtonToolTip).toHaveText('Send now');
|
|
92
89
|
}
|
|
93
90
|
async getTimeStampOfMessage(messageContent) {
|
|
94
91
|
await this.scheduledDraftPanel(messageContent).scrollIntoViewIfNeeded();
|
|
@@ -100,8 +97,8 @@ class ScheduledDraftPage {
|
|
|
100
97
|
await this.scheduledDraftPanel(messageContent).isVisible();
|
|
101
98
|
await this.scheduledDraftPanel(messageContent).hover();
|
|
102
99
|
await this.rescheduleIcon.hover();
|
|
103
|
-
await
|
|
104
|
-
await
|
|
100
|
+
await expect(this.rescheduleIconToolTip).toBeVisible();
|
|
101
|
+
await expect(this.rescheduleIconToolTip).toHaveText('Reschedule post');
|
|
105
102
|
await this.rescheduleIcon.click();
|
|
106
103
|
}
|
|
107
104
|
async deleteScheduledMessage(messageContent) {
|
|
@@ -109,7 +106,7 @@ class ScheduledDraftPage {
|
|
|
109
106
|
await this.scheduledDraftPanel(messageContent).hover();
|
|
110
107
|
await this.verifyDeleteIcon();
|
|
111
108
|
await this.deleteIcon.click();
|
|
112
|
-
|
|
109
|
+
expect(await this.confirmbutton.textContent()).toEqual('Yes, delete');
|
|
113
110
|
await this.confirmbutton.click();
|
|
114
111
|
}
|
|
115
112
|
async sendScheduledMessage(messageContent) {
|
|
@@ -117,7 +114,7 @@ class ScheduledDraftPage {
|
|
|
117
114
|
await this.scheduledDraftPanel(messageContent).hover();
|
|
118
115
|
await this.verifySendNowIcon();
|
|
119
116
|
await this.scheduledDraftSendNowButton.click();
|
|
120
|
-
|
|
117
|
+
expect(await this.confirmbutton.textContent()).toEqual('Yes, send now');
|
|
121
118
|
await this.confirmbutton.click();
|
|
122
119
|
}
|
|
123
120
|
async goTo(teamName) {
|
|
@@ -139,6 +136,3 @@ class ScheduledDraftPage {
|
|
|
139
136
|
await this.copyIcon.click();
|
|
140
137
|
}
|
|
141
138
|
}
|
|
142
|
-
|
|
143
|
-
module.exports = ScheduledDraftPage;
|
|
144
|
-
//# sourceMappingURL=scheduled_draft.js.map
|
package/dist/ui/pages/signup.js
CHANGED
|
@@ -1,12 +1,9 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
var test = require('@playwright/test');
|
|
4
|
-
var util = require('../../util.js');
|
|
5
|
-
var index = require('../components/index.js');
|
|
6
|
-
|
|
7
1
|
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
|
|
8
2
|
// See LICENSE.txt for license information.
|
|
9
|
-
|
|
3
|
+
import { expect } from '@playwright/test';
|
|
4
|
+
import { duration, wait } from '@/util';
|
|
5
|
+
import { components } from '@/ui/components';
|
|
6
|
+
export default class SignupPage {
|
|
10
7
|
page;
|
|
11
8
|
title;
|
|
12
9
|
subtitle;
|
|
@@ -48,17 +45,17 @@ class SignupPage {
|
|
|
48
45
|
const agreementBlock = page.locator('.signup-body-card-agreement');
|
|
49
46
|
this.agreementTermsOfUseLink = agreementBlock.locator('text=Terms of Use');
|
|
50
47
|
this.agreementPrivacyPolicyLink = agreementBlock.locator('text=Privacy Policy');
|
|
51
|
-
this.header = new
|
|
52
|
-
this.footer = new
|
|
48
|
+
this.header = new components.MainHeader(page.locator('.hfroute-header'));
|
|
49
|
+
this.footer = new components.Footer(page.locator('.hfroute-footer'));
|
|
53
50
|
}
|
|
54
51
|
async toBeVisible() {
|
|
55
52
|
await this.page.waitForLoadState('networkidle');
|
|
56
53
|
await this.page.waitForLoadState('domcontentloaded');
|
|
57
|
-
await
|
|
58
|
-
await
|
|
59
|
-
await
|
|
60
|
-
await
|
|
61
|
-
await
|
|
54
|
+
await wait(duration.half_sec);
|
|
55
|
+
await expect(this.title).toBeVisible();
|
|
56
|
+
await expect(this.emailInput).toBeVisible();
|
|
57
|
+
await expect(this.usernameInput).toBeVisible();
|
|
58
|
+
await expect(this.passwordInput).toBeVisible();
|
|
62
59
|
}
|
|
63
60
|
async goto() {
|
|
64
61
|
await this.page.goto('/signup_user_complete');
|
|
@@ -73,6 +70,3 @@ class SignupPage {
|
|
|
73
70
|
}
|
|
74
71
|
}
|
|
75
72
|
}
|
|
76
|
-
|
|
77
|
-
module.exports = SignupPage;
|
|
78
|
-
//# sourceMappingURL=signup.js.map
|
|
@@ -1,10 +1,7 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
var index = require('../components/index.js');
|
|
4
|
-
|
|
5
1
|
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
|
|
6
2
|
// See LICENSE.txt for license information.
|
|
7
|
-
|
|
3
|
+
import { components } from '@/ui/components';
|
|
4
|
+
export default class SystemConsolePage {
|
|
8
5
|
page;
|
|
9
6
|
sidebar;
|
|
10
7
|
navbar;
|
|
@@ -27,22 +24,22 @@ class SystemConsolePage {
|
|
|
27
24
|
constructor(page) {
|
|
28
25
|
this.page = page;
|
|
29
26
|
// Areas of the page
|
|
30
|
-
this.navbar = new
|
|
31
|
-
this.sidebar = new
|
|
27
|
+
this.navbar = new components.SystemConsoleNavbar(page.locator('.backstage-navbar'));
|
|
28
|
+
this.sidebar = new components.SystemConsoleSidebar(page.locator('.admin-sidebar'));
|
|
32
29
|
// Sections and sub-sections
|
|
33
|
-
this.systemUsers = new
|
|
34
|
-
this.mobileSecurity = new
|
|
35
|
-
this.featureDiscovery = new
|
|
30
|
+
this.systemUsers = new components.SystemUsers(page.getByTestId('systemUsersSection'));
|
|
31
|
+
this.mobileSecurity = new components.SystemConsoleMobileSecurity(page.getByTestId('sysconsole_section_MobileSecuritySettings'));
|
|
32
|
+
this.featureDiscovery = new components.SystemConsoleFeatureDiscovery(page.getByTestId('featureDiscovery'));
|
|
36
33
|
// Menus & Popovers
|
|
37
|
-
this.systemUsersFilterPopover = new
|
|
38
|
-
this.systemUsersRoleMenu = new
|
|
39
|
-
this.systemUsersStatusMenu = new
|
|
40
|
-
this.systemUsersColumnToggleMenu = new
|
|
41
|
-
this.systemUsersDateRangeMenu = new
|
|
42
|
-
this.systemUsersActionMenus = Array.from(Array(10).keys()).map((index
|
|
43
|
-
this.confirmModal = new
|
|
44
|
-
this.exportModal = new
|
|
45
|
-
this.saveChangesModal = new
|
|
34
|
+
this.systemUsersFilterPopover = new components.SystemUsersFilterPopover(page.locator('#systemUsersFilterPopover'));
|
|
35
|
+
this.systemUsersRoleMenu = new components.SystemUsersFilterMenu(page.locator('#DropdownInput_filterRole'));
|
|
36
|
+
this.systemUsersStatusMenu = new components.SystemUsersFilterMenu(page.locator('#DropdownInput_filterStatus'));
|
|
37
|
+
this.systemUsersColumnToggleMenu = new components.SystemUsersColumnToggleMenu(page.locator('#systemUsersColumnTogglerMenu'));
|
|
38
|
+
this.systemUsersDateRangeMenu = new components.SystemUsersFilterMenu(page.locator('#systemUsersDateRangeSelectorMenu'));
|
|
39
|
+
this.systemUsersActionMenus = Array.from(Array(10).keys()).map((index) => new components.SystemUsersFilterMenu(page.locator(`#actionMenu-systemUsersTable-${index}`)));
|
|
40
|
+
this.confirmModal = new components.GenericConfirmModal(page.locator('#confirmModal'));
|
|
41
|
+
this.exportModal = new components.GenericConfirmModal(page.getByRole('dialog', { name: 'Export user data' }));
|
|
42
|
+
this.saveChangesModal = new components.SystemUsers(page.locator('div.modal-content'));
|
|
46
43
|
}
|
|
47
44
|
async toBeVisible() {
|
|
48
45
|
await this.page.waitForLoadState('networkidle');
|
|
@@ -59,6 +56,3 @@ class SystemConsolePage {
|
|
|
59
56
|
await this.saveChangesModal.container.locator('button.btn-primary:has-text("Reset")').click();
|
|
60
57
|
}
|
|
61
58
|
}
|
|
62
|
-
|
|
63
|
-
module.exports = SystemConsolePage;
|
|
64
|
-
//# sourceMappingURL=system_console.js.map
|
package/dist/util.js
CHANGED
|
@@ -1,12 +1,9 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
var uuid = require('uuid');
|
|
4
|
-
|
|
5
1
|
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
|
|
6
2
|
// See LICENSE.txt for license information.
|
|
3
|
+
import { v4 as uuidv4 } from 'uuid';
|
|
7
4
|
const second = 1000;
|
|
8
5
|
const minute = 60 * 1000;
|
|
9
|
-
const duration = {
|
|
6
|
+
export const duration = {
|
|
10
7
|
half_sec: second / 2,
|
|
11
8
|
one_sec: second,
|
|
12
9
|
two_sec: second * 2,
|
|
@@ -22,30 +19,22 @@ const duration = {
|
|
|
22
19
|
* @param {number} ms - duration in millisecond
|
|
23
20
|
* @return {Promise} promise with timeout
|
|
24
21
|
*/
|
|
25
|
-
const wait = async (ms = 0) => {
|
|
22
|
+
export const wait = async (ms = 0) => {
|
|
26
23
|
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
27
24
|
};
|
|
28
25
|
/**
|
|
29
26
|
* @param {Number} length - length on random string to return, e.g. 7 (default)
|
|
30
27
|
* @return {String} random string
|
|
31
28
|
*/
|
|
32
|
-
function getRandomId(length = 7) {
|
|
29
|
+
export function getRandomId(length = 7) {
|
|
33
30
|
const MAX_SUBSTRING_INDEX = 27;
|
|
34
|
-
return
|
|
31
|
+
return uuidv4()
|
|
35
32
|
.replace(/-/g, '')
|
|
36
33
|
.substring(MAX_SUBSTRING_INDEX - length, MAX_SUBSTRING_INDEX);
|
|
37
34
|
}
|
|
38
35
|
// Default team is meant for sysadmin's primary team,
|
|
39
36
|
// selected for compatibility with existing local development.
|
|
40
37
|
// It should not be used for testing.
|
|
41
|
-
const defaultTeam = { name: 'ad-1', displayName: 'eligendi'};
|
|
42
|
-
const illegalRe = /[/?<>\\:*|":&();]/g;
|
|
43
|
-
const simpleEmailRe = /\S+@\S+\.\S+/;
|
|
44
|
-
|
|
45
|
-
exports.defaultTeam = defaultTeam;
|
|
46
|
-
exports.duration = duration;
|
|
47
|
-
exports.getRandomId = getRandomId;
|
|
48
|
-
exports.illegalRe = illegalRe;
|
|
49
|
-
exports.simpleEmailRe = simpleEmailRe;
|
|
50
|
-
exports.wait = wait;
|
|
51
|
-
//# sourceMappingURL=util.js.map
|
|
38
|
+
export const defaultTeam = { name: 'ad-1', displayName: 'eligendi', type: 'O' };
|
|
39
|
+
export const illegalRe = /[/?<>\\:*|":&();]/g;
|
|
40
|
+
export const simpleEmailRe = /\S+@\S+\.\S+/;
|
package/dist/visual/index.js
CHANGED
|
@@ -1,37 +1,31 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
var os = require('node:os');
|
|
4
|
-
var chalk = require('chalk');
|
|
5
|
-
var test = require('@playwright/test');
|
|
6
|
-
var percy = require('./percy.js');
|
|
7
|
-
var util = require('../util.js');
|
|
8
|
-
var test_config = require('../test_config.js');
|
|
9
|
-
|
|
10
1
|
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
|
|
11
2
|
// See LICENSE.txt for license information.
|
|
12
|
-
|
|
3
|
+
import os from 'node:os';
|
|
4
|
+
import chalk from 'chalk';
|
|
5
|
+
import { expect } from '@playwright/test';
|
|
6
|
+
import snapshotWithPercy from './percy';
|
|
7
|
+
import { duration, illegalRe, wait } from '@/util';
|
|
8
|
+
import { testConfig } from '@/test_config';
|
|
9
|
+
export async function matchSnapshot(testInfo, testArgs, options = {}) {
|
|
13
10
|
if (os.platform() !== 'linux') {
|
|
14
11
|
// eslint-disable-next-line no-console
|
|
15
12
|
console.log(chalk.yellow(`^ Warning: No visual test performed. Run in Linux or Playwright docker image to match snapshot.`));
|
|
16
13
|
return;
|
|
17
14
|
}
|
|
18
|
-
if (
|
|
15
|
+
if (testConfig.snapshotEnabled || testConfig.percyEnabled) {
|
|
19
16
|
await testArgs.page.waitForLoadState('networkidle');
|
|
20
17
|
await testArgs.page.waitForLoadState('domcontentloaded');
|
|
21
|
-
await
|
|
18
|
+
await wait(duration.half_sec);
|
|
22
19
|
}
|
|
23
|
-
if (
|
|
20
|
+
if (testConfig.snapshotEnabled) {
|
|
24
21
|
// Visual test with built-in snapshot
|
|
25
|
-
const filename = testInfo.title.trim().replace(
|
|
26
|
-
await
|
|
22
|
+
const filename = testInfo.title.trim().replace(illegalRe, '').replace(/\s/g, '-').trim().toLowerCase();
|
|
23
|
+
await expect(testArgs.page).toHaveScreenshot(`${filename}.png`, { fullPage: true, ...options });
|
|
27
24
|
}
|
|
28
|
-
if (
|
|
25
|
+
if (testConfig.percyEnabled) {
|
|
29
26
|
// Used to easily identify the screenshot when viewing from third-party service provider.
|
|
30
27
|
const name = `[${testInfo.project.name}, ${testArgs?.viewport?.width}px] > ${testInfo.file} > ${testInfo.title}`;
|
|
31
28
|
// Visual test with Percy
|
|
32
|
-
await
|
|
29
|
+
await snapshotWithPercy(name, testArgs);
|
|
33
30
|
}
|
|
34
31
|
}
|
|
35
|
-
|
|
36
|
-
exports.matchSnapshot = matchSnapshot;
|
|
37
|
-
//# sourceMappingURL=index.js.map
|
package/dist/visual/percy.js
CHANGED
|
@@ -1,12 +1,9 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
var percySnapshot = require('@percy/playwright');
|
|
4
|
-
var test_config = require('../test_config.js');
|
|
5
|
-
|
|
6
1
|
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
|
|
7
2
|
// See LICENSE.txt for license information.
|
|
8
|
-
|
|
9
|
-
|
|
3
|
+
import percySnapshot from '@percy/playwright';
|
|
4
|
+
import { testConfig } from '@/test_config';
|
|
5
|
+
export default async function snapshotWithPercy(name, testArgs) {
|
|
6
|
+
if (testArgs.browserName === 'chromium' && testConfig.percyEnabled && testArgs.viewport) {
|
|
10
7
|
const { page, viewport } = testArgs;
|
|
11
8
|
try {
|
|
12
9
|
await percySnapshot(page, name, { widths: [viewport.width], minHeight: viewport.height });
|
|
@@ -18,6 +15,3 @@ async function snapshotWithPercy(name, testArgs) {
|
|
|
18
15
|
}
|
|
19
16
|
}
|
|
20
17
|
}
|
|
21
|
-
|
|
22
|
-
module.exports = snapshotWithPercy;
|
|
23
|
-
//# sourceMappingURL=percy.js.map
|
package/package.json
CHANGED