@mattermost/playwright-lib 10.7.0 → 11.3.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 (217) hide show
  1. package/dist/browser_context.d.ts +4 -2
  2. package/dist/browser_context.js +24 -4
  3. package/dist/browser_context.js.map +1 -1
  4. package/dist/constant.d.ts +2 -0
  5. package/dist/constant.js +5 -0
  6. package/dist/constant.js.map +1 -1
  7. package/dist/file.js +2 -1
  8. package/dist/file.js.map +1 -1
  9. package/dist/flag.js +1 -1
  10. package/dist/flag.js.map +1 -1
  11. package/dist/global_setup.js +26 -4
  12. package/dist/global_setup.js.map +1 -1
  13. package/dist/index.d.ts +2 -1
  14. package/dist/index.js +93 -3
  15. package/dist/index.js.map +1 -1
  16. package/dist/mock_browser_api.js.map +1 -1
  17. package/dist/server/channel.js.map +1 -1
  18. package/dist/server/client.d.ts +6 -0
  19. package/dist/server/client.js +6 -0
  20. package/dist/server/client.js.map +1 -1
  21. package/dist/server/default_config.d.ts +1 -0
  22. package/dist/server/default_config.js +100 -29
  23. package/dist/server/default_config.js.map +1 -1
  24. package/dist/server/index.d.ts +3 -3
  25. package/dist/server/index.js +9 -0
  26. package/dist/server/init.d.ts +9 -8
  27. package/dist/server/init.js +3 -11
  28. package/dist/server/init.js.map +1 -1
  29. package/dist/server/post.js.map +1 -1
  30. package/dist/server/team.d.ts +8 -1
  31. package/dist/server/team.js +13 -2
  32. package/dist/server/team.js.map +1 -1
  33. package/dist/server/user.d.ts +9 -2
  34. package/dist/server/user.js +36 -2
  35. package/dist/server/user.js.map +1 -1
  36. package/dist/test_action.d.ts +9 -0
  37. package/dist/test_action.js +39 -2
  38. package/dist/test_action.js.map +1 -1
  39. package/dist/test_config.js +1 -1
  40. package/dist/test_config.js.map +1 -1
  41. package/dist/test_fixture.d.ts +10 -3
  42. package/dist/test_fixture.js +19 -4
  43. package/dist/test_fixture.js.map +1 -1
  44. package/dist/tsconfig.tsbuildinfo +1 -0
  45. package/dist/types.d.ts +1 -0
  46. package/dist/types.js +3 -0
  47. package/dist/ui/components/channels/app_bar.js.map +1 -1
  48. package/dist/ui/components/channels/center_view.d.ts +17 -13
  49. package/dist/ui/components/channels/center_view.js +55 -25
  50. package/dist/ui/components/channels/center_view.js.map +1 -1
  51. package/dist/ui/components/channels/channel_settings/channel_settings_modal.d.ts +17 -0
  52. package/dist/ui/components/channels/channel_settings/channel_settings_modal.js +49 -0
  53. package/dist/ui/components/channels/channel_settings/channel_settings_modal.js.map +1 -0
  54. package/dist/ui/components/channels/channel_settings/configuration_settings.d.ts +11 -0
  55. package/dist/ui/components/channels/channel_settings/configuration_settings.js +48 -0
  56. package/dist/ui/components/channels/channel_settings/configuration_settings.js.map +1 -0
  57. package/dist/ui/components/channels/{scheduled_draft_menu.d.ts → channel_settings/info_settings.d.ts} +1 -3
  58. package/dist/ui/components/channels/channel_settings/info_settings.js +18 -0
  59. package/dist/ui/components/channels/channel_settings/info_settings.js.map +1 -0
  60. package/dist/ui/components/channels/delete_post_confirmation_dialog.js.map +1 -1
  61. package/dist/ui/components/channels/delete_post_modal.js.map +1 -1
  62. package/dist/ui/components/channels/delete_scheduled_post_modal.d.ts +10 -0
  63. package/dist/ui/components/channels/delete_scheduled_post_modal.js +26 -0
  64. package/dist/ui/components/channels/delete_scheduled_post_modal.js.map +1 -0
  65. package/dist/ui/components/channels/draft_post.d.ts +16 -0
  66. package/dist/ui/components/channels/draft_post.js +39 -0
  67. package/dist/ui/components/channels/draft_post.js.map +1 -0
  68. package/dist/ui/components/channels/emoji_gif_picker.d.ts +2 -0
  69. package/dist/ui/components/channels/emoji_gif_picker.js +6 -0
  70. package/dist/ui/components/channels/emoji_gif_picker.js.map +1 -1
  71. package/dist/ui/components/channels/find_channels_modal.js.map +1 -1
  72. package/dist/ui/components/channels/flag_post_confirmation_dialog.d.ts +24 -0
  73. package/dist/ui/components/channels/flag_post_confirmation_dialog.js +74 -0
  74. package/dist/ui/components/channels/flag_post_confirmation_dialog.js.map +1 -0
  75. package/dist/ui/components/channels/generic_confirm_modal.js.map +1 -1
  76. package/dist/ui/components/channels/header.d.ts +2 -0
  77. package/dist/ui/components/channels/header.js +6 -0
  78. package/dist/ui/components/channels/header.js.map +1 -1
  79. package/dist/ui/components/channels/invite_people_modal.d.ts +6 -0
  80. package/dist/ui/components/channels/invite_people_modal.js +18 -0
  81. package/dist/ui/components/channels/invite_people_modal.js.map +1 -0
  82. package/dist/ui/components/channels/message_priority.d.ts +0 -1
  83. package/dist/ui/components/channels/message_priority.js +2 -7
  84. package/dist/ui/components/channels/message_priority.js.map +1 -1
  85. package/dist/ui/components/channels/post.d.ts +7 -0
  86. package/dist/ui/components/channels/post.js +18 -0
  87. package/dist/ui/components/channels/post.js.map +1 -1
  88. package/dist/ui/components/channels/post_create.d.ts +1 -5
  89. package/dist/ui/components/channels/post_create.js +3 -12
  90. package/dist/ui/components/channels/post_create.js.map +1 -1
  91. package/dist/ui/components/channels/post_dot_menu.d.ts +2 -0
  92. package/dist/ui/components/channels/post_dot_menu.js +5 -0
  93. package/dist/ui/components/channels/post_dot_menu.js.map +1 -1
  94. package/dist/ui/components/channels/post_edit.js.map +1 -1
  95. package/dist/ui/components/channels/post_menu.js.map +1 -1
  96. package/dist/ui/components/channels/post_reminder_menu.js.map +1 -1
  97. package/dist/ui/components/channels/profile_modal.d.ts +27 -0
  98. package/dist/ui/components/channels/profile_modal.js +66 -0
  99. package/dist/ui/components/channels/profile_modal.js.map +1 -0
  100. package/dist/ui/components/channels/restore_post_confirmation_dialog.js.map +1 -1
  101. package/dist/ui/components/channels/schedule_message_menu.d.ts +12 -0
  102. package/dist/ui/components/channels/schedule_message_menu.js +31 -0
  103. package/dist/ui/components/channels/schedule_message_menu.js.map +1 -0
  104. package/dist/ui/components/channels/schedule_message_modal.d.ts +20 -0
  105. package/dist/ui/components/channels/schedule_message_modal.js +91 -0
  106. package/dist/ui/components/channels/schedule_message_modal.js.map +1 -0
  107. package/dist/ui/components/channels/scheduled_draft_modal.js.map +1 -1
  108. package/dist/ui/components/channels/scheduled_post.d.ts +20 -0
  109. package/dist/ui/components/channels/scheduled_post.js +47 -0
  110. package/dist/ui/components/channels/scheduled_post.js.map +1 -0
  111. package/dist/ui/components/channels/scheduled_post_indicator.d.ts +12 -0
  112. package/dist/ui/components/channels/scheduled_post_indicator.js +32 -0
  113. package/dist/ui/components/channels/scheduled_post_indicator.js.map +1 -0
  114. package/dist/ui/components/channels/{search_popover.d.ts → search_box.d.ts} +1 -1
  115. package/dist/ui/components/channels/{search_popover.js → search_box.js} +4 -3
  116. package/dist/ui/components/channels/search_box.js.map +1 -0
  117. package/dist/ui/components/channels/send_message_now_modal.d.ts +10 -0
  118. package/dist/ui/components/channels/send_message_now_modal.js +26 -0
  119. package/dist/ui/components/channels/send_message_now_modal.js.map +1 -0
  120. package/dist/ui/components/channels/settings/advanced_settings.d.ts +15 -0
  121. package/dist/ui/components/channels/settings/advanced_settings.js +35 -0
  122. package/dist/ui/components/channels/settings/advanced_settings.js.map +1 -0
  123. package/dist/ui/components/channels/settings/display_settings.d.ts +27 -0
  124. package/dist/ui/components/channels/settings/display_settings.js +77 -0
  125. package/dist/ui/components/channels/settings/display_settings.js.map +1 -0
  126. package/dist/ui/components/channels/settings/{notification_settings.d.ts → notifications_settings.d.ts} +12 -0
  127. package/dist/ui/components/channels/settings/{notification_settings.js → notifications_settings.js} +23 -1
  128. package/dist/ui/components/channels/settings/notifications_settings.js.map +1 -0
  129. package/dist/ui/components/channels/settings/settings_modal.d.ts +19 -4
  130. package/dist/ui/components/channels/settings/settings_modal.js +48 -7
  131. package/dist/ui/components/channels/settings/settings_modal.js.map +1 -1
  132. package/dist/ui/components/channels/settings/sidebar_settings.d.ts +12 -0
  133. package/dist/ui/components/channels/settings/sidebar_settings.js +28 -0
  134. package/dist/ui/components/channels/settings/sidebar_settings.js.map +1 -0
  135. package/dist/ui/components/channels/sidebar_left.d.ts +16 -3
  136. package/dist/ui/components/channels/sidebar_left.js +26 -9
  137. package/dist/ui/components/channels/sidebar_left.js.map +1 -1
  138. package/dist/ui/components/channels/sidebar_right.d.ts +3 -2
  139. package/dist/ui/components/channels/sidebar_right.js +6 -6
  140. package/dist/ui/components/channels/sidebar_right.js.map +1 -1
  141. package/dist/ui/components/channels/team_menu.d.ts +19 -0
  142. package/dist/ui/components/channels/team_menu.js +51 -0
  143. package/dist/ui/components/channels/team_menu.js.map +1 -0
  144. package/dist/ui/components/channels/team_settings/team_settings_modal.d.ts +6 -0
  145. package/dist/ui/components/channels/team_settings/team_settings_modal.js +18 -0
  146. package/dist/ui/components/channels/team_settings/team_settings_modal.js.map +1 -0
  147. package/dist/ui/components/channels/thread_footer.js.map +1 -1
  148. package/dist/ui/components/channels/user_profile_popover.js.map +1 -1
  149. package/dist/ui/components/footer.js.map +1 -1
  150. package/dist/ui/components/global_header.d.ts +7 -2
  151. package/dist/ui/components/global_header.js +13 -1
  152. package/dist/ui/components/global_header.js.map +1 -1
  153. package/dist/ui/components/index.d.ts +33 -5
  154. package/dist/ui/components/index.js +90 -10
  155. package/dist/ui/components/index.js.map +1 -1
  156. package/dist/ui/components/main_header.js.map +1 -1
  157. package/dist/ui/components/system_console/navbar.js.map +1 -1
  158. package/dist/ui/components/system_console/sections/site_configuration/notifications.d.ts +24 -0
  159. package/dist/ui/components/system_console/sections/site_configuration/notifications.js +63 -0
  160. package/dist/ui/components/system_console/sections/site_configuration/notifications.js.map +1 -0
  161. package/dist/ui/components/system_console/sections/system_users/column_toggle_menu.js.map +1 -1
  162. package/dist/ui/components/system_console/sections/system_users/feature_discovery.js.map +1 -1
  163. package/dist/ui/components/system_console/sections/system_users/filter_menu.js.map +1 -1
  164. package/dist/ui/components/system_console/sections/system_users/filter_popover.js.map +1 -1
  165. package/dist/ui/components/system_console/sections/system_users/mobile_security.d.ts +29 -2
  166. package/dist/ui/components/system_console/sections/system_users/mobile_security.js +75 -1
  167. package/dist/ui/components/system_console/sections/system_users/mobile_security.js.map +1 -1
  168. package/dist/ui/components/system_console/sections/system_users/system_users.js.map +1 -1
  169. package/dist/ui/components/system_console/sidebar.js.map +1 -1
  170. package/dist/ui/components/user_account_menu.d.ts +13 -0
  171. package/dist/ui/components/user_account_menu.js +32 -0
  172. package/dist/ui/components/user_account_menu.js.map +1 -0
  173. package/dist/ui/pages/channels.d.ts +46 -11
  174. package/dist/ui/pages/channels.js +119 -12
  175. package/dist/ui/pages/channels.js.map +1 -1
  176. package/dist/ui/pages/content_review_dm.d.ts +44 -0
  177. package/dist/ui/pages/content_review_dm.js +154 -0
  178. package/dist/ui/pages/content_review_dm.js.map +1 -0
  179. package/dist/ui/pages/drafts.d.ts +9 -25
  180. package/dist/ui/pages/drafts.js +25 -94
  181. package/dist/ui/pages/drafts.js.map +1 -1
  182. package/dist/ui/pages/index.d.ts +9 -5
  183. package/dist/ui/pages/index.js +10 -5
  184. package/dist/ui/pages/index.js.map +1 -1
  185. package/dist/ui/pages/landing_login.js.map +1 -1
  186. package/dist/ui/pages/login.d.ts +2 -2
  187. package/dist/ui/pages/login.js +1 -1
  188. package/dist/ui/pages/login.js.map +1 -1
  189. package/dist/ui/pages/reset_password.d.ts +2 -2
  190. package/dist/ui/pages/reset_password.js +1 -1
  191. package/dist/ui/pages/reset_password.js.map +1 -1
  192. package/dist/ui/pages/scheduled_posts.d.ts +23 -0
  193. package/dist/ui/pages/scheduled_posts.js +63 -0
  194. package/dist/ui/pages/scheduled_posts.js.map +1 -0
  195. package/dist/ui/pages/signup.d.ts +2 -2
  196. package/dist/ui/pages/signup.js +1 -1
  197. package/dist/ui/pages/signup.js.map +1 -1
  198. package/dist/ui/pages/system_console.d.ts +16 -14
  199. package/dist/ui/pages/system_console.js +10 -1
  200. package/dist/ui/pages/system_console.js.map +1 -1
  201. package/dist/ui/pages/threads.d.ts +13 -0
  202. package/dist/ui/pages/threads.js +44 -0
  203. package/dist/ui/pages/threads.js.map +1 -0
  204. package/dist/util.d.ts +17 -4
  205. package/dist/util.js +65 -5
  206. package/dist/util.js.map +1 -1
  207. package/dist/visual/index.js +9 -3
  208. package/dist/visual/index.js.map +1 -1
  209. package/dist/visual/percy.js.map +1 -1
  210. package/package.json +14 -15
  211. package/dist/ui/components/channels/scheduled_draft_menu.js +0 -23
  212. package/dist/ui/components/channels/scheduled_draft_menu.js.map +0 -1
  213. package/dist/ui/components/channels/search_popover.js.map +0 -1
  214. package/dist/ui/components/channels/settings/notification_settings.js.map +0 -1
  215. package/dist/ui/pages/scheduled_draft.d.ts +0 -38
  216. package/dist/ui/pages/scheduled_draft.js +0 -144
  217. package/dist/ui/pages/scheduled_draft.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"init.js","sources":["../../src/server/init.ts"],"sourcesContent":["// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {expect} from '@playwright/test';\nimport {PreferenceType} from '@mattermost/types/preferences';\n\nimport {makeClient} from './client';\nimport {getOnPremServerConfig} from './default_config';\nimport {createRandomTeam} from './team';\nimport {createRandomUser} from './user';\n\nimport {getFileFromCommonAsset} from '@/file';\nimport {testConfig} from '@/test_config';\n\nexport async function initSetup({\n userPrefix = 'user',\n teamPrefix = {name: 'team', displayName: 'Team'},\n withDefaultProfileImage = true,\n} = {}) {\n try {\n // Login the admin user via API\n const {adminClient, adminUser} = await getAdminClient();\n if (!adminUser) {\n throw new Error('Failed to setup admin: Admin user not found.');\n }\n if (!adminClient) {\n throw new Error(\n \"Failed to setup admin: Check that you're able to access the server using the same admin credential.\",\n );\n }\n\n // Reset server config\n const adminConfig = await adminClient.updateConfig(getOnPremServerConfig() as any);\n\n // Create new team\n const team = await adminClient.createTeam(createRandomTeam(teamPrefix.name, teamPrefix.displayName));\n\n // Create new user and add to newly created team\n const randomUser = createRandomUser(userPrefix);\n const user = await adminClient.createUser(randomUser, '', '');\n user.password = randomUser.password;\n await adminClient.addToTeam(team.id, user.id);\n\n // Log in new user via API\n const {client: userClient} = await makeClient(user);\n\n if (withDefaultProfileImage) {\n const file = getFileFromCommonAsset('mattermost-icon_128x128.png');\n await userClient.uploadProfileImage(user.id, file);\n }\n\n // Update user preference\n const preferences: PreferenceType[] = [\n {user_id: user.id, category: 'tutorial_step', name: user.id, value: '999'},\n {user_id: user.id, category: 'crt_thread_pane_step', name: user.id, value: '999'},\n ];\n await userClient.savePreferences(user.id, preferences);\n\n return {\n adminClient,\n adminUser,\n adminConfig,\n user,\n userClient,\n team,\n offTopicUrl: getUrl(team.name, 'off-topic'),\n townSquareUrl: getUrl(team.name, 'town-square'),\n };\n } catch (error) {\n expect(error, 'Should not throw an error').toBeFalsy();\n throw error;\n }\n}\n\nexport async function getAdminClient(opts: {skipLog: boolean} = {skipLog: false}) {\n const {client: adminClient, user: adminUser} = await makeClient(\n {\n username: testConfig.adminUsername,\n password: testConfig.adminPassword,\n },\n opts,\n );\n\n return {adminClient, adminUser};\n}\n\nfunction getUrl(teamName: string, channelName: string) {\n return `/${teamName}/channels/${channelName}`;\n}\n"],"names":["getOnPremServerConfig","team","createRandomTeam","createRandomUser","user","makeClient","file","getFileFromCommonAsset","expect","testConfig"],"mappings":"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"}
