@mattermost/playwright-lib 10.6.0-0
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/README.md +214 -0
- package/dist/asset/mattermost-icon_128x128.png +0 -0
- package/dist/browser_context.d.ts +17 -0
- package/dist/browser_context.js +71 -0
- package/dist/browser_context.js.map +1 -0
- package/dist/constant.d.ts +3 -0
- package/dist/constant.js +8 -0
- package/dist/constant.js.map +1 -0
- package/dist/file.d.ts +42 -0
- package/dist/file.js +74 -0
- package/dist/file.js.map +1 -0
- package/dist/flag.d.ts +7 -0
- package/dist/flag.js +76 -0
- package/dist/flag.js.map +1 -0
- package/dist/global_setup.d.ts +3 -0
- package/dist/global_setup.js +173 -0
- package/dist/global_setup.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.js +47 -0
- package/dist/index.js.map +1 -0
- package/dist/mock_browser_api.d.ts +31 -0
- package/dist/mock_browser_api.js +71 -0
- package/dist/mock_browser_api.js.map +1 -0
- package/dist/server/channel.d.ts +12 -0
- package/dist/server/channel.js +25 -0
- package/dist/server/channel.js.map +1 -0
- package/dist/server/client.d.ts +16 -0
- package/dist/server/client.js +39 -0
- package/dist/server/client.js.map +1 -0
- package/dist/server/default_config.d.ts +2 -0
- package/dist/server/default_config.js +755 -0
- package/dist/server/default_config.js.map +1 -0
- package/dist/server/index.d.ts +7 -0
- package/dist/server/init.d.ts +23 -0
- package/dist/server/init.js +73 -0
- package/dist/server/init.js.map +1 -0
- package/dist/server/post.d.ts +2 -0
- package/dist/server/post.js +31 -0
- package/dist/server/post.js.map +1 -0
- package/dist/server/team.d.ts +2 -0
- package/dist/server/team.js +18 -0
- package/dist/server/team.js.map +1 -0
- package/dist/server/user.d.ts +3 -0
- package/dist/server/user.js +33 -0
- package/dist/server/user.js.map +1 -0
- package/dist/test_action.d.ts +4 -0
- package/dist/test_action.js +24 -0
- package/dist/test_action.js.map +1 -0
- package/dist/test_config.d.ts +20 -0
- package/dist/test_config.js +82 -0
- package/dist/test_config.js.map +1 -0
- package/dist/test_fixture.d.ts +72 -0
- package/dist/test_fixture.js +172 -0
- package/dist/test_fixture.js.map +1 -0
- package/dist/types.d.ts +91 -0
- package/dist/ui/components/channels/app_bar.d.ts +7 -0
- package/dist/ui/components/channels/app_bar.js +20 -0
- package/dist/ui/components/channels/app_bar.js.map +1 -0
- package/dist/ui/components/channels/center_view.d.ts +52 -0
- package/dist/ui/components/channels/center_view.js +124 -0
- package/dist/ui/components/channels/center_view.js.map +1 -0
- package/dist/ui/components/channels/delete_post_confirmation_dialog.d.ts +11 -0
- package/dist/ui/components/channels/delete_post_confirmation_dialog.js +35 -0
- package/dist/ui/components/channels/delete_post_confirmation_dialog.js.map +1 -0
- package/dist/ui/components/channels/delete_post_modal.d.ts +8 -0
- package/dist/ui/components/channels/delete_post_modal.js +26 -0
- package/dist/ui/components/channels/delete_post_modal.js.map +1 -0
- package/dist/ui/components/channels/emoji_gif_picker.d.ts +16 -0
- package/dist/ui/components/channels/emoji_gif_picker.js +50 -0
- package/dist/ui/components/channels/emoji_gif_picker.js.map +1 -0
- package/dist/ui/components/channels/find_channels_modal.d.ts +8 -0
- package/dist/ui/components/channels/find_channels_modal.js +22 -0
- package/dist/ui/components/channels/find_channels_modal.js.map +1 -0
- package/dist/ui/components/channels/generic_confirm_modal.d.ts +16 -0
- package/dist/ui/components/channels/generic_confirm_modal.js +40 -0
- package/dist/ui/components/channels/generic_confirm_modal.js.map +1 -0
- package/dist/ui/components/channels/header.d.ts +6 -0
- package/dist/ui/components/channels/header.js +18 -0
- package/dist/ui/components/channels/header.js.map +1 -0
- package/dist/ui/components/channels/message_priority.d.ts +18 -0
- package/dist/ui/components/channels/message_priority.js +66 -0
- package/dist/ui/components/channels/message_priority.js.map +1 -0
- package/dist/ui/components/channels/post.d.ts +29 -0
- package/dist/ui/components/channels/post.js +63 -0
- package/dist/ui/components/channels/post.js.map +1 -0
- package/dist/ui/components/channels/post_create.d.ts +41 -0
- package/dist/ui/components/channels/post_create.js +118 -0
- package/dist/ui/components/channels/post_create.js.map +1 -0
- package/dist/ui/components/channels/post_dot_menu.d.ts +20 -0
- package/dist/ui/components/channels/post_dot_menu.js +47 -0
- package/dist/ui/components/channels/post_dot_menu.js.map +1 -0
- package/dist/ui/components/channels/post_edit.d.ts +21 -0
- package/dist/ui/components/channels/post_edit.js +76 -0
- package/dist/ui/components/channels/post_edit.js.map +1 -0
- package/dist/ui/components/channels/post_menu.d.ts +26 -0
- package/dist/ui/components/channels/post_menu.js +54 -0
- package/dist/ui/components/channels/post_menu.js.map +1 -0
- package/dist/ui/components/channels/post_reminder_menu.d.ts +11 -0
- package/dist/ui/components/channels/post_reminder_menu.js +29 -0
- package/dist/ui/components/channels/post_reminder_menu.js.map +1 -0
- package/dist/ui/components/channels/restore_post_confirmation_dialog.d.ts +10 -0
- package/dist/ui/components/channels/restore_post_confirmation_dialog.js +30 -0
- package/dist/ui/components/channels/restore_post_confirmation_dialog.js.map +1 -0
- package/dist/ui/components/channels/scheduled_draft_menu.d.ts +8 -0
- package/dist/ui/components/channels/scheduled_draft_menu.js +23 -0
- package/dist/ui/components/channels/scheduled_draft_menu.js.map +1 -0
- package/dist/ui/components/channels/scheduled_draft_modal.d.ts +20 -0
- package/dist/ui/components/channels/scheduled_draft_modal.js +84 -0
- package/dist/ui/components/channels/scheduled_draft_modal.js.map +1 -0
- package/dist/ui/components/channels/search_popover.d.ts +15 -0
- package/dist/ui/components/channels/search_popover.js +43 -0
- package/dist/ui/components/channels/search_popover.js.map +1 -0
- package/dist/ui/components/channels/settings/notification_settings.d.ts +13 -0
- package/dist/ui/components/channels/settings/notification_settings.js +41 -0
- package/dist/ui/components/channels/settings/notification_settings.js.map +1 -0
- package/dist/ui/components/channels/settings/settings_modal.d.ts +11 -0
- package/dist/ui/components/channels/settings/settings_modal.js +32 -0
- package/dist/ui/components/channels/settings/settings_modal.js.map +1 -0
- package/dist/ui/components/channels/sidebar_left.d.ts +24 -0
- package/dist/ui/components/channels/sidebar_left.js +54 -0
- package/dist/ui/components/channels/sidebar_left.js.map +1 -0
- package/dist/ui/components/channels/sidebar_right.d.ts +38 -0
- package/dist/ui/components/channels/sidebar_right.js +87 -0
- package/dist/ui/components/channels/sidebar_right.js.map +1 -0
- package/dist/ui/components/channels/thread_footer.d.ts +11 -0
- package/dist/ui/components/channels/thread_footer.js +27 -0
- package/dist/ui/components/channels/thread_footer.js.map +1 -0
- package/dist/ui/components/channels/user_profile_popover.d.ts +7 -0
- package/dist/ui/components/channels/user_profile_popover.js +21 -0
- package/dist/ui/components/channels/user_profile_popover.js.map +1 -0
- package/dist/ui/components/footer.d.ts +11 -0
- package/dist/ui/components/footer.js +28 -0
- package/dist/ui/components/footer.js.map +1 -0
- package/dist/ui/components/global_header.d.ts +15 -0
- package/dist/ui/components/global_header.js +46 -0
- package/dist/ui/components/global_header.js.map +1 -0
- package/dist/ui/components/index.d.ts +73 -0
- package/dist/ui/components/index.js +77 -0
- package/dist/ui/components/index.js.map +1 -0
- package/dist/ui/components/main_header.d.ts +8 -0
- package/dist/ui/components/main_header.js +22 -0
- package/dist/ui/components/main_header.js.map +1 -0
- package/dist/ui/components/system_console/navbar.d.ts +6 -0
- package/dist/ui/components/system_console/navbar.js +18 -0
- package/dist/ui/components/system_console/navbar.js.map +1 -0
- package/dist/ui/components/system_console/sections/system_users/column_toggle_menu.d.ts +22 -0
- package/dist/ui/components/system_console/sections/system_users/column_toggle_menu.js +47 -0
- package/dist/ui/components/system_console/sections/system_users/column_toggle_menu.js.map +1 -0
- package/dist/ui/components/system_console/sections/system_users/feature_discovery.d.ts +10 -0
- package/dist/ui/components/system_console/sections/system_users/feature_discovery.js +24 -0
- package/dist/ui/components/system_console/sections/system_users/feature_discovery.js.map +1 -0
- package/dist/ui/components/system_console/sections/system_users/filter_menu.d.ts +21 -0
- package/dist/ui/components/system_console/sections/system_users/filter_menu.js +42 -0
- package/dist/ui/components/system_console/sections/system_users/filter_menu.js.map +1 -0
- package/dist/ui/components/system_console/sections/system_users/filter_popover.d.ts +30 -0
- package/dist/ui/components/system_console/sections/system_users/filter_popover.js +61 -0
- package/dist/ui/components/system_console/sections/system_users/filter_popover.js.map +1 -0
- package/dist/ui/components/system_console/sections/system_users/mobile_security.d.ts +23 -0
- package/dist/ui/components/system_console/sections/system_users/mobile_security.js +56 -0
- package/dist/ui/components/system_console/sections/system_users/mobile_security.js.map +1 -0
- package/dist/ui/components/system_console/sections/system_users/system_users.d.ts +58 -0
- package/dist/ui/components/system_console/sections/system_users/system_users.js +114 -0
- package/dist/ui/components/system_console/sections/system_users/system_users.js.map +1 -0
- package/dist/ui/components/system_console/sidebar.d.ts +17 -0
- package/dist/ui/components/system_console/sidebar.js +37 -0
- package/dist/ui/components/system_console/sidebar.js.map +1 -0
- package/dist/ui/pages/channels.d.ts +31 -0
- package/dist/ui/pages/channels.js +79 -0
- package/dist/ui/pages/channels.js.map +1 -0
- package/dist/ui/pages/drafts.d.ts +30 -0
- package/dist/ui/pages/drafts.js +114 -0
- package/dist/ui/pages/drafts.js.map +1 -0
- package/dist/ui/pages/index.d.ts +19 -0
- package/dist/ui/pages/index.js +34 -0
- package/dist/ui/pages/index.js.map +1 -0
- package/dist/ui/pages/landing_login.d.ts +11 -0
- package/dist/ui/pages/landing_login.js +36 -0
- package/dist/ui/pages/landing_login.js.map +1 -0
- package/dist/ui/pages/login.d.ts +25 -0
- package/dist/ui/pages/login.js +62 -0
- package/dist/ui/pages/login.js.map +1 -0
- package/dist/ui/pages/reset_password.d.ts +15 -0
- package/dist/ui/pages/reset_password.js +44 -0
- package/dist/ui/pages/reset_password.js.map +1 -0
- package/dist/ui/pages/scheduled_draft.d.ts +38 -0
- package/dist/ui/pages/scheduled_draft.js +144 -0
- package/dist/ui/pages/scheduled_draft.js.map +1 -0
- package/dist/ui/pages/signup.d.ts +31 -0
- package/dist/ui/pages/signup.js +78 -0
- package/dist/ui/pages/signup.js.map +1 -0
- package/dist/ui/pages/system_console.d.ts +26 -0
- package/dist/ui/pages/system_console.js +64 -0
- package/dist/ui/pages/system_console.js.map +1 -0
- package/dist/util.d.ts +29 -0
- package/dist/util.js +51 -0
- package/dist/util.js.map +1 -0
- package/dist/visual/index.d.ts +3 -0
- package/dist/visual/index.js +37 -0
- package/dist/visual/index.js.map +1 -0
- package/dist/visual/percy.d.ts +2 -0
- package/dist/visual/percy.js +23 -0
- package/dist/visual/percy.js.map +1 -0
- package/package.json +68 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reset_password.js","sources":["../../../src/ui/pages/reset_password.ts"],"sourcesContent":["// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {Page, expect} from '@playwright/test';\n\nimport {components} from '@/ui/components';\n\nexport default class ResetPasswordPage {\n readonly page: Page;\n\n readonly title;\n readonly subtitle;\n readonly emailInput;\n readonly resetButton;\n readonly formContainer;\n\n readonly header;\n readonly footer;\n\n constructor(page: Page) {\n this.page = page;\n\n this.title = page.locator('h1:has-text(\"Password Reset\")');\n this.subtitle = page.locator('text=To reset your password, enter the email address you used to sign up');\n this.emailInput = page.locator(`[placeholder=\"Email\"]`);\n this.resetButton = page.locator('#passwordResetButton');\n this.formContainer = page.locator('.signup-team__container');\n\n this.header = new components.MainHeader(page.locator('.signup-header'));\n this.footer = new components.Footer(page.locator('#footer_section'));\n }\n\n async toBeVisible() {\n await this.page.waitForLoadState('networkidle');\n await expect(this.title).toBeVisible();\n await expect(this.subtitle).toBeVisible();\n await expect(this.emailInput).toBeVisible();\n await expect(this.resetButton).toBeVisible();\n }\n\n async goto() {\n await this.page.goto('/reset_password');\n }\n\n async reset(email: string) {\n await this.emailInput.fill(email);\n await Promise.all([this.page.waitForNavigation(), this.resetButton.click()]);\n }\n}\n"],"names":["components","expect"],"mappings":";;;;;AAAA;AACA;AAMc,MAAO,iBAAiB,CAAA;AACzB,IAAA,IAAI;AAEJ,IAAA,KAAK;AACL,IAAA,QAAQ;AACR,IAAA,UAAU;AACV,IAAA,WAAW;AACX,IAAA,aAAa;AAEb,IAAA,MAAM;AACN,IAAA,MAAM;AAEf,IAAA,WAAA,CAAY,IAAU,EAAA;AAClB,QAAA,IAAI,CAAC,IAAI,GAAG,IAAI;QAEhB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,+BAA+B,CAAC;QAC1D,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,0EAA0E,CAAC;QACxG,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,CAAuB,qBAAA,CAAA,CAAC;QACvD,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,sBAAsB,CAAC;QACvD,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,yBAAyB,CAAC;AAE5D,QAAA,IAAI,CAAC,MAAM,GAAG,IAAIA,gBAAU,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;AACvE,QAAA,IAAI,CAAC,MAAM,GAAG,IAAIA,gBAAU,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;;AAGxE,IAAA,MAAM,WAAW,GAAA;QACb,MAAM,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,aAAa,CAAC;QAC/C,MAAMC,WAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE;QACtC,MAAMA,WAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE;QACzC,MAAMA,WAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,WAAW,EAAE;QAC3C,MAAMA,WAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,WAAW,EAAE;;AAGhD,IAAA,MAAM,IAAI,GAAA;QACN,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC;;IAG3C,MAAM,KAAK,CAAC,KAAa,EAAA;QACrB,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC;QACjC,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,EAAE,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC,CAAC;;AAEnF;;;;"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { Page } from '@playwright/test';
|
|
2
|
+
export default class ScheduledDraftPage {
|
|
3
|
+
readonly page: Page;
|
|
4
|
+
readonly badgeCountOnScheduledTab: import("playwright-core").Locator;
|
|
5
|
+
readonly confirmbutton: import("playwright-core").Locator;
|
|
6
|
+
readonly copyIcon: import("playwright-core").Locator;
|
|
7
|
+
readonly copyIconToolTip: import("playwright-core").Locator;
|
|
8
|
+
readonly datePattern: RegExp;
|
|
9
|
+
readonly deleteIcon: import("playwright-core").Locator;
|
|
10
|
+
readonly deleteIconToolTip: import("playwright-core").Locator;
|
|
11
|
+
readonly noscheduledDraftIcon: import("playwright-core").Locator;
|
|
12
|
+
readonly rescheduleIcon: import("playwright-core").Locator;
|
|
13
|
+
readonly rescheduleIconToolTip: import("playwright-core").Locator;
|
|
14
|
+
readonly scheduledDraftBody: import("playwright-core").Locator;
|
|
15
|
+
readonly scheduledDraftPageInfo: import("playwright-core").Locator;
|
|
16
|
+
readonly scheduledDraftPanel: (messageContent: string) => import("playwright-core").Locator;
|
|
17
|
+
readonly scheduledDraftSendNowButton: import("playwright-core").Locator;
|
|
18
|
+
readonly scheduledDraftSendNowButtonToolTip: import("playwright-core").Locator;
|
|
19
|
+
readonly editIcon: import("playwright-core").Locator;
|
|
20
|
+
readonly editBox: import("playwright-core").Locator;
|
|
21
|
+
readonly editorSaveButton: import("playwright-core").Locator;
|
|
22
|
+
constructor(page: Page);
|
|
23
|
+
toBeVisible(): Promise<void>;
|
|
24
|
+
assertBadgeCountOnTab(badgeCount: string): Promise<void>;
|
|
25
|
+
assertscheduledDraftBody(draftMessage: string): Promise<void>;
|
|
26
|
+
verifyOnHoverActionItems(messageContent: string): Promise<void>;
|
|
27
|
+
verifyDeleteIcon(): Promise<void>;
|
|
28
|
+
verifyCopyIcon(): Promise<void>;
|
|
29
|
+
verifyRescheduleIcon(): Promise<void>;
|
|
30
|
+
verifySendNowIcon(): Promise<void>;
|
|
31
|
+
getTimeStampOfMessage(messageContent: string): Promise<string>;
|
|
32
|
+
openRescheduleModal(messageContent: string): Promise<void>;
|
|
33
|
+
deleteScheduledMessage(messageContent: string): Promise<void>;
|
|
34
|
+
sendScheduledMessage(messageContent: string): Promise<void>;
|
|
35
|
+
goTo(teamName: string): Promise<void>;
|
|
36
|
+
editText(newText: string): Promise<void>;
|
|
37
|
+
copyScheduledMessage(draftMessage: string): Promise<void>;
|
|
38
|
+
}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var test = require('@playwright/test');
|
|
4
|
+
|
|
5
|
+
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
|
|
6
|
+
// See LICENSE.txt for license information.
|
|
7
|
+
class ScheduledDraftPage {
|
|
8
|
+
page;
|
|
9
|
+
badgeCountOnScheduledTab;
|
|
10
|
+
confirmbutton;
|
|
11
|
+
copyIcon;
|
|
12
|
+
copyIconToolTip;
|
|
13
|
+
datePattern;
|
|
14
|
+
deleteIcon;
|
|
15
|
+
deleteIconToolTip;
|
|
16
|
+
noscheduledDraftIcon;
|
|
17
|
+
rescheduleIcon;
|
|
18
|
+
rescheduleIconToolTip;
|
|
19
|
+
scheduledDraftBody;
|
|
20
|
+
scheduledDraftPageInfo;
|
|
21
|
+
scheduledDraftPanel;
|
|
22
|
+
scheduledDraftSendNowButton;
|
|
23
|
+
scheduledDraftSendNowButtonToolTip;
|
|
24
|
+
editIcon;
|
|
25
|
+
editBox;
|
|
26
|
+
editorSaveButton;
|
|
27
|
+
constructor(page) {
|
|
28
|
+
this.page = page;
|
|
29
|
+
this.datePattern =
|
|
30
|
+
/(Today|Tomorrow|(?:January|February|March|April|May|June|July|August|September|October|November|December) \d{1,2}) at \d{1,2}:\d{2} [AP]M/;
|
|
31
|
+
this.scheduledDraftBody = page.locator('div.post__body');
|
|
32
|
+
this.badgeCountOnScheduledTab = page.locator('a#draft_tabs-tab-1 div.drafts_tab_title span.MuiBadge-badge');
|
|
33
|
+
this.scheduledDraftPageInfo = page.locator('.PanelHeader__info');
|
|
34
|
+
this.scheduledDraftPanel = (messageContent) => page.locator(`article.Panel:has(div.post__body:has-text("${messageContent}"))`);
|
|
35
|
+
this.deleteIcon = page.locator('#draft_icon-trash-can-outline_delete');
|
|
36
|
+
this.deleteIconToolTip = page.locator('text=Delete scheduled post');
|
|
37
|
+
this.copyIcon = page.locator('#draft_icon-content-copy_copy_text');
|
|
38
|
+
this.copyIconToolTip = page.locator('text=Copy text');
|
|
39
|
+
this.rescheduleIcon = page.locator('#draft_icon-clock-send-outline_reschedule');
|
|
40
|
+
this.rescheduleIconToolTip = page.locator('text=Reschedule post');
|
|
41
|
+
this.noscheduledDraftIcon = page.locator('.no-results__wrapper');
|
|
42
|
+
this.scheduledDraftSendNowButton = page.locator('#draft_icon-send-outline_sendNow');
|
|
43
|
+
this.scheduledDraftSendNowButtonToolTip = page.locator('text=Send now');
|
|
44
|
+
this.confirmbutton = this.page.locator('button.btn-primary');
|
|
45
|
+
this.editIcon = page.locator('#draft_icon-pencil-outline_edit');
|
|
46
|
+
this.editBox = page.locator('textarea#edit_textbox');
|
|
47
|
+
this.editorSaveButton = page.locator('button.save');
|
|
48
|
+
}
|
|
49
|
+
async toBeVisible() {
|
|
50
|
+
await this.page.waitForLoadState('networkidle');
|
|
51
|
+
await test.expect(this.page).toHaveURL(/.*scheduled_posts/);
|
|
52
|
+
}
|
|
53
|
+
async assertBadgeCountOnTab(badgeCount) {
|
|
54
|
+
await this.badgeCountOnScheduledTab.isVisible();
|
|
55
|
+
await test.expect(this.badgeCountOnScheduledTab).toHaveText(badgeCount);
|
|
56
|
+
}
|
|
57
|
+
async assertscheduledDraftBody(draftMessage) {
|
|
58
|
+
await test.expect(this.scheduledDraftBody).toBeVisible();
|
|
59
|
+
await test.expect(this.scheduledDraftBody).toHaveText(draftMessage);
|
|
60
|
+
}
|
|
61
|
+
async verifyOnHoverActionItems(messageContent) {
|
|
62
|
+
await this.scheduledDraftPanel(messageContent).isVisible();
|
|
63
|
+
await this.scheduledDraftPanel(messageContent).hover();
|
|
64
|
+
await this.verifyDeleteIcon();
|
|
65
|
+
await this.verifyCopyIcon();
|
|
66
|
+
await this.verifyRescheduleIcon();
|
|
67
|
+
await this.verifySendNowIcon();
|
|
68
|
+
}
|
|
69
|
+
async verifyDeleteIcon() {
|
|
70
|
+
await this.deleteIcon.isVisible();
|
|
71
|
+
await this.deleteIcon.hover();
|
|
72
|
+
await test.expect(this.deleteIconToolTip).toBeVisible();
|
|
73
|
+
await test.expect(this.deleteIconToolTip).toHaveText('Delete scheduled post');
|
|
74
|
+
}
|
|
75
|
+
async verifyCopyIcon() {
|
|
76
|
+
await this.copyIcon.isVisible();
|
|
77
|
+
await this.copyIcon.hover();
|
|
78
|
+
await test.expect(this.copyIconToolTip).toBeVisible();
|
|
79
|
+
await test.expect(this.copyIconToolTip).toHaveText('Copy text');
|
|
80
|
+
}
|
|
81
|
+
async verifyRescheduleIcon() {
|
|
82
|
+
await test.expect(this.rescheduleIcon).toBeVisible();
|
|
83
|
+
await this.rescheduleIcon.hover();
|
|
84
|
+
await test.expect(this.rescheduleIconToolTip).toBeVisible();
|
|
85
|
+
await test.expect(this.rescheduleIconToolTip).toHaveText('Reschedule post');
|
|
86
|
+
}
|
|
87
|
+
async verifySendNowIcon() {
|
|
88
|
+
await this.scheduledDraftSendNowButton.isVisible();
|
|
89
|
+
await this.scheduledDraftSendNowButton.hover();
|
|
90
|
+
await test.expect(this.scheduledDraftSendNowButtonToolTip).toBeVisible();
|
|
91
|
+
await test.expect(this.scheduledDraftSendNowButtonToolTip).toHaveText('Send now');
|
|
92
|
+
}
|
|
93
|
+
async getTimeStampOfMessage(messageContent) {
|
|
94
|
+
await this.scheduledDraftPanel(messageContent).scrollIntoViewIfNeeded();
|
|
95
|
+
await this.scheduledDraftPanel(messageContent).isVisible();
|
|
96
|
+
return this.scheduledDraftPanel(messageContent).locator(this.scheduledDraftPageInfo).innerHTML();
|
|
97
|
+
}
|
|
98
|
+
async openRescheduleModal(messageContent) {
|
|
99
|
+
await this.scheduledDraftPanel(messageContent).scrollIntoViewIfNeeded();
|
|
100
|
+
await this.scheduledDraftPanel(messageContent).isVisible();
|
|
101
|
+
await this.scheduledDraftPanel(messageContent).hover();
|
|
102
|
+
await this.rescheduleIcon.hover();
|
|
103
|
+
await test.expect(this.rescheduleIconToolTip).toBeVisible();
|
|
104
|
+
await test.expect(this.rescheduleIconToolTip).toHaveText('Reschedule post');
|
|
105
|
+
await this.rescheduleIcon.click();
|
|
106
|
+
}
|
|
107
|
+
async deleteScheduledMessage(messageContent) {
|
|
108
|
+
await this.scheduledDraftPanel(messageContent).isVisible();
|
|
109
|
+
await this.scheduledDraftPanel(messageContent).hover();
|
|
110
|
+
await this.verifyDeleteIcon();
|
|
111
|
+
await this.deleteIcon.click();
|
|
112
|
+
test.expect(await this.confirmbutton.textContent()).toEqual('Yes, delete');
|
|
113
|
+
await this.confirmbutton.click();
|
|
114
|
+
}
|
|
115
|
+
async sendScheduledMessage(messageContent) {
|
|
116
|
+
await this.scheduledDraftPanel(messageContent).isVisible();
|
|
117
|
+
await this.scheduledDraftPanel(messageContent).hover();
|
|
118
|
+
await this.verifySendNowIcon();
|
|
119
|
+
await this.scheduledDraftSendNowButton.click();
|
|
120
|
+
test.expect(await this.confirmbutton.textContent()).toEqual('Yes, send now');
|
|
121
|
+
await this.confirmbutton.click();
|
|
122
|
+
}
|
|
123
|
+
async goTo(teamName) {
|
|
124
|
+
await this.page.goto(`/${teamName}/scheduled_posts`);
|
|
125
|
+
}
|
|
126
|
+
async editText(newText) {
|
|
127
|
+
await this.editIcon.click();
|
|
128
|
+
await this.editBox.isVisible();
|
|
129
|
+
await this.editBox.fill(newText);
|
|
130
|
+
await this.editorSaveButton.isVisible();
|
|
131
|
+
await this.editorSaveButton.click();
|
|
132
|
+
await this.editBox.isHidden();
|
|
133
|
+
await this.scheduledDraftPanel(newText).isVisible();
|
|
134
|
+
}
|
|
135
|
+
async copyScheduledMessage(draftMessage) {
|
|
136
|
+
await this.scheduledDraftPanel(draftMessage).isVisible();
|
|
137
|
+
await this.scheduledDraftPanel(draftMessage).hover();
|
|
138
|
+
await this.verifyCopyIcon();
|
|
139
|
+
await this.copyIcon.click();
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
module.exports = ScheduledDraftPage;
|
|
144
|
+
//# sourceMappingURL=scheduled_draft.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scheduled_draft.js","sources":["../../../src/ui/pages/scheduled_draft.ts"],"sourcesContent":["// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {Page, expect} from '@playwright/test';\n\nexport default class ScheduledDraftPage {\n readonly page: Page;\n\n readonly badgeCountOnScheduledTab;\n readonly confirmbutton;\n readonly copyIcon;\n readonly copyIconToolTip;\n readonly datePattern;\n readonly deleteIcon;\n readonly deleteIconToolTip;\n readonly noscheduledDraftIcon;\n readonly rescheduleIcon;\n readonly rescheduleIconToolTip;\n readonly scheduledDraftBody;\n readonly scheduledDraftPageInfo;\n readonly scheduledDraftPanel;\n readonly scheduledDraftSendNowButton;\n readonly scheduledDraftSendNowButtonToolTip;\n readonly editIcon;\n readonly editBox;\n readonly editorSaveButton;\n\n constructor(page: Page) {\n this.page = page;\n\n this.datePattern =\n /(Today|Tomorrow|(?:January|February|March|April|May|June|July|August|September|October|November|December) \\d{1,2}) at \\d{1,2}:\\d{2} [AP]M/;\n this.scheduledDraftBody = page.locator('div.post__body');\n this.badgeCountOnScheduledTab = page.locator('a#draft_tabs-tab-1 div.drafts_tab_title span.MuiBadge-badge');\n this.scheduledDraftPageInfo = page.locator('.PanelHeader__info');\n this.scheduledDraftPanel = (messageContent: string) =>\n page.locator(`article.Panel:has(div.post__body:has-text(\"${messageContent}\"))`);\n this.deleteIcon = page.locator('#draft_icon-trash-can-outline_delete');\n this.deleteIconToolTip = page.locator('text=Delete scheduled post');\n this.copyIcon = page.locator('#draft_icon-content-copy_copy_text');\n this.copyIconToolTip = page.locator('text=Copy text');\n this.rescheduleIcon = page.locator('#draft_icon-clock-send-outline_reschedule');\n this.rescheduleIconToolTip = page.locator('text=Reschedule post');\n this.noscheduledDraftIcon = page.locator('.no-results__wrapper');\n this.scheduledDraftSendNowButton = page.locator('#draft_icon-send-outline_sendNow');\n this.scheduledDraftSendNowButtonToolTip = page.locator('text=Send now');\n this.confirmbutton = this.page.locator('button.btn-primary');\n this.editIcon = page.locator('#draft_icon-pencil-outline_edit');\n this.editBox = page.locator('textarea#edit_textbox');\n this.editorSaveButton = page.locator('button.save');\n }\n\n async toBeVisible() {\n await this.page.waitForLoadState('networkidle');\n await expect(this.page).toHaveURL(/.*scheduled_posts/);\n }\n\n async assertBadgeCountOnTab(badgeCount: string) {\n await this.badgeCountOnScheduledTab.isVisible();\n await expect(this.badgeCountOnScheduledTab).toHaveText(badgeCount);\n }\n\n async assertscheduledDraftBody(draftMessage: string) {\n await expect(this.scheduledDraftBody).toBeVisible();\n await expect(this.scheduledDraftBody).toHaveText(draftMessage);\n }\n\n async verifyOnHoverActionItems(messageContent: string) {\n await this.scheduledDraftPanel(messageContent).isVisible();\n await this.scheduledDraftPanel(messageContent).hover();\n await this.verifyDeleteIcon();\n await this.verifyCopyIcon();\n await this.verifyRescheduleIcon();\n await this.verifySendNowIcon();\n }\n\n async verifyDeleteIcon() {\n await this.deleteIcon.isVisible();\n await this.deleteIcon.hover();\n await expect(this.deleteIconToolTip).toBeVisible();\n await expect(this.deleteIconToolTip).toHaveText('Delete scheduled post');\n }\n\n async verifyCopyIcon() {\n await this.copyIcon.isVisible();\n await this.copyIcon.hover();\n await expect(this.copyIconToolTip).toBeVisible();\n await expect(this.copyIconToolTip).toHaveText('Copy text');\n }\n\n async verifyRescheduleIcon() {\n await expect(this.rescheduleIcon).toBeVisible();\n await this.rescheduleIcon.hover();\n await expect(this.rescheduleIconToolTip).toBeVisible();\n await expect(this.rescheduleIconToolTip).toHaveText('Reschedule post');\n }\n\n async verifySendNowIcon() {\n await this.scheduledDraftSendNowButton.isVisible();\n await this.scheduledDraftSendNowButton.hover();\n await expect(this.scheduledDraftSendNowButtonToolTip).toBeVisible();\n await expect(this.scheduledDraftSendNowButtonToolTip).toHaveText('Send now');\n }\n\n async getTimeStampOfMessage(messageContent: string) {\n await this.scheduledDraftPanel(messageContent).scrollIntoViewIfNeeded();\n await this.scheduledDraftPanel(messageContent).isVisible();\n return this.scheduledDraftPanel(messageContent).locator(this.scheduledDraftPageInfo).innerHTML();\n }\n\n async openRescheduleModal(messageContent: string) {\n await this.scheduledDraftPanel(messageContent).scrollIntoViewIfNeeded();\n await this.scheduledDraftPanel(messageContent).isVisible();\n await this.scheduledDraftPanel(messageContent).hover();\n await this.rescheduleIcon.hover();\n await expect(this.rescheduleIconToolTip).toBeVisible();\n await expect(this.rescheduleIconToolTip).toHaveText('Reschedule post');\n await this.rescheduleIcon.click();\n }\n\n async deleteScheduledMessage(messageContent: string) {\n await this.scheduledDraftPanel(messageContent).isVisible();\n await this.scheduledDraftPanel(messageContent).hover();\n await this.verifyDeleteIcon();\n await this.deleteIcon.click();\n expect(await this.confirmbutton.textContent()).toEqual('Yes, delete');\n await this.confirmbutton.click();\n }\n\n async sendScheduledMessage(messageContent: string) {\n await this.scheduledDraftPanel(messageContent).isVisible();\n await this.scheduledDraftPanel(messageContent).hover();\n await this.verifySendNowIcon();\n await this.scheduledDraftSendNowButton.click();\n expect(await this.confirmbutton.textContent()).toEqual('Yes, send now');\n await this.confirmbutton.click();\n }\n\n async goTo(teamName: string) {\n await this.page.goto(`/${teamName}/scheduled_posts`);\n }\n\n async editText(newText: string) {\n await this.editIcon.click();\n await this.editBox.isVisible();\n await this.editBox.fill(newText);\n await this.editorSaveButton.isVisible();\n await this.editorSaveButton.click();\n await this.editBox.isHidden();\n await this.scheduledDraftPanel(newText).isVisible();\n }\n\n async copyScheduledMessage(draftMessage: string) {\n await this.scheduledDraftPanel(draftMessage).isVisible();\n await this.scheduledDraftPanel(draftMessage).hover();\n await this.verifyCopyIcon();\n await this.copyIcon.click();\n }\n}\n"],"names":["expect"],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { Page } from '@playwright/test';
|
|
2
|
+
export default class SignupPage {
|
|
3
|
+
readonly page: Page;
|
|
4
|
+
readonly title: import("playwright-core").Locator;
|
|
5
|
+
readonly subtitle: import("playwright-core").Locator;
|
|
6
|
+
readonly bodyCard: import("playwright-core").Locator;
|
|
7
|
+
readonly emailInput: import("playwright-core").Locator;
|
|
8
|
+
readonly usernameInput: import("playwright-core").Locator;
|
|
9
|
+
readonly passwordInput: import("playwright-core").Locator;
|
|
10
|
+
readonly passwordToggleButton: import("playwright-core").Locator;
|
|
11
|
+
readonly newsLetterCheckBox: import("playwright-core").Locator;
|
|
12
|
+
readonly newsLetterPrivacyPolicyLink: import("playwright-core").Locator;
|
|
13
|
+
readonly newsLetterUnsubscribeLink: import("playwright-core").Locator;
|
|
14
|
+
readonly agreementTermsOfUseLink: import("playwright-core").Locator;
|
|
15
|
+
readonly agreementPrivacyPolicyLink: import("playwright-core").Locator;
|
|
16
|
+
readonly createAccountButton: import("playwright-core").Locator;
|
|
17
|
+
readonly loginLink: import("playwright-core").Locator;
|
|
18
|
+
readonly emailError: import("playwright-core").Locator;
|
|
19
|
+
readonly usernameError: import("playwright-core").Locator;
|
|
20
|
+
readonly passwordError: import("playwright-core").Locator;
|
|
21
|
+
readonly header: import("../components/main_header").default;
|
|
22
|
+
readonly footer: import("../components/footer").default;
|
|
23
|
+
constructor(page: Page);
|
|
24
|
+
toBeVisible(): Promise<void>;
|
|
25
|
+
goto(): Promise<void>;
|
|
26
|
+
create(user: {
|
|
27
|
+
email: string;
|
|
28
|
+
username: string;
|
|
29
|
+
password: string;
|
|
30
|
+
}, waitForRedirect?: boolean): Promise<void>;
|
|
31
|
+
}
|
|
@@ -0,0 +1,78 @@
|
|
|
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
|
+
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
|
|
8
|
+
// See LICENSE.txt for license information.
|
|
9
|
+
class SignupPage {
|
|
10
|
+
page;
|
|
11
|
+
title;
|
|
12
|
+
subtitle;
|
|
13
|
+
bodyCard;
|
|
14
|
+
emailInput;
|
|
15
|
+
usernameInput;
|
|
16
|
+
passwordInput;
|
|
17
|
+
passwordToggleButton;
|
|
18
|
+
newsLetterCheckBox;
|
|
19
|
+
newsLetterPrivacyPolicyLink;
|
|
20
|
+
newsLetterUnsubscribeLink;
|
|
21
|
+
agreementTermsOfUseLink;
|
|
22
|
+
agreementPrivacyPolicyLink;
|
|
23
|
+
createAccountButton;
|
|
24
|
+
loginLink;
|
|
25
|
+
emailError;
|
|
26
|
+
usernameError;
|
|
27
|
+
passwordError;
|
|
28
|
+
header;
|
|
29
|
+
footer;
|
|
30
|
+
constructor(page) {
|
|
31
|
+
this.page = page;
|
|
32
|
+
this.title = page.locator('h1:has-text("Let’s get started")');
|
|
33
|
+
this.subtitle = page.locator('text=Create your Mattermost account to start collaborating with your team');
|
|
34
|
+
this.bodyCard = page.locator('.signup-body-card-content');
|
|
35
|
+
this.loginLink = page.locator('text=Log in');
|
|
36
|
+
this.emailInput = page.locator('#input_email');
|
|
37
|
+
this.usernameInput = page.locator('#input_name');
|
|
38
|
+
this.passwordInput = page.locator('#input_password-input');
|
|
39
|
+
this.passwordToggleButton = page.getByRole('button', { name: 'Show or hide password' });
|
|
40
|
+
this.createAccountButton = page.locator('button:has-text("Create Account")');
|
|
41
|
+
this.emailError = page.locator('text=Please enter a valid email address');
|
|
42
|
+
this.usernameError = page.locator('text=Usernames have to begin with a lowercase letter and be 3-22 characters long. You can use lowercase letters, numbers, periods, dashes, and underscores.');
|
|
43
|
+
this.passwordError = page.locator('text=Must be 5-72 characters long.');
|
|
44
|
+
const newsletterBlock = page.locator('.check-input');
|
|
45
|
+
this.newsLetterCheckBox = newsletterBlock.getByRole('checkbox', { name: 'newsletter checkbox' });
|
|
46
|
+
this.newsLetterPrivacyPolicyLink = newsletterBlock.locator('text=Privacy Policy');
|
|
47
|
+
this.newsLetterUnsubscribeLink = newsletterBlock.locator('text=unsubscribe');
|
|
48
|
+
const agreementBlock = page.locator('.signup-body-card-agreement');
|
|
49
|
+
this.agreementTermsOfUseLink = agreementBlock.locator('text=Terms of Use');
|
|
50
|
+
this.agreementPrivacyPolicyLink = agreementBlock.locator('text=Privacy Policy');
|
|
51
|
+
this.header = new index.components.MainHeader(page.locator('.hfroute-header'));
|
|
52
|
+
this.footer = new index.components.Footer(page.locator('.hfroute-footer'));
|
|
53
|
+
}
|
|
54
|
+
async toBeVisible() {
|
|
55
|
+
await this.page.waitForLoadState('networkidle');
|
|
56
|
+
await this.page.waitForLoadState('domcontentloaded');
|
|
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();
|
|
62
|
+
}
|
|
63
|
+
async goto() {
|
|
64
|
+
await this.page.goto('/signup_user_complete');
|
|
65
|
+
}
|
|
66
|
+
async create(user, waitForRedirect = true) {
|
|
67
|
+
await this.emailInput.fill(user.email);
|
|
68
|
+
await this.usernameInput.fill(user.username);
|
|
69
|
+
await this.passwordInput.fill(user.password);
|
|
70
|
+
await this.createAccountButton.click();
|
|
71
|
+
if (waitForRedirect) {
|
|
72
|
+
await this.page.waitForNavigation();
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
module.exports = SignupPage;
|
|
78
|
+
//# sourceMappingURL=signup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signup.js","sources":["../../../src/ui/pages/signup.ts"],"sourcesContent":["// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {Page, expect} from '@playwright/test';\n\nimport {duration, wait} from '@/util';\nimport {components} from '@/ui/components';\n\nexport default class SignupPage {\n readonly page: Page;\n\n readonly title;\n readonly subtitle;\n readonly bodyCard;\n readonly emailInput;\n readonly usernameInput;\n readonly passwordInput;\n readonly passwordToggleButton;\n readonly newsLetterCheckBox;\n readonly newsLetterPrivacyPolicyLink;\n readonly newsLetterUnsubscribeLink;\n readonly agreementTermsOfUseLink;\n readonly agreementPrivacyPolicyLink;\n readonly createAccountButton;\n readonly loginLink;\n readonly emailError;\n readonly usernameError;\n readonly passwordError;\n\n readonly header;\n readonly footer;\n\n constructor(page: Page) {\n this.page = page;\n\n this.title = page.locator('h1:has-text(\"Let’s get started\")');\n this.subtitle = page.locator('text=Create your Mattermost account to start collaborating with your team');\n this.bodyCard = page.locator('.signup-body-card-content');\n this.loginLink = page.locator('text=Log in');\n this.emailInput = page.locator('#input_email');\n this.usernameInput = page.locator('#input_name');\n this.passwordInput = page.locator('#input_password-input');\n this.passwordToggleButton = page.getByRole('button', {name: 'Show or hide password'});\n this.createAccountButton = page.locator('button:has-text(\"Create Account\")');\n this.emailError = page.locator('text=Please enter a valid email address');\n this.usernameError = page.locator(\n 'text=Usernames have to begin with a lowercase letter and be 3-22 characters long. You can use lowercase letters, numbers, periods, dashes, and underscores.',\n );\n this.passwordError = page.locator('text=Must be 5-72 characters long.');\n\n const newsletterBlock = page.locator('.check-input');\n this.newsLetterCheckBox = newsletterBlock.getByRole('checkbox', {name: 'newsletter checkbox'});\n this.newsLetterPrivacyPolicyLink = newsletterBlock.locator('text=Privacy Policy');\n this.newsLetterUnsubscribeLink = newsletterBlock.locator('text=unsubscribe');\n\n const agreementBlock = page.locator('.signup-body-card-agreement');\n this.agreementTermsOfUseLink = agreementBlock.locator('text=Terms of Use');\n this.agreementPrivacyPolicyLink = agreementBlock.locator('text=Privacy Policy');\n\n this.header = new components.MainHeader(page.locator('.hfroute-header'));\n this.footer = new components.Footer(page.locator('.hfroute-footer'));\n }\n\n async toBeVisible() {\n await this.page.waitForLoadState('networkidle');\n await this.page.waitForLoadState('domcontentloaded');\n await wait(duration.half_sec);\n await expect(this.title).toBeVisible();\n await expect(this.emailInput).toBeVisible();\n await expect(this.usernameInput).toBeVisible();\n await expect(this.passwordInput).toBeVisible();\n }\n\n async goto() {\n await this.page.goto('/signup_user_complete');\n }\n\n async create(user: {email: string; username: string; password: string}, waitForRedirect = true) {\n await this.emailInput.fill(user.email);\n await this.usernameInput.fill(user.username);\n await this.passwordInput.fill(user.password);\n await this.createAccountButton.click();\n\n if (waitForRedirect) {\n await this.page.waitForNavigation();\n }\n }\n}\n"],"names":["components","wait","duration","expect"],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { Page } from '@playwright/test';
|
|
2
|
+
export default class SystemConsolePage {
|
|
3
|
+
readonly page: Page;
|
|
4
|
+
readonly sidebar: import("../components/system_console/sidebar").default;
|
|
5
|
+
readonly navbar: import("../components/system_console/navbar").default;
|
|
6
|
+
/**
|
|
7
|
+
* System Console -> User Management -> Users
|
|
8
|
+
*/
|
|
9
|
+
readonly systemUsers: import("../components/system_console/sections/system_users/system_users").default;
|
|
10
|
+
readonly systemUsersFilterPopover: import("../components/system_console/sections/system_users/filter_popover").default;
|
|
11
|
+
readonly systemUsersRoleMenu: import("../components/system_console/sections/system_users/filter_menu").default;
|
|
12
|
+
readonly systemUsersStatusMenu: import("../components/system_console/sections/system_users/filter_menu").default;
|
|
13
|
+
readonly systemUsersDateRangeMenu: import("../components/system_console/sections/system_users/filter_menu").default;
|
|
14
|
+
readonly systemUsersColumnToggleMenu: import("../components/system_console/sections/system_users/column_toggle_menu").default;
|
|
15
|
+
readonly systemUsersActionMenus: import("../components/system_console/sections/system_users/filter_menu").default[];
|
|
16
|
+
readonly mobileSecurity: import("../components/system_console/sections/system_users/mobile_security").default;
|
|
17
|
+
readonly featureDiscovery: import("../components/system_console/sections/system_users/feature_discovery").default;
|
|
18
|
+
readonly confirmModal: import("../components/channels/generic_confirm_modal").default;
|
|
19
|
+
readonly exportModal: import("../components/channels/generic_confirm_modal").default;
|
|
20
|
+
readonly saveChangesModal: import("../components/system_console/sections/system_users/system_users").default;
|
|
21
|
+
constructor(page: Page);
|
|
22
|
+
toBeVisible(): Promise<void>;
|
|
23
|
+
goto(): Promise<void>;
|
|
24
|
+
saveRoleChange(): Promise<void>;
|
|
25
|
+
clickResetButton(): Promise<void>;
|
|
26
|
+
}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var index = require('../components/index.js');
|
|
4
|
+
|
|
5
|
+
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
|
|
6
|
+
// See LICENSE.txt for license information.
|
|
7
|
+
class SystemConsolePage {
|
|
8
|
+
page;
|
|
9
|
+
sidebar;
|
|
10
|
+
navbar;
|
|
11
|
+
/**
|
|
12
|
+
* System Console -> User Management -> Users
|
|
13
|
+
*/
|
|
14
|
+
systemUsers;
|
|
15
|
+
systemUsersFilterPopover;
|
|
16
|
+
systemUsersRoleMenu;
|
|
17
|
+
systemUsersStatusMenu;
|
|
18
|
+
systemUsersDateRangeMenu;
|
|
19
|
+
systemUsersColumnToggleMenu;
|
|
20
|
+
systemUsersActionMenus;
|
|
21
|
+
mobileSecurity;
|
|
22
|
+
featureDiscovery;
|
|
23
|
+
// modal
|
|
24
|
+
confirmModal;
|
|
25
|
+
exportModal;
|
|
26
|
+
saveChangesModal;
|
|
27
|
+
constructor(page) {
|
|
28
|
+
this.page = page;
|
|
29
|
+
// Areas of the page
|
|
30
|
+
this.navbar = new index.components.SystemConsoleNavbar(page.locator('.backstage-navbar'));
|
|
31
|
+
this.sidebar = new index.components.SystemConsoleSidebar(page.locator('.admin-sidebar'));
|
|
32
|
+
// Sections and sub-sections
|
|
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'));
|
|
36
|
+
// Menus & Popovers
|
|
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'));
|
|
46
|
+
}
|
|
47
|
+
async toBeVisible() {
|
|
48
|
+
await this.page.waitForLoadState('networkidle');
|
|
49
|
+
await this.sidebar.toBeVisible();
|
|
50
|
+
await this.navbar.toBeVisible();
|
|
51
|
+
}
|
|
52
|
+
async goto() {
|
|
53
|
+
await this.page.goto('/admin_console');
|
|
54
|
+
}
|
|
55
|
+
async saveRoleChange() {
|
|
56
|
+
await this.saveChangesModal.container.locator('button.btn-primary:has-text("Save")').click();
|
|
57
|
+
}
|
|
58
|
+
async clickResetButton() {
|
|
59
|
+
await this.saveChangesModal.container.locator('button.btn-primary:has-text("Reset")').click();
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
module.exports = SystemConsolePage;
|
|
64
|
+
//# sourceMappingURL=system_console.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"system_console.js","sources":["../../../src/ui/pages/system_console.ts"],"sourcesContent":["// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {Page} from '@playwright/test';\n\nimport {components} from '@/ui/components';\n\nexport default class SystemConsolePage {\n readonly page: Page;\n\n readonly sidebar;\n readonly navbar;\n\n /**\n * System Console -> User Management -> Users\n */\n readonly systemUsers;\n readonly systemUsersFilterPopover;\n readonly systemUsersRoleMenu;\n readonly systemUsersStatusMenu;\n readonly systemUsersDateRangeMenu;\n readonly systemUsersColumnToggleMenu;\n readonly systemUsersActionMenus;\n\n readonly mobileSecurity;\n\n readonly featureDiscovery;\n\n // modal\n readonly confirmModal;\n readonly exportModal;\n readonly saveChangesModal;\n\n constructor(page: Page) {\n this.page = page;\n\n // Areas of the page\n this.navbar = new components.SystemConsoleNavbar(page.locator('.backstage-navbar'));\n this.sidebar = new components.SystemConsoleSidebar(page.locator('.admin-sidebar'));\n\n // Sections and sub-sections\n this.systemUsers = new components.SystemUsers(page.getByTestId('systemUsersSection'));\n this.mobileSecurity = new components.SystemConsoleMobileSecurity(\n page.getByTestId('sysconsole_section_MobileSecuritySettings'),\n );\n this.featureDiscovery = new components.SystemConsoleFeatureDiscovery(page.getByTestId('featureDiscovery'));\n\n // Menus & Popovers\n this.systemUsersFilterPopover = new components.SystemUsersFilterPopover(\n page.locator('#systemUsersFilterPopover'),\n );\n this.systemUsersRoleMenu = new components.SystemUsersFilterMenu(page.locator('#DropdownInput_filterRole'));\n this.systemUsersStatusMenu = new components.SystemUsersFilterMenu(page.locator('#DropdownInput_filterStatus'));\n this.systemUsersColumnToggleMenu = new components.SystemUsersColumnToggleMenu(\n page.locator('#systemUsersColumnTogglerMenu'),\n );\n this.systemUsersDateRangeMenu = new components.SystemUsersFilterMenu(\n page.locator('#systemUsersDateRangeSelectorMenu'),\n );\n this.systemUsersActionMenus = Array.from(Array(10).keys()).map(\n (index) => new components.SystemUsersFilterMenu(page.locator(`#actionMenu-systemUsersTable-${index}`)),\n );\n\n this.confirmModal = new components.GenericConfirmModal(page.locator('#confirmModal'));\n this.exportModal = new components.GenericConfirmModal(page.getByRole('dialog', {name: 'Export user data'}));\n this.saveChangesModal = new components.SystemUsers(page.locator('div.modal-content'));\n }\n\n async toBeVisible() {\n await this.page.waitForLoadState('networkidle');\n\n await this.sidebar.toBeVisible();\n await this.navbar.toBeVisible();\n }\n\n async goto() {\n await this.page.goto('/admin_console');\n }\n\n async saveRoleChange() {\n await this.saveChangesModal.container.locator('button.btn-primary:has-text(\"Save\")').click();\n }\n\n async clickResetButton() {\n await this.saveChangesModal.container.locator('button.btn-primary:has-text(\"Reset\")').click();\n }\n}\n"],"names":["components","index"],"mappings":"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"}
|
package/dist/util.d.ts
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
export declare const duration: {
|
|
2
|
+
half_sec: number;
|
|
3
|
+
one_sec: number;
|
|
4
|
+
two_sec: number;
|
|
5
|
+
four_sec: number;
|
|
6
|
+
ten_sec: number;
|
|
7
|
+
half_min: number;
|
|
8
|
+
one_min: number;
|
|
9
|
+
two_min: number;
|
|
10
|
+
four_min: number;
|
|
11
|
+
};
|
|
12
|
+
/**
|
|
13
|
+
* Explicit `wait` should not normally used but made available for special cases.
|
|
14
|
+
* @param {number} ms - duration in millisecond
|
|
15
|
+
* @return {Promise} promise with timeout
|
|
16
|
+
*/
|
|
17
|
+
export declare const wait: (ms?: number) => Promise<unknown>;
|
|
18
|
+
/**
|
|
19
|
+
* @param {Number} length - length on random string to return, e.g. 7 (default)
|
|
20
|
+
* @return {String} random string
|
|
21
|
+
*/
|
|
22
|
+
export declare function getRandomId(length?: number): string;
|
|
23
|
+
export declare const defaultTeam: {
|
|
24
|
+
name: string;
|
|
25
|
+
displayName: string;
|
|
26
|
+
type: string;
|
|
27
|
+
};
|
|
28
|
+
export declare const illegalRe: RegExp;
|
|
29
|
+
export declare const simpleEmailRe: RegExp;
|
package/dist/util.js
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var uuid = require('uuid');
|
|
4
|
+
|
|
5
|
+
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
|
|
6
|
+
// See LICENSE.txt for license information.
|
|
7
|
+
const second = 1000;
|
|
8
|
+
const minute = 60 * 1000;
|
|
9
|
+
const duration = {
|
|
10
|
+
half_sec: second / 2,
|
|
11
|
+
one_sec: second,
|
|
12
|
+
two_sec: second * 2,
|
|
13
|
+
four_sec: second * 4,
|
|
14
|
+
ten_sec: second * 10,
|
|
15
|
+
half_min: minute / 2,
|
|
16
|
+
one_min: minute,
|
|
17
|
+
two_min: minute * 2,
|
|
18
|
+
four_min: minute * 4,
|
|
19
|
+
};
|
|
20
|
+
/**
|
|
21
|
+
* Explicit `wait` should not normally used but made available for special cases.
|
|
22
|
+
* @param {number} ms - duration in millisecond
|
|
23
|
+
* @return {Promise} promise with timeout
|
|
24
|
+
*/
|
|
25
|
+
const wait = async (ms = 0) => {
|
|
26
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
27
|
+
};
|
|
28
|
+
/**
|
|
29
|
+
* @param {Number} length - length on random string to return, e.g. 7 (default)
|
|
30
|
+
* @return {String} random string
|
|
31
|
+
*/
|
|
32
|
+
function getRandomId(length = 7) {
|
|
33
|
+
const MAX_SUBSTRING_INDEX = 27;
|
|
34
|
+
return uuid.v4()
|
|
35
|
+
.replace(/-/g, '')
|
|
36
|
+
.substring(MAX_SUBSTRING_INDEX - length, MAX_SUBSTRING_INDEX);
|
|
37
|
+
}
|
|
38
|
+
// Default team is meant for sysadmin's primary team,
|
|
39
|
+
// selected for compatibility with existing local development.
|
|
40
|
+
// 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
|
package/dist/util.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"util.js","sources":["../src/util.ts"],"sourcesContent":["// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {v4 as uuidv4} from 'uuid';\n\nconst second = 1000;\nconst minute = 60 * 1000;\n\nexport const duration = {\n half_sec: second / 2,\n one_sec: second,\n two_sec: second * 2,\n four_sec: second * 4,\n ten_sec: second * 10,\n half_min: minute / 2,\n one_min: minute,\n two_min: minute * 2,\n four_min: minute * 4,\n};\n\n/**\n * Explicit `wait` should not normally used but made available for special cases.\n * @param {number} ms - duration in millisecond\n * @return {Promise} promise with timeout\n */\nexport const wait = async (ms = 0) => {\n return new Promise((resolve) => setTimeout(resolve, ms));\n};\n\n/**\n * @param {Number} length - length on random string to return, e.g. 7 (default)\n * @return {String} random string\n */\nexport function getRandomId(length = 7): string {\n const MAX_SUBSTRING_INDEX = 27;\n\n return uuidv4()\n .replace(/-/g, '')\n .substring(MAX_SUBSTRING_INDEX - length, MAX_SUBSTRING_INDEX);\n}\n\n// Default team is meant for sysadmin's primary team,\n// selected for compatibility with existing local development.\n// It should not be used for testing.\nexport const defaultTeam = {name: 'ad-1', displayName: 'eligendi', type: 'O'};\n\nexport const illegalRe = /[/?<>\\\\:*|\":&();]/g;\nexport const simpleEmailRe = /\\S+@\\S+\\.\\S+/;\n"],"names":["uuidv4"],"mappings":";;;;AAAA;AACA;AAIA,MAAM,MAAM,GAAG,IAAI;AACnB,MAAM,MAAM,GAAG,EAAE,GAAG,IAAI;AAEX,MAAA,QAAQ,GAAG;IACpB,QAAQ,EAAE,MAAM,GAAG,CAAC;AACpB,IAAA,OAAO,EAAE,MAAM;IACf,OAAO,EAAE,MAAM,GAAG,CAAC;IACnB,QAAQ,EAAE,MAAM,GAAG,CAAC;IACpB,OAAO,EAAE,MAAM,GAAG,EAAE;IACpB,QAAQ,EAAE,MAAM,GAAG,CAAC;AACpB,IAAA,OAAO,EAAE,MAAM;IACf,OAAO,EAAE,MAAM,GAAG,CAAC;IACnB,QAAQ,EAAE,MAAM,GAAG,CAAC;;AAGxB;;;;AAIG;AACU,MAAA,IAAI,GAAG,OAAO,EAAE,GAAG,CAAC,KAAI;AACjC,IAAA,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,KAAK,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;AAC5D;AAEA;;;AAGG;AACa,SAAA,WAAW,CAAC,MAAM,GAAG,CAAC,EAAA;IAClC,MAAM,mBAAmB,GAAG,EAAE;AAE9B,IAAA,OAAOA,OAAM;AACR,SAAA,OAAO,CAAC,IAAI,EAAE,EAAE;AAChB,SAAA,SAAS,CAAC,mBAAmB,GAAG,MAAM,EAAE,mBAAmB,CAAC;AACrE;AAEA;AACA;AACA;AACa,MAAA,WAAW,GAAG,EAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE;AAEhD,MAAM,SAAS,GAAG;AAClB,MAAM,aAAa,GAAG;;;;;;;;;"}
|
|
@@ -0,0 +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
|
+
|
|
10
|
+
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
|
|
11
|
+
// See LICENSE.txt for license information.
|
|
12
|
+
async function matchSnapshot(testInfo, testArgs, options = {}) {
|
|
13
|
+
if (os.platform() !== 'linux') {
|
|
14
|
+
// eslint-disable-next-line no-console
|
|
15
|
+
console.log(chalk.yellow(`^ Warning: No visual test performed. Run in Linux or Playwright docker image to match snapshot.`));
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
if (test_config.testConfig.snapshotEnabled || test_config.testConfig.percyEnabled) {
|
|
19
|
+
await testArgs.page.waitForLoadState('networkidle');
|
|
20
|
+
await testArgs.page.waitForLoadState('domcontentloaded');
|
|
21
|
+
await util.wait(util.duration.half_sec);
|
|
22
|
+
}
|
|
23
|
+
if (test_config.testConfig.snapshotEnabled) {
|
|
24
|
+
// Visual test with built-in snapshot
|
|
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 });
|
|
27
|
+
}
|
|
28
|
+
if (test_config.testConfig.percyEnabled) {
|
|
29
|
+
// Used to easily identify the screenshot when viewing from third-party service provider.
|
|
30
|
+
const name = `[${testInfo.project.name}, ${testArgs?.viewport?.width}px] > ${testInfo.file} > ${testInfo.title}`;
|
|
31
|
+
// Visual test with Percy
|
|
32
|
+
await percy(name, testArgs);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
exports.matchSnapshot = matchSnapshot;
|
|
37
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../src/visual/index.ts"],"sourcesContent":["// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport os from 'node:os';\n\nimport chalk from 'chalk';\nimport {TestInfo, expect} from '@playwright/test';\n\nimport snapshotWithPercy from './percy';\n\nimport {duration, illegalRe, wait} from '@/util';\nimport {testConfig} from '@/test_config';\nimport {ScreenshotOptions, TestArgs} from '@/types';\n\nexport async function matchSnapshot(testInfo: TestInfo, testArgs: TestArgs, options: ScreenshotOptions = {}) {\n if (os.platform() !== 'linux') {\n // eslint-disable-next-line no-console\n console.log(\n chalk.yellow(\n `^ Warning: No visual test performed. Run in Linux or Playwright docker image to match snapshot.`,\n ),\n );\n return;\n }\n\n if (testConfig.snapshotEnabled || testConfig.percyEnabled) {\n await testArgs.page.waitForLoadState('networkidle');\n await testArgs.page.waitForLoadState('domcontentloaded');\n await wait(duration.half_sec);\n }\n\n if (testConfig.snapshotEnabled) {\n // Visual test with built-in snapshot\n const filename = testInfo.title.trim().replace(illegalRe, '').replace(/\\s/g, '-').trim().toLowerCase();\n await expect(testArgs.page).toHaveScreenshot(`${filename}.png`, {fullPage: true, ...options});\n }\n\n if (testConfig.percyEnabled) {\n // Used to easily identify the screenshot when viewing from third-party service provider.\n const name = `[${testInfo.project.name}, ${testArgs?.viewport?.width}px] > ${testInfo.file} > ${testInfo.title}`;\n\n // Visual test with Percy\n await snapshotWithPercy(name, testArgs);\n }\n}\n"],"names":["testConfig","wait","duration","illegalRe","expect","snapshotWithPercy"],"mappings":";;;;;;;;;AAAA;AACA;AAaO,eAAe,aAAa,CAAC,QAAkB,EAAE,QAAkB,EAAE,OAAA,GAA6B,EAAE,EAAA;AACvG,IAAA,IAAI,EAAE,CAAC,QAAQ,EAAE,KAAK,OAAO,EAAE;;QAE3B,OAAO,CAAC,GAAG,CACP,KAAK,CAAC,MAAM,CACR,CAAA,+FAAA,CAAiG,CACpG,CACJ;QACD;;IAGJ,IAAIA,sBAAU,CAAC,eAAe,IAAIA,sBAAU,CAAC,YAAY,EAAE;QACvD,MAAM,QAAQ,CAAC,IAAI,CAAC,gBAAgB,CAAC,aAAa,CAAC;QACnD,MAAM,QAAQ,CAAC,IAAI,CAAC,gBAAgB,CAAC,kBAAkB,CAAC;AACxD,QAAA,MAAMC,SAAI,CAACC,aAAQ,CAAC,QAAQ,CAAC;;AAGjC,IAAA,IAAIF,sBAAU,CAAC,eAAe,EAAE;;AAE5B,QAAA,MAAM,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,OAAO,CAACG,cAAS,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE;QACtG,MAAMC,WAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,gBAAgB,CAAC,CAAG,EAAA,QAAQ,MAAM,EAAE,EAAC,QAAQ,EAAE,IAAI,EAAE,GAAG,OAAO,EAAC,CAAC;;AAGjG,IAAA,IAAIJ,sBAAU,CAAC,YAAY,EAAE;;QAEzB,MAAM,IAAI,GAAG,CAAI,CAAA,EAAA,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAA,EAAA,EAAK,QAAQ,EAAE,QAAQ,EAAE,KAAK,CAAS,MAAA,EAAA,QAAQ,CAAC,IAAI,MAAM,QAAQ,CAAC,KAAK,CAAA,CAAE;;AAGhH,QAAA,MAAMK,KAAiB,CAAC,IAAI,EAAE,QAAQ,CAAC;;AAE/C;;;;"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var percySnapshot = require('@percy/playwright');
|
|
4
|
+
var test_config = require('../test_config.js');
|
|
5
|
+
|
|
6
|
+
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
|
|
7
|
+
// See LICENSE.txt for license information.
|
|
8
|
+
async function snapshotWithPercy(name, testArgs) {
|
|
9
|
+
if (testArgs.browserName === 'chromium' && test_config.testConfig.percyEnabled && testArgs.viewport) {
|
|
10
|
+
const { page, viewport } = testArgs;
|
|
11
|
+
try {
|
|
12
|
+
await percySnapshot(page, name, { widths: [viewport.width], minHeight: viewport.height });
|
|
13
|
+
}
|
|
14
|
+
catch (error) {
|
|
15
|
+
// log an error for debugging
|
|
16
|
+
// eslint-disable-next-line no-console
|
|
17
|
+
console.log(`${error}\nIn addition, check if token is properly set by "export PERCY_TOKEN=<change_me>"`);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
module.exports = snapshotWithPercy;
|
|
23
|
+
//# sourceMappingURL=percy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"percy.js","sources":["../../src/visual/percy.ts"],"sourcesContent":["// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport percySnapshot from '@percy/playwright';\n\nimport {testConfig} from '@/test_config';\nimport {TestArgs} from '@/types';\n\nexport default async function snapshotWithPercy(name: string, testArgs: TestArgs) {\n if (testArgs.browserName === 'chromium' && testConfig.percyEnabled && testArgs.viewport) {\n const {page, viewport} = testArgs;\n\n try {\n await percySnapshot(page, name, {widths: [viewport.width], minHeight: viewport.height});\n } catch (error) {\n // log an error for debugging\n // eslint-disable-next-line no-console\n console.log(`${error}\\nIn addition, check if token is properly set by \"export PERCY_TOKEN=<change_me>\"`);\n }\n }\n}\n"],"names":["testConfig"],"mappings":";;;;;AAAA;AACA;AAOe,eAAe,iBAAiB,CAAC,IAAY,EAAE,QAAkB,EAAA;AAC5E,IAAA,IAAI,QAAQ,CAAC,WAAW,KAAK,UAAU,IAAIA,sBAAU,CAAC,YAAY,IAAI,QAAQ,CAAC,QAAQ,EAAE;AACrF,QAAA,MAAM,EAAC,IAAI,EAAE,QAAQ,EAAC,GAAG,QAAQ;AAEjC,QAAA,IAAI;YACA,MAAM,aAAa,CAAC,IAAI,EAAE,IAAI,EAAE,EAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,EAAE,QAAQ,CAAC,MAAM,EAAC,CAAC;;QACzF,OAAO,KAAK,EAAE;;;AAGZ,YAAA,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAA,iFAAA,CAAmF,CAAC;;;AAGpH;;;;"}
|