@mattermost/playwright-lib 10.7.0-1 → 10.7.0-3
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 +21 -14
- package/dist/constant.js +6 -3
- package/dist/file.js +20 -20
- package/dist/flag.d.ts +2 -2
- package/dist/flag.js +77 -35
- package/dist/flag.js.map +1 -1
- package/dist/global_setup.js +24 -14
- package/dist/global_setup.js.map +1 -1
- package/dist/index.js +42 -9
- package/dist/mock_browser_api.js +8 -2
- package/dist/server/channel.js +9 -3
- package/dist/server/client.js +16 -10
- package/dist/server/default_config.js +15 -9
- package/dist/server/index.d.ts +0 -1
- package/dist/server/init.js +36 -29
- package/dist/server/post.js +9 -3
- package/dist/server/team.js +9 -3
- package/dist/server/user.js +15 -8
- package/dist/test_action.js +14 -3
- package/dist/test_config.js +30 -4
- package/dist/test_fixture.d.ts +2 -2
- package/dist/test_fixture.js +68 -49
- package/dist/test_fixture.js.map +1 -1
- package/dist/ui/components/channels/app_bar.js +9 -3
- package/dist/ui/components/channels/center_view.js +28 -22
- package/dist/ui/components/channels/delete_post_confirmation_dialog.js +14 -8
- package/dist/ui/components/channels/delete_post_modal.js +10 -4
- package/dist/ui/components/channels/emoji_gif_picker.js +15 -9
- package/dist/ui/components/channels/find_channels_modal.js +9 -3
- package/dist/ui/components/channels/generic_confirm_modal.js +11 -5
- package/dist/ui/components/channels/header.js +9 -3
- package/dist/ui/components/channels/message_priority.js +20 -14
- package/dist/ui/components/channels/post.js +16 -10
- package/dist/ui/components/channels/post_create.js +29 -23
- package/dist/ui/components/channels/post_dot_menu.js +9 -3
- package/dist/ui/components/channels/post_edit.js +22 -16
- package/dist/ui/components/channels/post_menu.js +9 -3
- package/dist/ui/components/channels/post_reminder_menu.js +9 -3
- package/dist/ui/components/channels/restore_post_confirmation_dialog.js +12 -6
- package/dist/ui/components/channels/scheduled_draft_menu.js +9 -3
- package/dist/ui/components/channels/scheduled_draft_modal.js +10 -4
- package/dist/ui/components/channels/search_popover.js +9 -3
- package/dist/ui/components/channels/settings/notification_settings.js +14 -8
- package/dist/ui/components/channels/settings/settings_modal.js +13 -7
- package/dist/ui/components/channels/sidebar_left.js +14 -8
- package/dist/ui/components/channels/sidebar_right.js +26 -20
- package/dist/ui/components/channels/thread_footer.js +9 -3
- package/dist/ui/components/channels/user_profile_popover.js +9 -3
- package/dist/ui/components/footer.js +9 -3
- package/dist/ui/components/global_header.js +13 -7
- package/dist/ui/components/index.js +74 -72
- package/dist/ui/components/main_header.js +9 -3
- package/dist/ui/components/system_console/navbar.js +9 -3
- package/dist/ui/components/system_console/sections/system_users/column_toggle_menu.js +10 -4
- package/dist/ui/components/system_console/sections/system_users/feature_discovery.js +10 -4
- package/dist/ui/components/system_console/sections/system_users/filter_menu.js +9 -3
- package/dist/ui/components/system_console/sections/system_users/filter_popover.js +14 -8
- package/dist/ui/components/system_console/sections/system_users/mobile_security.js +9 -3
- package/dist/ui/components/system_console/sections/system_users/system_users.js +16 -10
- package/dist/ui/components/system_console/sidebar.js +10 -4
- package/dist/ui/pages/channels.js +24 -18
- package/dist/ui/pages/drafts.js +23 -17
- package/dist/ui/pages/index.js +30 -17
- package/dist/ui/pages/landing_login.js +11 -5
- package/dist/ui/pages/login.js +14 -8
- package/dist/ui/pages/reset_password.js +15 -9
- package/dist/ui/pages/scheduled_draft.js +25 -19
- package/dist/ui/pages/signup.js +17 -11
- package/dist/ui/pages/system_console.js +22 -16
- package/dist/util.js +19 -8
- package/dist/visual/index.js +20 -14
- package/dist/visual/percy.js +10 -4
- package/package.json +1 -1
- package/dist/server/index.js +0 -10
- package/dist/server/plugins.d.ts +0 -2
- package/dist/server/plugins.js +0 -30
- package/dist/server/plugins.js.map +0 -1
- package/dist/tsconfig.tsbuildinfo +0 -1
- package/dist/types.js +0 -3
package/dist/ui/pages/index.js
CHANGED
|
@@ -1,21 +1,34 @@
|
|
|
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
|
+
|
|
1
12
|
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
|
|
2
13
|
// 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';
|
|
11
14
|
const pages = {
|
|
12
|
-
ChannelsPage,
|
|
13
|
-
LandingLoginPage,
|
|
14
|
-
LoginPage,
|
|
15
|
-
ResetPasswordPage,
|
|
16
|
-
SignupPage,
|
|
17
|
-
ScheduledDraftPage,
|
|
18
|
-
SystemConsolePage,
|
|
19
|
-
DraftPage,
|
|
15
|
+
ChannelsPage: channels,
|
|
16
|
+
LandingLoginPage: landing_login,
|
|
17
|
+
LoginPage: login,
|
|
18
|
+
ResetPasswordPage: reset_password,
|
|
19
|
+
SignupPage: signup,
|
|
20
|
+
ScheduledDraftPage: scheduled_draft,
|
|
21
|
+
SystemConsolePage: system_console,
|
|
22
|
+
DraftPage: drafts,
|
|
20
23
|
};
|
|
21
|
-
|
|
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
|
|
@@ -1,7 +1,10 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var test = require('@playwright/test');
|
|
4
|
+
|
|
1
5
|
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
|
|
2
6
|
// See LICENSE.txt for license information.
|
|
3
|
-
|
|
4
|
-
export default class LandingLoginPage {
|
|
7
|
+
class LandingLoginPage {
|
|
5
8
|
page;
|
|
6
9
|
isMobile;
|
|
7
10
|
viewInAppButton;
|
|
@@ -17,14 +20,17 @@ export default class LandingLoginPage {
|
|
|
17
20
|
async toBeVisible() {
|
|
18
21
|
await this.page.waitForLoadState('networkidle');
|
|
19
22
|
if (this.isMobile) {
|
|
20
|
-
await expect(this.viewInAppButton).toBeVisible();
|
|
23
|
+
await test.expect(this.viewInAppButton).toBeVisible();
|
|
21
24
|
}
|
|
22
25
|
else {
|
|
23
|
-
await expect(this.viewInDesktopAppButton).toBeVisible();
|
|
26
|
+
await test.expect(this.viewInDesktopAppButton).toBeVisible();
|
|
24
27
|
}
|
|
25
|
-
await expect(this.viewInBrowserButton).toBeVisible();
|
|
28
|
+
await test.expect(this.viewInBrowserButton).toBeVisible();
|
|
26
29
|
}
|
|
27
30
|
async goto() {
|
|
28
31
|
await this.page.goto('/landing#/login');
|
|
29
32
|
}
|
|
30
33
|
}
|
|
34
|
+
|
|
35
|
+
module.exports = LandingLoginPage;
|
|
36
|
+
//# sourceMappingURL=landing_login.js.map
|
package/dist/ui/pages/login.js
CHANGED
|
@@ -1,8 +1,11 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var test = require('@playwright/test');
|
|
4
|
+
var index = require('../components/index.js');
|
|
5
|
+
|
|
1
6
|
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
|
|
2
7
|
// See LICENSE.txt for license information.
|
|
3
|
-
|
|
4
|
-
import { components } from '@/ui/components';
|
|
5
|
-
export default class LoginPage {
|
|
8
|
+
class LoginPage {
|
|
6
9
|
page;
|
|
7
10
|
title;
|
|
8
11
|
subtitle;
|
|
@@ -36,14 +39,14 @@ export default class LoginPage {
|
|
|
36
39
|
this.userErrorLabel = page.locator('text=Please enter your email or username');
|
|
37
40
|
this.fieldWithError = page.locator('.with-error');
|
|
38
41
|
this.formContainer = page.locator('.signup-team__container');
|
|
39
|
-
this.header = new components.MainHeader(page.locator('.hfroute-header'));
|
|
40
|
-
this.footer = new components.Footer(page.locator('.hfroute-footer'));
|
|
42
|
+
this.header = new index.components.MainHeader(page.locator('.hfroute-header'));
|
|
43
|
+
this.footer = new index.components.Footer(page.locator('.hfroute-footer'));
|
|
41
44
|
}
|
|
42
45
|
async toBeVisible() {
|
|
43
46
|
await this.page.waitForLoadState('networkidle');
|
|
44
|
-
await expect(this.title).toBeVisible();
|
|
45
|
-
await expect(this.loginInput).toBeVisible();
|
|
46
|
-
await expect(this.passwordInput).toBeVisible();
|
|
47
|
+
await test.expect(this.title).toBeVisible();
|
|
48
|
+
await test.expect(this.loginInput).toBeVisible();
|
|
49
|
+
await test.expect(this.passwordInput).toBeVisible();
|
|
47
50
|
}
|
|
48
51
|
async goto() {
|
|
49
52
|
await this.page.goto('/login');
|
|
@@ -54,3 +57,6 @@ export default class LoginPage {
|
|
|
54
57
|
await Promise.all([this.page.waitForNavigation(), this.signInButton.click()]);
|
|
55
58
|
}
|
|
56
59
|
}
|
|
60
|
+
|
|
61
|
+
module.exports = LoginPage;
|
|
62
|
+
//# sourceMappingURL=login.js.map
|
|
@@ -1,8 +1,11 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var test = require('@playwright/test');
|
|
4
|
+
var index = require('../components/index.js');
|
|
5
|
+
|
|
1
6
|
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
|
|
2
7
|
// See LICENSE.txt for license information.
|
|
3
|
-
|
|
4
|
-
import { components } from '@/ui/components';
|
|
5
|
-
export default class ResetPasswordPage {
|
|
8
|
+
class ResetPasswordPage {
|
|
6
9
|
page;
|
|
7
10
|
title;
|
|
8
11
|
subtitle;
|
|
@@ -18,15 +21,15 @@ export default class ResetPasswordPage {
|
|
|
18
21
|
this.emailInput = page.locator(`[placeholder="Email"]`);
|
|
19
22
|
this.resetButton = page.locator('#passwordResetButton');
|
|
20
23
|
this.formContainer = page.locator('.signup-team__container');
|
|
21
|
-
this.header = new components.MainHeader(page.locator('.signup-header'));
|
|
22
|
-
this.footer = new components.Footer(page.locator('#footer_section'));
|
|
24
|
+
this.header = new index.components.MainHeader(page.locator('.signup-header'));
|
|
25
|
+
this.footer = new index.components.Footer(page.locator('#footer_section'));
|
|
23
26
|
}
|
|
24
27
|
async toBeVisible() {
|
|
25
28
|
await this.page.waitForLoadState('networkidle');
|
|
26
|
-
await expect(this.title).toBeVisible();
|
|
27
|
-
await expect(this.subtitle).toBeVisible();
|
|
28
|
-
await expect(this.emailInput).toBeVisible();
|
|
29
|
-
await expect(this.resetButton).toBeVisible();
|
|
29
|
+
await test.expect(this.title).toBeVisible();
|
|
30
|
+
await test.expect(this.subtitle).toBeVisible();
|
|
31
|
+
await test.expect(this.emailInput).toBeVisible();
|
|
32
|
+
await test.expect(this.resetButton).toBeVisible();
|
|
30
33
|
}
|
|
31
34
|
async goto() {
|
|
32
35
|
await this.page.goto('/reset_password');
|
|
@@ -36,3 +39,6 @@ export default class ResetPasswordPage {
|
|
|
36
39
|
await Promise.all([this.page.waitForNavigation(), this.resetButton.click()]);
|
|
37
40
|
}
|
|
38
41
|
}
|
|
42
|
+
|
|
43
|
+
module.exports = ResetPasswordPage;
|
|
44
|
+
//# sourceMappingURL=reset_password.js.map
|
|
@@ -1,7 +1,10 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var test = require('@playwright/test');
|
|
4
|
+
|
|
1
5
|
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
|
|
2
6
|
// See LICENSE.txt for license information.
|
|
3
|
-
|
|
4
|
-
export default class ScheduledDraftPage {
|
|
7
|
+
class ScheduledDraftPage {
|
|
5
8
|
page;
|
|
6
9
|
badgeCountOnScheduledTab;
|
|
7
10
|
confirmbutton;
|
|
@@ -45,15 +48,15 @@ export default class ScheduledDraftPage {
|
|
|
45
48
|
}
|
|
46
49
|
async toBeVisible() {
|
|
47
50
|
await this.page.waitForLoadState('networkidle');
|
|
48
|
-
await expect(this.page).toHaveURL(/.*scheduled_posts/);
|
|
51
|
+
await test.expect(this.page).toHaveURL(/.*scheduled_posts/);
|
|
49
52
|
}
|
|
50
53
|
async assertBadgeCountOnTab(badgeCount) {
|
|
51
54
|
await this.badgeCountOnScheduledTab.isVisible();
|
|
52
|
-
await expect(this.badgeCountOnScheduledTab).toHaveText(badgeCount);
|
|
55
|
+
await test.expect(this.badgeCountOnScheduledTab).toHaveText(badgeCount);
|
|
53
56
|
}
|
|
54
57
|
async assertscheduledDraftBody(draftMessage) {
|
|
55
|
-
await expect(this.scheduledDraftBody).toBeVisible();
|
|
56
|
-
await expect(this.scheduledDraftBody).toHaveText(draftMessage);
|
|
58
|
+
await test.expect(this.scheduledDraftBody).toBeVisible();
|
|
59
|
+
await test.expect(this.scheduledDraftBody).toHaveText(draftMessage);
|
|
57
60
|
}
|
|
58
61
|
async verifyOnHoverActionItems(messageContent) {
|
|
59
62
|
await this.scheduledDraftPanel(messageContent).isVisible();
|
|
@@ -66,26 +69,26 @@ export default class ScheduledDraftPage {
|
|
|
66
69
|
async verifyDeleteIcon() {
|
|
67
70
|
await this.deleteIcon.isVisible();
|
|
68
71
|
await this.deleteIcon.hover();
|
|
69
|
-
await expect(this.deleteIconToolTip).toBeVisible();
|
|
70
|
-
await expect(this.deleteIconToolTip).toHaveText('Delete scheduled post');
|
|
72
|
+
await test.expect(this.deleteIconToolTip).toBeVisible();
|
|
73
|
+
await test.expect(this.deleteIconToolTip).toHaveText('Delete scheduled post');
|
|
71
74
|
}
|
|
72
75
|
async verifyCopyIcon() {
|
|
73
76
|
await this.copyIcon.isVisible();
|
|
74
77
|
await this.copyIcon.hover();
|
|
75
|
-
await expect(this.copyIconToolTip).toBeVisible();
|
|
76
|
-
await expect(this.copyIconToolTip).toHaveText('Copy text');
|
|
78
|
+
await test.expect(this.copyIconToolTip).toBeVisible();
|
|
79
|
+
await test.expect(this.copyIconToolTip).toHaveText('Copy text');
|
|
77
80
|
}
|
|
78
81
|
async verifyRescheduleIcon() {
|
|
79
|
-
await expect(this.rescheduleIcon).toBeVisible();
|
|
82
|
+
await test.expect(this.rescheduleIcon).toBeVisible();
|
|
80
83
|
await this.rescheduleIcon.hover();
|
|
81
|
-
await expect(this.rescheduleIconToolTip).toBeVisible();
|
|
82
|
-
await expect(this.rescheduleIconToolTip).toHaveText('Reschedule post');
|
|
84
|
+
await test.expect(this.rescheduleIconToolTip).toBeVisible();
|
|
85
|
+
await test.expect(this.rescheduleIconToolTip).toHaveText('Reschedule post');
|
|
83
86
|
}
|
|
84
87
|
async verifySendNowIcon() {
|
|
85
88
|
await this.scheduledDraftSendNowButton.isVisible();
|
|
86
89
|
await this.scheduledDraftSendNowButton.hover();
|
|
87
|
-
await expect(this.scheduledDraftSendNowButtonToolTip).toBeVisible();
|
|
88
|
-
await expect(this.scheduledDraftSendNowButtonToolTip).toHaveText('Send now');
|
|
90
|
+
await test.expect(this.scheduledDraftSendNowButtonToolTip).toBeVisible();
|
|
91
|
+
await test.expect(this.scheduledDraftSendNowButtonToolTip).toHaveText('Send now');
|
|
89
92
|
}
|
|
90
93
|
async getTimeStampOfMessage(messageContent) {
|
|
91
94
|
await this.scheduledDraftPanel(messageContent).scrollIntoViewIfNeeded();
|
|
@@ -97,8 +100,8 @@ export default class ScheduledDraftPage {
|
|
|
97
100
|
await this.scheduledDraftPanel(messageContent).isVisible();
|
|
98
101
|
await this.scheduledDraftPanel(messageContent).hover();
|
|
99
102
|
await this.rescheduleIcon.hover();
|
|
100
|
-
await expect(this.rescheduleIconToolTip).toBeVisible();
|
|
101
|
-
await expect(this.rescheduleIconToolTip).toHaveText('Reschedule post');
|
|
103
|
+
await test.expect(this.rescheduleIconToolTip).toBeVisible();
|
|
104
|
+
await test.expect(this.rescheduleIconToolTip).toHaveText('Reschedule post');
|
|
102
105
|
await this.rescheduleIcon.click();
|
|
103
106
|
}
|
|
104
107
|
async deleteScheduledMessage(messageContent) {
|
|
@@ -106,7 +109,7 @@ export default class ScheduledDraftPage {
|
|
|
106
109
|
await this.scheduledDraftPanel(messageContent).hover();
|
|
107
110
|
await this.verifyDeleteIcon();
|
|
108
111
|
await this.deleteIcon.click();
|
|
109
|
-
expect(await this.confirmbutton.textContent()).toEqual('Yes, delete');
|
|
112
|
+
test.expect(await this.confirmbutton.textContent()).toEqual('Yes, delete');
|
|
110
113
|
await this.confirmbutton.click();
|
|
111
114
|
}
|
|
112
115
|
async sendScheduledMessage(messageContent) {
|
|
@@ -114,7 +117,7 @@ export default class ScheduledDraftPage {
|
|
|
114
117
|
await this.scheduledDraftPanel(messageContent).hover();
|
|
115
118
|
await this.verifySendNowIcon();
|
|
116
119
|
await this.scheduledDraftSendNowButton.click();
|
|
117
|
-
expect(await this.confirmbutton.textContent()).toEqual('Yes, send now');
|
|
120
|
+
test.expect(await this.confirmbutton.textContent()).toEqual('Yes, send now');
|
|
118
121
|
await this.confirmbutton.click();
|
|
119
122
|
}
|
|
120
123
|
async goTo(teamName) {
|
|
@@ -136,3 +139,6 @@ export default class ScheduledDraftPage {
|
|
|
136
139
|
await this.copyIcon.click();
|
|
137
140
|
}
|
|
138
141
|
}
|
|
142
|
+
|
|
143
|
+
module.exports = ScheduledDraftPage;
|
|
144
|
+
//# sourceMappingURL=scheduled_draft.js.map
|
package/dist/ui/pages/signup.js
CHANGED
|
@@ -1,9 +1,12 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var test = require('@playwright/test');
|
|
4
|
+
var util = require('../../util.js');
|
|
5
|
+
var index = require('../components/index.js');
|
|
6
|
+
|
|
1
7
|
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
|
|
2
8
|
// See LICENSE.txt for license information.
|
|
3
|
-
|
|
4
|
-
import { duration, wait } from '@/util';
|
|
5
|
-
import { components } from '@/ui/components';
|
|
6
|
-
export default class SignupPage {
|
|
9
|
+
class SignupPage {
|
|
7
10
|
page;
|
|
8
11
|
title;
|
|
9
12
|
subtitle;
|
|
@@ -45,17 +48,17 @@ export default class SignupPage {
|
|
|
45
48
|
const agreementBlock = page.locator('.signup-body-card-agreement');
|
|
46
49
|
this.agreementTermsOfUseLink = agreementBlock.locator('text=Terms of Use');
|
|
47
50
|
this.agreementPrivacyPolicyLink = agreementBlock.locator('text=Privacy Policy');
|
|
48
|
-
this.header = new components.MainHeader(page.locator('.hfroute-header'));
|
|
49
|
-
this.footer = new components.Footer(page.locator('.hfroute-footer'));
|
|
51
|
+
this.header = new index.components.MainHeader(page.locator('.hfroute-header'));
|
|
52
|
+
this.footer = new index.components.Footer(page.locator('.hfroute-footer'));
|
|
50
53
|
}
|
|
51
54
|
async toBeVisible() {
|
|
52
55
|
await this.page.waitForLoadState('networkidle');
|
|
53
56
|
await this.page.waitForLoadState('domcontentloaded');
|
|
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();
|
|
57
|
+
await util.wait(util.duration.half_sec);
|
|
58
|
+
await test.expect(this.title).toBeVisible();
|
|
59
|
+
await test.expect(this.emailInput).toBeVisible();
|
|
60
|
+
await test.expect(this.usernameInput).toBeVisible();
|
|
61
|
+
await test.expect(this.passwordInput).toBeVisible();
|
|
59
62
|
}
|
|
60
63
|
async goto() {
|
|
61
64
|
await this.page.goto('/signup_user_complete');
|
|
@@ -70,3 +73,6 @@ export default class SignupPage {
|
|
|
70
73
|
}
|
|
71
74
|
}
|
|
72
75
|
}
|
|
76
|
+
|
|
77
|
+
module.exports = SignupPage;
|
|
78
|
+
//# sourceMappingURL=signup.js.map
|
|
@@ -1,7 +1,10 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var index = require('../components/index.js');
|
|
4
|
+
|
|
1
5
|
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
|
|
2
6
|
// See LICENSE.txt for license information.
|
|
3
|
-
|
|
4
|
-
export default class SystemConsolePage {
|
|
7
|
+
class SystemConsolePage {
|
|
5
8
|
page;
|
|
6
9
|
sidebar;
|
|
7
10
|
navbar;
|
|
@@ -24,22 +27,22 @@ export default class SystemConsolePage {
|
|
|
24
27
|
constructor(page) {
|
|
25
28
|
this.page = page;
|
|
26
29
|
// Areas of the page
|
|
27
|
-
this.navbar = new components.SystemConsoleNavbar(page.locator('.backstage-navbar'));
|
|
28
|
-
this.sidebar = new components.SystemConsoleSidebar(page.locator('.admin-sidebar'));
|
|
30
|
+
this.navbar = new index.components.SystemConsoleNavbar(page.locator('.backstage-navbar'));
|
|
31
|
+
this.sidebar = new index.components.SystemConsoleSidebar(page.locator('.admin-sidebar'));
|
|
29
32
|
// Sections and sub-sections
|
|
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'));
|
|
33
|
+
this.systemUsers = new index.components.SystemUsers(page.getByTestId('systemUsersSection'));
|
|
34
|
+
this.mobileSecurity = new index.components.SystemConsoleMobileSecurity(page.getByTestId('sysconsole_section_MobileSecuritySettings'));
|
|
35
|
+
this.featureDiscovery = new index.components.SystemConsoleFeatureDiscovery(page.getByTestId('featureDiscovery'));
|
|
33
36
|
// Menus & Popovers
|
|
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'));
|
|
37
|
+
this.systemUsersFilterPopover = new index.components.SystemUsersFilterPopover(page.locator('#systemUsersFilterPopover'));
|
|
38
|
+
this.systemUsersRoleMenu = new index.components.SystemUsersFilterMenu(page.locator('#DropdownInput_filterRole'));
|
|
39
|
+
this.systemUsersStatusMenu = new index.components.SystemUsersFilterMenu(page.locator('#DropdownInput_filterStatus'));
|
|
40
|
+
this.systemUsersColumnToggleMenu = new index.components.SystemUsersColumnToggleMenu(page.locator('#systemUsersColumnTogglerMenu'));
|
|
41
|
+
this.systemUsersDateRangeMenu = new index.components.SystemUsersFilterMenu(page.locator('#systemUsersDateRangeSelectorMenu'));
|
|
42
|
+
this.systemUsersActionMenus = Array.from(Array(10).keys()).map((index$1) => new index.components.SystemUsersFilterMenu(page.locator(`#actionMenu-systemUsersTable-${index$1}`)));
|
|
43
|
+
this.confirmModal = new index.components.GenericConfirmModal(page.locator('#confirmModal'));
|
|
44
|
+
this.exportModal = new index.components.GenericConfirmModal(page.getByRole('dialog', { name: 'Export user data' }));
|
|
45
|
+
this.saveChangesModal = new index.components.SystemUsers(page.locator('div.modal-content'));
|
|
43
46
|
}
|
|
44
47
|
async toBeVisible() {
|
|
45
48
|
await this.page.waitForLoadState('networkidle');
|
|
@@ -56,3 +59,6 @@ export default class SystemConsolePage {
|
|
|
56
59
|
await this.saveChangesModal.container.locator('button.btn-primary:has-text("Reset")').click();
|
|
57
60
|
}
|
|
58
61
|
}
|
|
62
|
+
|
|
63
|
+
module.exports = SystemConsolePage;
|
|
64
|
+
//# sourceMappingURL=system_console.js.map
|
package/dist/util.js
CHANGED
|
@@ -1,9 +1,12 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var uuid = require('uuid');
|
|
4
|
+
|
|
1
5
|
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
|
|
2
6
|
// See LICENSE.txt for license information.
|
|
3
|
-
import { v4 as uuidv4 } from 'uuid';
|
|
4
7
|
const second = 1000;
|
|
5
8
|
const minute = 60 * 1000;
|
|
6
|
-
|
|
9
|
+
const duration = {
|
|
7
10
|
half_sec: second / 2,
|
|
8
11
|
one_sec: second,
|
|
9
12
|
two_sec: second * 2,
|
|
@@ -19,22 +22,30 @@ export const duration = {
|
|
|
19
22
|
* @param {number} ms - duration in millisecond
|
|
20
23
|
* @return {Promise} promise with timeout
|
|
21
24
|
*/
|
|
22
|
-
|
|
25
|
+
const wait = async (ms = 0) => {
|
|
23
26
|
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
24
27
|
};
|
|
25
28
|
/**
|
|
26
29
|
* @param {Number} length - length on random string to return, e.g. 7 (default)
|
|
27
30
|
* @return {String} random string
|
|
28
31
|
*/
|
|
29
|
-
|
|
32
|
+
function getRandomId(length = 7) {
|
|
30
33
|
const MAX_SUBSTRING_INDEX = 27;
|
|
31
|
-
return
|
|
34
|
+
return uuid.v4()
|
|
32
35
|
.replace(/-/g, '')
|
|
33
36
|
.substring(MAX_SUBSTRING_INDEX - length, MAX_SUBSTRING_INDEX);
|
|
34
37
|
}
|
|
35
38
|
// Default team is meant for sysadmin's primary team,
|
|
36
39
|
// selected for compatibility with existing local development.
|
|
37
40
|
// It should not be used for testing.
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
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
|
package/dist/visual/index.js
CHANGED
|
@@ -1,31 +1,37 @@
|
|
|
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
|
+
|
|
1
10
|
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
|
|
2
11
|
// See LICENSE.txt for license information.
|
|
3
|
-
|
|
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 = {}) {
|
|
12
|
+
async function matchSnapshot(testInfo, testArgs, options = {}) {
|
|
10
13
|
if (os.platform() !== 'linux') {
|
|
11
14
|
// eslint-disable-next-line no-console
|
|
12
15
|
console.log(chalk.yellow(`^ Warning: No visual test performed. Run in Linux or Playwright docker image to match snapshot.`));
|
|
13
16
|
return;
|
|
14
17
|
}
|
|
15
|
-
if (testConfig.snapshotEnabled || testConfig.percyEnabled) {
|
|
18
|
+
if (test_config.testConfig.snapshotEnabled || test_config.testConfig.percyEnabled) {
|
|
16
19
|
await testArgs.page.waitForLoadState('networkidle');
|
|
17
20
|
await testArgs.page.waitForLoadState('domcontentloaded');
|
|
18
|
-
await wait(duration.half_sec);
|
|
21
|
+
await util.wait(util.duration.half_sec);
|
|
19
22
|
}
|
|
20
|
-
if (testConfig.snapshotEnabled) {
|
|
23
|
+
if (test_config.testConfig.snapshotEnabled) {
|
|
21
24
|
// Visual test with built-in snapshot
|
|
22
|
-
const filename = testInfo.title.trim().replace(illegalRe, '').replace(/\s/g, '-').trim().toLowerCase();
|
|
23
|
-
await expect(testArgs.page).toHaveScreenshot(`${filename}.png`, { fullPage: true, ...options });
|
|
25
|
+
const filename = testInfo.title.trim().replace(util.illegalRe, '').replace(/\s/g, '-').trim().toLowerCase();
|
|
26
|
+
await test.expect(testArgs.page).toHaveScreenshot(`${filename}.png`, { fullPage: true, ...options });
|
|
24
27
|
}
|
|
25
|
-
if (testConfig.percyEnabled) {
|
|
28
|
+
if (test_config.testConfig.percyEnabled) {
|
|
26
29
|
// Used to easily identify the screenshot when viewing from third-party service provider.
|
|
27
30
|
const name = `[${testInfo.project.name}, ${testArgs?.viewport?.width}px] > ${testInfo.file} > ${testInfo.title}`;
|
|
28
31
|
// Visual test with Percy
|
|
29
|
-
await
|
|
32
|
+
await percy(name, testArgs);
|
|
30
33
|
}
|
|
31
34
|
}
|
|
35
|
+
|
|
36
|
+
exports.matchSnapshot = matchSnapshot;
|
|
37
|
+
//# sourceMappingURL=index.js.map
|
package/dist/visual/percy.js
CHANGED
|
@@ -1,9 +1,12 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var percySnapshot = require('@percy/playwright');
|
|
4
|
+
var test_config = require('../test_config.js');
|
|
5
|
+
|
|
1
6
|
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
|
|
2
7
|
// See LICENSE.txt for license information.
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
export default async function snapshotWithPercy(name, testArgs) {
|
|
6
|
-
if (testArgs.browserName === 'chromium' && testConfig.percyEnabled && testArgs.viewport) {
|
|
8
|
+
async function snapshotWithPercy(name, testArgs) {
|
|
9
|
+
if (testArgs.browserName === 'chromium' && test_config.testConfig.percyEnabled && testArgs.viewport) {
|
|
7
10
|
const { page, viewport } = testArgs;
|
|
8
11
|
try {
|
|
9
12
|
await percySnapshot(page, name, { widths: [viewport.width], minHeight: viewport.height });
|
|
@@ -15,3 +18,6 @@ export default async function snapshotWithPercy(name, testArgs) {
|
|
|
15
18
|
}
|
|
16
19
|
}
|
|
17
20
|
}
|
|
21
|
+
|
|
22
|
+
module.exports = snapshotWithPercy;
|
|
23
|
+
//# sourceMappingURL=percy.js.map
|
package/package.json
CHANGED
package/dist/server/index.js
DELETED
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
|
|
2
|
-
// See LICENSE.txt for license information.
|
|
3
|
-
export { makeClient } from './client';
|
|
4
|
-
export { createRandomChannel } from './channel';
|
|
5
|
-
export { getOnPremServerConfig } from './default_config';
|
|
6
|
-
export { initSetup, getAdminClient } from './init';
|
|
7
|
-
export { ensurePluginsLoaded } from './plugins';
|
|
8
|
-
export { createRandomPost } from './post';
|
|
9
|
-
export { createRandomTeam } from './team';
|
|
10
|
-
export { createRandomUser, getDefaultAdminUser } from './user';
|
package/dist/server/plugins.d.ts
DELETED
package/dist/server/plugins.js
DELETED
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
|
|
2
|
-
// See LICENSE.txt for license information.
|
|
3
|
-
import { expect } from '@playwright/test';
|
|
4
|
-
import { testConfig } from '@/test_config';
|
|
5
|
-
// ensurePluginsLoaded is used to ensure all pluginIds including from testConfig.ensurePluginsInstalled are installed and active.
|
|
6
|
-
// If any pluginId is not installed, test will fail.
|
|
7
|
-
// testConfig.ensurePluginsInstalled is derived from `PW_ENSURE_PLUGINS_INSTALLED` environment variable.
|
|
8
|
-
export async function ensurePluginsLoaded(client, pluginIds = []) {
|
|
9
|
-
const pluginStatus = await client.getPluginStatuses();
|
|
10
|
-
const plugins = await client.getPlugins();
|
|
11
|
-
// Ensure all plugins are installed and active.
|
|
12
|
-
testConfig.ensurePluginsInstalled
|
|
13
|
-
.concat(pluginIds)
|
|
14
|
-
.filter((pluginId) => Boolean(pluginId))
|
|
15
|
-
.forEach(async (pluginId) => {
|
|
16
|
-
const isInstalled = pluginStatus.some((plugin) => plugin.plugin_id === pluginId);
|
|
17
|
-
// If not installed, test will fail.
|
|
18
|
-
expect(isInstalled, `${pluginId} is not installed. Related test will fail.`).toBe(true);
|
|
19
|
-
const isActive = plugins.active.some((plugin) => plugin.id === pluginId);
|
|
20
|
-
if (!isActive) {
|
|
21
|
-
await client.enablePlugin(pluginId);
|
|
22
|
-
// eslint-disable-next-line no-console
|
|
23
|
-
console.log(`${pluginId} is installed and has been activated.`);
|
|
24
|
-
}
|
|
25
|
-
else {
|
|
26
|
-
// eslint-disable-next-line no-console
|
|
27
|
-
console.log(`${pluginId} is installed and active.`);
|
|
28
|
-
}
|
|
29
|
-
});
|
|
30
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"plugins.js","sources":["../../src/server/plugins.ts"],"sourcesContent":["// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {Client4} from '@mattermost/client';\nimport {PluginManifest} from '@mattermost/types/plugins';\nimport { expect } from '@playwright/test';\n\nimport {testConfig} from '@/test_config';\n\n// ensurePluginsLoaded is used to ensure all pluginIds including from testConfig.ensurePluginsInstalled are installed and active.\n// If any pluginId is not installed, test will fail.\n// testConfig.ensurePluginsInstalled can be derived from `PW_ENSURE_PLUGINS_INSTALLED` environment variable.\nexport async function ensurePluginsLoaded(client: Client4, pluginIds: string[] = []) {\n const pluginStatus = await client.getPluginStatuses();\n const plugins = await client.getPlugins();\n\n // Ensure all plugins are installed and active.\n // If not installed, test will fail.\n testConfig.ensurePluginsInstalled.concat(pluginIds).filter((pluginId) => Boolean(pluginId)).forEach(async (pluginId) => {\n const isInstalled = pluginStatus.some((plugin) => plugin.plugin_id === pluginId);\n\n // If not installed, test will fail.\n expect(isInstalled, `${pluginId} is not installed. Related test will fail.`).toBe(true);\n\n const isActive = plugins.active.some((plugin: PluginManifest) => plugin.id === pluginId);\n if (!isActive) {\n await client.enablePlugin(pluginId);\n\n // eslint-disable-next-line no-console\n console.log(`${pluginId} is installed and has been activated.`);\n } else {\n // eslint-disable-next-line no-console\n console.log(`${pluginId} is installed and active.`);\n }\n });\n}\n"],"names":["testConfig","expect"],"mappings":";;;;;AAAA;AACA;AAQA;AACA;AACA;AACO,eAAe,mBAAmB,CAAC,MAAe,EAAE,YAAsB,EAAE,EAAA;AAC/E,IAAA,MAAM,YAAY,GAAG,MAAM,MAAM,CAAC,iBAAiB,EAAE;AACrD,IAAA,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,UAAU,EAAE;;;IAIzCA,sBAAU,CAAC,sBAAsB,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,QAAQ,KAAI;AACnH,QAAA,MAAM,WAAW,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,SAAS,KAAK,QAAQ,CAAC;;AAGhF,QAAAC,WAAM,CAAC,WAAW,EAAE,CAAA,EAAG,QAAQ,CAAA,0CAAA,CAA4C,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;AAEvF,QAAA,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAsB,KAAK,MAAM,CAAC,EAAE,KAAK,QAAQ,CAAC;QACxF,IAAI,CAAC,QAAQ,EAAE;AACX,YAAA,MAAM,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC;;AAGnC,YAAA,OAAO,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAA,qCAAA,CAAuC,CAAC;;aAC5D;;AAEH,YAAA,OAAO,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAA,yBAAA,CAA2B,CAAC;;AAE3D,KAAC,CAAC;AACN;;;;"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"root":["../src/browser_context.ts","../src/constant.ts","../src/file.ts","../src/flag.ts","../src/global_setup.ts","../src/index.ts","../src/mock_browser_api.ts","../src/test_action.ts","../src/test_config.ts","../src/test_fixture.ts","../src/types.ts","../src/util.ts","../src/server/channel.ts","../src/server/client.ts","../src/server/default_config.ts","../src/server/index.ts","../src/server/init.ts","../src/server/plugins.ts","../src/server/post.ts","../src/server/team.ts","../src/server/user.ts","../src/ui/components/footer.ts","../src/ui/components/global_header.ts","../src/ui/components/index.ts","../src/ui/components/main_header.ts","../src/ui/components/channels/app_bar.ts","../src/ui/components/channels/center_view.ts","../src/ui/components/channels/delete_post_confirmation_dialog.ts","../src/ui/components/channels/delete_post_modal.ts","../src/ui/components/channels/emoji_gif_picker.ts","../src/ui/components/channels/find_channels_modal.ts","../src/ui/components/channels/generic_confirm_modal.ts","../src/ui/components/channels/header.ts","../src/ui/components/channels/message_priority.ts","../src/ui/components/channels/post.ts","../src/ui/components/channels/post_create.ts","../src/ui/components/channels/post_dot_menu.ts","../src/ui/components/channels/post_edit.ts","../src/ui/components/channels/post_menu.ts","../src/ui/components/channels/post_reminder_menu.ts","../src/ui/components/channels/restore_post_confirmation_dialog.ts","../src/ui/components/channels/scheduled_draft_menu.ts","../src/ui/components/channels/scheduled_draft_modal.ts","../src/ui/components/channels/search_popover.ts","../src/ui/components/channels/sidebar_left.ts","../src/ui/components/channels/sidebar_right.ts","../src/ui/components/channels/thread_footer.ts","../src/ui/components/channels/user_profile_popover.ts","../src/ui/components/channels/settings/notification_settings.ts","../src/ui/components/channels/settings/settings_modal.ts","../src/ui/components/system_console/navbar.ts","../src/ui/components/system_console/sidebar.ts","../src/ui/components/system_console/sections/system_users/column_toggle_menu.ts","../src/ui/components/system_console/sections/system_users/feature_discovery.ts","../src/ui/components/system_console/sections/system_users/filter_menu.ts","../src/ui/components/system_console/sections/system_users/filter_popover.ts","../src/ui/components/system_console/sections/system_users/mobile_security.ts","../src/ui/components/system_console/sections/system_users/system_users.ts","../src/ui/pages/channels.ts","../src/ui/pages/drafts.ts","../src/ui/pages/index.ts","../src/ui/pages/landing_login.ts","../src/ui/pages/login.ts","../src/ui/pages/reset_password.ts","../src/ui/pages/scheduled_draft.ts","../src/ui/pages/signup.ts","../src/ui/pages/system_console.ts","../src/visual/index.ts","../src/visual/percy.ts"],"version":"5.8.2"}
|
package/dist/types.js
DELETED