@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,17 @@
|
|
|
1
|
+
import { Locator } from '@playwright/test';
|
|
2
|
+
export default class SystemConsoleSidebar {
|
|
3
|
+
readonly container: Locator;
|
|
4
|
+
readonly searchInput: Locator;
|
|
5
|
+
constructor(container: Locator);
|
|
6
|
+
toBeVisible(): Promise<void>;
|
|
7
|
+
/**
|
|
8
|
+
* Clicks on the sidebar section link with the given name. Pass the exact name of the section.
|
|
9
|
+
* @param sectionName
|
|
10
|
+
*/
|
|
11
|
+
goToItem(sectionName: string): Promise<void>;
|
|
12
|
+
/**
|
|
13
|
+
* Searches for the given item in the sidebar search input.
|
|
14
|
+
* @param itemName
|
|
15
|
+
*/
|
|
16
|
+
searchForItem(itemName: string): Promise<void>;
|
|
17
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
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 SystemConsoleSidebar {
|
|
8
|
+
container;
|
|
9
|
+
searchInput;
|
|
10
|
+
constructor(container) {
|
|
11
|
+
this.container = container;
|
|
12
|
+
this.searchInput = container.getByPlaceholder('Find settings');
|
|
13
|
+
}
|
|
14
|
+
async toBeVisible() {
|
|
15
|
+
await test.expect(this.container).toBeVisible();
|
|
16
|
+
await test.expect(this.searchInput).toBeVisible();
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Clicks on the sidebar section link with the given name. Pass the exact name of the section.
|
|
20
|
+
* @param sectionName
|
|
21
|
+
*/
|
|
22
|
+
async goToItem(sectionName) {
|
|
23
|
+
const section = this.container.getByText(sectionName, { exact: true });
|
|
24
|
+
await section.waitFor();
|
|
25
|
+
await section.click();
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Searches for the given item in the sidebar search input.
|
|
29
|
+
* @param itemName
|
|
30
|
+
*/
|
|
31
|
+
async searchForItem(itemName) {
|
|
32
|
+
await this.searchInput.fill(itemName);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
module.exports = SystemConsoleSidebar;
|
|
37
|
+
//# sourceMappingURL=sidebar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sidebar.js","sources":["../../../../src/ui/components/system_console/sidebar.ts"],"sourcesContent":["// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {Locator, expect} from '@playwright/test';\n\nexport default class SystemConsoleSidebar {\n readonly container: Locator;\n\n readonly searchInput: Locator;\n\n constructor(container: Locator) {\n this.container = container;\n\n this.searchInput = container.getByPlaceholder('Find settings');\n }\n\n async toBeVisible() {\n await expect(this.container).toBeVisible();\n await expect(this.searchInput).toBeVisible();\n }\n\n /**\n * Clicks on the sidebar section link with the given name. Pass the exact name of the section.\n * @param sectionName\n */\n async goToItem(sectionName: string) {\n const section = this.container.getByText(sectionName, {exact: true});\n await section.waitFor();\n await section.click();\n }\n\n /**\n * Searches for the given item in the sidebar search input.\n * @param itemName\n */\n async searchForItem(itemName: string) {\n await this.searchInput.fill(itemName);\n }\n}\n"],"names":["expect"],"mappings":";;;;AAAA;AACA;AAIc,MAAO,oBAAoB,CAAA;AAC5B,IAAA,SAAS;AAET,IAAA,WAAW;AAEpB,IAAA,WAAA,CAAY,SAAkB,EAAA;AAC1B,QAAA,IAAI,CAAC,SAAS,GAAG,SAAS;QAE1B,IAAI,CAAC,WAAW,GAAG,SAAS,CAAC,gBAAgB,CAAC,eAAe,CAAC;;AAGlE,IAAA,MAAM,WAAW,GAAA;QACb,MAAMA,WAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE;QAC1C,MAAMA,WAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,WAAW,EAAE;;AAGhD;;;AAGG;IACH,MAAM,QAAQ,CAAC,WAAmB,EAAA;AAC9B,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,WAAW,EAAE,EAAC,KAAK,EAAE,IAAI,EAAC,CAAC;AACpE,QAAA,MAAM,OAAO,CAAC,OAAO,EAAE;AACvB,QAAA,MAAM,OAAO,CAAC,KAAK,EAAE;;AAGzB;;;AAGG;IACH,MAAM,aAAa,CAAC,QAAgB,EAAA;QAChC,MAAM,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC;;AAE5C;;;;"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { Page } from '@playwright/test';
|
|
2
|
+
export default class ChannelsPage {
|
|
3
|
+
readonly channels = "Channels";
|
|
4
|
+
readonly page: Page;
|
|
5
|
+
readonly globalHeader: import("@/ui/components").GlobalHeader;
|
|
6
|
+
readonly searchPopover: import("../components/channels/search_popover").default;
|
|
7
|
+
readonly centerView: import("@/ui/components").ChannelsCenterView;
|
|
8
|
+
readonly scheduledDraftDropdown: import("../components/channels/scheduled_draft_menu").default;
|
|
9
|
+
readonly scheduledDraftModal: import("../components/channels/scheduled_draft_modal").default;
|
|
10
|
+
readonly sidebarLeft: import("@/ui/components").ChannelsSidebarLeft;
|
|
11
|
+
readonly sidebarRight: import("@/ui/components").ChannelsSidebarRight;
|
|
12
|
+
readonly appBar: import("@/ui/components").ChannelsAppBar;
|
|
13
|
+
readonly userProfilePopover: import("../components/channels/user_profile_popover").default;
|
|
14
|
+
readonly messagePriority: import("@/ui/components").MessagePriority;
|
|
15
|
+
readonly findChannelsModal: import("@/ui/components").FindChannelsModal;
|
|
16
|
+
readonly deletePostModal: import("@/ui/components").DeletePostModal;
|
|
17
|
+
readonly settingsModal: import("../components/channels/settings/settings_modal").default;
|
|
18
|
+
readonly postContainer: import("playwright-core").Locator;
|
|
19
|
+
readonly postDotMenu: import("@/ui/components").PostDotMenu;
|
|
20
|
+
readonly postReminderMenu: import("../components/channels/post_reminder_menu").default;
|
|
21
|
+
readonly emojiGifPickerPopup: import("../components/channels/emoji_gif_picker").default;
|
|
22
|
+
constructor(page: Page);
|
|
23
|
+
toBeVisible(): Promise<void>;
|
|
24
|
+
getLastPost(): Promise<import("playwright-core").Locator>;
|
|
25
|
+
goto(teamName?: string, channelName?: string): Promise<void>;
|
|
26
|
+
/**
|
|
27
|
+
* `postMessage` posts a message in the current channel
|
|
28
|
+
* @param message Message to post
|
|
29
|
+
*/
|
|
30
|
+
postMessage(message: string): Promise<void>;
|
|
31
|
+
}
|
|
@@ -0,0 +1,79 @@
|
|
|
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 ChannelsPage {
|
|
8
|
+
channels = 'Channels';
|
|
9
|
+
page;
|
|
10
|
+
globalHeader;
|
|
11
|
+
searchPopover;
|
|
12
|
+
centerView;
|
|
13
|
+
scheduledDraftDropdown;
|
|
14
|
+
scheduledDraftModal;
|
|
15
|
+
sidebarLeft;
|
|
16
|
+
sidebarRight;
|
|
17
|
+
appBar;
|
|
18
|
+
userProfilePopover;
|
|
19
|
+
messagePriority;
|
|
20
|
+
findChannelsModal;
|
|
21
|
+
deletePostModal;
|
|
22
|
+
settingsModal;
|
|
23
|
+
postContainer;
|
|
24
|
+
postDotMenu;
|
|
25
|
+
postReminderMenu;
|
|
26
|
+
emojiGifPickerPopup;
|
|
27
|
+
constructor(page) {
|
|
28
|
+
this.page = page;
|
|
29
|
+
// The main areas of the app
|
|
30
|
+
this.globalHeader = new index.components.GlobalHeader(page.locator('#global-header'));
|
|
31
|
+
this.searchPopover = new index.components.SearchPopover(page.locator('#searchPopover'));
|
|
32
|
+
this.centerView = new index.components.ChannelsCenterView(page.getByTestId('channel_view'));
|
|
33
|
+
this.sidebarLeft = new index.components.ChannelsSidebarLeft(page.locator('#SidebarContainer'));
|
|
34
|
+
this.sidebarRight = new index.components.ChannelsSidebarRight(page.locator('#sidebar-right'));
|
|
35
|
+
this.appBar = new index.components.ChannelsAppBar(page.locator('.app-bar'));
|
|
36
|
+
this.messagePriority = new index.components.MessagePriority(page.locator('body'));
|
|
37
|
+
// Modals
|
|
38
|
+
this.findChannelsModal = new index.components.FindChannelsModal(page.getByRole('dialog', { name: 'Find Channels' }));
|
|
39
|
+
this.deletePostModal = new index.components.DeletePostModal(page.locator('#deletePostModal'));
|
|
40
|
+
this.settingsModal = new index.components.SettingsModal(page.getByRole('dialog', { name: 'Settings' }));
|
|
41
|
+
// Menus
|
|
42
|
+
this.postDotMenu = new index.components.PostDotMenu(page.getByRole('menu', { name: 'Post extra options' }));
|
|
43
|
+
this.postReminderMenu = new index.components.PostReminderMenu(page.getByRole('menu', { name: 'Set a reminder for:' }));
|
|
44
|
+
// Popovers
|
|
45
|
+
this.emojiGifPickerPopup = new index.components.EmojiGifPicker(page.locator('#emojiGifPicker'));
|
|
46
|
+
this.scheduledDraftDropdown = new index.components.ScheduledDraftMenu(page.locator('#dropdown_send_post_options'));
|
|
47
|
+
this.scheduledDraftModal = new index.components.ScheduledDraftModal(page.locator('div.modal-content'));
|
|
48
|
+
this.userProfilePopover = new index.components.UserProfilePopover(page.locator('.user-profile-popover'));
|
|
49
|
+
// Posts
|
|
50
|
+
this.postContainer = page.locator('div.post-message__text');
|
|
51
|
+
}
|
|
52
|
+
async toBeVisible() {
|
|
53
|
+
await this.centerView.toBeVisible();
|
|
54
|
+
}
|
|
55
|
+
async getLastPost() {
|
|
56
|
+
return this.postContainer.last();
|
|
57
|
+
}
|
|
58
|
+
async goto(teamName = '', channelName = '') {
|
|
59
|
+
let channelsUrl = '/';
|
|
60
|
+
if (teamName) {
|
|
61
|
+
channelsUrl += `${teamName}`;
|
|
62
|
+
if (channelName) {
|
|
63
|
+
const prefix = channelName.startsWith('@') ? '/messages' : '/channels';
|
|
64
|
+
channelsUrl += `${prefix}/${channelName}`;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
await this.page.goto(channelsUrl);
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* `postMessage` posts a message in the current channel
|
|
71
|
+
* @param message Message to post
|
|
72
|
+
*/
|
|
73
|
+
async postMessage(message) {
|
|
74
|
+
await this.centerView.postCreate.postMessage(message);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
module.exports = ChannelsPage;
|
|
79
|
+
//# sourceMappingURL=channels.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"channels.js","sources":["../../../src/ui/pages/channels.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 ChannelsPage {\n readonly channels = 'Channels';\n\n readonly page: Page;\n\n readonly globalHeader;\n readonly searchPopover;\n readonly centerView;\n readonly scheduledDraftDropdown;\n readonly scheduledDraftModal;\n readonly sidebarLeft;\n readonly sidebarRight;\n readonly appBar;\n readonly userProfilePopover;\n readonly messagePriority;\n\n readonly findChannelsModal;\n readonly deletePostModal;\n readonly settingsModal;\n\n readonly postContainer;\n readonly postDotMenu;\n readonly postReminderMenu;\n\n readonly emojiGifPickerPopup;\n\n constructor(page: Page) {\n this.page = page;\n\n // The main areas of the app\n this.globalHeader = new components.GlobalHeader(page.locator('#global-header'));\n this.searchPopover = new components.SearchPopover(page.locator('#searchPopover'));\n this.centerView = new components.ChannelsCenterView(page.getByTestId('channel_view'));\n this.sidebarLeft = new components.ChannelsSidebarLeft(page.locator('#SidebarContainer'));\n this.sidebarRight = new components.ChannelsSidebarRight(page.locator('#sidebar-right'));\n this.appBar = new components.ChannelsAppBar(page.locator('.app-bar'));\n this.messagePriority = new components.MessagePriority(page.locator('body'));\n\n // Modals\n this.findChannelsModal = new components.FindChannelsModal(page.getByRole('dialog', {name: 'Find Channels'}));\n this.deletePostModal = new components.DeletePostModal(page.locator('#deletePostModal'));\n this.settingsModal = new components.SettingsModal(page.getByRole('dialog', {name: 'Settings'}));\n\n // Menus\n this.postDotMenu = new components.PostDotMenu(page.getByRole('menu', {name: 'Post extra options'}));\n this.postReminderMenu = new components.PostReminderMenu(page.getByRole('menu', {name: 'Set a reminder for:'}));\n\n // Popovers\n this.emojiGifPickerPopup = new components.EmojiGifPicker(page.locator('#emojiGifPicker'));\n this.scheduledDraftDropdown = new components.ScheduledDraftMenu(page.locator('#dropdown_send_post_options'));\n this.scheduledDraftModal = new components.ScheduledDraftModal(page.locator('div.modal-content'));\n this.userProfilePopover = new components.UserProfilePopover(page.locator('.user-profile-popover'));\n\n // Posts\n this.postContainer = page.locator('div.post-message__text');\n }\n\n async toBeVisible() {\n await this.centerView.toBeVisible();\n }\n\n async getLastPost() {\n return this.postContainer.last();\n }\n\n async goto(teamName = '', channelName = '') {\n let channelsUrl = '/';\n if (teamName) {\n channelsUrl += `${teamName}`;\n if (channelName) {\n const prefix = channelName.startsWith('@') ? '/messages' : '/channels';\n channelsUrl += `${prefix}/${channelName}`;\n }\n }\n await this.page.goto(channelsUrl);\n }\n\n /**\n * `postMessage` posts a message in the current channel\n * @param message Message to post\n */\n async postMessage(message: string) {\n await this.centerView.postCreate.postMessage(message);\n }\n}\n"],"names":["components"],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { Page } from '@playwright/test';
|
|
2
|
+
export default class DraftPage {
|
|
3
|
+
readonly page: Page;
|
|
4
|
+
readonly badgeCountOnScheduledTab: import("playwright-core").Locator;
|
|
5
|
+
readonly confirmbutton: import("playwright-core").Locator;
|
|
6
|
+
readonly datePattern: RegExp;
|
|
7
|
+
readonly deleteIcon: import("playwright-core").Locator;
|
|
8
|
+
readonly deleteIconToolTip: import("playwright-core").Locator;
|
|
9
|
+
readonly noscheduledDraftIcon: import("playwright-core").Locator;
|
|
10
|
+
readonly scheduleIcon: import("playwright-core").Locator;
|
|
11
|
+
readonly rescheduleIconToolTip: import("playwright-core").Locator;
|
|
12
|
+
readonly draftBody: import("playwright-core").Locator;
|
|
13
|
+
readonly scheduledDraftPageInfo: import("playwright-core").Locator;
|
|
14
|
+
readonly scheduledDraftPanel: (messageContent: string) => import("playwright-core").Locator;
|
|
15
|
+
readonly scheduledDraftSendNowButton: import("playwright-core").Locator;
|
|
16
|
+
readonly scheduledDraftSendNowButtonToolTip: import("playwright-core").Locator;
|
|
17
|
+
constructor(page: Page);
|
|
18
|
+
goTo(teamName: string): Promise<void>;
|
|
19
|
+
toBeVisible(): Promise<void>;
|
|
20
|
+
assertBadgeCountOnTab(badgeCount: string): Promise<void>;
|
|
21
|
+
assertDraftBody(draftMessage: string): Promise<void>;
|
|
22
|
+
verifyOnHoverActionItems(messageContent: string): Promise<void>;
|
|
23
|
+
verifyDeleteIcon(): Promise<void>;
|
|
24
|
+
verifyScheduleIcon(messageContent: string): Promise<void>;
|
|
25
|
+
verifySendNowIcon(): Promise<void>;
|
|
26
|
+
getTimeStampOfMessage(messageContent: string): Promise<string>;
|
|
27
|
+
openScheduleModal(messageContent: string): Promise<void>;
|
|
28
|
+
deleteScheduledMessage(messageContent: string): Promise<void>;
|
|
29
|
+
sendScheduledMessage(messageContent: string): Promise<void>;
|
|
30
|
+
}
|
|
@@ -0,0 +1,114 @@
|
|
|
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 DraftPage {
|
|
8
|
+
page;
|
|
9
|
+
badgeCountOnScheduledTab;
|
|
10
|
+
confirmbutton;
|
|
11
|
+
datePattern;
|
|
12
|
+
deleteIcon;
|
|
13
|
+
deleteIconToolTip;
|
|
14
|
+
noscheduledDraftIcon;
|
|
15
|
+
scheduleIcon;
|
|
16
|
+
rescheduleIconToolTip;
|
|
17
|
+
draftBody;
|
|
18
|
+
scheduledDraftPageInfo;
|
|
19
|
+
scheduledDraftPanel;
|
|
20
|
+
scheduledDraftSendNowButton;
|
|
21
|
+
scheduledDraftSendNowButtonToolTip;
|
|
22
|
+
constructor(page) {
|
|
23
|
+
this.page = page;
|
|
24
|
+
this.draftBody = page.locator('div.post__body');
|
|
25
|
+
this.scheduleIcon = page.locator('#draft_icon-clock-send-outline_reschedule');
|
|
26
|
+
this.datePattern =
|
|
27
|
+
/(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/;
|
|
28
|
+
this.badgeCountOnScheduledTab = page.locator('a#draft_tabs-tab-0 div.drafts_tab_title span.MuiBadge-badge');
|
|
29
|
+
// this.scheduledDraftPageInfo = page.locator('span:has-text("Send on")');
|
|
30
|
+
this.scheduledDraftPageInfo = page.locator('.PanelHeader__info');
|
|
31
|
+
this.scheduledDraftPanel = (messageContent) => page.locator(`article.Panel:has(div.post__body:has-text("${messageContent}"))`);
|
|
32
|
+
this.deleteIcon = page.locator('#draft_icon-trash-can-outline_delete');
|
|
33
|
+
this.deleteIconToolTip = page.locator('text=Delete scheduled post');
|
|
34
|
+
this.rescheduleIconToolTip = page.locator('text=Schedule draft');
|
|
35
|
+
this.noscheduledDraftIcon = page.locator('.no-results__wrapper');
|
|
36
|
+
this.scheduledDraftSendNowButton = page.locator('#draft_icon-send-outline_sendNow');
|
|
37
|
+
this.scheduledDraftSendNowButtonToolTip = page.locator('text=Send now');
|
|
38
|
+
this.confirmbutton = this.page.locator('button.btn-primary');
|
|
39
|
+
}
|
|
40
|
+
async goTo(teamName) {
|
|
41
|
+
await this.page.goto(`/${teamName}/drafts`);
|
|
42
|
+
}
|
|
43
|
+
async toBeVisible() {
|
|
44
|
+
await this.page.waitForLoadState('networkidle');
|
|
45
|
+
await test.expect(this.page).toHaveURL(/.*drafts/);
|
|
46
|
+
}
|
|
47
|
+
async assertBadgeCountOnTab(badgeCount) {
|
|
48
|
+
await this.badgeCountOnScheduledTab.isVisible();
|
|
49
|
+
await test.expect(this.badgeCountOnScheduledTab).toHaveText(badgeCount);
|
|
50
|
+
}
|
|
51
|
+
async assertDraftBody(draftMessage) {
|
|
52
|
+
await test.expect(this.draftBody).toBeVisible();
|
|
53
|
+
await test.expect(this.draftBody).toHaveText(draftMessage);
|
|
54
|
+
}
|
|
55
|
+
async verifyOnHoverActionItems(messageContent) {
|
|
56
|
+
await this.scheduledDraftPanel(messageContent).isVisible();
|
|
57
|
+
await this.scheduledDraftPanel(messageContent).hover();
|
|
58
|
+
await this.verifyDeleteIcon();
|
|
59
|
+
await this.verifyScheduleIcon(messageContent);
|
|
60
|
+
await this.verifySendNowIcon();
|
|
61
|
+
}
|
|
62
|
+
async verifyDeleteIcon() {
|
|
63
|
+
await this.deleteIcon.isVisible();
|
|
64
|
+
await this.deleteIcon.hover();
|
|
65
|
+
await test.expect(this.deleteIconToolTip).toBeVisible();
|
|
66
|
+
await test.expect(this.deleteIconToolTip).toHaveText('Delete scheduled post');
|
|
67
|
+
}
|
|
68
|
+
async verifyScheduleIcon(messageContent) {
|
|
69
|
+
await this.scheduledDraftPanel(messageContent).hover();
|
|
70
|
+
await test.expect(this.scheduleIcon).toBeVisible();
|
|
71
|
+
await this.scheduleIcon.hover();
|
|
72
|
+
await test.expect(this.rescheduleIconToolTip).toBeVisible();
|
|
73
|
+
await test.expect(this.rescheduleIconToolTip).toHaveText('Schedule draft');
|
|
74
|
+
}
|
|
75
|
+
async verifySendNowIcon() {
|
|
76
|
+
await this.scheduledDraftSendNowButton.isVisible();
|
|
77
|
+
await this.scheduledDraftSendNowButton.hover();
|
|
78
|
+
await test.expect(this.scheduledDraftSendNowButtonToolTip).toBeVisible();
|
|
79
|
+
await test.expect(this.scheduledDraftSendNowButtonToolTip).toHaveText('Send now');
|
|
80
|
+
}
|
|
81
|
+
async getTimeStampOfMessage(messageContent) {
|
|
82
|
+
await this.scheduledDraftPanel(messageContent).scrollIntoViewIfNeeded();
|
|
83
|
+
await this.scheduledDraftPanel(messageContent).isVisible();
|
|
84
|
+
return this.scheduledDraftPanel(messageContent).locator(this.scheduledDraftPageInfo).innerHTML();
|
|
85
|
+
}
|
|
86
|
+
async openScheduleModal(messageContent) {
|
|
87
|
+
await this.scheduledDraftPanel(messageContent).scrollIntoViewIfNeeded();
|
|
88
|
+
await this.scheduledDraftPanel(messageContent).isVisible();
|
|
89
|
+
await this.scheduledDraftPanel(messageContent).hover();
|
|
90
|
+
await this.scheduleIcon.hover();
|
|
91
|
+
await test.expect(this.rescheduleIconToolTip).toBeVisible();
|
|
92
|
+
await test.expect(this.rescheduleIconToolTip).toHaveText('Schedule draft');
|
|
93
|
+
await this.scheduleIcon.click();
|
|
94
|
+
}
|
|
95
|
+
async deleteScheduledMessage(messageContent) {
|
|
96
|
+
await this.scheduledDraftPanel(messageContent).isVisible();
|
|
97
|
+
await this.scheduledDraftPanel(messageContent).hover();
|
|
98
|
+
await this.verifyDeleteIcon();
|
|
99
|
+
await this.deleteIcon.click();
|
|
100
|
+
test.expect(await this.confirmbutton.textContent()).toEqual('Yes, delete');
|
|
101
|
+
await this.confirmbutton.click();
|
|
102
|
+
}
|
|
103
|
+
async sendScheduledMessage(messageContent) {
|
|
104
|
+
await this.scheduledDraftPanel(messageContent).isVisible();
|
|
105
|
+
await this.scheduledDraftPanel(messageContent).hover();
|
|
106
|
+
await this.verifySendNowIcon();
|
|
107
|
+
await this.scheduledDraftSendNowButton.click();
|
|
108
|
+
test.expect(await this.confirmbutton.textContent()).toEqual('Yes, send now');
|
|
109
|
+
await this.confirmbutton.click();
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
module.exports = DraftPage;
|
|
114
|
+
//# sourceMappingURL=drafts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"drafts.js","sources":["../../../src/ui/pages/drafts.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 DraftPage {\n readonly page: Page;\n\n readonly badgeCountOnScheduledTab;\n readonly confirmbutton;\n readonly datePattern;\n readonly deleteIcon;\n readonly deleteIconToolTip;\n readonly noscheduledDraftIcon;\n readonly scheduleIcon;\n readonly rescheduleIconToolTip;\n readonly draftBody;\n readonly scheduledDraftPageInfo;\n readonly scheduledDraftPanel;\n readonly scheduledDraftSendNowButton;\n readonly scheduledDraftSendNowButtonToolTip;\n\n constructor(page: Page) {\n this.page = page;\n this.draftBody = page.locator('div.post__body');\n this.scheduleIcon = page.locator('#draft_icon-clock-send-outline_reschedule');\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.badgeCountOnScheduledTab = page.locator('a#draft_tabs-tab-0 div.drafts_tab_title span.MuiBadge-badge');\n // this.scheduledDraftPageInfo = page.locator('span:has-text(\"Send on\")');\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.rescheduleIconToolTip = page.locator('text=Schedule draft');\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 }\n\n async goTo(teamName: string) {\n await this.page.goto(`/${teamName}/drafts`);\n }\n\n async toBeVisible() {\n await this.page.waitForLoadState('networkidle');\n await expect(this.page).toHaveURL(/.*drafts/);\n }\n\n async assertBadgeCountOnTab(badgeCount: string) {\n await this.badgeCountOnScheduledTab.isVisible();\n await expect(this.badgeCountOnScheduledTab).toHaveText(badgeCount);\n }\n\n async assertDraftBody(draftMessage: string) {\n await expect(this.draftBody).toBeVisible();\n await expect(this.draftBody).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.verifyScheduleIcon(messageContent);\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 verifyScheduleIcon(messageContent: string) {\n await this.scheduledDraftPanel(messageContent).hover();\n await expect(this.scheduleIcon).toBeVisible();\n await this.scheduleIcon.hover();\n await expect(this.rescheduleIconToolTip).toBeVisible();\n await expect(this.rescheduleIconToolTip).toHaveText('Schedule draft');\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 openScheduleModal(messageContent: string) {\n await this.scheduledDraftPanel(messageContent).scrollIntoViewIfNeeded();\n await this.scheduledDraftPanel(messageContent).isVisible();\n await this.scheduledDraftPanel(messageContent).hover();\n await this.scheduleIcon.hover();\n await expect(this.rescheduleIconToolTip).toBeVisible();\n await expect(this.rescheduleIconToolTip).toHaveText('Schedule draft');\n await this.scheduleIcon.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"],"names":["expect"],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import ChannelsPage from './channels';
|
|
2
|
+
import LandingLoginPage from './landing_login';
|
|
3
|
+
import LoginPage from './login';
|
|
4
|
+
import ResetPasswordPage from './reset_password';
|
|
5
|
+
import SignupPage from './signup';
|
|
6
|
+
import SystemConsolePage from './system_console';
|
|
7
|
+
import ScheduledDraftPage from './scheduled_draft';
|
|
8
|
+
import DraftPage from './drafts';
|
|
9
|
+
declare const pages: {
|
|
10
|
+
ChannelsPage: typeof ChannelsPage;
|
|
11
|
+
LandingLoginPage: typeof LandingLoginPage;
|
|
12
|
+
LoginPage: typeof LoginPage;
|
|
13
|
+
ResetPasswordPage: typeof ResetPasswordPage;
|
|
14
|
+
SignupPage: typeof SignupPage;
|
|
15
|
+
ScheduledDraftPage: typeof ScheduledDraftPage;
|
|
16
|
+
SystemConsolePage: typeof SystemConsolePage;
|
|
17
|
+
DraftPage: typeof DraftPage;
|
|
18
|
+
};
|
|
19
|
+
export { pages, ChannelsPage, LandingLoginPage, LoginPage, ResetPasswordPage, SignupPage, ScheduledDraftPage, SystemConsolePage, DraftPage, };
|
|
@@ -0,0 +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
|
+
|
|
12
|
+
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
|
|
13
|
+
// See LICENSE.txt for license information.
|
|
14
|
+
const pages = {
|
|
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,
|
|
23
|
+
};
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../src/ui/pages/index.ts"],"sourcesContent":["// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport ChannelsPage from './channels';\nimport LandingLoginPage from './landing_login';\nimport LoginPage from './login';\nimport ResetPasswordPage from './reset_password';\nimport SignupPage from './signup';\nimport SystemConsolePage from './system_console';\nimport ScheduledDraftPage from './scheduled_draft';\nimport DraftPage from './drafts';\n\nconst pages = {\n ChannelsPage,\n LandingLoginPage,\n LoginPage,\n ResetPasswordPage,\n SignupPage,\n ScheduledDraftPage,\n SystemConsolePage,\n DraftPage,\n};\n\nexport {\n pages,\n ChannelsPage,\n LandingLoginPage,\n LoginPage,\n ResetPasswordPage,\n SignupPage,\n ScheduledDraftPage,\n SystemConsolePage,\n DraftPage,\n};\n"],"names":["ChannelsPage","LandingLoginPage","LoginPage","ResetPasswordPage","SignupPage","ScheduledDraftPage","SystemConsolePage","DraftPage"],"mappings":";;;;;;;;;;;AAAA;AACA;AAWA,MAAM,KAAK,GAAG;kBACVA,QAAY;sBACZC,aAAgB;eAChBC,KAAS;uBACTC,cAAiB;gBACjBC,MAAU;wBACVC,eAAkB;uBAClBC,cAAiB;eACjBC,MAAS;;;;;;;;;;;;;"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { Page } from '@playwright/test';
|
|
2
|
+
export default class LandingLoginPage {
|
|
3
|
+
readonly page: Page;
|
|
4
|
+
readonly isMobile?: boolean;
|
|
5
|
+
readonly viewInAppButton: import("playwright-core").Locator;
|
|
6
|
+
readonly viewInDesktopAppButton: import("playwright-core").Locator;
|
|
7
|
+
readonly viewInBrowserButton: import("playwright-core").Locator;
|
|
8
|
+
constructor(page: Page, isMobile?: boolean);
|
|
9
|
+
toBeVisible(): Promise<void>;
|
|
10
|
+
goto(): Promise<void>;
|
|
11
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
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 LandingLoginPage {
|
|
8
|
+
page;
|
|
9
|
+
isMobile;
|
|
10
|
+
viewInAppButton;
|
|
11
|
+
viewInDesktopAppButton;
|
|
12
|
+
viewInBrowserButton;
|
|
13
|
+
constructor(page, isMobile) {
|
|
14
|
+
this.page = page;
|
|
15
|
+
this.isMobile = isMobile;
|
|
16
|
+
this.viewInAppButton = page.locator('text=View in App');
|
|
17
|
+
this.viewInDesktopAppButton = page.locator('text=View in Desktop App');
|
|
18
|
+
this.viewInBrowserButton = page.locator('text=View in Browser');
|
|
19
|
+
}
|
|
20
|
+
async toBeVisible() {
|
|
21
|
+
await this.page.waitForLoadState('networkidle');
|
|
22
|
+
if (this.isMobile) {
|
|
23
|
+
await test.expect(this.viewInAppButton).toBeVisible();
|
|
24
|
+
}
|
|
25
|
+
else {
|
|
26
|
+
await test.expect(this.viewInDesktopAppButton).toBeVisible();
|
|
27
|
+
}
|
|
28
|
+
await test.expect(this.viewInBrowserButton).toBeVisible();
|
|
29
|
+
}
|
|
30
|
+
async goto() {
|
|
31
|
+
await this.page.goto('/landing#/login');
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
module.exports = LandingLoginPage;
|
|
36
|
+
//# sourceMappingURL=landing_login.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"landing_login.js","sources":["../../../src/ui/pages/landing_login.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 LandingLoginPage {\n readonly page: Page;\n\n readonly isMobile?: boolean;\n\n readonly viewInAppButton;\n readonly viewInDesktopAppButton;\n readonly viewInBrowserButton;\n\n constructor(page: Page, isMobile?: boolean) {\n this.page = page;\n this.isMobile = isMobile;\n\n this.viewInAppButton = page.locator('text=View in App');\n this.viewInDesktopAppButton = page.locator('text=View in Desktop App');\n this.viewInBrowserButton = page.locator('text=View in Browser');\n }\n\n async toBeVisible() {\n await this.page.waitForLoadState('networkidle');\n\n if (this.isMobile) {\n await expect(this.viewInAppButton).toBeVisible();\n } else {\n await expect(this.viewInDesktopAppButton).toBeVisible();\n }\n\n await expect(this.viewInBrowserButton).toBeVisible();\n }\n\n async goto() {\n await this.page.goto('/landing#/login');\n }\n}\n"],"names":["expect"],"mappings":";;;;AAAA;AACA;AAIc,MAAO,gBAAgB,CAAA;AACxB,IAAA,IAAI;AAEJ,IAAA,QAAQ;AAER,IAAA,eAAe;AACf,IAAA,sBAAsB;AACtB,IAAA,mBAAmB;IAE5B,WAAY,CAAA,IAAU,EAAE,QAAkB,EAAA;AACtC,QAAA,IAAI,CAAC,IAAI,GAAG,IAAI;AAChB,QAAA,IAAI,CAAC,QAAQ,GAAG,QAAQ;QAExB,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC;QACvD,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC,OAAO,CAAC,0BAA0B,CAAC;QACtE,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC,OAAO,CAAC,sBAAsB,CAAC;;AAGnE,IAAA,MAAM,WAAW,GAAA;QACb,MAAM,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,aAAa,CAAC;AAE/C,QAAA,IAAI,IAAI,CAAC,QAAQ,EAAE;YACf,MAAMA,WAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,WAAW,EAAE;;aAC7C;YACH,MAAMA,WAAM,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC,WAAW,EAAE;;QAG3D,MAAMA,WAAM,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,WAAW,EAAE;;AAGxD,IAAA,MAAM,IAAI,GAAA;QACN,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC;;AAE9C;;;;"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { Page } from '@playwright/test';
|
|
2
|
+
import { UserProfile } from '@mattermost/types/users';
|
|
3
|
+
export default class LoginPage {
|
|
4
|
+
readonly page: Page;
|
|
5
|
+
readonly title: import("playwright-core").Locator;
|
|
6
|
+
readonly subtitle: import("playwright-core").Locator;
|
|
7
|
+
readonly bodyCard: import("playwright-core").Locator;
|
|
8
|
+
readonly loginInput: import("playwright-core").Locator;
|
|
9
|
+
readonly loginPlaceholder: import("playwright-core").Locator;
|
|
10
|
+
readonly loginWithAdLdapPlaceholder: import("playwright-core").Locator;
|
|
11
|
+
readonly passwordInput: import("playwright-core").Locator;
|
|
12
|
+
readonly passwordToggleButton: import("playwright-core").Locator;
|
|
13
|
+
readonly signInButton: import("playwright-core").Locator;
|
|
14
|
+
readonly createAccountLink: import("playwright-core").Locator;
|
|
15
|
+
readonly forgotPasswordLink: import("playwright-core").Locator;
|
|
16
|
+
readonly userErrorLabel: import("playwright-core").Locator;
|
|
17
|
+
readonly fieldWithError: import("playwright-core").Locator;
|
|
18
|
+
readonly formContainer: import("playwright-core").Locator;
|
|
19
|
+
readonly header: import("../components/main_header").default;
|
|
20
|
+
readonly footer: import("../components/footer").default;
|
|
21
|
+
constructor(page: Page);
|
|
22
|
+
toBeVisible(): Promise<void>;
|
|
23
|
+
goto(): Promise<void>;
|
|
24
|
+
login(user: UserProfile, useUsername?: boolean): Promise<void>;
|
|
25
|
+
}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var test = require('@playwright/test');
|
|
4
|
+
var index = require('../components/index.js');
|
|
5
|
+
|
|
6
|
+
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
|
|
7
|
+
// See LICENSE.txt for license information.
|
|
8
|
+
class LoginPage {
|
|
9
|
+
page;
|
|
10
|
+
title;
|
|
11
|
+
subtitle;
|
|
12
|
+
bodyCard;
|
|
13
|
+
loginInput;
|
|
14
|
+
loginPlaceholder;
|
|
15
|
+
loginWithAdLdapPlaceholder;
|
|
16
|
+
passwordInput;
|
|
17
|
+
passwordToggleButton;
|
|
18
|
+
signInButton;
|
|
19
|
+
createAccountLink;
|
|
20
|
+
forgotPasswordLink;
|
|
21
|
+
userErrorLabel;
|
|
22
|
+
fieldWithError;
|
|
23
|
+
formContainer;
|
|
24
|
+
header;
|
|
25
|
+
footer;
|
|
26
|
+
constructor(page) {
|
|
27
|
+
this.page = page;
|
|
28
|
+
this.title = page.locator('h1:has-text("Log in to your account")');
|
|
29
|
+
this.subtitle = page.locator('text=Collaborate with your team in real-time');
|
|
30
|
+
this.bodyCard = page.locator('.login-body-card-content');
|
|
31
|
+
this.loginInput = page.locator('#input_loginId');
|
|
32
|
+
this.loginPlaceholder = page.locator(`[placeholder="Email or Username"]`);
|
|
33
|
+
this.loginWithAdLdapPlaceholder = page.locator(`[placeholder="Email, Username or AD/LDAP Username"]`);
|
|
34
|
+
this.passwordInput = page.locator('#input_password-input');
|
|
35
|
+
this.passwordToggleButton = page.getByRole('button', { name: 'Show or hide password' });
|
|
36
|
+
this.signInButton = page.locator('button:has-text("Log in")');
|
|
37
|
+
this.createAccountLink = page.locator("text=Don't have an account?");
|
|
38
|
+
this.forgotPasswordLink = page.locator('text=Forgot your password?');
|
|
39
|
+
this.userErrorLabel = page.locator('text=Please enter your email or username');
|
|
40
|
+
this.fieldWithError = page.locator('.with-error');
|
|
41
|
+
this.formContainer = page.locator('.signup-team__container');
|
|
42
|
+
this.header = new index.components.MainHeader(page.locator('.hfroute-header'));
|
|
43
|
+
this.footer = new index.components.Footer(page.locator('.hfroute-footer'));
|
|
44
|
+
}
|
|
45
|
+
async toBeVisible() {
|
|
46
|
+
await this.page.waitForLoadState('networkidle');
|
|
47
|
+
await test.expect(this.title).toBeVisible();
|
|
48
|
+
await test.expect(this.loginInput).toBeVisible();
|
|
49
|
+
await test.expect(this.passwordInput).toBeVisible();
|
|
50
|
+
}
|
|
51
|
+
async goto() {
|
|
52
|
+
await this.page.goto('/login');
|
|
53
|
+
}
|
|
54
|
+
async login(user, useUsername = true) {
|
|
55
|
+
await this.loginInput.fill(useUsername ? user.username : user.email);
|
|
56
|
+
await this.passwordInput.fill(user.password);
|
|
57
|
+
await Promise.all([this.page.waitForNavigation(), this.signInButton.click()]);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
module.exports = LoginPage;
|
|
62
|
+
//# sourceMappingURL=login.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"login.js","sources":["../../../src/ui/pages/login.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';\nimport {UserProfile} from '@mattermost/types/users';\n\nimport {components} from '@/ui/components';\n\nexport default class LoginPage {\n readonly page: Page;\n\n readonly title;\n readonly subtitle;\n readonly bodyCard;\n readonly loginInput;\n readonly loginPlaceholder;\n readonly loginWithAdLdapPlaceholder;\n readonly passwordInput;\n readonly passwordToggleButton;\n readonly signInButton;\n readonly createAccountLink;\n readonly forgotPasswordLink;\n readonly userErrorLabel;\n readonly fieldWithError;\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(\"Log in to your account\")');\n this.subtitle = page.locator('text=Collaborate with your team in real-time');\n this.bodyCard = page.locator('.login-body-card-content');\n this.loginInput = page.locator('#input_loginId');\n this.loginPlaceholder = page.locator(`[placeholder=\"Email or Username\"]`);\n this.loginWithAdLdapPlaceholder = page.locator(`[placeholder=\"Email, Username or AD/LDAP Username\"]`);\n this.passwordInput = page.locator('#input_password-input');\n this.passwordToggleButton = page.getByRole('button', {name: 'Show or hide password'});\n this.signInButton = page.locator('button:has-text(\"Log in\")');\n this.createAccountLink = page.locator(\"text=Don't have an account?\");\n this.forgotPasswordLink = page.locator('text=Forgot your password?');\n this.userErrorLabel = page.locator('text=Please enter your email or username');\n this.fieldWithError = page.locator('.with-error');\n this.formContainer = page.locator('.signup-team__container');\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 expect(this.title).toBeVisible();\n await expect(this.loginInput).toBeVisible();\n await expect(this.passwordInput).toBeVisible();\n }\n\n async goto() {\n await this.page.goto('/login');\n }\n\n async login(user: UserProfile, useUsername = true) {\n await this.loginInput.fill(useUsername ? user.username : user.email);\n await this.passwordInput.fill(user.password);\n await Promise.all([this.page.waitForNavigation(), this.signInButton.click()]);\n }\n}\n"],"names":["components","expect"],"mappings":";;;;;AAAA;AACA;AAOc,MAAO,SAAS,CAAA;AACjB,IAAA,IAAI;AAEJ,IAAA,KAAK;AACL,IAAA,QAAQ;AACR,IAAA,QAAQ;AACR,IAAA,UAAU;AACV,IAAA,gBAAgB;AAChB,IAAA,0BAA0B;AAC1B,IAAA,aAAa;AACb,IAAA,oBAAoB;AACpB,IAAA,YAAY;AACZ,IAAA,iBAAiB;AACjB,IAAA,kBAAkB;AAClB,IAAA,cAAc;AACd,IAAA,cAAc;AACd,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,uCAAuC,CAAC;QAClE,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,8CAA8C,CAAC;QAC5E,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,0BAA0B,CAAC;QACxD,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC;QAChD,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,OAAO,CAAC,CAAmC,iCAAA,CAAA,CAAC;QACzE,IAAI,CAAC,0BAA0B,GAAG,IAAI,CAAC,OAAO,CAAC,CAAqD,mDAAA,CAAA,CAAC;QACrG,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,uBAAuB,CAAC;AAC1D,QAAA,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAC,IAAI,EAAE,uBAAuB,EAAC,CAAC;QACrF,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,2BAA2B,CAAC;QAC7D,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,OAAO,CAAC,6BAA6B,CAAC;QACpE,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,OAAO,CAAC,4BAA4B,CAAC;QACpE,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,0CAA0C,CAAC;QAC9E,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC;QACjD,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,iBAAiB,CAAC,CAAC;AACxE,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,UAAU,CAAC,CAAC,WAAW,EAAE;QAC3C,MAAMA,WAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,WAAW,EAAE;;AAGlD,IAAA,MAAM,IAAI,GAAA;QACN,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC;;AAGlC,IAAA,MAAM,KAAK,CAAC,IAAiB,EAAE,WAAW,GAAG,IAAI,EAAA;QAC7C,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC;QACpE,MAAM,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC;QAC5C,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,EAAE,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC,CAAC;;AAEpF;;;;"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { Page } from '@playwright/test';
|
|
2
|
+
export default class ResetPasswordPage {
|
|
3
|
+
readonly page: Page;
|
|
4
|
+
readonly title: import("playwright-core").Locator;
|
|
5
|
+
readonly subtitle: import("playwright-core").Locator;
|
|
6
|
+
readonly emailInput: import("playwright-core").Locator;
|
|
7
|
+
readonly resetButton: import("playwright-core").Locator;
|
|
8
|
+
readonly formContainer: import("playwright-core").Locator;
|
|
9
|
+
readonly header: import("../components/main_header").default;
|
|
10
|
+
readonly footer: import("../components/footer").default;
|
|
11
|
+
constructor(page: Page);
|
|
12
|
+
toBeVisible(): Promise<void>;
|
|
13
|
+
goto(): Promise<void>;
|
|
14
|
+
reset(email: string): Promise<void>;
|
|
15
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var test = require('@playwright/test');
|
|
4
|
+
var index = require('../components/index.js');
|
|
5
|
+
|
|
6
|
+
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
|
|
7
|
+
// See LICENSE.txt for license information.
|
|
8
|
+
class ResetPasswordPage {
|
|
9
|
+
page;
|
|
10
|
+
title;
|
|
11
|
+
subtitle;
|
|
12
|
+
emailInput;
|
|
13
|
+
resetButton;
|
|
14
|
+
formContainer;
|
|
15
|
+
header;
|
|
16
|
+
footer;
|
|
17
|
+
constructor(page) {
|
|
18
|
+
this.page = page;
|
|
19
|
+
this.title = page.locator('h1:has-text("Password Reset")');
|
|
20
|
+
this.subtitle = page.locator('text=To reset your password, enter the email address you used to sign up');
|
|
21
|
+
this.emailInput = page.locator(`[placeholder="Email"]`);
|
|
22
|
+
this.resetButton = page.locator('#passwordResetButton');
|
|
23
|
+
this.formContainer = page.locator('.signup-team__container');
|
|
24
|
+
this.header = new index.components.MainHeader(page.locator('.signup-header'));
|
|
25
|
+
this.footer = new index.components.Footer(page.locator('#footer_section'));
|
|
26
|
+
}
|
|
27
|
+
async toBeVisible() {
|
|
28
|
+
await this.page.waitForLoadState('networkidle');
|
|
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();
|
|
33
|
+
}
|
|
34
|
+
async goto() {
|
|
35
|
+
await this.page.goto('/reset_password');
|
|
36
|
+
}
|
|
37
|
+
async reset(email) {
|
|
38
|
+
await this.emailInput.fill(email);
|
|
39
|
+
await Promise.all([this.page.waitForNavigation(), this.resetButton.click()]);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
module.exports = ResetPasswordPage;
|
|
44
|
+
//# sourceMappingURL=reset_password.js.map
|