@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.
Files changed (203) hide show
  1. package/README.md +214 -0
  2. package/dist/asset/mattermost-icon_128x128.png +0 -0
  3. package/dist/browser_context.d.ts +17 -0
  4. package/dist/browser_context.js +71 -0
  5. package/dist/browser_context.js.map +1 -0
  6. package/dist/constant.d.ts +3 -0
  7. package/dist/constant.js +8 -0
  8. package/dist/constant.js.map +1 -0
  9. package/dist/file.d.ts +42 -0
  10. package/dist/file.js +74 -0
  11. package/dist/file.js.map +1 -0
  12. package/dist/flag.d.ts +7 -0
  13. package/dist/flag.js +76 -0
  14. package/dist/flag.js.map +1 -0
  15. package/dist/global_setup.d.ts +3 -0
  16. package/dist/global_setup.js +173 -0
  17. package/dist/global_setup.js.map +1 -0
  18. package/dist/index.d.ts +9 -0
  19. package/dist/index.js +47 -0
  20. package/dist/index.js.map +1 -0
  21. package/dist/mock_browser_api.d.ts +31 -0
  22. package/dist/mock_browser_api.js +71 -0
  23. package/dist/mock_browser_api.js.map +1 -0
  24. package/dist/server/channel.d.ts +12 -0
  25. package/dist/server/channel.js +25 -0
  26. package/dist/server/channel.js.map +1 -0
  27. package/dist/server/client.d.ts +16 -0
  28. package/dist/server/client.js +39 -0
  29. package/dist/server/client.js.map +1 -0
  30. package/dist/server/default_config.d.ts +2 -0
  31. package/dist/server/default_config.js +755 -0
  32. package/dist/server/default_config.js.map +1 -0
  33. package/dist/server/index.d.ts +7 -0
  34. package/dist/server/init.d.ts +23 -0
  35. package/dist/server/init.js +73 -0
  36. package/dist/server/init.js.map +1 -0
  37. package/dist/server/post.d.ts +2 -0
  38. package/dist/server/post.js +31 -0
  39. package/dist/server/post.js.map +1 -0
  40. package/dist/server/team.d.ts +2 -0
  41. package/dist/server/team.js +18 -0
  42. package/dist/server/team.js.map +1 -0
  43. package/dist/server/user.d.ts +3 -0
  44. package/dist/server/user.js +33 -0
  45. package/dist/server/user.js.map +1 -0
  46. package/dist/test_action.d.ts +4 -0
  47. package/dist/test_action.js +24 -0
  48. package/dist/test_action.js.map +1 -0
  49. package/dist/test_config.d.ts +20 -0
  50. package/dist/test_config.js +82 -0
  51. package/dist/test_config.js.map +1 -0
  52. package/dist/test_fixture.d.ts +72 -0
  53. package/dist/test_fixture.js +172 -0
  54. package/dist/test_fixture.js.map +1 -0
  55. package/dist/types.d.ts +91 -0
  56. package/dist/ui/components/channels/app_bar.d.ts +7 -0
  57. package/dist/ui/components/channels/app_bar.js +20 -0
  58. package/dist/ui/components/channels/app_bar.js.map +1 -0
  59. package/dist/ui/components/channels/center_view.d.ts +52 -0
  60. package/dist/ui/components/channels/center_view.js +124 -0
  61. package/dist/ui/components/channels/center_view.js.map +1 -0
  62. package/dist/ui/components/channels/delete_post_confirmation_dialog.d.ts +11 -0
  63. package/dist/ui/components/channels/delete_post_confirmation_dialog.js +35 -0
  64. package/dist/ui/components/channels/delete_post_confirmation_dialog.js.map +1 -0
  65. package/dist/ui/components/channels/delete_post_modal.d.ts +8 -0
  66. package/dist/ui/components/channels/delete_post_modal.js +26 -0
  67. package/dist/ui/components/channels/delete_post_modal.js.map +1 -0
  68. package/dist/ui/components/channels/emoji_gif_picker.d.ts +16 -0
  69. package/dist/ui/components/channels/emoji_gif_picker.js +50 -0
  70. package/dist/ui/components/channels/emoji_gif_picker.js.map +1 -0
  71. package/dist/ui/components/channels/find_channels_modal.d.ts +8 -0
  72. package/dist/ui/components/channels/find_channels_modal.js +22 -0
  73. package/dist/ui/components/channels/find_channels_modal.js.map +1 -0
  74. package/dist/ui/components/channels/generic_confirm_modal.d.ts +16 -0
  75. package/dist/ui/components/channels/generic_confirm_modal.js +40 -0
  76. package/dist/ui/components/channels/generic_confirm_modal.js.map +1 -0
  77. package/dist/ui/components/channels/header.d.ts +6 -0
  78. package/dist/ui/components/channels/header.js +18 -0
  79. package/dist/ui/components/channels/header.js.map +1 -0
  80. package/dist/ui/components/channels/message_priority.d.ts +18 -0
  81. package/dist/ui/components/channels/message_priority.js +66 -0
  82. package/dist/ui/components/channels/message_priority.js.map +1 -0
  83. package/dist/ui/components/channels/post.d.ts +29 -0
  84. package/dist/ui/components/channels/post.js +63 -0
  85. package/dist/ui/components/channels/post.js.map +1 -0
  86. package/dist/ui/components/channels/post_create.d.ts +41 -0
  87. package/dist/ui/components/channels/post_create.js +118 -0
  88. package/dist/ui/components/channels/post_create.js.map +1 -0
  89. package/dist/ui/components/channels/post_dot_menu.d.ts +20 -0
  90. package/dist/ui/components/channels/post_dot_menu.js +47 -0
  91. package/dist/ui/components/channels/post_dot_menu.js.map +1 -0
  92. package/dist/ui/components/channels/post_edit.d.ts +21 -0
  93. package/dist/ui/components/channels/post_edit.js +76 -0
  94. package/dist/ui/components/channels/post_edit.js.map +1 -0
  95. package/dist/ui/components/channels/post_menu.d.ts +26 -0
  96. package/dist/ui/components/channels/post_menu.js +54 -0
  97. package/dist/ui/components/channels/post_menu.js.map +1 -0
  98. package/dist/ui/components/channels/post_reminder_menu.d.ts +11 -0
  99. package/dist/ui/components/channels/post_reminder_menu.js +29 -0
  100. package/dist/ui/components/channels/post_reminder_menu.js.map +1 -0
  101. package/dist/ui/components/channels/restore_post_confirmation_dialog.d.ts +10 -0
  102. package/dist/ui/components/channels/restore_post_confirmation_dialog.js +30 -0
  103. package/dist/ui/components/channels/restore_post_confirmation_dialog.js.map +1 -0
  104. package/dist/ui/components/channels/scheduled_draft_menu.d.ts +8 -0
  105. package/dist/ui/components/channels/scheduled_draft_menu.js +23 -0
  106. package/dist/ui/components/channels/scheduled_draft_menu.js.map +1 -0
  107. package/dist/ui/components/channels/scheduled_draft_modal.d.ts +20 -0
  108. package/dist/ui/components/channels/scheduled_draft_modal.js +84 -0
  109. package/dist/ui/components/channels/scheduled_draft_modal.js.map +1 -0
  110. package/dist/ui/components/channels/search_popover.d.ts +15 -0
  111. package/dist/ui/components/channels/search_popover.js +43 -0
  112. package/dist/ui/components/channels/search_popover.js.map +1 -0
  113. package/dist/ui/components/channels/settings/notification_settings.d.ts +13 -0
  114. package/dist/ui/components/channels/settings/notification_settings.js +41 -0
  115. package/dist/ui/components/channels/settings/notification_settings.js.map +1 -0
  116. package/dist/ui/components/channels/settings/settings_modal.d.ts +11 -0
  117. package/dist/ui/components/channels/settings/settings_modal.js +32 -0
  118. package/dist/ui/components/channels/settings/settings_modal.js.map +1 -0
  119. package/dist/ui/components/channels/sidebar_left.d.ts +24 -0
  120. package/dist/ui/components/channels/sidebar_left.js +54 -0
  121. package/dist/ui/components/channels/sidebar_left.js.map +1 -0
  122. package/dist/ui/components/channels/sidebar_right.d.ts +38 -0
  123. package/dist/ui/components/channels/sidebar_right.js +87 -0
  124. package/dist/ui/components/channels/sidebar_right.js.map +1 -0
  125. package/dist/ui/components/channels/thread_footer.d.ts +11 -0
  126. package/dist/ui/components/channels/thread_footer.js +27 -0
  127. package/dist/ui/components/channels/thread_footer.js.map +1 -0
  128. package/dist/ui/components/channels/user_profile_popover.d.ts +7 -0
  129. package/dist/ui/components/channels/user_profile_popover.js +21 -0
  130. package/dist/ui/components/channels/user_profile_popover.js.map +1 -0
  131. package/dist/ui/components/footer.d.ts +11 -0
  132. package/dist/ui/components/footer.js +28 -0
  133. package/dist/ui/components/footer.js.map +1 -0
  134. package/dist/ui/components/global_header.d.ts +15 -0
  135. package/dist/ui/components/global_header.js +46 -0
  136. package/dist/ui/components/global_header.js.map +1 -0
  137. package/dist/ui/components/index.d.ts +73 -0
  138. package/dist/ui/components/index.js +77 -0
  139. package/dist/ui/components/index.js.map +1 -0
  140. package/dist/ui/components/main_header.d.ts +8 -0
  141. package/dist/ui/components/main_header.js +22 -0
  142. package/dist/ui/components/main_header.js.map +1 -0
  143. package/dist/ui/components/system_console/navbar.d.ts +6 -0
  144. package/dist/ui/components/system_console/navbar.js +18 -0
  145. package/dist/ui/components/system_console/navbar.js.map +1 -0
  146. package/dist/ui/components/system_console/sections/system_users/column_toggle_menu.d.ts +22 -0
  147. package/dist/ui/components/system_console/sections/system_users/column_toggle_menu.js +47 -0
  148. package/dist/ui/components/system_console/sections/system_users/column_toggle_menu.js.map +1 -0
  149. package/dist/ui/components/system_console/sections/system_users/feature_discovery.d.ts +10 -0
  150. package/dist/ui/components/system_console/sections/system_users/feature_discovery.js +24 -0
  151. package/dist/ui/components/system_console/sections/system_users/feature_discovery.js.map +1 -0
  152. package/dist/ui/components/system_console/sections/system_users/filter_menu.d.ts +21 -0
  153. package/dist/ui/components/system_console/sections/system_users/filter_menu.js +42 -0
  154. package/dist/ui/components/system_console/sections/system_users/filter_menu.js.map +1 -0
  155. package/dist/ui/components/system_console/sections/system_users/filter_popover.d.ts +30 -0
  156. package/dist/ui/components/system_console/sections/system_users/filter_popover.js +61 -0
  157. package/dist/ui/components/system_console/sections/system_users/filter_popover.js.map +1 -0
  158. package/dist/ui/components/system_console/sections/system_users/mobile_security.d.ts +23 -0
  159. package/dist/ui/components/system_console/sections/system_users/mobile_security.js +56 -0
  160. package/dist/ui/components/system_console/sections/system_users/mobile_security.js.map +1 -0
  161. package/dist/ui/components/system_console/sections/system_users/system_users.d.ts +58 -0
  162. package/dist/ui/components/system_console/sections/system_users/system_users.js +114 -0
  163. package/dist/ui/components/system_console/sections/system_users/system_users.js.map +1 -0
  164. package/dist/ui/components/system_console/sidebar.d.ts +17 -0
  165. package/dist/ui/components/system_console/sidebar.js +37 -0
  166. package/dist/ui/components/system_console/sidebar.js.map +1 -0
  167. package/dist/ui/pages/channels.d.ts +31 -0
  168. package/dist/ui/pages/channels.js +79 -0
  169. package/dist/ui/pages/channels.js.map +1 -0
  170. package/dist/ui/pages/drafts.d.ts +30 -0
  171. package/dist/ui/pages/drafts.js +114 -0
  172. package/dist/ui/pages/drafts.js.map +1 -0
  173. package/dist/ui/pages/index.d.ts +19 -0
  174. package/dist/ui/pages/index.js +34 -0
  175. package/dist/ui/pages/index.js.map +1 -0
  176. package/dist/ui/pages/landing_login.d.ts +11 -0
  177. package/dist/ui/pages/landing_login.js +36 -0
  178. package/dist/ui/pages/landing_login.js.map +1 -0
  179. package/dist/ui/pages/login.d.ts +25 -0
  180. package/dist/ui/pages/login.js +62 -0
  181. package/dist/ui/pages/login.js.map +1 -0
  182. package/dist/ui/pages/reset_password.d.ts +15 -0
  183. package/dist/ui/pages/reset_password.js +44 -0
  184. package/dist/ui/pages/reset_password.js.map +1 -0
  185. package/dist/ui/pages/scheduled_draft.d.ts +38 -0
  186. package/dist/ui/pages/scheduled_draft.js +144 -0
  187. package/dist/ui/pages/scheduled_draft.js.map +1 -0
  188. package/dist/ui/pages/signup.d.ts +31 -0
  189. package/dist/ui/pages/signup.js +78 -0
  190. package/dist/ui/pages/signup.js.map +1 -0
  191. package/dist/ui/pages/system_console.d.ts +26 -0
  192. package/dist/ui/pages/system_console.js +64 -0
  193. package/dist/ui/pages/system_console.js.map +1 -0
  194. package/dist/util.d.ts +29 -0
  195. package/dist/util.js +51 -0
  196. package/dist/util.js.map +1 -0
  197. package/dist/visual/index.d.ts +3 -0
  198. package/dist/visual/index.js +37 -0
  199. package/dist/visual/index.js.map +1 -0
  200. package/dist/visual/percy.d.ts +2 -0
  201. package/dist/visual/percy.js +23 -0
  202. package/dist/visual/percy.js.map +1 -0
  203. 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":";;;;;;AAAA;AACA;AAOc,MAAO,UAAU,CAAA;AAClB,IAAA,IAAI;AAEJ,IAAA,KAAK;AACL,IAAA,QAAQ;AACR,IAAA,QAAQ;AACR,IAAA,UAAU;AACV,IAAA,aAAa;AACb,IAAA,aAAa;AACb,IAAA,oBAAoB;AACpB,IAAA,kBAAkB;AAClB,IAAA,2BAA2B;AAC3B,IAAA,yBAAyB;AACzB,IAAA,uBAAuB;AACvB,IAAA,0BAA0B;AAC1B,IAAA,mBAAmB;AACnB,IAAA,SAAS;AACT,IAAA,UAAU;AACV,IAAA,aAAa;AACb,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,kCAAkC,CAAC;QAC7D,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,2EAA2E,CAAC;QACzG,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,2BAA2B,CAAC;QACzD,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC;QAC5C,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC;QAC9C,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC;QAChD,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,mBAAmB,GAAG,IAAI,CAAC,OAAO,CAAC,mCAAmC,CAAC;QAC5E,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,yCAAyC,CAAC;QACzE,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,OAAO,CAC7B,6JAA6J,CAChK;QACD,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,oCAAoC,CAAC;QAEvE,MAAM,eAAe,GAAG,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC;AACpD,QAAA,IAAI,CAAC,kBAAkB,GAAG,eAAe,CAAC,SAAS,CAAC,UAAU,EAAE,EAAC,IAAI,EAAE,qBAAqB,EAAC,CAAC;QAC9F,IAAI,CAAC,2BAA2B,GAAG,eAAe,CAAC,OAAO,CAAC,qBAAqB,CAAC;QACjF,IAAI,CAAC,yBAAyB,GAAG,eAAe,CAAC,OAAO,CAAC,kBAAkB,CAAC;QAE5E,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,6BAA6B,CAAC;QAClE,IAAI,CAAC,uBAAuB,GAAG,cAAc,CAAC,OAAO,CAAC,mBAAmB,CAAC;QAC1E,IAAI,CAAC,0BAA0B,GAAG,cAAc,CAAC,OAAO,CAAC,qBAAqB,CAAC;AAE/E,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,MAAM,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,kBAAkB,CAAC;AACpD,QAAA,MAAMC,SAAI,CAACC,aAAQ,CAAC,QAAQ,CAAC;QAC7B,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;QAC9C,MAAMA,WAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,WAAW,EAAE;;AAGlD,IAAA,MAAM,IAAI,GAAA;QACN,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,uBAAuB,CAAC;;AAGjD,IAAA,MAAM,MAAM,CAAC,IAAyD,EAAE,eAAe,GAAG,IAAI,EAAA;QAC1F,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;QACtC,MAAM,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC;QAC5C,MAAM,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC;AAC5C,QAAA,MAAM,IAAI,CAAC,mBAAmB,CAAC,KAAK,EAAE;QAEtC,IAAI,eAAe,EAAE;AACjB,YAAA,MAAM,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE;;;AAG9C;;;;"}
@@ -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
@@ -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,3 @@
1
+ import { TestInfo } from '@playwright/test';
2
+ import { ScreenshotOptions, TestArgs } from '@/types';
3
+ export declare function matchSnapshot(testInfo: TestInfo, testArgs: TestArgs, options?: ScreenshotOptions): Promise<void>;
@@ -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,2 @@
1
+ import { TestArgs } from '@/types';
2
+ export default function snapshotWithPercy(name: string, testArgs: TestArgs): Promise<void>;
@@ -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;;;;"}