@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,50 @@
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 EmojiGifPicker {
8
+ container;
9
+ gifTab;
10
+ gifSearchInput;
11
+ gifPickerItems;
12
+ constructor(container) {
13
+ this.container = container;
14
+ this.gifTab = container.getByText('GIFs');
15
+ this.gifSearchInput = container.getByPlaceholder('Search GIPHY');
16
+ this.gifPickerItems = container.locator('.gif-picker__items');
17
+ }
18
+ async toBeVisible() {
19
+ await test.expect(this.container).toBeVisible();
20
+ }
21
+ async openGifTab() {
22
+ await test.expect(this.gifTab).toBeVisible();
23
+ await this.gifTab.click({ force: true });
24
+ await test.expect(this.gifSearchInput).toBeVisible();
25
+ await test.expect(this.gifPickerItems).toBeVisible();
26
+ }
27
+ async searchGif(name) {
28
+ await this.gifSearchInput.fill(name);
29
+ await test.expect(this.gifSearchInput).toHaveValue(name);
30
+ }
31
+ async getNthGif(n) {
32
+ await test.expect(this.gifPickerItems).toBeVisible();
33
+ await this.gifPickerItems.locator('img').nth(n).waitFor();
34
+ const nthGif = this.gifPickerItems.locator('img').nth(n);
35
+ await test.expect(nthGif).toBeVisible();
36
+ const nthGifSrc = await nthGif.getAttribute('src');
37
+ const nthGifAlt = await nthGif.getAttribute('alt');
38
+ if (!nthGifSrc || !nthGifAlt) {
39
+ throw new Error('Gif src or alt is empty');
40
+ }
41
+ return {
42
+ src: nthGifSrc,
43
+ alt: nthGifAlt,
44
+ img: nthGif,
45
+ };
46
+ }
47
+ }
48
+
49
+ module.exports = EmojiGifPicker;
50
+ //# sourceMappingURL=emoji_gif_picker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emoji_gif_picker.js","sources":["../../../../src/ui/components/channels/emoji_gif_picker.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 EmojiGifPicker {\n readonly container: Locator;\n\n readonly gifTab: Locator;\n readonly gifSearchInput: Locator;\n readonly gifPickerItems: Locator;\n\n constructor(container: Locator) {\n this.container = container;\n\n this.gifTab = container.getByText('GIFs');\n this.gifSearchInput = container.getByPlaceholder('Search GIPHY');\n this.gifPickerItems = container.locator('.gif-picker__items');\n }\n\n async toBeVisible() {\n await expect(this.container).toBeVisible();\n }\n\n async openGifTab() {\n await expect(this.gifTab).toBeVisible();\n\n await this.gifTab.click({force: true});\n\n await expect(this.gifSearchInput).toBeVisible();\n await expect(this.gifPickerItems).toBeVisible();\n }\n\n async searchGif(name: string) {\n await this.gifSearchInput.fill(name);\n await expect(this.gifSearchInput).toHaveValue(name);\n }\n\n async getNthGif(n: number) {\n await expect(this.gifPickerItems).toBeVisible();\n\n await this.gifPickerItems.locator('img').nth(n).waitFor();\n const nthGif = this.gifPickerItems.locator('img').nth(n);\n await expect(nthGif).toBeVisible();\n\n const nthGifSrc = await nthGif.getAttribute('src');\n const nthGifAlt = await nthGif.getAttribute('alt');\n\n if (!nthGifSrc || !nthGifAlt) {\n throw new Error('Gif src or alt is empty');\n }\n\n return {\n src: nthGifSrc,\n alt: nthGifAlt,\n img: nthGif,\n };\n }\n}\n"],"names":["expect"],"mappings":";;;;AAAA;AACA;AAIc,MAAO,cAAc,CAAA;AACtB,IAAA,SAAS;AAET,IAAA,MAAM;AACN,IAAA,cAAc;AACd,IAAA,cAAc;AAEvB,IAAA,WAAA,CAAY,SAAkB,EAAA;AAC1B,QAAA,IAAI,CAAC,SAAS,GAAG,SAAS;QAE1B,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC,SAAS,CAAC,MAAM,CAAC;QACzC,IAAI,CAAC,cAAc,GAAG,SAAS,CAAC,gBAAgB,CAAC,cAAc,CAAC;QAChE,IAAI,CAAC,cAAc,GAAG,SAAS,CAAC,OAAO,CAAC,oBAAoB,CAAC;;AAGjE,IAAA,MAAM,WAAW,GAAA;QACb,MAAMA,WAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE;;AAG9C,IAAA,MAAM,UAAU,GAAA;QACZ,MAAMA,WAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE;AAEvC,QAAA,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,EAAC,KAAK,EAAE,IAAI,EAAC,CAAC;QAEtC,MAAMA,WAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,WAAW,EAAE;QAC/C,MAAMA,WAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,WAAW,EAAE;;IAGnD,MAAM,SAAS,CAAC,IAAY,EAAA;QACxB,MAAM,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC;QACpC,MAAMA,WAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC;;IAGvD,MAAM,SAAS,CAAC,CAAS,EAAA;QACrB,MAAMA,WAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,WAAW,EAAE;AAE/C,QAAA,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE;AACzD,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AACxD,QAAA,MAAMA,WAAM,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE;QAElC,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC;QAClD,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC;AAElD,QAAA,IAAI,CAAC,SAAS,IAAI,CAAC,SAAS,EAAE;AAC1B,YAAA,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC;;QAG9C,OAAO;AACH,YAAA,GAAG,EAAE,SAAS;AACd,YAAA,GAAG,EAAE,SAAS;AACd,YAAA,GAAG,EAAE,MAAM;SACd;;AAER;;;;"}
@@ -0,0 +1,8 @@
1
+ import { Locator } from '@playwright/test';
2
+ export default class FindChannelsModal {
3
+ readonly container: Locator;
4
+ readonly input: Locator;
5
+ readonly searchList: Locator;
6
+ constructor(container: Locator);
7
+ toBeVisible(): Promise<void>;
8
+ }
@@ -0,0 +1,22 @@
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 FindChannelsModal {
8
+ container;
9
+ input;
10
+ searchList;
11
+ constructor(container) {
12
+ this.container = container;
13
+ this.input = container.getByRole('combobox', { name: 'quick switch input' });
14
+ this.searchList = container.locator('.suggestion-list__item');
15
+ }
16
+ async toBeVisible() {
17
+ await test.expect(this.container).toBeVisible();
18
+ }
19
+ }
20
+
21
+ module.exports = FindChannelsModal;
22
+ //# sourceMappingURL=find_channels_modal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"find_channels_modal.js","sources":["../../../../src/ui/components/channels/find_channels_modal.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 FindChannelsModal {\n readonly container: Locator;\n readonly input;\n readonly searchList;\n\n constructor(container: Locator) {\n this.container = container;\n\n this.input = container.getByRole('combobox', {name: 'quick switch input'});\n this.searchList = container.locator('.suggestion-list__item');\n }\n\n async toBeVisible() {\n await expect(this.container).toBeVisible();\n }\n}\n"],"names":["expect"],"mappings":";;;;AAAA;AACA;AAIc,MAAO,iBAAiB,CAAA;AACzB,IAAA,SAAS;AACT,IAAA,KAAK;AACL,IAAA,UAAU;AAEnB,IAAA,WAAA,CAAY,SAAkB,EAAA;AAC1B,QAAA,IAAI,CAAC,SAAS,GAAG,SAAS;AAE1B,QAAA,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC,SAAS,CAAC,UAAU,EAAE,EAAC,IAAI,EAAE,oBAAoB,EAAC,CAAC;QAC1E,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC,OAAO,CAAC,wBAAwB,CAAC;;AAGjE,IAAA,MAAM,WAAW,GAAA;QACb,MAAMA,WAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE;;AAEjD;;;;"}
@@ -0,0 +1,16 @@
1
+ import { Locator } from '@playwright/test';
2
+ /**
3
+ * This is the generic confirm modal that is used in the app.
4
+ * It has optional cancel button, optional checkbox and confirm button along with title and message body.
5
+ * It can present in different parts of the app such as channel, system console, etc and hence its constructor
6
+ * should be able to accept the page object of the app and an optional id to uniquely identify the modal.
7
+ */
8
+ export default class GenericConfirmModal {
9
+ readonly container: Locator;
10
+ readonly confirmButton: Locator;
11
+ readonly cancelButton: Locator;
12
+ constructor(container: Locator);
13
+ toBeVisible(): Promise<void>;
14
+ confirm(): Promise<void>;
15
+ cancel(): Promise<void>;
16
+ }
@@ -0,0 +1,40 @@
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
+ /**
8
+ * This is the generic confirm modal that is used in the app.
9
+ * It has optional cancel button, optional checkbox and confirm button along with title and message body.
10
+ * It can present in different parts of the app such as channel, system console, etc and hence its constructor
11
+ * should be able to accept the page object of the app and an optional id to uniquely identify the modal.
12
+ */
13
+ class GenericConfirmModal {
14
+ container;
15
+ confirmButton;
16
+ cancelButton;
17
+ constructor(container) {
18
+ this.container = container;
19
+ this.confirmButton = container.locator('#confirmModalButton');
20
+ this.cancelButton = container.locator('#cancelModalButton');
21
+ }
22
+ async toBeVisible() {
23
+ await test.expect(this.container).toBeVisible();
24
+ }
25
+ async confirm() {
26
+ await this.confirmButton.waitFor();
27
+ await this.confirmButton.click();
28
+ // Wait for the modal to disappear
29
+ await test.expect(this.container).not.toBeVisible();
30
+ }
31
+ async cancel() {
32
+ await this.cancelButton.waitFor();
33
+ await this.cancelButton.click();
34
+ // Wait for the modal to disappear
35
+ await test.expect(this.container).not.toBeVisible();
36
+ }
37
+ }
38
+
39
+ module.exports = GenericConfirmModal;
40
+ //# sourceMappingURL=generic_confirm_modal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generic_confirm_modal.js","sources":["../../../../src/ui/components/channels/generic_confirm_modal.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\n/**\n * This is the generic confirm modal that is used in the app.\n * It has optional cancel button, optional checkbox and confirm button along with title and message body.\n * It can present in different parts of the app such as channel, system console, etc and hence its constructor\n * should be able to accept the page object of the app and an optional id to uniquely identify the modal.\n */\nexport default class GenericConfirmModal {\n readonly container: Locator;\n\n readonly confirmButton: Locator;\n readonly cancelButton: Locator;\n\n constructor(container: Locator) {\n this.container = container;\n this.confirmButton = container.locator('#confirmModalButton');\n this.cancelButton = container.locator('#cancelModalButton');\n }\n\n async toBeVisible() {\n await expect(this.container).toBeVisible();\n }\n\n async confirm() {\n await this.confirmButton.waitFor();\n await this.confirmButton.click();\n\n // Wait for the modal to disappear\n await expect(this.container).not.toBeVisible();\n }\n\n async cancel() {\n await this.cancelButton.waitFor();\n await this.cancelButton.click();\n\n // Wait for the modal to disappear\n await expect(this.container).not.toBeVisible();\n }\n}\n"],"names":["expect"],"mappings":";;;;AAAA;AACA;AAIA;;;;;AAKG;AACW,MAAO,mBAAmB,CAAA;AAC3B,IAAA,SAAS;AAET,IAAA,aAAa;AACb,IAAA,YAAY;AAErB,IAAA,WAAA,CAAY,SAAkB,EAAA;AAC1B,QAAA,IAAI,CAAC,SAAS,GAAG,SAAS;QAC1B,IAAI,CAAC,aAAa,GAAG,SAAS,CAAC,OAAO,CAAC,qBAAqB,CAAC;QAC7D,IAAI,CAAC,YAAY,GAAG,SAAS,CAAC,OAAO,CAAC,oBAAoB,CAAC;;AAG/D,IAAA,MAAM,WAAW,GAAA;QACb,MAAMA,WAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE;;AAG9C,IAAA,MAAM,OAAO,GAAA;AACT,QAAA,MAAM,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE;AAClC,QAAA,MAAM,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE;;QAGhC,MAAMA,WAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,WAAW,EAAE;;AAGlD,IAAA,MAAM,MAAM,GAAA;AACR,QAAA,MAAM,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE;AACjC,QAAA,MAAM,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE;;QAG/B,MAAMA,WAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,WAAW,EAAE;;AAErD;;;;"}
@@ -0,0 +1,6 @@
1
+ import { Locator } from '@playwright/test';
2
+ export default class ChannelsHeader {
3
+ readonly container: Locator;
4
+ constructor(container: Locator);
5
+ toBeVisible(): Promise<void>;
6
+ }
@@ -0,0 +1,18 @@
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 ChannelsHeader {
8
+ container;
9
+ constructor(container) {
10
+ this.container = container;
11
+ }
12
+ async toBeVisible() {
13
+ await test.expect(this.container).toBeVisible();
14
+ }
15
+ }
16
+
17
+ module.exports = ChannelsHeader;
18
+ //# sourceMappingURL=header.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"header.js","sources":["../../../../src/ui/components/channels/header.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 ChannelsHeader {\n readonly container: Locator;\n\n constructor(container: Locator) {\n this.container = container;\n }\n\n async toBeVisible() {\n await expect(this.container).toBeVisible();\n }\n}\n"],"names":["expect"],"mappings":";;;;AAAA;AACA;AAIc,MAAO,cAAc,CAAA;AACtB,IAAA,SAAS;AAElB,IAAA,WAAA,CAAY,SAAkB,EAAA;AAC1B,QAAA,IAAI,CAAC,SAAS,GAAG,SAAS;;AAG9B,IAAA,MAAM,WAAW,GAAA;QACb,MAAMA,WAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE;;AAEjD;;;;"}
@@ -0,0 +1,18 @@
1
+ import { Locator } from '@playwright/test';
2
+ export default class MessagePriority {
3
+ readonly container: Locator;
4
+ readonly priorityIcon: Locator;
5
+ readonly priorityMenu: Locator;
6
+ readonly standardPriorityOption: Locator;
7
+ readonly priorityDialog: Locator;
8
+ readonly dialogHeader: Locator;
9
+ constructor(container: Locator);
10
+ clickPriorityIcon(): Promise<void>;
11
+ verifyPriorityIconVisible(): Promise<void>;
12
+ verifyStandardPrioritySelected(): Promise<void>;
13
+ verifyPriorityMenuVisible(): Promise<void>;
14
+ closePriorityMenu(): Promise<void>;
15
+ verifyNoPriorityLabel(postText: string): Promise<void>;
16
+ verifyPriorityDialog(): Promise<void>;
17
+ verifyStandardOptionSelected(): Promise<void>;
18
+ }
@@ -0,0 +1,66 @@
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 MessagePriority {
8
+ container;
9
+ priorityIcon;
10
+ priorityMenu;
11
+ standardPriorityOption;
12
+ priorityDialog;
13
+ dialogHeader;
14
+ constructor(container) {
15
+ this.container = container;
16
+ // Formatting bar priority icon
17
+ this.priorityIcon = container.locator('#messagePriority');
18
+ // Priority menu that opens when clicking the icon
19
+ this.priorityMenu = container.locator('[role="menu"]');
20
+ // Standard priority option in the menu (id comes from webapp implementation)
21
+ this.standardPriorityOption = this.priorityMenu.locator('#menu-item-priority-standard');
22
+ // Priority dialog elements
23
+ this.priorityDialog = container.page().getByRole('menu');
24
+ this.dialogHeader = container.page().locator('h4.modal-title');
25
+ }
26
+ async clickPriorityIcon() {
27
+ await this.priorityIcon.waitFor({ state: 'visible' });
28
+ await this.priorityIcon.click();
29
+ }
30
+ async verifyPriorityIconVisible() {
31
+ await this.priorityIcon.waitFor({ state: 'visible' });
32
+ await test.expect(this.priorityIcon).toBeVisible();
33
+ }
34
+ async verifyStandardPrioritySelected() {
35
+ await test.expect(this.priorityMenu).toBeVisible();
36
+ await test.expect(this.standardPriorityOption).toHaveAttribute('aria-checked', 'true');
37
+ }
38
+ async verifyPriorityMenuVisible() {
39
+ await test.expect(this.priorityMenu).toBeVisible();
40
+ // Look for beta text in header
41
+ await test.expect(this.priorityMenu.locator('text=Message Priority')).toBeVisible();
42
+ }
43
+ async closePriorityMenu() {
44
+ await this.priorityMenu.press('Escape');
45
+ await test.expect(this.priorityMenu).not.toBeVisible();
46
+ }
47
+ async verifyNoPriorityLabel(postText) {
48
+ const post = this.container.locator(`text=${postText}`);
49
+ await test.expect(post).toBeVisible();
50
+ // Verify no priority label exists
51
+ const priorityLabel = post.locator('[data-testid="post-priority-label"]');
52
+ await test.expect(priorityLabel).toHaveCount(0);
53
+ }
54
+ async verifyPriorityDialog() {
55
+ await test.expect(this.priorityDialog).toBeVisible();
56
+ await test.expect(this.dialogHeader).toHaveText('Message priority');
57
+ }
58
+ async verifyStandardOptionSelected() {
59
+ const standardOption = this.priorityDialog.getByRole('menuitemradio', { name: 'Standard' });
60
+ await test.expect(standardOption).toBeVisible();
61
+ await test.expect(standardOption.locator('svg.StyledCheckIcon-dFKfoY')).toBeVisible();
62
+ }
63
+ }
64
+
65
+ module.exports = MessagePriority;
66
+ //# sourceMappingURL=message_priority.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message_priority.js","sources":["../../../../src/ui/components/channels/message_priority.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 MessagePriority {\n readonly container: Locator;\n readonly priorityIcon: Locator;\n readonly priorityMenu: Locator;\n readonly standardPriorityOption: Locator;\n readonly priorityDialog: Locator;\n readonly dialogHeader: Locator;\n\n constructor(container: Locator) {\n this.container = container;\n\n // Formatting bar priority icon\n this.priorityIcon = container.locator('#messagePriority');\n\n // Priority menu that opens when clicking the icon\n this.priorityMenu = container.locator('[role=\"menu\"]');\n\n // Standard priority option in the menu (id comes from webapp implementation)\n this.standardPriorityOption = this.priorityMenu.locator('#menu-item-priority-standard');\n\n // Priority dialog elements\n this.priorityDialog = container.page().getByRole('menu');\n this.dialogHeader = container.page().locator('h4.modal-title');\n }\n\n async clickPriorityIcon() {\n await this.priorityIcon.waitFor({state: 'visible'});\n await this.priorityIcon.click();\n }\n\n async verifyPriorityIconVisible() {\n await this.priorityIcon.waitFor({state: 'visible'});\n await expect(this.priorityIcon).toBeVisible();\n }\n\n async verifyStandardPrioritySelected() {\n await expect(this.priorityMenu).toBeVisible();\n await expect(this.standardPriorityOption).toHaveAttribute('aria-checked', 'true');\n }\n\n async verifyPriorityMenuVisible() {\n await expect(this.priorityMenu).toBeVisible();\n // Look for beta text in header\n await expect(this.priorityMenu.locator('text=Message Priority')).toBeVisible();\n }\n\n async closePriorityMenu() {\n await this.priorityMenu.press('Escape');\n await expect(this.priorityMenu).not.toBeVisible();\n }\n\n async verifyNoPriorityLabel(postText: string) {\n const post = this.container.locator(`text=${postText}`);\n await expect(post).toBeVisible();\n\n // Verify no priority label exists\n const priorityLabel = post.locator('[data-testid=\"post-priority-label\"]');\n await expect(priorityLabel).toHaveCount(0);\n }\n\n async verifyPriorityDialog() {\n await expect(this.priorityDialog).toBeVisible();\n await expect(this.dialogHeader).toHaveText('Message priority');\n }\n\n async verifyStandardOptionSelected() {\n const standardOption = this.priorityDialog.getByRole('menuitemradio', {name: 'Standard'});\n await expect(standardOption).toBeVisible();\n await expect(standardOption.locator('svg.StyledCheckIcon-dFKfoY')).toBeVisible();\n }\n}\n"],"names":["expect"],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ import { Locator } from '@playwright/test';
2
+ import PostMenu from './post_menu';
3
+ import ThreadFooter from './thread_footer';
4
+ export default class ChannelsPost {
5
+ readonly container: Locator;
6
+ readonly body: Locator;
7
+ readonly profileIcon: Locator;
8
+ readonly removePostButton: Locator;
9
+ readonly postMenu: PostMenu;
10
+ readonly threadFooter: ThreadFooter;
11
+ constructor(container: Locator);
12
+ toBeVisible(): Promise<void>;
13
+ /**
14
+ * Hover over the post. Can be used for post menu to appear.
15
+ */
16
+ hover(): Promise<void>;
17
+ getId(): Promise<string>;
18
+ getProfileImage(username: string): Promise<Locator>;
19
+ /**
20
+ * Clicks on the deleted post's remove 'x' button.
21
+ * Also verifies that the post is a deleted post.
22
+ */
23
+ remove(): Promise<void>;
24
+ /**
25
+ * `toContainText` verifies if the post contains the specified text.
26
+ * @param text Text to be verified in the post
27
+ */
28
+ toContainText(text: string): Promise<void>;
29
+ }
@@ -0,0 +1,63 @@
1
+ 'use strict';
2
+
3
+ var test = require('@playwright/test');
4
+ var post_menu = require('./post_menu.js');
5
+ var thread_footer = require('./thread_footer.js');
6
+
7
+ // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
8
+ // See LICENSE.txt for license information.
9
+ class ChannelsPost {
10
+ container;
11
+ body;
12
+ profileIcon;
13
+ removePostButton;
14
+ postMenu;
15
+ threadFooter;
16
+ constructor(container) {
17
+ this.container = container;
18
+ this.body = container.locator('.post__body');
19
+ this.profileIcon = container.locator('.profile-icon');
20
+ this.removePostButton = container.locator('.post__remove');
21
+ this.postMenu = new post_menu(container.locator('.post-menu'));
22
+ this.threadFooter = new thread_footer(container.locator('.ThreadFooter'));
23
+ }
24
+ async toBeVisible() {
25
+ await test.expect(this.container).toBeVisible();
26
+ }
27
+ /**
28
+ * Hover over the post. Can be used for post menu to appear.
29
+ */
30
+ async hover() {
31
+ await this.container.hover();
32
+ }
33
+ async getId() {
34
+ const id = await this.container.getAttribute('id');
35
+ test.expect(id, 'No post ID found.').toBeTruthy();
36
+ return (id || '').substring('post_'.length);
37
+ }
38
+ async getProfileImage(username) {
39
+ return this.profileIcon.getByAltText(`${username} profile image`);
40
+ }
41
+ /**
42
+ * Clicks on the deleted post's remove 'x' button.
43
+ * Also verifies that the post is a deleted post.
44
+ */
45
+ async remove() {
46
+ // Verify the post is a deleted post
47
+ await test.expect(this.container).toContainText(/\(message deleted\)/);
48
+ // Hover over the post and click on the remove post button
49
+ await this.container.hover();
50
+ await this.removePostButton.waitFor();
51
+ await this.removePostButton.click();
52
+ }
53
+ /**
54
+ * `toContainText` verifies if the post contains the specified text.
55
+ * @param text Text to be verified in the post
56
+ */
57
+ async toContainText(text) {
58
+ await test.expect(this.container).toContainText(text);
59
+ }
60
+ }
61
+
62
+ module.exports = ChannelsPost;
63
+ //# sourceMappingURL=post.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"post.js","sources":["../../../../src/ui/components/channels/post.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\nimport PostMenu from './post_menu';\nimport ThreadFooter from './thread_footer';\n\nexport default class ChannelsPost {\n readonly container: Locator;\n\n readonly body;\n readonly profileIcon;\n\n readonly removePostButton;\n\n readonly postMenu;\n readonly threadFooter;\n\n constructor(container: Locator) {\n this.container = container;\n\n this.body = container.locator('.post__body');\n\n this.profileIcon = container.locator('.profile-icon');\n\n this.removePostButton = container.locator('.post__remove');\n\n this.postMenu = new PostMenu(container.locator('.post-menu'));\n this.threadFooter = new ThreadFooter(container.locator('.ThreadFooter'));\n }\n\n async toBeVisible() {\n await expect(this.container).toBeVisible();\n }\n\n /**\n * Hover over the post. Can be used for post menu to appear.\n */\n async hover() {\n await this.container.hover();\n }\n\n async getId() {\n const id = await this.container.getAttribute('id');\n expect(id, 'No post ID found.').toBeTruthy();\n return (id || '').substring('post_'.length);\n }\n\n async getProfileImage(username: string) {\n return this.profileIcon.getByAltText(`${username} profile image`);\n }\n\n /**\n * Clicks on the deleted post's remove 'x' button.\n * Also verifies that the post is a deleted post.\n */\n async remove() {\n // Verify the post is a deleted post\n await expect(this.container).toContainText(/\\(message deleted\\)/);\n\n // Hover over the post and click on the remove post button\n await this.container.hover();\n await this.removePostButton.waitFor();\n await this.removePostButton.click();\n }\n\n /**\n * `toContainText` verifies if the post contains the specified text.\n * @param text Text to be verified in the post\n */\n async toContainText(text: string) {\n await expect(this.container).toContainText(text);\n }\n}\n"],"names":["PostMenu","ThreadFooter","expect"],"mappings":";;;;;;AAAA;AACA;AAOc,MAAO,YAAY,CAAA;AACpB,IAAA,SAAS;AAET,IAAA,IAAI;AACJ,IAAA,WAAW;AAEX,IAAA,gBAAgB;AAEhB,IAAA,QAAQ;AACR,IAAA,YAAY;AAErB,IAAA,WAAA,CAAY,SAAkB,EAAA;AAC1B,QAAA,IAAI,CAAC,SAAS,GAAG,SAAS;QAE1B,IAAI,CAAC,IAAI,GAAG,SAAS,CAAC,OAAO,CAAC,aAAa,CAAC;QAE5C,IAAI,CAAC,WAAW,GAAG,SAAS,CAAC,OAAO,CAAC,eAAe,CAAC;QAErD,IAAI,CAAC,gBAAgB,GAAG,SAAS,CAAC,OAAO,CAAC,eAAe,CAAC;AAE1D,QAAA,IAAI,CAAC,QAAQ,GAAG,IAAIA,SAAQ,CAAC,SAAS,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;AAC7D,QAAA,IAAI,CAAC,YAAY,GAAG,IAAIC,aAAY,CAAC,SAAS,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;;AAG5E,IAAA,MAAM,WAAW,GAAA;QACb,MAAMC,WAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE;;AAG9C;;AAEG;AACH,IAAA,MAAM,KAAK,GAAA;AACP,QAAA,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE;;AAGhC,IAAA,MAAM,KAAK,GAAA;QACP,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,IAAI,CAAC;QAClDA,WAAM,CAAC,EAAE,EAAE,mBAAmB,CAAC,CAAC,UAAU,EAAE;AAC5C,QAAA,OAAO,CAAC,EAAE,IAAI,EAAE,EAAE,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC;;IAG/C,MAAM,eAAe,CAAC,QAAgB,EAAA;QAClC,OAAO,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,CAAG,EAAA,QAAQ,CAAgB,cAAA,CAAA,CAAC;;AAGrE;;;AAGG;AACH,IAAA,MAAM,MAAM,GAAA;;QAER,MAAMA,WAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,aAAa,CAAC,qBAAqB,CAAC;;AAGjE,QAAA,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE;AAC5B,QAAA,MAAM,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE;AACrC,QAAA,MAAM,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE;;AAGvC;;;AAGG;IACH,MAAM,aAAa,CAAC,IAAY,EAAA;QAC5B,MAAMA,WAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC;;AAEvD;;;;"}
@@ -0,0 +1,41 @@
1
+ import { Locator } from '@playwright/test';
2
+ export default class ChannelsPostCreate {
3
+ readonly container: Locator;
4
+ readonly input: Locator;
5
+ readonly attachmentButton: Locator;
6
+ readonly emojiButton: Locator;
7
+ readonly sendMessageButton: Locator;
8
+ readonly scheduleDraftMessageButton: Locator;
9
+ readonly priorityButton: Locator;
10
+ readonly suggestionList: Locator;
11
+ readonly filePreview: Locator;
12
+ constructor(container: Locator, isRHS?: boolean);
13
+ toBeVisible(): Promise<void>;
14
+ /**
15
+ * It just writes the message in the input and doesn't send it
16
+ * @param message : Message to be written in the input
17
+ */
18
+ writeMessage(message: string): Promise<void>;
19
+ /**
20
+ * Returns the value of the message input
21
+ */
22
+ getInputValue(): Promise<string>;
23
+ /**
24
+ * Sends the message already written in the input
25
+ */
26
+ sendMessage(): Promise<void>;
27
+ /**
28
+ * Click on Scheduled Draft button to open options
29
+ */
30
+ clickOnScheduleDraftDropdownButton(): Promise<void>;
31
+ /**
32
+ * Opens the message priority menu
33
+ */
34
+ openPriorityMenu(): Promise<void>;
35
+ /**
36
+ * Composes and sends a message
37
+ */
38
+ postMessage(message: string, files?: string[]): Promise<void>;
39
+ openEmojiPicker(): Promise<void>;
40
+ waitUntilFilePreviewContains(files: string[], timeout?: number): Promise<void>;
41
+ }
@@ -0,0 +1,118 @@
1
+ 'use strict';
2
+
3
+ var path = require('node:path');
4
+ var test = require('@playwright/test');
5
+ var util = require('../../../util.js');
6
+ var file = require('../../../file.js');
7
+ var asyncWaitUntil = require('async-wait-until');
8
+
9
+ // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
10
+ // See LICENSE.txt for license information.
11
+ class ChannelsPostCreate {
12
+ container;
13
+ input;
14
+ attachmentButton;
15
+ emojiButton;
16
+ sendMessageButton;
17
+ scheduleDraftMessageButton;
18
+ priorityButton;
19
+ suggestionList;
20
+ filePreview;
21
+ constructor(container, isRHS = false) {
22
+ this.container = container;
23
+ if (!isRHS) {
24
+ this.input = container.getByTestId('post_textbox');
25
+ }
26
+ else {
27
+ this.input = container.getByTestId('reply_textbox');
28
+ }
29
+ this.attachmentButton = container.locator('#fileUploadButton');
30
+ this.emojiButton = container.getByLabel('select an emoji');
31
+ this.sendMessageButton = container.getByTestId('SendMessageButton');
32
+ this.scheduleDraftMessageButton = container.getByLabel('Schedule message');
33
+ this.priorityButton = container.getByLabel('Message priority');
34
+ this.suggestionList = container.getByTestId('suggestionList');
35
+ this.filePreview = container.locator('.file-preview__container');
36
+ }
37
+ async toBeVisible() {
38
+ await test.expect(this.container).toBeVisible();
39
+ await this.input.waitFor();
40
+ await test.expect(this.input).toBeVisible();
41
+ }
42
+ /**
43
+ * It just writes the message in the input and doesn't send it
44
+ * @param message : Message to be written in the input
45
+ */
46
+ async writeMessage(message) {
47
+ await this.input.waitFor();
48
+ await test.expect(this.input).toBeVisible();
49
+ await this.input.fill(message);
50
+ }
51
+ /**
52
+ * Returns the value of the message input
53
+ */
54
+ async getInputValue() {
55
+ await test.expect(this.input).toBeVisible();
56
+ return await this.input.inputValue();
57
+ }
58
+ /**
59
+ * Sends the message already written in the input
60
+ */
61
+ async sendMessage() {
62
+ await test.expect(this.input).toBeVisible();
63
+ const messageInputValue = await this.getInputValue();
64
+ test.expect(messageInputValue).not.toBe('');
65
+ await test.expect(this.sendMessageButton).toBeVisible();
66
+ await test.expect(this.sendMessageButton).toBeEnabled();
67
+ await this.sendMessageButton.click();
68
+ }
69
+ /**
70
+ * Click on Scheduled Draft button to open options
71
+ */
72
+ async clickOnScheduleDraftDropdownButton() {
73
+ await test.expect(this.input).toBeVisible();
74
+ await test.expect(this.scheduleDraftMessageButton).toBeVisible();
75
+ await test.expect(this.scheduleDraftMessageButton).toBeEnabled();
76
+ await this.scheduleDraftMessageButton.click();
77
+ }
78
+ /**
79
+ * Opens the message priority menu
80
+ */
81
+ async openPriorityMenu() {
82
+ await test.expect(this.priorityButton).toBeVisible();
83
+ await test.expect(this.priorityButton).toBeEnabled();
84
+ await this.priorityButton.click();
85
+ }
86
+ /**
87
+ * Composes and sends a message
88
+ */
89
+ async postMessage(message, files) {
90
+ await this.writeMessage(message);
91
+ if (files) {
92
+ const filePaths = files.map((file$1) => path.join(file.assetPath, file$1));
93
+ this.container.page().once('filechooser', async (fileChooser) => {
94
+ await fileChooser.setFiles(filePaths);
95
+ });
96
+ // Click on the attachment button
97
+ await this.attachmentButton.click();
98
+ // Wait until the file preview is displayed
99
+ await this.waitUntilFilePreviewContains(files);
100
+ }
101
+ await this.sendMessage();
102
+ }
103
+ async openEmojiPicker() {
104
+ await test.expect(this.emojiButton).toBeVisible();
105
+ await this.emojiButton.click();
106
+ }
107
+ async waitUntilFilePreviewContains(files, timeout = util.duration.ten_sec) {
108
+ await asyncWaitUntil.waitUntil(async () => {
109
+ const previews = this.filePreview.locator('.file-preview');
110
+ const details = this.filePreview.locator('.post-image__details');
111
+ const [previewsCount, detailsCount] = await Promise.all([previews.count(), details.count()]);
112
+ return previewsCount === files.length && detailsCount === files.length;
113
+ }, { timeout });
114
+ }
115
+ }
116
+
117
+ module.exports = ChannelsPostCreate;
118
+ //# sourceMappingURL=post_create.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"post_create.js","sources":["../../../../src/ui/components/channels/post_create.ts"],"sourcesContent":["// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport path from 'node:path';\n\nimport {Locator, expect} from '@playwright/test';\n\nimport {duration} from '@/util';\nimport {assetPath} from '@/file';\nimport {waitUntil} from '@/test_action';\n\nexport default class ChannelsPostCreate {\n readonly container: Locator;\n readonly input;\n\n readonly attachmentButton;\n readonly emojiButton;\n readonly sendMessageButton;\n readonly scheduleDraftMessageButton;\n readonly priorityButton;\n readonly suggestionList;\n readonly filePreview;\n\n constructor(container: Locator, isRHS = false) {\n this.container = container;\n\n if (!isRHS) {\n this.input = container.getByTestId('post_textbox');\n } else {\n this.input = container.getByTestId('reply_textbox');\n }\n\n this.attachmentButton = container.locator('#fileUploadButton');\n this.emojiButton = container.getByLabel('select an emoji');\n this.sendMessageButton = container.getByTestId('SendMessageButton');\n this.scheduleDraftMessageButton = container.getByLabel('Schedule message');\n this.priorityButton = container.getByLabel('Message priority');\n this.suggestionList = container.getByTestId('suggestionList');\n this.filePreview = container.locator('.file-preview__container');\n }\n\n async toBeVisible() {\n await expect(this.container).toBeVisible();\n\n await this.input.waitFor();\n await expect(this.input).toBeVisible();\n }\n\n /**\n * It just writes the message in the input and doesn't send it\n * @param message : Message to be written in the input\n */\n async writeMessage(message: string) {\n await this.input.waitFor();\n await expect(this.input).toBeVisible();\n\n await this.input.fill(message);\n }\n\n /**\n * Returns the value of the message input\n */\n async getInputValue() {\n await expect(this.input).toBeVisible();\n return await this.input.inputValue();\n }\n\n /**\n * Sends the message already written in the input\n */\n async sendMessage() {\n await expect(this.input).toBeVisible();\n const messageInputValue = await this.getInputValue();\n expect(messageInputValue).not.toBe('');\n\n await expect(this.sendMessageButton).toBeVisible();\n await expect(this.sendMessageButton).toBeEnabled();\n\n await this.sendMessageButton.click();\n }\n\n /**\n * Click on Scheduled Draft button to open options\n */\n async clickOnScheduleDraftDropdownButton() {\n await expect(this.input).toBeVisible();\n\n await expect(this.scheduleDraftMessageButton).toBeVisible();\n await expect(this.scheduleDraftMessageButton).toBeEnabled();\n\n await this.scheduleDraftMessageButton.click();\n }\n\n /**\n * Opens the message priority menu\n */\n async openPriorityMenu() {\n await expect(this.priorityButton).toBeVisible();\n await expect(this.priorityButton).toBeEnabled();\n await this.priorityButton.click();\n }\n\n /**\n * Composes and sends a message\n */\n async postMessage(message: string, files?: string[]) {\n await this.writeMessage(message);\n\n if (files) {\n const filePaths = files.map((file) => path.join(assetPath, file));\n this.container.page().once('filechooser', async (fileChooser) => {\n await fileChooser.setFiles(filePaths);\n });\n\n // Click on the attachment button\n await this.attachmentButton.click();\n\n // Wait until the file preview is displayed\n await this.waitUntilFilePreviewContains(files);\n }\n\n await this.sendMessage();\n }\n\n async openEmojiPicker() {\n await expect(this.emojiButton).toBeVisible();\n await this.emojiButton.click();\n }\n\n async waitUntilFilePreviewContains(files: string[], timeout = duration.ten_sec) {\n await waitUntil(\n async () => {\n const previews = this.filePreview.locator('.file-preview');\n const details = this.filePreview.locator('.post-image__details');\n\n const [previewsCount, detailsCount] = await Promise.all([previews.count(), details.count()]);\n\n return previewsCount === files.length && detailsCount === files.length;\n },\n {timeout},\n );\n }\n}\n"],"names":["expect","file","assetPath","duration","waitUntil"],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import { Locator } from '@playwright/test';
2
+ export default class PostDotMenu {
3
+ readonly container: Locator;
4
+ readonly replyMenuItem: Locator;
5
+ readonly forwardMenuItem: Locator;
6
+ readonly followMessageMenuItem: Locator;
7
+ readonly markAsUnreadMenuItem: Locator;
8
+ readonly remindMenuItem: Locator;
9
+ readonly saveMenuItem: Locator;
10
+ readonly removeFromSavedMenuItem: Locator;
11
+ readonly pinToChannelMenuItem: Locator;
12
+ readonly unpinFromChannelMenuItem: Locator;
13
+ readonly moveThreadMenuItem: Locator;
14
+ readonly copyLinkMenuItem: Locator;
15
+ readonly editMenuItem: Locator;
16
+ readonly copyTextMenuItem: Locator;
17
+ readonly deleteMenuItem: Locator;
18
+ constructor(container: Locator);
19
+ toBeVisible(): Promise<void>;
20
+ }
@@ -0,0 +1,47 @@
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 PostDotMenu {
8
+ container;
9
+ replyMenuItem;
10
+ forwardMenuItem;
11
+ followMessageMenuItem;
12
+ markAsUnreadMenuItem;
13
+ remindMenuItem;
14
+ saveMenuItem;
15
+ removeFromSavedMenuItem;
16
+ pinToChannelMenuItem;
17
+ unpinFromChannelMenuItem;
18
+ moveThreadMenuItem;
19
+ copyLinkMenuItem;
20
+ editMenuItem;
21
+ copyTextMenuItem;
22
+ deleteMenuItem;
23
+ constructor(container) {
24
+ this.container = container;
25
+ const getMenuItem = (hasText) => container.getByRole('menuitem').filter({ hasText });
26
+ this.replyMenuItem = getMenuItem('Reply');
27
+ this.forwardMenuItem = getMenuItem('Forward');
28
+ this.followMessageMenuItem = getMenuItem('Follow message');
29
+ this.markAsUnreadMenuItem = getMenuItem('Mark as Unread');
30
+ this.remindMenuItem = getMenuItem('Remind');
31
+ this.saveMenuItem = getMenuItem('Save');
32
+ this.removeFromSavedMenuItem = getMenuItem('Remove from Saved');
33
+ this.pinToChannelMenuItem = getMenuItem('Pin to Channel');
34
+ this.unpinFromChannelMenuItem = getMenuItem('Unpin from Channel');
35
+ this.moveThreadMenuItem = getMenuItem('Move Thread');
36
+ this.copyLinkMenuItem = getMenuItem('Copy Link');
37
+ this.editMenuItem = getMenuItem('Edit');
38
+ this.copyTextMenuItem = getMenuItem('Copy Text');
39
+ this.deleteMenuItem = getMenuItem('Delete');
40
+ }
41
+ async toBeVisible() {
42
+ await test.expect(this.container).toBeVisible();
43
+ }
44
+ }
45
+
46
+ module.exports = PostDotMenu;
47
+ //# sourceMappingURL=post_dot_menu.js.map