1
+ {"version":3,"file":"init.js","sources":["../../src/server/init.ts"],"sourcesContent":["// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {expect} from '@playwright/test';\nimport {TeamType} from '@mattermost/types/teams';\n\nimport {makeClient} from './client';\nimport {getOnPremServerConfig} from './default_config';\nimport {createNewTeam} from './team';\nimport {createNewUserProfile} from './user';\n\nimport {getFileFromCommonAsset} from '@/file';\nimport {testConfig} from '@/test_config';\n\ntype InitSetupOptions = {\n userOptions?: Partial<Parameters<typeof createNewUserProfile>[1]>;\n teamsOptions?: Partial<Parameters<typeof createNewTeam>[1]>;\n withDefaultProfileImage?: boolean;\n};\n\nexport async function initSetup({\n userOptions = {prefix: 'user', disableTutorial: true, disableOnboarding: true},\n teamsOptions = {name: 'team', displayName: 'Team', type: 'O' as TeamType, unique: true},\n withDefaultProfileImage = true,\n}: Partial<InitSetupOptions> = {}) {\n try {\n // Login the admin user via API\n const {adminClient, adminUser} = await getAdminClient();\n if (!adminUser) {\n throw new Error('Failed to setup admin: Admin user not found.');\n }\n if (!adminClient) {\n throw new Error(\n \"Failed to setup admin: Check that you're able to access the server using the same admin credential.\",\n );\n }\n\n // Reset server config\n const adminConfig = await adminClient.updateConfig(getOnPremServerConfig() as any);\n\n // Create new team\n const team = await createNewTeam(adminClient, teamsOptions);\n\n // Create new user and add to newly created team\n const user = await createNewUserProfile(adminClient, userOptions);\n await adminClient.addToTeam(team.id, user.id);\n\n // Log in new user via API\n const {client: userClient} = await makeClient(user);\n\n if (withDefaultProfileImage) {\n const file = getFileFromCommonAsset('mattermost-icon_128x128.png');\n await userClient.uploadProfileImage(user.id, file);\n }\n\n return {\n adminClient,\n adminUser,\n adminConfig,\n user,\n userClient,\n team,\n offTopicUrl: getUrl(team.name, 'off-topic'),\n townSquareUrl: getUrl(team.name, 'town-square'),\n };\n } catch (error) {\n expect(error, 'Should not throw an error').toBeFalsy();\n throw error;\n }\n}\n\nexport async function getAdminClient(opts: {skipLog: boolean} = {skipLog: false}) {\n const {client: adminClient, user: adminUser} = await makeClient(\n {\n username: testConfig.adminUsername,\n password: testConfig.adminPassword,\n },\n opts,\n );\n\n return {adminClient, adminUser};\n}\n\nfunction getUrl(teamName: string, channelName: string) {\n return `/${teamName}/channels/${channelName}`;\n}\n"],"names":["getOnPremServerConfig","team","createNewTeam","user","createNewUserProfile","makeClient","file","getFileFromCommonAsset","expect","testConfig"],"mappings":";;;;;;;;;;AAAA;AACA;AAmBO,eAAe,SAAS,CAAC,EAC5B,WAAW,GAAG,EAAC,MAAM,EAAE,MAAM,EAAE,eAAe,EAAE,IAAI,EAAE,iBAAiB,EAAE,IAAI,EAAC,EAC9E,YAAY,GAAG,EAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,GAAe,EAAE,MAAM,EAAE,IAAI,EAAC,EACvF,uBAAuB,GAAG,IAAI,GAAA,GACH,EAAE,EAAA;AAC7B,IAAA,IAAI;;QAEA,MAAM,EAAC,WAAW,EAAE,SAAS,EAAC,GAAG,MAAM,cAAc,EAAE;QACvD,IAAI,CAAC,SAAS,EAAE;AACZ,YAAA,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC;QACnE;QACA,IAAI,CAAC,WAAW,EAAE;AACd,YAAA,MAAM,IAAI,KAAK,CACX,qGAAqG,CACxG;QACL;;QAGA,MAAM,WAAW,GAAG,MAAM,WAAW,CAAC,YAAY,CAACA,oCAAqB,EAAS,CAAC;;QAGlF,MAAMC,MAAI,GAAG,MAAMC,kBAAa,CAAC,WAAW,EAAE,YAAY,CAAC;;QAG3D,MAAMC,MAAI,GAAG,MAAMC,yBAAoB,CAAC,WAAW,EAAE,WAAW,CAAC;AACjE,QAAA,MAAM,WAAW,CAAC,SAAS,CAACH,MAAI,CAAC,EAAE,EAAEE,MAAI,CAAC,EAAE,CAAC;;QAG7C,MAAM,EAAC,MAAM,EAAE,UAAU,EAAC,GAAG,MAAME,iBAAU,CAACF,MAAI,CAAC;QAEnD,IAAI,uBAAuB,EAAE;AACzB,YAAA,MAAMG,MAAI,GAAGC,2BAAsB,CAAC,6BAA6B,CAAC;YAClE,MAAM,UAAU,CAAC,kBAAkB,CAACJ,MAAI,CAAC,EAAE,EAAEG,MAAI,CAAC;QACtD;QAEA,OAAO;YACH,WAAW;YACX,SAAS;YACT,WAAW;kBACXH,MAAI;YACJ,UAAU;kBACVF,MAAI;YACJ,WAAW,EAAE,MAAM,CAACA,MAAI,CAAC,IAAI,EAAE,WAAW,CAAC;YAC3C,aAAa,EAAE,MAAM,CAACA,MAAI,CAAC,IAAI,EAAE,aAAa,CAAC;SAClD;IACL;IAAE,OAAO,KAAK,EAAE;QACZO,WAAM,CAAC,KAAK,EAAE,2BAA2B,CAAC,CAAC,SAAS,EAAE;AACtD,QAAA,MAAM,KAAK;IACf;AACJ;AAEO,eAAe,cAAc,CAAC,OAA2B,EAAC,OAAO,EAAE,KAAK,EAAC,EAAA;AAC5E,IAAA,MAAM,EAAC,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,SAAS,EAAC,GAAG,MAAMH,iBAAU,CAC3D;QACI,QAAQ,EAAEI,sBAAU,CAAC,aAAa;QAClC,QAAQ,EAAEA,sBAAU,CAAC,aAAa;KACrC,EACD,IAAI,CACP;AAED,IAAA,OAAO,EAAC,WAAW,EAAE,SAAS,EAAC;AACnC;AAEA,SAAS,MAAM,CAAC,QAAgB,EAAE,WAAmB,EAAA;AACjD,IAAA,OAAO,CAAA,CAAA,EAAI,QAAQ,CAAA,UAAA,EAAa,WAAW,EAAE;AACjD;;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"post.js","sources":["../../src/server/post.ts"],"sourcesContent":["// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {Post, PostMetadata} from '@mattermost/types/posts';\n\nimport {getRandomId} from '@/util';\n\nexport function createRandomPost(post?: Partial<Post>): Post {\n if (post && post.channel_id && post.user_id) {\n const time = Date.now();\n\n const defaultPost = {\n create_at: time,\n user_id: post.user_id,\n channel_id: post.channel_id,\n root_id: post.root_id || '',\n message: `${post?.message ?? ''}${getRandomId()}`,\n pending_post_id: `${post.user_id}:${time}`,\n props: post?.props || {},\n file_ids: post?.file_ids || [],\n metadata: {} as PostMetadata,\n };\n\n Reflect.deleteProperty(post, 'user_id');\n Reflect.deleteProperty(post, 'channel_id');\n Reflect.deleteProperty(post, 'message');\n Reflect.deleteProperty(post, 'pending_post_id');\n\n return {...defaultPost, ...post} as Post;\n }\n\n throw new Error('Post is missing channel_id or user_id or both');\n}\n"],"names":["getRandomId"],"mappings":";;;;AAAA;AACA;AAMM,SAAU,gBAAgB,CAAC,IAAoB,EAAA;IACjD,IAAI,IAAI,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,OAAO,EAAE;AACzC,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE;AAEvB,QAAA,MAAM,WAAW,GAAG;AAChB,YAAA,SAAS,EAAE,IAAI;YACf,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,UAAU,EAAE,IAAI,CAAC,UAAU;AAC3B,YAAA,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,EAAE;YAC3B,OAAO,EAAE,CAAG,EAAA,IAAI,EAAE,OAAO,IAAI,EAAE,CAAA,EAAGA,gBAAW,EAAE,CAAE,CAAA;AACjD,YAAA,eAAe,EAAE,CAAG,EAAA,IAAI,CAAC,OAAO,CAAA,CAAA,EAAI,IAAI,CAAE,CAAA;AAC1C,YAAA,KAAK,EAAE,IAAI,EAAE,KAAK,IAAI,EAAE;AACxB,YAAA,QAAQ,EAAE,IAAI,EAAE,QAAQ,IAAI,EAAE;AAC9B,YAAA,QAAQ,EAAE,EAAkB;SAC/B;AAED,QAAA,OAAO,CAAC,cAAc,CAAC,IAAI,EAAE,SAAS,CAAC;AACvC,QAAA,OAAO,CAAC,cAAc,CAAC,IAAI,EAAE,YAAY,CAAC;AAC1C,QAAA,OAAO,CAAC,cAAc,CAAC,IAAI,EAAE,SAAS,CAAC;AACvC,QAAA,OAAO,CAAC,cAAc,CAAC,IAAI,EAAE,iBAAiB,CAAC;AAE/C,QAAA,OAAO,EAAC,GAAG,WAAW,EAAE,GAAG,IAAI,EAAS;;AAG5C,IAAA,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC;AACpE;;;;"}
1
+ {"version":3,"file":"post.js","sources":["../../src/server/post.ts"],"sourcesContent":["// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {Post, PostMetadata} from '@mattermost/types/posts';\n\nimport {getRandomId} from '@/util';\n\nexport function createRandomPost(post?: Partial<Post>): Post {\n if (post && post.channel_id && post.user_id) {\n const time = Date.now();\n\n const defaultPost = {\n create_at: time,\n user_id: post.user_id,\n channel_id: post.channel_id,\n root_id: post.root_id || '',\n message: `${post?.message ?? ''}${getRandomId()}`,\n pending_post_id: `${post.user_id}:${time}`,\n props: post?.props || {},\n file_ids: post?.file_ids || [],\n metadata: {} as PostMetadata,\n };\n\n Reflect.deleteProperty(post, 'user_id');\n Reflect.deleteProperty(post, 'channel_id');\n Reflect.deleteProperty(post, 'message');\n Reflect.deleteProperty(post, 'pending_post_id');\n\n return {...defaultPost, ...post} as Post;\n }\n\n throw new Error('Post is missing channel_id or user_id or both');\n}\n"],"names":["getRandomId"],"mappings":";;;;AAAA;AACA;AAMM,SAAU,gBAAgB,CAAC,IAAoB,EAAA;IACjD,IAAI,IAAI,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,OAAO,EAAE;AACzC,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE;AAEvB,QAAA,MAAM,WAAW,GAAG;AAChB,YAAA,SAAS,EAAE,IAAI;YACf,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,UAAU,EAAE,IAAI,CAAC,UAAU;AAC3B,YAAA,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,EAAE;YAC3B,OAAO,EAAE,CAAA,EAAG,IAAI,EAAE,OAAO,IAAI,EAAE,CAAA,EAAGA,gBAAW,EAAE,CAAA,CAAE;AACjD,YAAA,eAAe,EAAE,CAAA,EAAG,IAAI,CAAC,OAAO,CAAA,CAAA,EAAI,IAAI,CAAA,CAAE;AAC1C,YAAA,KAAK,EAAE,IAAI,EAAE,KAAK,IAAI,EAAE;AACxB,YAAA,QAAQ,EAAE,IAAI,EAAE,QAAQ,IAAI,EAAE;AAC9B,YAAA,QAAQ,EAAE,EAAkB;SAC/B;AAED,QAAA,OAAO,CAAC,cAAc,CAAC,IAAI,EAAE,SAAS,CAAC;AACvC,QAAA,OAAO,CAAC,cAAc,CAAC,IAAI,EAAE,YAAY,CAAC;AAC1C,QAAA,OAAO,CAAC,cAAc,CAAC,IAAI,EAAE,SAAS,CAAC;AACvC,QAAA,OAAO,CAAC,cAAc,CAAC,IAAI,EAAE,iBAAiB,CAAC;AAE/C,QAAA,OAAO,EAAC,GAAG,WAAW,EAAE,GAAG,IAAI,EAAS;IAC5C;AAEA,IAAA,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC;AACpE;;;;"}
@@ -1,2 +1,9 @@
1
+ import { Client4 } from '@mattermost/client';
1
2
  import { Team, TeamType } from '@mattermost/types/teams';
2
- export declare function createRandomTeam(name?: string, displayName?: string, type?: TeamType, unique?: boolean): Team;
3
+ export declare function createNewTeam(client: Client4, options?: {
4
+ name?: string;
5
+ displayName?: string;
6
+ type?: TeamType;
7
+ unique?: boolean;
8
+ }): Promise<Team>;
9
+ export declare function createRandomTeam(name?: string, displayName?: string, type?: TeamType, unique?: boolean): Promise<Team>;
@@ -4,8 +4,18 @@ var util = require('../util.js');
4
4
 
5
5
  // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
6
6
  // See LICENSE.txt for license information.
7
- function createRandomTeam(name = 'team', displayName = 'Team', type = 'O', unique = true) {
8
- const randomSuffix = util.getRandomId();
7
+ async function createNewTeam(client, options = {
8
+ name: 'team',
9
+ displayName: 'Team',
10
+ type: 'O',
11
+ unique: true,
12
+ }) {
13
+ const randomTeam = await createRandomTeam(options.name, options.displayName, options.type, options.unique);
14
+ const newTeam = await client.createTeam(randomTeam);
15
+ return newTeam;
16
+ }
17
+ async function createRandomTeam(name = 'team', displayName = 'Team', type = 'O', unique = true) {
18
+ const randomSuffix = await util.getRandomId();
9
19
  const team = {
10
20
  name: unique ? `${name}-${randomSuffix}` : name,
11
21
  display_name: unique ? `${displayName} ${randomSuffix}` : displayName,
@@ -14,5 +24,6 @@ function createRandomTeam(name = 'team', displayName = 'Team', type = 'O', uniqu
14
24
  return team;
15
25
  }
16
26
 
27
+ exports.createNewTeam = createNewTeam;
17
28
  exports.createRandomTeam = createRandomTeam;
18
29
  //# sourceMappingURL=team.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"team.js","sources":["../../src/server/team.ts"],"sourcesContent":["// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {Team, TeamType} from '@mattermost/types/teams';\n\nimport {getRandomId} from '@/util';\n\nexport function createRandomTeam(name = 'team', displayName = 'Team', type: TeamType = 'O', unique = true): Team {\n const randomSuffix = getRandomId();\n\n const team = {\n name: unique ? `${name}-${randomSuffix}` : name,\n display_name: unique ? `${displayName} ${randomSuffix}` : displayName,\n type,\n };\n\n return team as Team;\n}\n"],"names":["getRandomId"],"mappings":";;;;AAAA;AACA;SAMgB,gBAAgB,CAAC,IAAI,GAAG,MAAM,EAAE,WAAW,GAAG,MAAM,EAAE,IAAiB,GAAA,GAAG,EAAE,MAAM,GAAG,IAAI,EAAA;AACrG,IAAA,MAAM,YAAY,GAAGA,gBAAW,EAAE;AAElC,IAAA,MAAM,IAAI,GAAG;AACT,QAAA,IAAI,EAAE,MAAM,GAAG,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,YAAY,CAAA,CAAE,GAAG,IAAI;AAC/C,QAAA,YAAY,EAAE,MAAM,GAAG,CAAA,EAAG,WAAW,CAAA,CAAA,EAAI,YAAY,CAAA,CAAE,GAAG,WAAW;QACrE,IAAI;KACP;AAED,IAAA,OAAO,IAAY;AACvB;;;;"}
1
+ {"version":3,"file":"team.js","sources":["../../src/server/team.ts"],"sourcesContent":["// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {Client4} from '@mattermost/client';\nimport {Team, TeamType} from '@mattermost/types/teams';\n\nimport {getRandomId} from '@/util';\n\nexport async function createNewTeam(\n client: Client4,\n options: {name?: string; displayName?: string; type?: TeamType; unique?: boolean} = {\n name: 'team',\n displayName: 'Team',\n type: 'O' as TeamType,\n unique: true,\n },\n) {\n const randomTeam = await createRandomTeam(options.name, options.displayName, options.type, options.unique);\n const newTeam = await client.createTeam(randomTeam);\n\n return newTeam;\n}\n\nexport async function createRandomTeam(\n name = 'team',\n displayName = 'Team',\n type: TeamType = 'O',\n unique = true,\n): Promise<Team> {\n const randomSuffix = await getRandomId();\n\n const team = {\n name: unique ? `${name}-${randomSuffix}` : name,\n display_name: unique ? `${displayName} ${randomSuffix}` : displayName,\n type,\n };\n\n return team as Team;\n}\n"],"names":["getRandomId"],"mappings":";;;;AAAA;AACA;AAOO,eAAe,aAAa,CAC/B,MAAe,EACf,OAAA,GAAoF;AAChF,IAAA,IAAI,EAAE,MAAM;AACZ,IAAA,WAAW,EAAE,MAAM;AACnB,IAAA,IAAI,EAAE,GAAe;AACrB,IAAA,MAAM,EAAE,IAAI;AACf,CAAA,EAAA;IAED,MAAM,UAAU,GAAG,MAAM,gBAAgB,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,WAAW,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC;IAC1G,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,UAAU,CAAC;AAEnD,IAAA,OAAO,OAAO;AAClB;AAEO,eAAe,gBAAgB,CAClC,IAAI,GAAG,MAAM,EACb,WAAW,GAAG,MAAM,EACpB,IAAA,GAAiB,GAAG,EACpB,MAAM,GAAG,IAAI,EAAA;AAEb,IAAA,MAAM,YAAY,GAAG,MAAMA,gBAAW,EAAE;AAExC,IAAA,MAAM,IAAI,GAAG;AACT,QAAA,IAAI,EAAE,MAAM,GAAG,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,YAAY,CAAA,CAAE,GAAG,IAAI;AAC/C,QAAA,YAAY,EAAE,MAAM,GAAG,CAAA,EAAG,WAAW,CAAA,CAAA,EAAI,YAAY,CAAA,CAAE,GAAG,WAAW;QACrE,IAAI;KACP;AAED,IAAA,OAAO,IAAY;AACvB;;;;;"}
@@ -1,3 +1,10 @@
1
- import { UserProfile } from '@mattermost/types/users';
2
- export declare function createRandomUser(prefix?: string): UserProfile;
1
+ import { Client4 } from '@mattermost/client';
2
+ import { UserProfile, UserTimezone } from '@mattermost/types/users';
3
+ export declare function createNewUserProfile(client: Client4, options?: {
4
+ prefix?: string;
5
+ disableTutorial?: boolean;
6
+ disableOnboarding?: boolean;
7
+ }): Promise<UserProfile>;
8
+ export declare function createRandomUser(prefix?: string): Promise<UserProfile>;
3
9
  export declare function getDefaultAdminUser(): UserProfile;
10
+ export declare function isOutsideRemoteUserHour(userTz: UserTimezone | undefined): boolean;
@@ -1,12 +1,37 @@
1
1
  'use strict';
2
2
 
3
+ var luxon = require('luxon');
3
4
  var util = require('../util.js');
4
5
  var test_config = require('../test_config.js');
6
+ var constant = require('../constant.js');
5
7
 
6
8
  // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
7
9
  // See LICENSE.txt for license information.
8
- function createRandomUser(prefix = 'user') {
9
- const randomId = util.getRandomId();
10
+ async function createNewUserProfile(client, options = {
11
+ prefix: 'user',
12
+ disableTutorial: true,
13
+ disableOnboarding: true,
14
+ }) {
15
+ const randomUser = await createRandomUser(options.prefix);
16
+ const newUser = await client.createUser(randomUser, '', '');
17
+ // Set password to the created user profile so it can be used to login later
18
+ newUser.password = randomUser.password;
19
+ if (options.disableTutorial) {
20
+ await client.savePreferences(newUser.id, [
21
+ { user_id: newUser.id, category: 'tutorial_step', name: newUser.id, value: '999' },
22
+ { user_id: newUser.id, category: 'crt_thread_pane_step', name: newUser.id, value: '999' },
23
+ ]);
24
+ }
25
+ if (options.disableOnboarding) {
26
+ await client.savePreferences(newUser.id, [
27
+ { user_id: newUser.id, category: 'onboarding_task_list', name: 'onboarding_task_list_show', value: 'false' },
28
+ { user_id: newUser.id, category: 'onboarding_task_list', name: 'onboarding_task_list_open', value: 'false' },
29
+ ]);
30
+ }
31
+ return newUser;
32
+ }
33
+ async function createRandomUser(prefix = 'user') {
34
+ const randomId = await util.getRandomId();
10
35
  const user = {
11
36
  email: `${prefix}${randomId}@sample.mattermost.com`,
12
37
  username: `${prefix}${randomId}`,
@@ -27,7 +52,16 @@ function getDefaultAdminUser() {
27
52
  };
28
53
  return admin;
29
54
  }
55
+ function isOutsideRemoteUserHour(userTz) {
56
+ const timezone = (userTz?.useAutomaticTimezone ? userTz?.automaticTimezone : userTz?.manualTimezone) || 'UTC';
57
+ const teammateUserDate = luxon.DateTime.local().setZone(timezone);
58
+ const currentHour = teammateUserDate.hour;
59
+ return (currentHour >= constant.REMOTE_USERS_HOUR_LIMIT_END_OF_THE_DAY ||
60
+ currentHour < constant.REMOTE_USERS_HOUR_LIMIT_BEGINNING_OF_THE_DAY);
61
+ }
30
62
 
63
+ exports.createNewUserProfile = createNewUserProfile;
31
64
  exports.createRandomUser = createRandomUser;
32
65
  exports.getDefaultAdminUser = getDefaultAdminUser;
66
+ exports.isOutsideRemoteUserHour = isOutsideRemoteUserHour;
33
67
  //# sourceMappingURL=user.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"user.js","sources":["../../src/server/user.ts"],"sourcesContent":["// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {UserProfile} from '@mattermost/types/users';\n\nimport {getRandomId} from '@/util';\nimport {testConfig} from '@/test_config';\n\nexport function createRandomUser(prefix = 'user') {\n const randomId = getRandomId();\n\n const user = {\n email: `${prefix}${randomId}@sample.mattermost.com`,\n username: `${prefix}${randomId}`,\n password: 'passwd',\n first_name: `First${randomId}`,\n last_name: `Last${randomId}`,\n nickname: `Nickname${randomId}`,\n };\n\n return user as UserProfile;\n}\n\nexport function getDefaultAdminUser() {\n const admin = {\n username: testConfig.adminUsername,\n password: testConfig.adminPassword,\n first_name: 'Kenneth',\n last_name: 'Moreno',\n email: testConfig.adminEmail,\n };\n\n return admin as UserProfile;\n}\n"],"names":["getRandomId","testConfig"],"mappings":";;;;;AAAA;AACA;AAOgB,SAAA,gBAAgB,CAAC,MAAM,GAAG,MAAM,EAAA;AAC5C,IAAA,MAAM,QAAQ,GAAGA,gBAAW,EAAE;AAE9B,IAAA,MAAM,IAAI,GAAG;AACT,QAAA,KAAK,EAAE,CAAA,EAAG,MAAM,CAAA,EAAG,QAAQ,CAAwB,sBAAA,CAAA;AACnD,QAAA,QAAQ,EAAE,CAAA,EAAG,MAAM,CAAA,EAAG,QAAQ,CAAE,CAAA;AAChC,QAAA,QAAQ,EAAE,QAAQ;QAClB,UAAU,EAAE,CAAQ,KAAA,EAAA,QAAQ,CAAE,CAAA;QAC9B,SAAS,EAAE,CAAO,IAAA,EAAA,QAAQ,CAAE,CAAA;QAC5B,QAAQ,EAAE,CAAW,QAAA,EAAA,QAAQ,CAAE,CAAA;KAClC;AAED,IAAA,OAAO,IAAmB;AAC9B;SAEgB,mBAAmB,GAAA;AAC/B,IAAA,MAAM,KAAK,GAAG;QACV,QAAQ,EAAEC,sBAAU,CAAC,aAAa;QAClC,QAAQ,EAAEA,sBAAU,CAAC,aAAa;AAClC,QAAA,UAAU,EAAE,SAAS;AACrB,QAAA,SAAS,EAAE,QAAQ;QACnB,KAAK,EAAEA,sBAAU,CAAC,UAAU;KAC/B;AAED,IAAA,OAAO,KAAoB;AAC/B;;;;;"}
1
+ {"version":3,"file":"user.js","sources":["../../src/server/user.ts"],"sourcesContent":["// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {Client4} from '@mattermost/client';\nimport {UserProfile, UserTimezone} from '@mattermost/types/users';\nimport {DateTime} from 'luxon';\n\nimport {getRandomId} from '@/util';\nimport {testConfig} from '@/test_config';\nimport {REMOTE_USERS_HOUR_LIMIT_END_OF_THE_DAY, REMOTE_USERS_HOUR_LIMIT_BEGINNING_OF_THE_DAY} from '@/constant';\n\nexport async function createNewUserProfile(\n client: Client4,\n options: {prefix?: string; disableTutorial?: boolean; disableOnboarding?: boolean} = {\n prefix: 'user',\n disableTutorial: true,\n disableOnboarding: true,\n },\n) {\n const randomUser = await createRandomUser(options.prefix);\n\n const newUser = await client.createUser(randomUser, '', '');\n // Set password to the created user profile so it can be used to login later\n newUser.password = randomUser.password;\n\n if (options.disableTutorial) {\n await client.savePreferences(newUser.id, [\n {user_id: newUser.id, category: 'tutorial_step', name: newUser.id, value: '999'},\n {user_id: newUser.id, category: 'crt_thread_pane_step', name: newUser.id, value: '999'},\n ]);\n }\n\n if (options.disableOnboarding) {\n await client.savePreferences(newUser.id, [\n {user_id: newUser.id, category: 'onboarding_task_list', name: 'onboarding_task_list_show', value: 'false'},\n {user_id: newUser.id, category: 'onboarding_task_list', name: 'onboarding_task_list_open', value: 'false'},\n ]);\n }\n\n return newUser;\n}\n\nexport async function createRandomUser(prefix = 'user') {\n const randomId = await getRandomId();\n\n const user = {\n email: `${prefix}${randomId}@sample.mattermost.com`,\n username: `${prefix}${randomId}`,\n password: 'passwd',\n first_name: `First${randomId}`,\n last_name: `Last${randomId}`,\n nickname: `Nickname${randomId}`,\n };\n\n return user as UserProfile;\n}\n\nexport function getDefaultAdminUser() {\n const admin = {\n username: testConfig.adminUsername,\n password: testConfig.adminPassword,\n first_name: 'Kenneth',\n last_name: 'Moreno',\n email: testConfig.adminEmail,\n };\n\n return admin as UserProfile;\n}\n\nexport function isOutsideRemoteUserHour(userTz: UserTimezone | undefined) {\n const timezone = (userTz?.useAutomaticTimezone ? userTz?.automaticTimezone : userTz?.manualTimezone) || 'UTC';\n\n const teammateUserDate = DateTime.local().setZone(timezone);\n\n const currentHour = teammateUserDate.hour;\n return (\n currentHour >= REMOTE_USERS_HOUR_LIMIT_END_OF_THE_DAY ||\n currentHour < REMOTE_USERS_HOUR_LIMIT_BEGINNING_OF_THE_DAY\n );\n}\n"],"names":["getRandomId","testConfig","DateTime","REMOTE_USERS_HOUR_LIMIT_END_OF_THE_DAY","REMOTE_USERS_HOUR_LIMIT_BEGINNING_OF_THE_DAY"],"mappings":"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"}
@@ -2,3 +2,12 @@ import { Locator, Page } from '@playwright/test';
2
2
  export { waitUntil } from 'async-wait-until';
3
3
  export declare function hideDynamicChannelsContent(page: Page): Promise<void>;
4
4
  export declare function waitForAnimationEnd(locator: Locator): Promise<Animation[]>;
5
+ export declare function toBeFocusedWithFocusVisible(locator: Locator): Promise<boolean>;
6
+ export declare function logFocusedElement(page: Page): Promise<"No element has focus" | {
7
+ selector: string;
8
+ role: string;
9
+ ariaLabel: string;
10
+ text: string;
11
+ nodeName: string;
12
+ isVisible: boolean;
13
+ }>;
@@ -1,24 +1,61 @@
1
1
  'use strict';
2
2
 
3
+ var test = require('@playwright/test');
3
4
  var asyncWaitUntil = require('async-wait-until');
4
5
 
5
6
  // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
6
7
  // See LICENSE.txt for license information.
7
8
  const visibilityHidden = 'visibility: hidden !important;';
8
- const hideTeamHeader = `.test-team-header {${visibilityHidden}} `;
9
+ const hideTeamHeader = `#sidebarTeamMenuButton {${visibilityHidden}} `;
9
10
  const hidePostHeaderTime = `.post__time {${visibilityHidden}} `;
10
11
  const hidePostProfileIcon = `.profile-icon {${visibilityHidden}} `;
12
+ const hideKeywordsAndMentionsDesc = `#keywordsAndMentionsDesc {${visibilityHidden}} `;
11
13
  async function hideDynamicChannelsContent(page) {
12
- await page.addStyleTag({ content: hideTeamHeader + hidePostHeaderTime + hidePostProfileIcon });
14
+ await page.addStyleTag({
15
+ content: hideTeamHeader + hidePostHeaderTime + hidePostProfileIcon + hideKeywordsAndMentionsDesc,
16
+ });
13
17
  }
14
18
  async function waitForAnimationEnd(locator) {
15
19
  return locator.evaluate((element) => Promise.all(element.getAnimations({ subtree: true }).map((animation) => animation.finished)));
16
20
  }
21
+ async function toBeFocusedWithFocusVisible(locator) {
22
+ await test.expect(locator).toBeVisible();
23
+ await test.expect(locator).toBeFocused();
24
+ return locator.evaluate((element) => element.matches(':focus-visible'));
25
+ }
26
+ async function logFocusedElement(page) {
27
+ const focusedElementInfo = await page.evaluate(() => {
28
+ const activeElement = document.activeElement;
29
+ if (!activeElement) {
30
+ return 'No element has focus';
31
+ }
32
+ const tagName = activeElement.tagName.toLowerCase();
33
+ const id = activeElement.id ? `#${activeElement.id}` : '(none)';
34
+ const className = activeElement.className ? `.${Array.from(activeElement.classList).join('.')}` : '(none)';
35
+ const role = activeElement.getAttribute('role') || '';
36
+ const ariaLabel = activeElement.getAttribute('aria-label') || '';
37
+ const text = activeElement.textContent?.slice(0, 50) || '';
38
+ const htmlElement = activeElement;
39
+ return {
40
+ selector: `tag: ${tagName} | id: ${id} | class: ${className}`,
41
+ role: role,
42
+ ariaLabel: ariaLabel,
43
+ text: text.length > 50 ? `${text}...` : text,
44
+ nodeName: activeElement.nodeName,
45
+ isVisible: htmlElement.offsetWidth > 0 && htmlElement.offsetHeight > 0,
46
+ };
47
+ });
48
+ // eslint-disable-next-line no-console
49
+ console.log('Currently focused element:', focusedElementInfo);
50
+ return focusedElementInfo;
51
+ }
17
52
 
18
53
  Object.defineProperty(exports, "waitUntil", {
19
54
  enumerable: true,
20
55
  get: function () { return asyncWaitUntil.waitUntil; }
21
56
  });
22
57
  exports.hideDynamicChannelsContent = hideDynamicChannelsContent;
58
+ exports.logFocusedElement = logFocusedElement;
59
+ exports.toBeFocusedWithFocusVisible = toBeFocusedWithFocusVisible;
23
60
  exports.waitForAnimationEnd = waitForAnimationEnd;
24
61
  //# sourceMappingURL=test_action.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"test_action.js","sources":["../src/test_action.ts"],"sourcesContent":["// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {Locator, Page} from '@playwright/test';\nexport {waitUntil} from 'async-wait-until';\n\nconst visibilityHidden = 'visibility: hidden !important;';\nconst hideTeamHeader = `.test-team-header {${visibilityHidden}} `;\nconst hidePostHeaderTime = `.post__time {${visibilityHidden}} `;\nconst hidePostProfileIcon = `.profile-icon {${visibilityHidden}} `;\n\nexport async function hideDynamicChannelsContent(page: Page) {\n await page.addStyleTag({content: hideTeamHeader + hidePostHeaderTime + hidePostProfileIcon});\n}\n\nexport async function waitForAnimationEnd(locator: Locator) {\n return locator.evaluate((element) =>\n Promise.all(element.getAnimations({subtree: true}).map((animation) => animation.finished)),\n );\n}\n"],"names":[],"mappings":";;;;AAAA;AACA;AAKA,MAAM,gBAAgB,GAAG,gCAAgC;AACzD,MAAM,cAAc,GAAG,CAAsB,mBAAA,EAAA,gBAAgB,IAAI;AACjE,MAAM,kBAAkB,GAAG,CAAgB,aAAA,EAAA,gBAAgB,IAAI;AAC/D,MAAM,mBAAmB,GAAG,CAAkB,eAAA,EAAA,gBAAgB,IAAI;AAE3D,eAAe,0BAA0B,CAAC,IAAU,EAAA;AACvD,IAAA,MAAM,IAAI,CAAC,WAAW,CAAC,EAAC,OAAO,EAAE,cAAc,GAAG,kBAAkB,GAAG,mBAAmB,EAAC,CAAC;AAChG;AAEO,eAAe,mBAAmB,CAAC,OAAgB,EAAA;AACtD,IAAA,OAAO,OAAO,CAAC,QAAQ,CAAC,CAAC,OAAO,KAC5B,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC,EAAC,OAAO,EAAE,IAAI,EAAC,CAAC,CAAC,GAAG,CAAC,CAAC,SAAS,KAAK,SAAS,CAAC,QAAQ,CAAC,CAAC,CAC7F;AACL;;;;;;;;;"}
1
+ {"version":3,"file":"test_action.js","sources":["../src/test_action.ts"],"sourcesContent":["// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {Locator, Page, expect} from '@playwright/test';\nexport {waitUntil} from 'async-wait-until';\n\nconst visibilityHidden = 'visibility: hidden !important;';\nconst hideTeamHeader = `#sidebarTeamMenuButton {${visibilityHidden}} `;\nconst hidePostHeaderTime = `.post__time {${visibilityHidden}} `;\nconst hidePostProfileIcon = `.profile-icon {${visibilityHidden}} `;\nconst hideKeywordsAndMentionsDesc = `#keywordsAndMentionsDesc {${visibilityHidden}} `;\n\nexport async function hideDynamicChannelsContent(page: Page) {\n await page.addStyleTag({\n content: hideTeamHeader + hidePostHeaderTime + hidePostProfileIcon + hideKeywordsAndMentionsDesc,\n });\n}\n\nexport async function waitForAnimationEnd(locator: Locator) {\n return locator.evaluate((element) =>\n Promise.all(element.getAnimations({subtree: true}).map((animation) => animation.finished)),\n );\n}\n\nexport async function toBeFocusedWithFocusVisible(locator: Locator) {\n await expect(locator).toBeVisible();\n await expect(locator).toBeFocused();\n return locator.evaluate((element) => element.matches(':focus-visible'));\n}\n\nexport async function logFocusedElement(page: Page) {\n const focusedElementInfo = await page.evaluate(() => {\n const activeElement = document.activeElement;\n if (!activeElement) {\n return 'No element has focus';\n }\n\n const tagName = activeElement.tagName.toLowerCase();\n const id = activeElement.id ? `#${activeElement.id}` : '(none)';\n const className = activeElement.className ? `.${Array.from(activeElement.classList).join('.')}` : '(none)';\n const role = activeElement.getAttribute('role') || '';\n const ariaLabel = activeElement.getAttribute('aria-label') || '';\n const text = activeElement.textContent?.slice(0, 50) || '';\n const htmlElement = activeElement as HTMLElement;\n\n return {\n selector: `tag: ${tagName} | id: ${id} | class: ${className}`,\n role: role,\n ariaLabel: ariaLabel,\n text: text.length > 50 ? `${text}...` : text,\n nodeName: activeElement.nodeName,\n isVisible: htmlElement.offsetWidth > 0 && htmlElement.offsetHeight > 0,\n };\n });\n\n // eslint-disable-next-line no-console\n console.log('Currently focused element:', focusedElementInfo);\n return focusedElementInfo;\n}\n"],"names":["expect"],"mappings":"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"}
@@ -23,7 +23,7 @@ var dotenv__namespace = /*#__PURE__*/_interopNamespaceDefault(dotenv);
23
23
 
24
24
  // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
25
25
  // See LICENSE.txt for license information.
26
- dotenv__namespace.config();
26
+ dotenv__namespace.config({ quiet: true });
27
27
  // All process.env should be defined here
28
28
  class TestConfig {
29
29
  baseURL;
@@ -1 +1 @@
1
- {"version":3,"file":"test_config.js","sources":["../src/test_config.ts"],"sourcesContent":["// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport * as dotenv from 'dotenv';\n\ndotenv.config();\n\n// All process.env should be defined here\nexport class TestConfig {\n baseURL: string;\n adminUsername: string;\n adminPassword: string;\n adminEmail: string;\n ensurePluginsInstalled: string[];\n haClusterEnabled: boolean;\n haClusterNodeCount: number;\n haClusterName: string;\n pushNotificationServer: string;\n resetBeforeTest: boolean;\n isCI: boolean;\n headless: boolean;\n slowMo: number;\n workers: number;\n snapshotEnabled: boolean;\n percyEnabled: boolean;\n\n constructor() {\n // Server\n this.baseURL = process.env.PW_BASE_URL || 'http://localhost:8065';\n this.adminUsername = process.env.PW_ADMIN_USERNAME || 'sysadmin';\n this.adminPassword = process.env.PW_ADMIN_PASSWORD || 'Sys@dmin-sample1';\n this.adminEmail = process.env.PW_ADMIN_EMAIL || 'sysadmin@sample.mattermost.com';\n this.ensurePluginsInstalled =\n typeof process.env?.PW_ENSURE_PLUGINS_INSTALLED === 'string'\n ? process.env.PW_ENSURE_PLUGINS_INSTALLED.split(',').filter((plugin) => Boolean(plugin))\n : [];\n this.haClusterEnabled = parseBool(process.env.PW_HA_CLUSTER_ENABLED, false);\n this.haClusterNodeCount = parseNumber(process.env.PW_HA_CLUSTER_NODE_COUNT, 2);\n this.haClusterName = process.env.PW_HA_CLUSTER_NAME || 'mm_dev_cluster';\n this.pushNotificationServer = process.env.PW_PUSH_NOTIFICATION_SERVER || 'https://push-test.mattermost.com';\n this.resetBeforeTest = parseBool(process.env.PW_RESET_BEFORE_TEST, false);\n // CI\n this.isCI = !!process.env.CI;\n // Playwright\n this.headless = parseBool(process.env.PW_HEADLESS, true);\n this.slowMo = parseNumber(process.env.PW_SLOWMO, 0);\n this.workers = parseNumber(process.env.PW_WORKERS, 1);\n // Visual tests\n this.snapshotEnabled = parseBool(process.env.PW_SNAPSHOT_ENABLE, false);\n this.percyEnabled = parseBool(process.env.PW_PERCY_ENABLE, false);\n }\n}\n\n// Create a singleton instance\nexport const testConfig = new TestConfig();\n\nfunction parseBool(actualValue: string | undefined, defaultValue: boolean) {\n return actualValue ? actualValue === 'true' : defaultValue;\n}\n\nfunction parseNumber(actualValue: string | undefined, defaultValue: number) {\n return actualValue ? parseInt(actualValue, 10) : defaultValue;\n}\n"],"names":["dotenv"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAAA;AACA;AAIAA,iBAAM,CAAC,MAAM,EAAE;AAEf;MACa,UAAU,CAAA;AACnB,IAAA,OAAO;AACP,IAAA,aAAa;AACb,IAAA,aAAa;AACb,IAAA,UAAU;AACV,IAAA,sBAAsB;AACtB,IAAA,gBAAgB;AAChB,IAAA,kBAAkB;AAClB,IAAA,aAAa;AACb,IAAA,sBAAsB;AACtB,IAAA,eAAe;AACf,IAAA,IAAI;AACJ,IAAA,QAAQ;AACR,IAAA,MAAM;AACN,IAAA,OAAO;AACP,IAAA,eAAe;AACf,IAAA,YAAY;AAEZ,IAAA,WAAA,GAAA;;QAEI,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,uBAAuB;QACjE,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,UAAU;QAChE,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,kBAAkB;QACxE,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,gCAAgC;AAChF,QAAA,IAAI,CAAC,sBAAsB;AACvB,YAAA,OAAO,OAAO,CAAC,GAAG,EAAE,2BAA2B,KAAK;kBAC9C,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC;kBACrF,EAAE;AACZ,QAAA,IAAI,CAAC,gBAAgB,GAAG,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,qBAAqB,EAAE,KAAK,CAAC;AAC3E,QAAA,IAAI,CAAC,kBAAkB,GAAG,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,wBAAwB,EAAE,CAAC,CAAC;QAC9E,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,gBAAgB;QACvE,IAAI,CAAC,sBAAsB,GAAG,OAAO,CAAC,GAAG,CAAC,2BAA2B,IAAI,kCAAkC;AAC3G,QAAA,IAAI,CAAC,eAAe,GAAG,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,oBAAoB,EAAE,KAAK,CAAC;;QAEzE,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;;AAE5B,QAAA,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,IAAI,CAAC;AACxD,QAAA,IAAI,CAAC,MAAM,GAAG,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC;AACnD,QAAA,IAAI,CAAC,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC;;AAErD,QAAA,IAAI,CAAC,eAAe,GAAG,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,EAAE,KAAK,CAAC;AACvE,QAAA,IAAI,CAAC,YAAY,GAAG,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,KAAK,CAAC;;AAExE;AAED;AACa,MAAA,UAAU,GAAG,IAAI,UAAU;AAExC,SAAS,SAAS,CAAC,WAA+B,EAAE,YAAqB,EAAA;IACrE,OAAO,WAAW,GAAG,WAAW,KAAK,MAAM,GAAG,YAAY;AAC9D;AAEA,SAAS,WAAW,CAAC,WAA+B,EAAE,YAAoB,EAAA;AACtE,IAAA,OAAO,WAAW,GAAG,QAAQ,CAAC,WAAW,EAAE,EAAE,CAAC,GAAG,YAAY;AACjE;;;;;"}
1
+ {"version":3,"file":"test_config.js","sources":["../src/test_config.ts"],"sourcesContent":["// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport * as dotenv from 'dotenv';\n\ndotenv.config({quiet: true});\n\n// All process.env should be defined here\nexport class TestConfig {\n baseURL: string;\n adminUsername: string;\n adminPassword: string;\n adminEmail: string;\n ensurePluginsInstalled: string[];\n haClusterEnabled: boolean;\n haClusterNodeCount: number;\n haClusterName: string;\n pushNotificationServer: string;\n resetBeforeTest: boolean;\n isCI: boolean;\n headless: boolean;\n slowMo: number;\n workers: number;\n snapshotEnabled: boolean;\n percyEnabled: boolean;\n\n constructor() {\n // Server\n this.baseURL = process.env.PW_BASE_URL || 'http://localhost:8065';\n this.adminUsername = process.env.PW_ADMIN_USERNAME || 'sysadmin';\n this.adminPassword = process.env.PW_ADMIN_PASSWORD || 'Sys@dmin-sample1';\n this.adminEmail = process.env.PW_ADMIN_EMAIL || 'sysadmin@sample.mattermost.com';\n this.ensurePluginsInstalled =\n typeof process.env?.PW_ENSURE_PLUGINS_INSTALLED === 'string'\n ? process.env.PW_ENSURE_PLUGINS_INSTALLED.split(',').filter((plugin) => Boolean(plugin))\n : [];\n this.haClusterEnabled = parseBool(process.env.PW_HA_CLUSTER_ENABLED, false);\n this.haClusterNodeCount = parseNumber(process.env.PW_HA_CLUSTER_NODE_COUNT, 2);\n this.haClusterName = process.env.PW_HA_CLUSTER_NAME || 'mm_dev_cluster';\n this.pushNotificationServer = process.env.PW_PUSH_NOTIFICATION_SERVER || 'https://push-test.mattermost.com';\n this.resetBeforeTest = parseBool(process.env.PW_RESET_BEFORE_TEST, false);\n // CI\n this.isCI = !!process.env.CI;\n // Playwright\n this.headless = parseBool(process.env.PW_HEADLESS, true);\n this.slowMo = parseNumber(process.env.PW_SLOWMO, 0);\n this.workers = parseNumber(process.env.PW_WORKERS, 1);\n // Visual tests\n this.snapshotEnabled = parseBool(process.env.PW_SNAPSHOT_ENABLE, false);\n this.percyEnabled = parseBool(process.env.PW_PERCY_ENABLE, false);\n }\n}\n\n// Create a singleton instance\nexport const testConfig = new TestConfig();\n\nfunction parseBool(actualValue: string | undefined, defaultValue: boolean) {\n return actualValue ? actualValue === 'true' : defaultValue;\n}\n\nfunction parseNumber(actualValue: string | undefined, defaultValue: number) {\n return actualValue ? parseInt(actualValue, 10) : defaultValue;\n}\n"],"names":["dotenv"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAAA;AACA;AAIAA,iBAAM,CAAC,MAAM,CAAC,EAAC,KAAK,EAAE,IAAI,EAAC,CAAC;AAE5B;MACa,UAAU,CAAA;AACnB,IAAA,OAAO;AACP,IAAA,aAAa;AACb,IAAA,aAAa;AACb,IAAA,UAAU;AACV,IAAA,sBAAsB;AACtB,IAAA,gBAAgB;AAChB,IAAA,kBAAkB;AAClB,IAAA,aAAa;AACb,IAAA,sBAAsB;AACtB,IAAA,eAAe;AACf,IAAA,IAAI;AACJ,IAAA,QAAQ;AACR,IAAA,MAAM;AACN,IAAA,OAAO;AACP,IAAA,eAAe;AACf,IAAA,YAAY;AAEZ,IAAA,WAAA,GAAA;;QAEI,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,uBAAuB;QACjE,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,UAAU;QAChE,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,kBAAkB;QACxE,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,gCAAgC;AAChF,QAAA,IAAI,CAAC,sBAAsB;AACvB,YAAA,OAAO,OAAO,CAAC,GAAG,EAAE,2BAA2B,KAAK;kBAC9C,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC;kBACrF,EAAE;AACZ,QAAA,IAAI,CAAC,gBAAgB,GAAG,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,qBAAqB,EAAE,KAAK,CAAC;AAC3E,QAAA,IAAI,CAAC,kBAAkB,GAAG,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,wBAAwB,EAAE,CAAC,CAAC;QAC9E,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,gBAAgB;QACvE,IAAI,CAAC,sBAAsB,GAAG,OAAO,CAAC,GAAG,CAAC,2BAA2B,IAAI,kCAAkC;AAC3G,QAAA,IAAI,CAAC,eAAe,GAAG,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,oBAAoB,EAAE,KAAK,CAAC;;QAEzE,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;;AAE5B,QAAA,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,IAAI,CAAC;AACxD,QAAA,IAAI,CAAC,MAAM,GAAG,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC;AACnD,QAAA,IAAI,CAAC,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC;;AAErD,QAAA,IAAI,CAAC,eAAe,GAAG,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,EAAE,KAAK,CAAC;AACvE,QAAA,IAAI,CAAC,YAAY,GAAG,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,KAAK,CAAC;IACrE;AACH;AAED;AACO,MAAM,UAAU,GAAG,IAAI,UAAU;AAExC,SAAS,SAAS,CAAC,WAA+B,EAAE,YAAqB,EAAA;IACrE,OAAO,WAAW,GAAG,WAAW,KAAK,MAAM,GAAG,YAAY;AAC9D;AAEA,SAAS,WAAW,CAAC,WAA+B,EAAE,YAAoB,EAAA;AACtE,IAAA,OAAO,WAAW,GAAG,QAAQ,CAAC,WAAW,EAAE,EAAE,CAAC,GAAG,YAAY;AACjE;;;;;"}
@@ -4,8 +4,8 @@ import { AxeBuilder } from '@axe-core/playwright';
4
4
  import { TestBrowser } from './browser_context';
5
5
  import { ensureLicense, ensurePluginsLoaded, ensureServerDeployment, shouldHaveCallsEnabled, shouldHaveFeatureFlag, shouldRunInLinux, skipIfFeatureFlagNotSet, skipIfNoLicense } from './flag';
6
6
  import { getBlobFromAsset, getFileFromAsset } from './file';
7
- import { createRandomChannel, createRandomPost, createRandomTeam, createRandomUser, getAdminClient, initSetup } from './server';
8
- import { hideDynamicChannelsContent, waitForAnimationEnd } from './test_action';
7
+ import { createNewUserProfile, createNewTeam, createRandomChannel, createRandomPost, createRandomTeam, createRandomUser, getAdminClient, initSetup, isOutsideRemoteUserHour, makeClient, mergeWithOnPremServerConfig } from './server';
8
+ import { toBeFocusedWithFocusVisible, hideDynamicChannelsContent, waitForAnimationEnd, logFocusedElement } from './test_action';
9
9
  import { matchSnapshot } from './visual';
10
10
  import { stubNotification, waitForNotification } from './mock_browser_api';
11
11
  import { getRandomId } from './util';
@@ -32,12 +32,19 @@ export declare class PlaywrightExtended {
32
32
  readonly getFileFromAsset: typeof getFileFromAsset;
33
33
  readonly ensurePluginsLoaded: typeof ensurePluginsLoaded;
34
34
  readonly getAdminClient: typeof getAdminClient;
35
+ readonly mergeWithOnPremServerConfig: typeof mergeWithOnPremServerConfig;
35
36
  readonly initSetup: typeof initSetup;
37
+ readonly toBeFocusedWithFocusVisible: typeof toBeFocusedWithFocusVisible;
36
38
  readonly hideDynamicChannelsContent: typeof hideDynamicChannelsContent;
37
39
  readonly waitForAnimationEnd: typeof waitForAnimationEnd;
38
40
  readonly waitUntil: <T extends import("async-wait-until").PredicateReturnValue>(predicate: import("async-wait-until").Predicate<T>, options?: number | import("async-wait-until").Options, intervalBetweenAttempts?: number) => Promise<T>;
41
+ readonly logFocusedElement: typeof logFocusedElement;
39
42
  readonly stubNotification: typeof stubNotification;
40
43
  readonly waitForNotification: typeof waitForNotification;
44
+ readonly createNewUserProfile: typeof createNewUserProfile;
45
+ readonly createNewTeam: typeof createNewTeam;
46
+ readonly isOutsideRemoteUserHour: typeof isOutsideRemoteUserHour;
47
+ readonly makeClient: typeof makeClient;
41
48
  readonly matchSnapshot: typeof matchSnapshot;
42
49
  readonly duration: {
43
50
  half_sec: number;
@@ -51,7 +58,7 @@ export declare class PlaywrightExtended {
51
58
  four_min: number;
52
59
  };
53
60
  readonly simpleEmailRe: RegExp;
54
- readonly wait: (ms?: number) => Promise<unknown>;
61
+ readonly wait: (ms?: number) => Promise<void>;
55
62
  readonly random: {
56
63
  id: typeof getRandomId;
57
64
  channel: typeof createRandomChannel;
@@ -5,10 +5,9 @@ var playwright = require('@axe-core/playwright');
5
5
  var browser_context = require('./browser_context.js');
6
6
  var flag = require('./flag.js');
7
7
  var file = require('./file.js');
8
- require('@mattermost/client');
9
- require('./test_config.js');
8
+ var client = require('./server/client.js');
10
9
  var channel = require('./server/channel.js');
11
- require('./server/default_config.js');
10
+ var default_config = require('./server/default_config.js');
12
11
  var init = require('./server/init.js');
13
12
  var post = require('./server/post.js');
14
13
  var team = require('./server/team.js');
@@ -51,14 +50,22 @@ class PlaywrightExtended {
51
50
  // ./server
52
51
  ensurePluginsLoaded;
53
52
  getAdminClient;
53
+ mergeWithOnPremServerConfig;
54
54
  initSetup;
55
55
  // ./test_action
56
+ toBeFocusedWithFocusVisible;
56
57
  hideDynamicChannelsContent;
57
58
  waitForAnimationEnd;
58
59
  waitUntil;
60
+ logFocusedElement;
59
61
  // ./mock_browser_api
60
62
  stubNotification;
61
63
  waitForNotification;
64
+ // ./server
65
+ createNewUserProfile;
66
+ createNewTeam;
67
+ isOutsideRemoteUserHour;
68
+ makeClient;
62
69
  // ./visual
63
70
  matchSnapshot;
64
71
  // ./util
@@ -91,10 +98,14 @@ class PlaywrightExtended {
91
98
  this.ensurePluginsLoaded = flag.ensurePluginsLoaded;
92
99
  this.initSetup = init.initSetup;
93
100
  this.getAdminClient = init.getAdminClient;
101
+ this.mergeWithOnPremServerConfig = default_config.mergeWithOnPremServerConfig;
102
+ this.isOutsideRemoteUserHour = user.isOutsideRemoteUserHour;
94
103
  // ./test_action
104
+ this.toBeFocusedWithFocusVisible = test_action.toBeFocusedWithFocusVisible;
95
105
  this.hideDynamicChannelsContent = test_action.hideDynamicChannelsContent;
96
106
  this.waitForAnimationEnd = test_action.waitForAnimationEnd;
97
107
  this.waitUntil = asyncWaitUntil.waitUntil;
108
+ this.logFocusedElement = test_action.logFocusedElement;
98
109
  // unauthenticated page
99
110
  this.loginPage = new index.pages.LoginPage(page);
100
111
  this.landingLoginPage = new index.pages.LandingLoginPage(page, isMobile);
@@ -103,6 +114,10 @@ class PlaywrightExtended {
103
114
  // ./mock_browser_api
104
115
  this.stubNotification = mock_browser_api.stubNotification;
105
116
  this.waitForNotification = mock_browser_api.waitForNotification;
117
+ // ./server
118
+ this.createNewUserProfile = user.createNewUserProfile;
119
+ this.createNewTeam = team.createNewTeam;
120
+ this.makeClient = client.makeClient;
106
121
  // ./visual
107
122
  this.matchSnapshot = index$1.matchSnapshot;
108
123
  // ./util
@@ -126,7 +141,7 @@ class PlaywrightExtended {
126
141
  class AxeBuilderExtended {
127
142
  builder;
128
143
  // See https://github.com/dequelabs/axe-core/blob/master/doc/API.md#axe-core-tags
129
- tags = ['wcag2a', 'wcag2aa'];
144
+ tags = ['wcag2a', 'wcag2aa', 'wcag21aa'];
130
145
  constructor() {
131
146
  this.builder = (page, options = {}) => {
132
147
  // See https://github.com/dequelabs/axe-core/blob/master/doc/rule-descriptions.md#wcag-20-level-a--aa-rules
@@ -1 +1 @@
1
- {"version":3,"file":"test_fixture.js","sources":["../src/test_fixture.ts"],"sourcesContent":["// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {Browser, Page, test as base} from '@playwright/test';\nimport {AxeResults} from 'axe-core';\nimport {AxeBuilder} from '@axe-core/playwright';\n\nimport {TestBrowser} from './browser_context';\nimport {\n ensureLicense,\n ensurePluginsLoaded,\n ensureServerDeployment,\n shouldHaveCallsEnabled,\n shouldHaveFeatureFlag,\n shouldRunInLinux,\n skipIfFeatureFlagNotSet,\n skipIfNoLicense,\n} from './flag';\nimport {getBlobFromAsset, getFileFromAsset} from './file';\nimport {\n createRandomChannel,\n createRandomPost,\n createRandomTeam,\n createRandomUser,\n getAdminClient,\n initSetup,\n} from './server';\nimport {hideDynamicChannelsContent, waitForAnimationEnd, waitUntil} from './test_action';\nimport {pages} from './ui/pages';\nimport {matchSnapshot} from './visual';\nimport {stubNotification, waitForNotification} from './mock_browser_api';\nimport {duration, getRandomId, simpleEmailRe, wait} from './util';\n\nexport {expect} from '@playwright/test';\n\nexport type ExtendedFixtures = {\n axe: AxeBuilderExtended;\n pw: PlaywrightExtended;\n};\n\ntype AxeBuilderOptions = {\n disableColorContrast?: boolean;\n disableLinkInTextBlock?: boolean;\n};\n\nexport const test = base.extend<ExtendedFixtures>({\n // eslint-disable-next-line no-empty-pattern\n axe: async ({}, use) => {\n const ab = new AxeBuilderExtended();\n await use(ab);\n },\n pw: async ({browser, page, isMobile}, use) => {\n const pw = new PlaywrightExtended(browser, page, isMobile);\n await use(pw);\n await pw.testBrowser.close();\n },\n});\n\nexport class PlaywrightExtended {\n // ./browser_context\n readonly testBrowser;\n\n // ./flag\n readonly shouldHaveCallsEnabled;\n readonly shouldHaveFeatureFlag;\n readonly shouldRunInLinux;\n readonly ensureLicense;\n readonly ensureServerDeployment;\n readonly skipIfNoLicense;\n readonly skipIfFeatureFlagNotSet;\n\n // ./file\n readonly getBlobFromAsset;\n readonly getFileFromAsset;\n\n // ./server\n readonly ensurePluginsLoaded;\n readonly getAdminClient;\n readonly initSetup;\n\n // ./test_action\n readonly hideDynamicChannelsContent;\n readonly waitForAnimationEnd;\n readonly waitUntil;\n\n // ./mock_browser_api\n readonly stubNotification;\n readonly waitForNotification;\n\n // ./visual\n readonly matchSnapshot;\n\n // ./util\n readonly duration;\n readonly simpleEmailRe;\n readonly wait;\n\n // random\n readonly random;\n\n // unauthenticated page\n readonly loginPage;\n readonly landingLoginPage;\n readonly signupPage;\n readonly resetPasswordPage;\n\n readonly hasSeenLandingPage;\n\n constructor(browser: Browser, page: Page, isMobile: boolean) {\n // ./browser_context\n this.testBrowser = new TestBrowser(browser);\n\n // ./flag\n this.shouldHaveCallsEnabled = shouldHaveCallsEnabled;\n this.shouldHaveFeatureFlag = shouldHaveFeatureFlag;\n this.shouldRunInLinux = shouldRunInLinux;\n this.ensureLicense = ensureLicense;\n this.ensureServerDeployment = ensureServerDeployment;\n this.skipIfNoLicense = skipIfNoLicense;\n this.skipIfFeatureFlagNotSet = skipIfFeatureFlagNotSet;\n\n // ./file\n this.getBlobFromAsset = getBlobFromAsset;\n this.getFileFromAsset = getFileFromAsset;\n\n // ./server\n this.ensurePluginsLoaded = ensurePluginsLoaded;\n this.initSetup = initSetup;\n this.getAdminClient = getAdminClient;\n\n // ./test_action\n this.hideDynamicChannelsContent = hideDynamicChannelsContent;\n this.waitForAnimationEnd = waitForAnimationEnd;\n this.waitUntil = waitUntil;\n\n // unauthenticated page\n this.loginPage = new pages.LoginPage(page);\n this.landingLoginPage = new pages.LandingLoginPage(page, isMobile);\n this.signupPage = new pages.SignupPage(page);\n this.resetPasswordPage = new pages.ResetPasswordPage(page);\n\n // ./mock_browser_api\n this.stubNotification = stubNotification;\n this.waitForNotification = waitForNotification;\n\n // ./visual\n this.matchSnapshot = matchSnapshot;\n\n // ./util\n this.duration = duration;\n this.wait = wait;\n this.simpleEmailRe = simpleEmailRe;\n\n this.random = {\n id: getRandomId,\n channel: createRandomChannel,\n post: createRandomPost,\n team: createRandomTeam,\n user: createRandomUser,\n };\n\n this.hasSeenLandingPage = async () => {\n // Visit the base URL to be able to set the localStorage\n await page.goto('/');\n return await waitUntilLocalStorageIsSet(page, '__landingPageSeen__', 'true');\n };\n }\n}\n\nexport class AxeBuilderExtended {\n readonly builder: (page: Page, options?: AxeBuilderOptions) => AxeBuilder;\n\n // See https://github.com/dequelabs/axe-core/blob/master/doc/API.md#axe-core-tags\n readonly tags: string[] = ['wcag2a', 'wcag2aa'];\n\n constructor() {\n this.builder = (page: Page, options: AxeBuilderOptions = {}) => {\n // See https://github.com/dequelabs/axe-core/blob/master/doc/rule-descriptions.md#wcag-20-level-a--aa-rules\n const disabledRules: string[] = [];\n\n if (options.disableColorContrast) {\n // Disabled in pages due to impact to overall theme of Mattermost.\n // Option: make use of custom theme to improve color contrast.\n disabledRules.push('color-contrast');\n }\n\n if (options.disableLinkInTextBlock) {\n // Disabled in pages due to impact to overall theme of Mattermost.\n // Option: make use of custom theme to improve color contrast.\n disabledRules.push('link-in-text-block');\n }\n\n return new AxeBuilder({page}).withTags(this.tags).disableRules(disabledRules);\n };\n }\n\n violationFingerprints(accessibilityScanResults: AxeResults) {\n const fingerprints = accessibilityScanResults.violations.map((violation) => ({\n rule: violation.id,\n description: violation.description,\n helpUrl: violation.helpUrl,\n targets: violation.nodes.map((node) => {\n return {target: node.target, impact: node.impact, html: node.html};\n }),\n }));\n\n return JSON.stringify(fingerprints, null, 2);\n }\n}\n\nasync function waitUntilLocalStorageIsSet(page: Page, key: string, value: string, timeout = duration.ten_sec) {\n await waitUntil(\n () =>\n page.evaluate(\n ({key, value}) => {\n if (localStorage.getItem(key) === value) {\n return true;\n }\n localStorage.setItem(key, value);\n return false;\n },\n {key, value},\n ),\n {timeout},\n );\n}\n"],"names":["base","TestBrowser","shouldHaveCallsEnabled","shouldHaveFeatureFlag","shouldRunInLinux","ensureLicense","ensureServerDeployment","skipIfNoLicense","skipIfFeatureFlagNotSet","getBlobFromAsset","getFileFromAsset","ensurePluginsLoaded","initSetup","getAdminClient","hideDynamicChannelsContent","waitForAnimationEnd","waitUntil","pages","stubNotification","waitForNotification","matchSnapshot","duration","wait","simpleEmailRe","getRandomId","createRandomChannel","createRandomPost","createRandomTeam","createRandomUser","AxeBuilder"],"mappings":"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"}
1
+ {"version":3,"file":"test_fixture.js","sources":["../src/test_fixture.ts"],"sourcesContent":["// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {Browser, Page, test as base} from '@playwright/test';\nimport {AxeResults} from 'axe-core';\nimport {AxeBuilder} from '@axe-core/playwright';\n\nimport {TestBrowser} from './browser_context';\nimport {\n ensureLicense,\n ensurePluginsLoaded,\n ensureServerDeployment,\n shouldHaveCallsEnabled,\n shouldHaveFeatureFlag,\n shouldRunInLinux,\n skipIfFeatureFlagNotSet,\n skipIfNoLicense,\n} from './flag';\nimport {getBlobFromAsset, getFileFromAsset} from './file';\nimport {\n createNewUserProfile,\n createNewTeam,\n createRandomChannel,\n createRandomPost,\n createRandomTeam,\n createRandomUser,\n getAdminClient,\n initSetup,\n isOutsideRemoteUserHour,\n makeClient,\n mergeWithOnPremServerConfig,\n} from './server';\nimport {\n toBeFocusedWithFocusVisible,\n hideDynamicChannelsContent,\n waitForAnimationEnd,\n waitUntil,\n logFocusedElement,\n} from './test_action';\nimport {pages} from './ui/pages';\nimport {matchSnapshot} from './visual';\nimport {stubNotification, waitForNotification} from './mock_browser_api';\nimport {duration, getRandomId, simpleEmailRe, wait} from './util';\n\nexport {expect} from '@playwright/test';\n\nexport type ExtendedFixtures = {\n axe: AxeBuilderExtended;\n pw: PlaywrightExtended;\n};\n\ntype AxeBuilderOptions = {\n disableColorContrast?: boolean;\n disableLinkInTextBlock?: boolean;\n};\n\nexport const test = base.extend<ExtendedFixtures>({\n // eslint-disable-next-line no-empty-pattern\n axe: async ({}, use) => {\n const ab = new AxeBuilderExtended();\n await use(ab);\n },\n pw: async ({browser, page, isMobile}, use) => {\n const pw = new PlaywrightExtended(browser, page, isMobile);\n await use(pw);\n await pw.testBrowser.close();\n },\n});\n\nexport class PlaywrightExtended {\n // ./browser_context\n readonly testBrowser;\n\n // ./flag\n readonly shouldHaveCallsEnabled;\n readonly shouldHaveFeatureFlag;\n readonly shouldRunInLinux;\n readonly ensureLicense;\n readonly ensureServerDeployment;\n readonly skipIfNoLicense;\n readonly skipIfFeatureFlagNotSet;\n\n // ./file\n readonly getBlobFromAsset;\n readonly getFileFromAsset;\n\n // ./server\n readonly ensurePluginsLoaded;\n readonly getAdminClient;\n readonly mergeWithOnPremServerConfig;\n readonly initSetup;\n\n // ./test_action\n readonly toBeFocusedWithFocusVisible;\n readonly hideDynamicChannelsContent;\n readonly waitForAnimationEnd;\n readonly waitUntil;\n readonly logFocusedElement;\n\n // ./mock_browser_api\n readonly stubNotification;\n readonly waitForNotification;\n\n // ./server\n readonly createNewUserProfile;\n readonly createNewTeam;\n readonly isOutsideRemoteUserHour;\n readonly makeClient;\n\n // ./visual\n readonly matchSnapshot;\n\n // ./util\n readonly duration;\n readonly simpleEmailRe;\n readonly wait;\n\n // random\n readonly random;\n\n // unauthenticated page\n readonly loginPage;\n readonly landingLoginPage;\n readonly signupPage;\n readonly resetPasswordPage;\n\n readonly hasSeenLandingPage;\n\n constructor(browser: Browser, page: Page, isMobile: boolean) {\n // ./browser_context\n this.testBrowser = new TestBrowser(browser);\n\n // ./flag\n this.shouldHaveCallsEnabled = shouldHaveCallsEnabled;\n this.shouldHaveFeatureFlag = shouldHaveFeatureFlag;\n this.shouldRunInLinux = shouldRunInLinux;\n this.ensureLicense = ensureLicense;\n this.ensureServerDeployment = ensureServerDeployment;\n this.skipIfNoLicense = skipIfNoLicense;\n this.skipIfFeatureFlagNotSet = skipIfFeatureFlagNotSet;\n\n // ./file\n this.getBlobFromAsset = getBlobFromAsset;\n this.getFileFromAsset = getFileFromAsset;\n\n // ./server\n this.ensurePluginsLoaded = ensurePluginsLoaded;\n this.initSetup = initSetup;\n this.getAdminClient = getAdminClient;\n this.mergeWithOnPremServerConfig = mergeWithOnPremServerConfig;\n this.isOutsideRemoteUserHour = isOutsideRemoteUserHour;\n\n // ./test_action\n this.toBeFocusedWithFocusVisible = toBeFocusedWithFocusVisible;\n this.hideDynamicChannelsContent = hideDynamicChannelsContent;\n this.waitForAnimationEnd = waitForAnimationEnd;\n this.waitUntil = waitUntil;\n this.logFocusedElement = logFocusedElement;\n\n // unauthenticated page\n this.loginPage = new pages.LoginPage(page);\n this.landingLoginPage = new pages.LandingLoginPage(page, isMobile);\n this.signupPage = new pages.SignupPage(page);\n this.resetPasswordPage = new pages.ResetPasswordPage(page);\n\n // ./mock_browser_api\n this.stubNotification = stubNotification;\n this.waitForNotification = waitForNotification;\n\n // ./server\n this.createNewUserProfile = createNewUserProfile;\n this.createNewTeam = createNewTeam;\n this.makeClient = makeClient;\n\n // ./visual\n this.matchSnapshot = matchSnapshot;\n\n // ./util\n this.duration = duration;\n this.wait = wait;\n this.simpleEmailRe = simpleEmailRe;\n\n this.random = {\n id: getRandomId,\n channel: createRandomChannel,\n post: createRandomPost,\n team: createRandomTeam,\n user: createRandomUser,\n };\n\n this.hasSeenLandingPage = async () => {\n // Visit the base URL to be able to set the localStorage\n await page.goto('/');\n return await waitUntilLocalStorageIsSet(page, '__landingPageSeen__', 'true');\n };\n }\n}\n\nexport class AxeBuilderExtended {\n readonly builder: (page: Page, options?: AxeBuilderOptions) => AxeBuilder;\n\n // See https://github.com/dequelabs/axe-core/blob/master/doc/API.md#axe-core-tags\n readonly tags: string[] = ['wcag2a', 'wcag2aa', 'wcag21aa'];\n\n constructor() {\n this.builder = (page: Page, options: AxeBuilderOptions = {}) => {\n // See https://github.com/dequelabs/axe-core/blob/master/doc/rule-descriptions.md#wcag-20-level-a--aa-rules\n const disabledRules: string[] = [];\n\n if (options.disableColorContrast) {\n // Disabled in pages due to impact to overall theme of Mattermost.\n // Option: make use of custom theme to improve color contrast.\n disabledRules.push('color-contrast');\n }\n\n if (options.disableLinkInTextBlock) {\n // Disabled in pages due to impact to overall theme of Mattermost.\n // Option: make use of custom theme to improve color contrast.\n disabledRules.push('link-in-text-block');\n }\n\n return new AxeBuilder({page}).withTags(this.tags).disableRules(disabledRules);\n };\n }\n\n violationFingerprints(accessibilityScanResults: AxeResults) {\n const fingerprints = accessibilityScanResults.violations.map((violation) => ({\n rule: violation.id,\n description: violation.description,\n helpUrl: violation.helpUrl,\n targets: violation.nodes.map((node) => {\n return {target: node.target, impact: node.impact, html: node.html};\n }),\n }));\n\n return JSON.stringify(fingerprints, null, 2);\n }\n}\n\nasync function waitUntilLocalStorageIsSet(page: Page, key: string, value: string, timeout = duration.ten_sec) {\n await waitUntil(\n () =>\n page.evaluate(\n ({key, value}) => {\n if (localStorage.getItem(key) === value) {\n return true;\n }\n localStorage.setItem(key, value);\n return false;\n },\n {key, value},\n ),\n {timeout},\n );\n}\n"],"names":["base","TestBrowser","shouldHaveCallsEnabled","shouldHaveFeatureFlag","shouldRunInLinux","ensureLicense","ensureServerDeployment","skipIfNoLicense","skipIfFeatureFlagNotSet","getBlobFromAsset","getFileFromAsset","ensurePluginsLoaded","initSetup","getAdminClient","mergeWithOnPremServerConfig","isOutsideRemoteUserHour","toBeFocusedWithFocusVisible","hideDynamicChannelsContent","waitForAnimationEnd","waitUntil","logFocusedElement","pages","stubNotification","waitForNotification","createNewUserProfile","createNewTeam","makeClient","matchSnapshot","duration","wait","simpleEmailRe","getRandomId","createRandomChannel","createRandomPost","createRandomTeam","createRandomUser","AxeBuilder"],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"root":["../src/browser_context.ts","../src/constant.ts","../src/file.ts","../src/flag.ts","../src/global_setup.ts","../src/index.ts","../src/mock_browser_api.ts","../src/test_action.ts","../src/test_config.ts","../src/test_fixture.ts","../src/types.ts","../src/util.ts","../src/server/channel.ts","../src/server/client.ts","../src/server/default_config.ts","../src/server/index.ts","../src/server/init.ts","../src/server/post.ts","../src/server/team.ts","../src/server/user.ts","../src/ui/components/footer.ts","../src/ui/components/global_header.ts","../src/ui/components/index.ts","../src/ui/components/main_header.ts","../src/ui/components/user_account_menu.ts","../src/ui/components/channels/app_bar.ts","../src/ui/components/channels/center_view.ts","../src/ui/components/channels/delete_post_confirmation_dialog.ts","../src/ui/components/channels/delete_post_modal.ts","../src/ui/components/channels/delete_scheduled_post_modal.ts","../src/ui/components/channels/draft_post.ts","../src/ui/components/channels/emoji_gif_picker.ts","../src/ui/components/channels/find_channels_modal.ts","../src/ui/components/channels/flag_post_confirmation_dialog.ts","../src/ui/components/channels/generic_confirm_modal.ts","../src/ui/components/channels/header.ts","../src/ui/components/channels/invite_people_modal.ts","../src/ui/components/channels/message_priority.ts","../src/ui/components/channels/post.ts","../src/ui/components/channels/post_create.ts","../src/ui/components/channels/post_dot_menu.ts","../src/ui/components/channels/post_edit.ts","../src/ui/components/channels/post_menu.ts","../src/ui/components/channels/post_reminder_menu.ts","../src/ui/components/channels/profile_modal.ts","../src/ui/components/channels/restore_post_confirmation_dialog.ts","../src/ui/components/channels/schedule_message_menu.ts","../src/ui/components/channels/schedule_message_modal.ts","../src/ui/components/channels/scheduled_draft_modal.ts","../src/ui/components/channels/scheduled_post.ts","../src/ui/components/channels/scheduled_post_indicator.ts","../src/ui/components/channels/search_box.ts","../src/ui/components/channels/send_message_now_modal.ts","../src/ui/components/channels/sidebar_left.ts","../src/ui/components/channels/sidebar_right.ts","../src/ui/components/channels/team_menu.ts","../src/ui/components/channels/thread_footer.ts","../src/ui/components/channels/user_profile_popover.ts","../src/ui/components/channels/channel_settings/channel_settings_modal.ts","../src/ui/components/channels/channel_settings/configuration_settings.ts","../src/ui/components/channels/channel_settings/info_settings.ts","../src/ui/components/channels/settings/advanced_settings.ts","../src/ui/components/channels/settings/display_settings.ts","../src/ui/components/channels/settings/notifications_settings.ts","../src/ui/components/channels/settings/settings_modal.ts","../src/ui/components/channels/settings/sidebar_settings.ts","../src/ui/components/channels/team_settings/team_settings_modal.ts","../src/ui/components/system_console/navbar.ts","../src/ui/components/system_console/sidebar.ts","../src/ui/components/system_console/sections/site_configuration/notifications.ts","../src/ui/components/system_console/sections/system_users/column_toggle_menu.ts","../src/ui/components/system_console/sections/system_users/feature_discovery.ts","../src/ui/components/system_console/sections/system_users/filter_menu.ts","../src/ui/components/system_console/sections/system_users/filter_popover.ts","../src/ui/components/system_console/sections/system_users/mobile_security.ts","../src/ui/components/system_console/sections/system_users/system_users.ts","../src/ui/pages/channels.ts","../src/ui/pages/content_review_dm.ts","../src/ui/pages/drafts.ts","../src/ui/pages/index.ts","../src/ui/pages/landing_login.ts","../src/ui/pages/login.ts","../src/ui/pages/reset_password.ts","../src/ui/pages/scheduled_posts.ts","../src/ui/pages/signup.ts","../src/ui/pages/system_console.ts","../src/ui/pages/threads.ts","../src/visual/index.ts","../src/visual/percy.ts"],"version":"5.9.3"}
package/dist/types.d.ts CHANGED
@@ -1,6 +1,7 @@
1
1
  import { Locator, Page, ViewportSize } from '@playwright/test';
2
2
  export type TestArgs = {
3
3
  page: Page;
4
+ locator?: Locator;
4
5
  browserName: string;
5
6
  viewport?: ViewportSize | null;
6
7
  };
package/dist/types.js ADDED
@@ -0,0 +1,3 @@
1
+ // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
2
+ // See LICENSE.txt for license information.
3
+ export {};
@@ -1 +1 @@
1
- {"version":3,"file":"app_bar.js","sources":["../../../../src/ui/components/channels/app_bar.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 ChannelsAppBar {\n readonly container: Locator;\n\n readonly playbooksIcon;\n\n constructor(container: Locator) {\n this.container = container;\n\n this.playbooksIcon = container.locator('#app-bar-icon-playbooks').getByRole('img');\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;AAET,IAAA,aAAa;AAEtB,IAAA,WAAA,CAAY,SAAkB,EAAA;AAC1B,QAAA,IAAI,CAAC,SAAS,GAAG,SAAS;AAE1B,QAAA,IAAI,CAAC,aAAa,GAAG,SAAS,CAAC,OAAO,CAAC,yBAAyB,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC;;AAGtF,IAAA,MAAM,WAAW,GAAA;QACb,MAAMA,WAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE;;AAEjD;;;;"}
1
+ {"version":3,"file":"app_bar.js","sources":["../../../../src/ui/components/channels/app_bar.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 ChannelsAppBar {\n readonly container: Locator;\n\n readonly playbooksIcon;\n\n constructor(container: Locator) {\n this.container = container;\n\n this.playbooksIcon = container.locator('#app-bar-icon-playbooks').getByRole('img');\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;AAET,IAAA,aAAa;AAEtB,IAAA,WAAA,CAAY,SAAkB,EAAA;AAC1B,QAAA,IAAI,CAAC,SAAS,GAAG,SAAS;AAE1B,QAAA,IAAI,CAAC,aAAa,GAAG,SAAS,CAAC,OAAO,CAAC,yBAAyB,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC;IACtF;AAEA,IAAA,MAAM,WAAW,GAAA;QACb,MAAMA,WAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE;IAC9C;AACH;;;;"}
@@ -1,27 +1,26 @@
1
- import { Locator } from '@playwright/test';
1
+ import { Locator, Page } from '@playwright/test';
2
2
  import ChannelsHeader from './header';
3
3
  import ChannelsPostCreate from './post_create';
4
4
  import ChannelsPostEdit from './post_edit';
5
5
  import ChannelsPost from './post';
6
+ import ScheduledPostIndicator from './scheduled_post_indicator';
7
+ import FlagPostConfirmationDialog from './flag_post_confirmation_dialog';
6
8
  export default class ChannelsCenterView {
7
9
  readonly container: Locator;
10
+ readonly page: Page;
8
11
  readonly header: ChannelsHeader;
9
12
  readonly postCreate: ChannelsPostCreate;
10
13
  readonly scheduledDraftOptions: ChannelsPostCreate;
11
- readonly postBoxIndicator: Locator;
12
- readonly scheduledDraftChannelIcon: Locator;
13
- readonly scheduledDraftChannelInfoMessage: Locator;
14
- readonly scheduledDraftChannelInfoMessageLocator: string;
15
- readonly scheduledDraftChannelInfoMessageText: Locator;
16
- readonly scheduledDraftSeeAllLink: Locator;
14
+ readonly scheduledPostIndicator: ScheduledPostIndicator;
17
15
  readonly postEdit: ChannelsPostEdit;
18
16
  readonly editedPostIcon: (postID: string) => Locator;
19
- constructor(container: Locator);
17
+ readonly channelBanner: Locator;
18
+ readonly flagPostConfirmationDialog: FlagPostConfirmationDialog;
19
+ readonly messageDeleted: (postId: string) => Locator;
20
+ readonly postText: (postID: string) => Locator;
21
+ constructor(container: Locator, page: Page);
20
22
  toBeVisible(): Promise<void>;
21
- /**
22
- * Click on "See all scheduled messages"
23
- */
24
- clickOnSeeAllscheduledDrafts(): Promise<void>;
23
+ postMessage(message: string, files?: string[]): Promise<void>;
25
24
  /**
26
25
  * Return the first post in the Center
27
26
  */
@@ -47,6 +46,11 @@ export default class ChannelsCenterView {
47
46
  getPostById(id: string): Promise<ChannelsPost>;
48
47
  waitUntilLastPostContains(text: string, timeout?: number): Promise<void>;
49
48
  waitUntilPostWithIdContains(id: string, text: string, timeout?: number): Promise<void>;
50
- verifyscheduledDraftChannelInfo(): Promise<void>;
51
49
  clickOnLastEditedPost(postID: string | null): Promise<void>;
50
+ assertChannelBanner(text: string, backgroundColor: string): Promise<void>;
51
+ assertChannelBannerNotVisible(): Promise<void>;
52
+ assertChannelBannerHasBoldText(text: string): Promise<void>;
53
+ assertChannelBannerHasItalicText(text: string): Promise<void>;
54
+ assertChannelBannerHasStrikethroughText(text: string): Promise<void>;
55
+ messageDeletedVisible(isVisible: boolean | undefined, postId: string, message: string): Promise<void>;
52
56
  }