From be3c679cfd6afa7e21fbcb01c928d4c47a043999 Mon Sep 17 00:00:00 2001 From: Saturnino Abril Date: Fri, 17 Mar 2023 22:11:04 +0800 Subject: [PATCH] E2E folder structure for mono-repo (#22525) * move e2e to root folder, add playbooks to e2e/cypress * add e2e ci workflow, clean up dep and update playwright readme * fix elasticsearch tests * update default roles and enable app bar --- .github/workflows/e2e-ci.yml | 58 + .gitignore | 21 + e2e/.gitignore | 8 + e2e/cypress/.eslintignore | 1 + e2e/cypress/.eslintrc.json | 122 + .../e2e => e2e}/cypress/Dockerfile.webhook | 0 .../e2e => e2e}/cypress/README-Subpath.md | 0 .../e2e => e2e}/cypress/cypress.config.ts | 0 .../cypress/generate_test_cycle.js | 0 .../e2e => e2e}/cypress/package-lock.json | 7070 +++++++++++++++-- .../channels/e2e => e2e}/cypress/package.json | 33 +- .../@testing-library+cypress+9.0.0.patch | 0 .../e2e => e2e}/cypress/run_test_cycle.js | 0 .../channels/e2e => e2e}/cypress/run_tests.js | 0 .../e2e => e2e}/cypress/save_report.js | 0 .../Ignore-X-Frame-headers/background.js | 0 .../Ignore-X-Frame-headers/manifest.json | 0 .../tests/fixtures/MM-logo-horizontal.png | Bin .../fixtures/animated-gif-image-file.gif | Bin .../cypress/tests/fixtures/bmp-image-file.bmp | Bin .../tests/fixtures/bot-default-avatar.png | Bin .../tests/fixtures/client_billing.json | 0 .../fixtures/console-example-inputs.json | 0 .../tests/fixtures/date_time_format.js | 0 .../cypress/tests/fixtures/favicon-16x16.png | Bin .../tests/fixtures/favicon-default-16x16.png | Bin .../tests/fixtures/favicon-mentions-16x16.png | Bin .../tests/fixtures/favicon-unread-16x16.png | Bin .../tests/fixtures/gif-image-file-resized.gif | Bin .../cypress/tests/fixtures/gif-image-file.gif | Bin .../tests/fixtures/hooks/message_menus.json | 0 .../hooks/message_menus_with_datasource.json | 0 .../cypress/tests/fixtures/huge-image.jpg | Bin .../cypress/tests/fixtures/image-1000x40.jpg | Bin .../cypress/tests/fixtures/image-1600x40.jpg | Bin .../cypress/tests/fixtures/image-20x20.jpg | Bin .../cypress/tests/fixtures/image-400x40.jpg | Bin .../cypress/tests/fixtures/image-400x400.jpg | Bin .../cypress/tests/fixtures/image-40x400.jpg | Bin .../cypress/tests/fixtures/image-50x50.jpg | Bin .../cypress/tests/fixtures/image-60x60.jpg | Bin .../tests/fixtures/image-small-height.png | Bin .../tests/fixtures/image-small-width.png | Bin .../interactive_message_menus_options.json | 0 .../cypress/tests/fixtures/jpg-image-file.jpg | Bin .../cypress/tests/fixtures/ldap-add-user.ldif | 0 .../tests/fixtures/ldap-reset-data.ldif | 0 .../cypress/tests/fixtures/ldap_users.json | 0 .../cypress/tests/fixtures/long_text_post.txt | 0 .../cypress/tests/fixtures/m4a-audio-file.m4a | Bin .../fixtures/markdown/markdown_basic.html | 0 .../tests/fixtures/markdown/markdown_basic.md | 0 .../markdown/markdown_block_quotes_1.html | 0 .../markdown/markdown_block_quotes_1.md | 0 .../markdown/markdown_block_quotes_2.md | 0 .../markdown/markdown_carriage_return.html | 0 .../markdown/markdown_carriage_return.md | 0 .../markdown_carriage_return_two_lines.html | 0 .../markdown_carriage_return_two_lines.md | 0 .../markdown/markdown_code_block.html | 0 .../fixtures/markdown/markdown_code_block.md | 0 .../markdown/markdown_code_syntax.html | 0 .../markdown/markdown_escape_characters.html | 0 .../markdown/markdown_escape_characters.md | 0 .../fixtures/markdown/markdown_headings.html | 0 .../fixtures/markdown/markdown_headings.md | 0 .../markdown/markdown_inline_code.html | 0 .../fixtures/markdown/markdown_inline_code.md | 0 .../markdown/markdown_inline_images_1.md | 0 .../markdown/markdown_inline_images_2.md | 0 .../markdown/markdown_inline_images_3.md | 0 .../markdown/markdown_inline_images_4.md | 0 .../markdown/markdown_inline_images_5.md | 0 .../markdown/markdown_inline_images_6.md | 0 .../fixtures/markdown/markdown_latex.html | 0 .../tests/fixtures/markdown/markdown_latex.md | 0 .../fixtures/markdown/markdown_lines.html | 0 .../tests/fixtures/markdown/markdown_lines.md | 0 .../fixtures/markdown/markdown_list.html | 0 .../markdown/markdown_not_autolink.html | 0 .../markdown/markdown_not_autolink.md | 0 .../markdown/markdown_not_in_code_block.html | 0 .../markdown/markdown_not_in_code_block.md | 0 .../fixtures/markdown/markdown_postgres.html | 0 .../fixtures/markdown/markdown_postgres.md | 0 .../fixtures/markdown/markdown_python.html | 0 .../fixtures/markdown/markdown_python.md | 0 .../fixtures/markdown/markdown_shell.html | 0 .../tests/fixtures/markdown/markdown_shell.md | 0 .../fixtures/markdown/markdown_tables.html | 0 .../markdown/markdown_test_basic.html | 0 .../markdown/markdown_text_style.html | 0 .../fixtures/markdown/markdown_text_style.md | 0 .../markdown/markdown_typescript.html | 0 .../fixtures/markdown/markdown_typescript.md | 0 .../tests/fixtures/mattermost-icon.png | Bin .../fixtures/mattermost-icon_128x128.png | Bin .../cypress/tests/fixtures/messages.js | 0 .../fixtures/mm_file_testing/Audio/AAC.aac | Bin .../fixtures/mm_file_testing/Audio/FLAC.flac | Bin .../fixtures/mm_file_testing/Audio/M4A.m4a | Bin .../fixtures/mm_file_testing/Audio/M4R.m4r | Bin .../fixtures/mm_file_testing/Audio/MP3.mp3 | Bin .../fixtures/mm_file_testing/Audio/OGG.ogg | Bin .../fixtures/mm_file_testing/Audio/WAV.wav | Bin .../fixtures/mm_file_testing/Audio/WMA.wma | Bin .../tests/fixtures/mm_file_testing/Code/JSON | 0 .../fixtures/mm_file_testing/Code/Patch.diff | 0 .../fixtures/mm_file_testing/Code/Python | 0 .../mm_file_testing/Documents/Excel.xlsx | Bin .../mm_file_testing/Documents/PDF.pdf | Bin .../mm_file_testing/Documents/PPT.pptx | Bin .../mm_file_testing/Documents/Text.txt | 0 .../mm_file_testing/Documents/Word.docx | Bin .../fixtures/mm_file_testing/Images/BMP.bmp | Bin .../fixtures/mm_file_testing/Images/GIF.gif | Bin .../fixtures/mm_file_testing/Images/JPG.jpg | Bin .../fixtures/mm_file_testing/Images/PNG.png | Bin .../fixtures/mm_file_testing/Images/PSD.psd | Bin .../fixtures/mm_file_testing/Images/TIFF.tif | Bin .../fixtures/mm_file_testing/Video/AVI.avi | Bin .../fixtures/mm_file_testing/Video/MKV.mkv | Bin .../fixtures/mm_file_testing/Video/MOV.mov | Bin .../fixtures/mm_file_testing/Video/MP4.mp4 | Bin .../fixtures/mm_file_testing/Video/MPG.mpg | Bin .../fixtures/mm_file_testing/Video/WEBM.webm | Bin .../fixtures/mm_file_testing/Video/WMV.wmv | Bin .../cypress/tests/fixtures/mp3-audio-file.mp3 | Bin .../cypress/tests/fixtures/mp4-video-file.mp4 | Bin .../tests/fixtures/mpeg-video-file.mpg | Bin .../cypress/tests/fixtures/png-image-file.png | Bin .../tests/fixtures/powerpoint-file.ppt | Bin .../tests/fixtures/powerpointx-file.pptx | Bin .../tests/fixtures/saml_ldap_users.json | 0 .../cypress/tests/fixtures/saml_users.json | 0 .../cypress/tests/fixtures/small-image.png | Bin .../cypress/tests/fixtures/svg.svg | 0 .../fixtures/system-roles-console-access.json | 0 .../cypress/tests/fixtures/theme.json | 0 .../tests/fixtures/tiff-image-file.tif | Bin .../cypress/tests/fixtures/timeouts.js | 0 .../tests/fixtures/txt-changed-as-png.png | 0 .../cypress/tests/fixtures/webhook_icon.jpg | Bin .../tests/fixtures/webhook_override_icon.png | Bin .../cypress/tests/fixtures/word-file.doc | Bin .../cypress/tests/fixtures/wordx-file.docx | Bin .../integration/boards/card_badges_spec.ts | 0 .../boards/card_urlproperty_spec.ts | 0 .../integration/boards/create_board_spec.ts | 0 .../boards/group_by_property_spec.ts | 0 .../integration/boards/manage_groups_spec.ts | 0 .../accessibility_account_settings_spec.js | 6 +- .../accessibility_buttons_spec.js | 2 +- .../accessibility_dropdowns_spec.js | 2 +- .../accessibility/accessibility_image_spec.js | 2 +- .../accessibility_keyboard_usability_spec.js | 4 +- .../accessibility_nav_diff_regions_spec.js | 4 +- .../accessibility_popovers_spec.js | 2 +- .../accessibility/accessibility_post_spec.js | 6 +- .../accessibility_sidebar_dm_spec.js | 4 +- .../accessibility_sidebar_spec.ts | 4 +- .../account_settings/account_settings_spec.ts | 2 +- .../main_menu_stays_open_spec.ts | 4 +- .../profile/account_settings_position_spec.ts | 2 +- .../account_settings/profile/email_spec.ts | 6 +- .../profile/fullname_edit_spec.ts | 2 +- .../profile/fullname_truncate_spec.ts | 4 +- .../profile/help_text_link_spec.ts | 2 +- .../account_settings/profile/nickname_spec.ts | 4 +- .../profile/profile_picture_change_spec.ts | 4 +- .../profile/profile_picture_spec.ts | 4 +- .../account_settings/profile/username_spec.ts | 4 +- .../security/access_history_spec.ts | 2 +- .../security/active_sessions_spec.ts | 4 +- .../security/password_spec.ts | 4 +- .../ad_ldap/saml_ldap_sync_id_attrib_spec.js | 8 +- .../ad_ldap/saml_ldap_sync_remove_spec.js | 8 +- .../channels}/ad_ldap/saml_ldap_sync_spec.js | 8 +- .../archive_channel_add_reaction_spec.ts | 4 +- .../archive_channel_header_spec.ts | 2 +- .../archive_channel_member_spec.ts | 2 +- .../archive_channel_operations_spec.ts | 4 +- .../archive_channel_post_spec.ts | 4 +- .../archive_channel_reaction_spec.ts | 4 +- .../archive_channel_search_spec.ts | 4 +- .../archived_channel/archived_channel_spec.ts | 4 +- .../archived_leave_channel_spec.ts | 6 +- .../channels}/archived_channel/helpers.ts | 2 +- .../join_archived_channel_spec.ts | 6 +- .../leave_archived_channel_spec.ts | 2 +- .../archived_channel/post_menu_spec.ts | 2 +- .../auth_sso/authentication_1_spec.ts | 6 +- .../auth_sso/authentication_2_spec.ts | 6 +- .../auth_sso/authentication_3_spec.ts | 2 +- .../auth_sso/authentication_4_spec.ts | 6 +- .../auth_sso/authentication_not_cloud_spec.ts | 4 +- .../auth_sso/hide_create_account_spec.ts | 4 +- .../channels}/autocomplete/common_test.ts | 0 .../users_in_channel_switcher_spec.js | 4 +- .../users_in_message_input_box_spec.js | 4 +- .../autocomplete/database/users_spec.js | 4 +- .../channels}/autocomplete/helpers.ts | 4 +- .../channels}/benchmark/message_spec.ts | 4 +- .../channels}/bot_accounts/bot_api_1_spec.js | 4 +- .../channels}/bot_accounts/bot_api_2_spec.js | 4 +- .../bot_accounts/bot_api_not_cloud_spec.js | 4 +- .../bot_accounts/bot_channel_intro_spec.js | 4 +- .../channels}/bot_accounts/create_bot_spec.js | 4 +- .../bot_accounts/crud_not_cloud_spec.js | 4 +- .../channels}/bot_accounts/crud_spec.js | 4 +- .../bot_accounts/display_name_spec.js | 2 +- .../channels}/bot_accounts/edit_bot_spec.js | 6 +- .../bot_accounts/edit_bot_username_spec.js | 6 +- .../channels}/bot_accounts/helpers.js | 4 +- .../channels}/bot_accounts/in_lists_1_spec.js | 6 +- .../channels}/bot_accounts/in_lists_2_spec.js | 6 +- .../in_teams_and_channels_spec.js | 6 +- .../managing_bot_accounts_not_cloud_spec.js | 6 +- .../managing_bot_accounts_spec.js | 6 +- .../bot_accounts/post_message_spec.js | 2 +- .../bot_accounts/promote_demote_spec.js | 4 +- .../bot_accounts/sidebar_display_spec.js | 6 +- .../channels}/bot_accounts/tags_spec.js | 4 +- .../channel/archived_channels_1_spec.js | 4 +- .../channel/archived_channels_2_spec.js | 6 +- .../channel/channel_info_rhs_spec.js | 4 +- .../channel/channel_members_rhs_spec.js | 4 +- .../channel_mention_autocomplete_spec.js | 4 +- .../channel/channel_name_tooltips_spec.js | 4 +- .../channels}/channel/channel_routing_spec.js | 2 +- .../channel/channel_settings_spec.js | 4 +- .../channel/channel_switcher_spec.js | 2 +- .../channel/close_direct_group_spec.js | 2 +- .../convert_channel_to_private_spec.js | 2 +- ...ve_and_archive_channel_destructive_spec.ts | 2 +- .../channels}/channel/leave_channel_spec.js | 4 +- .../channels}/channel/more_channels_spec.js | 4 +- .../channel/more_public_channels_spec.js | 2 +- .../channel/new_channel_with_board_spec.js | 2 +- ...pen_rhs_coming_from_system_console_spec.ts | 6 +- ...updates_manage_channel_members_rhs_spec.js | 4 +- ...updates_manage_channel_members_rhs_spec.js | 4 +- .../add_users_to_channel_spec.ts | 2 +- .../channel_settings/channel_header_spec.ts | 6 +- .../channel_name_validations_spec.ts | 8 +- .../more_unreads_position_with_scroll_spec.ts | 4 +- .../channels}/channel_sidebar/category.d.ts | 0 .../category_collapsing_spec.ts | 8 +- .../channel_sidebar/category_muting_spec.ts | 6 +- .../category_sorting_1_spec.ts | 6 +- .../channel_sidebar/category_sorting_spec.ts | 4 +- .../channel_sidebar/channel_sidebar_spec.ts | 8 +- .../channel_sidebar/custom_categories_spec.ts | 6 +- .../channel_sidebar/dm_category_spec.ts | 4 +- .../channel_sidebar/dm_gm_behaviour_spec.ts | 4 +- .../dm_gm_filtering_sorting_spec.ts | 4 +- .../dm_sidebar_not_remove_spec.ts | 2 +- .../channel_sidebar/drag_and_drop_spec.ts | 4 +- .../group_unreads_separately_spec.ts | 4 +- .../channels}/channel_sidebar/helpers.ts | 2 +- .../history_channel_switcher_spec.ts | 6 +- .../channels}/channel_sidebar/hotkeys_spec.ts | 4 +- .../new_category_badge_spec.ts | 4 +- .../new_channel_dropdown_spec.ts | 6 +- .../sidebar_category_menu_spec.ts | 2 +- .../sidebar_channel_menu_spec.ts | 8 +- .../channel_sidebar/unread_filter_spec.ts | 10 +- .../channel_notifications_spec.js | 4 +- .../crt_settings_spec.js | 2 +- .../collapsed_reply_threads/crt_tour_spec.js | 2 +- .../collapsed_reply_threads/files_1_spec.js | 6 +- .../collapsed_reply_threads/files_spec.js | 4 +- .../collapsed_reply_threads/following_spec.js | 6 +- .../global_threads_spec.js | 2 +- .../last_viewed_spec.js | 4 +- .../collapsed_reply_threads/replies_spec.js | 2 +- .../collapsed_reply_threads/unread_spec.js | 4 +- .../channels}/commands/leave_channel_spec.ts | 4 +- .../custom_status/custom_status_1_spec.ts | 2 +- .../custom_status/custom_status_2_spec.ts | 2 +- .../custom_status/custom_status_3_spec.ts | 2 +- .../custom_status/custom_status_4_spec.ts | 2 +- .../custom_status/custom_status_5_spec.ts | 2 +- .../custom_status/custom_status_6_spec.ts | 2 +- .../custom_status_expiry_1_spec.ts | 2 +- .../custom_status_expiry_2_spec.ts | 2 +- .../custom_status_expiry_3_spec.ts | 2 +- .../custom_status_expiry_4_spec.ts | 2 +- .../channels}/emoji/custom_emoji_1_1_spec.ts | 4 +- .../channels}/emoji/custom_emoji_1_spec.ts | 4 +- .../channels}/emoji/custom_emoji_2_1_spec.ts | 4 +- .../channels}/emoji/custom_emoji_2_spec.ts | 4 +- .../channels}/emoji/custom_emoji_3_spec.ts | 6 +- .../integration/channels}/emoji/helpers.js | 2 +- .../emoji/recently_used_emoji_1_spec.ts | 6 +- .../emoji/recently_used_emoji_2_spec.ts | 6 +- .../channels}/emoji/sorted_emojis_spec.ts | 4 +- .../accessibility_input_fields_spec.js | 4 +- .../accessibility_modals_dialogs_1_spec.js | 4 +- .../accessibility_modals_dialogs_spec.js | 4 +- .../auth_sso/authentication_spec.js | 6 +- .../auth_sso/mfa_authentication_spec.js | 4 +- .../managing_bot_accounts_spec.js | 4 +- .../enterprise/channel/channel_groups_spec.ts | 4 +- .../cloud/billing/after_subscription_spec.js | 6 +- .../billing_history_free_trial_spec.ts | 2 +- .../cloud/billing/cloud_pricing_modal_spec.ts | 4 +- .../company_information_free_trial_spec.ts | 4 +- .../billing/downgrade_feedback_modal_spec.ts | 2 +- .../cloud/billing/notify_admin_spec.ts | 4 +- .../cloud/billing/payment_free_trial_spec.ts | 2 +- .../billing/subscriptions_free_trial_spec.ts | 4 +- .../cloud/billing/yearly_subscription_spec.js | 4 +- .../channels_spec.js | 4 +- .../channels_with_special_characters_spec.js | 2 +- .../helpers/index.js | 4 +- .../renaming_spec.js | 4 +- .../renaming_team_spec.js | 4 +- .../system_console_spec.js | 4 +- .../users_in_channel_switcher_spec.js | 4 +- .../users_in_message_input_box_spec.js | 4 +- .../elasticsearch_autocomplete/users_spec.js | 4 +- .../email_login_activity_spec.ts | 4 +- .../not_extended_when_disabled/helpers.js | 4 +- .../with_email_login_spec.js | 2 +- .../with_ldap_login_spec.js | 4 +- .../with_saml_login_spec.js | 4 +- .../extend_session/session_length_spec.ts | 2 +- .../group_mentions_permissions_spec.js | 6 +- .../group_mentions_posts_spec.js | 6 +- .../group_mentions_system_messages_spec.js | 6 +- .../enterprise/group_mentions/helpers.js | 2 +- .../guest_accounts/guest_add_spec.ts | 4 +- .../guest_experience_ui_spec.ts | 4 +- .../guest_accounts/guest_feature_spec.ts | 2 +- .../guest_identification_spec.ts | 6 +- .../guest_identification_ui_not_cloud_spec.ts | 4 +- .../guest_identification_ui_spec.ts | 6 +- .../guest_invitation_ui_more_spec.ts | 6 +- .../guest_invitation_ui_spec.ts | 4 +- .../guest_accounts/guest_popover_ui_spec.ts | 4 +- .../guest_accounts/guest_removal_ui_spec.ts | 4 +- .../enterprise/guest_accounts/helpers.ts | 0 .../member_invitation_ui_spec.ts | 8 +- .../system_console_guest_access_ui_spec.ts | 4 +- ...tem_console_manage_guest_not_cloud_spec.ts | 4 +- .../system_console_manage_guest_spec.ts | 8 +- .../integrations/incoming_webhook_spec.js | 4 +- .../enterprise/ldap/ldap_group_sync_spec.js | 4 +- .../enterprise/ldap/ldap_guest_spec.js | 10 +- .../enterprise/ldap/ldap_login_spec.js | 6 +- .../enterprise/ldap/ldap_setting_spec.js | 2 +- .../ldap_group/channel_modes_spec.ts | 2 +- .../ldap_group/group_mentions_spec.ts | 6 +- .../ldap_group/groups_assign_roles_spec.ts | 4 +- .../enterprise/ldap_group/invite_bot_spec.ts | 2 +- .../ldap_group/search_channels_spec.ts | 4 +- .../team_and_channel_assign_roles_spec.ts | 4 +- .../channels}/enterprise/oauth/oauth_spec.ts | 4 +- .../permissions/team_permissions_spec.ts | 4 +- .../profile_popover/profile_popover_spec.ts | 6 +- .../profile_popover_spec_user_a_b_spec.ts | 2 +- .../enterprise/saml/okta_login_spec.js | 4 +- .../enterprise/saml/saml_automated_spec.js | 4 +- .../enterprise/saml/saml_guest_member_spec.js | 6 +- .../enterprise/saml/saml_metadata_spec.js | 2 +- .../self_hosted_pricing_modal_spec.ts | 2 +- .../self-hosted/self_hosted_purchase_spec.ts | 4 +- .../about/edition_and_license_spec.js | 6 +- .../about/starter_edition_spec.js | 2 +- .../system_console/archived_channels_spec.js | 4 +- .../authentication_method_spec.js | 8 +- .../system_console/channel_members_spec.js | 4 +- .../channel_mentions_spec.js | 2 +- .../channel_moderation/constants.js | 0 .../channel_moderation/create_posts_spec.js | 2 +- .../channel_moderation/helpers.js | 4 +- .../higher_scoped_scheme_spec.js | 4 +- .../channel_moderation/manage_members_spec.js | 6 +- .../channel_moderation/post_reactions_spec.js | 8 +- .../channel_moderation/system_config_spec.js | 4 +- .../enterprise/system_console/cluster_spec.js | 2 +- .../compliance_export_multiple_post_spec.js | 2 +- .../compliance/compliance_export_ui_spec.js | 4 +- .../data_retention_policies_2_spec.js | 2 +- .../data_retention_policies_3_spec.js | 2 +- .../data_retention_policies_4_spec.js | 2 +- .../data_retention_policies_spec.js | 4 +- ...ownload_bot_compliance_export_file_spec.js | 2 +- .../download_compliance_export_file_spec.js | 2 +- .../system_console/compliance/helpers.js | 2 +- .../compliance/s3_bucket_storage_spec.js | 4 +- .../edition_and_license_link_spec.js | 4 +- .../system_console/environment_spec.js | 4 +- .../group_configuration_spec.js | 4 +- .../enterprise/system_console/helpers.js | 6 +- .../limited_console_access_not_cloud_spec.js | 2 +- .../limited_console_access_spec.js | 2 +- .../system_console/main_menu_spec.js | 2 +- .../system_console/openid/openid_spec.js | 6 +- .../reporting/site_statistics_spec.js | 6 +- .../system_console/search_box_spec.js | 4 +- .../system_console/settings_spec.js | 4 +- .../sidebar_link_navigation_cloud_spec.js | 6 +- .../sidebar_link_navigation_e20_spec.js | 6 +- .../support_packet_generation_spec.js | 2 +- .../system_scheme_permission_part2_spec.js | 4 +- .../system_scheme_permission_spec.js | 4 +- .../system_console/team_guest_channel_spec.js | 6 +- .../system_console/team_members_spec.js | 4 +- .../team_scheme_permission_part2_spec.js | 4 +- .../team_scheme_permission_spec.js | 4 +- .../ui_and_api/notifications_spec.js | 2 +- .../enterprise/teams/search_teams_spec.js | 2 +- .../cancel_file_upload_spec.js | 0 .../channel_files_spec.js | 4 +- .../cloud_upload_files_spec.js | 4 +- .../disabled_file_upload_spec.js | 4 +- .../edit_message_with_attachment_spec.js | 4 +- .../file_preview_audio_spec.js | 4 +- .../file_preview_generic_spec.js | 4 +- .../file_preview_image_spec.js | 4 +- .../file_preview_video_spec.js | 4 +- .../files_and_attachments/helpers.js | 2 +- .../image_link_preview_1_spec.js | 2 +- .../image_link_preview_new_window_spec.js | 2 +- .../image_link_preview_spec.js | 2 +- .../files_and_attachments/paste_image_spec.js | 2 +- .../upload_files_not_cloud_spec.js | 6 +- .../upload_files_spec.js | 4 +- .../youtube_video_spec.js | 2 +- .../channels}/insights/last_viewed_spec.js | 2 +- .../common_commands_1_spec.js | 6 +- .../common_commands_2_spec.js | 6 +- .../common_commands_3_spec.js | 4 +- .../builtin_commands/groupmsg_command_spec.js | 4 +- .../integrations/builtin_commands/helper.js | 2 +- .../builtin_commands/invalid_commands_spec.js | 4 +- .../builtin_commands/invite_command_spec.js | 4 +- .../invite_people_command_spec.js | 4 +- .../user_status_commands_spec.js | 2 +- .../builtin_commands/user_status_spec.js | 4 +- .../custom_slash_commands_spec.js | 4 +- .../custom_slash_commands/helpers.js | 2 +- .../slash_commands_spec.js | 2 +- .../attachment_does_not_collapse_spec.ts | 2 +- .../incoming_webhook/basic_formatting_spec.js | 2 +- .../cancel_out_of_edit_spec.js | 2 +- .../incoming_webhook/copy_icon_spec.js | 0 .../delete_incoming_webhook_spec.js | 2 +- .../description_length_check_spec.js | 2 +- ...disallow_username_profile_override_spec.js | 6 +- .../edit_incoming_webhook_spec.js | 2 +- .../integrations/incoming_webhook/helpers.js | 0 .../inapp_username_profile_override_spec.js | 6 +- .../incoming_webhook_creates_dm_spec.js | 2 +- .../incoming_webhook_is_image_only_spec.js | 2 +- ...ions_display_on_team_where_created_spec.js | 2 +- .../invalid_attachment_URL_webhook_spec.ts | 2 +- .../long_url_embedded_image_spec.js | 2 +- .../incoming_webhook/setting_spec.js | 6 +- .../setup_incoming_webhook_spec.js | 2 +- .../incoming_webhook/slack_formatting_spec.js | 2 +- ..._posts_when_creator_not_in_channel_spec.js | 4 +- .../integrations/integrations_page_spec.js | 2 +- ...integrations_search_gives_feedback_spec.js | 4 +- .../integrations/integrations_spec.js | 8 +- ...ssage_to_channel_via_slash_command_spec.js | 2 +- .../delete_outgoing_webhook_spec.js | 4 +- .../disable_outgoing_webhook_spec.js | 4 +- .../disable_override_username_profile_spec.js | 4 +- .../prompt_set_status_spec.js | 2 +- .../outgoing_webhook/regenerate_token_spec.js | 2 +- .../search_on_outgoing_webhooks_spec.js | 2 +- .../outgoing_webhook/token_copy_icon_spec.js | 2 +- ...plugin_slash_command_stays_visible_spec.js | 4 +- .../channels}/integrations/poll_spec.js | 6 +- .../integrations/regen_token_spec.js | 4 +- .../integrations/slash_commands_spec.js | 4 +- .../interactive_dialog/boolean_spec.js | 4 +- .../interactive_dialog/demo_boolean_spec.ts | 4 +- .../interactive_dialog/full_dialog_spec.js | 4 +- .../interactive_dialog/scrollable_spec.js | 4 +- .../interactive_dialog/simple_dialog_spec.js | 6 +- .../interactive_menu/basic_options_spec.js | 8 +- .../interactive_menu/select_with_keys_spec.js | 4 +- .../slack_parsing_message_button_spec.js | 4 +- .../alt_option_plus_up_down_spec.js | 4 +- .../keyboard_shortcuts/backspace_spec.js | 2 +- ...cmd_alt_I_toggles_channel_info_rhs_spec.js | 2 +- .../ctrl_cmd_k_at_username_spec.js | 2 +- .../ctrl_cmd_k_channel_switch_spec.js | 2 +- .../ctrl_cmd_k_focuses_message_box_spec.js | 4 +- ...k_open_channel_from_global_threads_spec.js | 4 +- .../ctrl_cmd_k_open_gm_with_mouse_spec.js | 2 +- .../ctrl_cmd_k_unreads_spec.js | 4 +- .../ctrl_cmd_k_user_from_other_team_spec.js | 2 +- .../ctrl_cmd_l_set_message_focus_spec.js | 2 +- .../ctrl_cmd_shift_a_account_settings_spec.js | 2 +- ..._l_does_not_change_focus_to_msgbox_spec.js | 2 +- .../ctrl_cmd_shift_m_spec.js | 2 +- .../ctrl_cmd_shift_slash/helpers.js | 2 +- .../not_open_emoji_picker_spec.js | 4 +- .../react_to_center_spec.js | 6 +- .../ctrl_cmd_shift_slash/react_to_rhs_spec.js | 6 +- .../ctrl_cmd_up_down_in_rhs_spec.js | 2 +- .../ctrl_cmd_up_down_no_action_spec.js | 4 +- .../keyboard_shortcuts/dot_menu_spec.js | 7 +- .../esc_close_modal_spec.js | 2 +- .../keyboard_shortcuts_1_spec.js | 6 +- .../keyboard_shortcuts_2_spec.js | 6 +- .../keyboard_shortcuts_3_spec.js | 4 +- .../shift_up_focuses_on_rhs_spec.js | 2 +- .../system_message_not_open_for_edit_spec.js | 2 +- .../up_arrow_edit_message_rhs_spec.js | 2 +- .../up_arrow_edit_message_spec.js | 4 +- .../large_data_sets/unreads_channels_spec.ts | 4 +- .../archive_channel_mark_as_unread_spec.js | 2 +- .../bot_post_mark_as_unread_spec.js | 4 +- .../mark_as_unread/channel_unread_spec.js | 4 +- .../channels}/mark_as_unread/helpers.js | 2 +- .../leave_channel_unread_spec.js | 4 +- .../mark_as_unread/mark_as_unread_spec.js | 4 +- .../mark_as_unread_using_shortcuts_spec.js | 4 +- .../mark_dm_post_as_unread_spec.js | 2 +- .../mark_as_unread/mark_gm_as_unread_spec.js | 4 +- .../mark_mentions_as_unread_spec.js | 4 +- .../toast_appears_unread_spec.js | 2 +- .../mark_as_unread/unread_toast_count_spec.js | 2 +- .../channels}/markdown/markdown_image_spec.js | 4 +- .../channels}/markdown/markdown_text_spec.js | 4 +- .../channels}/menus/main_menu_spec.js | 2 +- .../channels}/menus/status_dropdown_spec.js | 6 +- .../forward_message_from_dm_spec.js | 4 +- .../forward_message_from_gm_spec.js | 4 +- ...rward_message_from_private_channel_spec.js | 4 +- ...orward_message_from_public_channel_spec.js | 4 +- .../messaging/at_mentions_user_spec.js | 2 +- .../autocomplete_shown_each_channel_spec.js | 2 +- .../channels}/messaging/autocomplete_spec.js | 6 +- .../messaging/autocomplete_with_space_spec.js | 2 +- .../center_channel_rhs_overlap_spec.js | 8 +- .../messaging/channel_and_posts_links_spec.js | 4 +- .../channels}/messaging/channel_menu_spec.js | 4 +- .../channel_read_after_permalink_spec.js | 4 +- .../channel_users_interactions_spec.js | 2 +- .../channels}/messaging/collapse_link_spec.js | 2 +- .../messaging/collapsed_message_spec.js | 2 +- .../messaging/copy_post_text_spec.js | 4 +- ...trl_cmd_k_find_gm_by_matching_name_spec.js | 2 +- .../ctrl_cmd_k_open_dm_with_mouse_spec.js | 4 +- .../messaging/date_separator_spec.js | 4 +- .../messaging/direct_message_spec.js | 6 +- .../messaging/dm_list_of_users_spec.js | 4 +- .../draft_with_only_2_byte_characters_spec.js | 2 +- .../channels}/messaging/edit_message_spec.js | 4 +- .../emoji_followed_by_punctuation_spec.js | 2 +- .../channels}/messaging/emoji_gender_spec.ts | 2 +- .../messaging/emoji_insert_position_spec.js | 2 +- .../messaging/emoji_keyboard_entry_spec.js | 2 +- .../messaging/emoji_no_overlap_spec.js | 2 +- .../emoji_picker_keyboard_usability_spec.js | 2 +- .../messaging/emoji_recently_used_spec.js | 4 +- .../channels}/messaging/emoji_size_spec.js | 2 +- .../messaging/emoji_skin_tone_spec.js | 2 +- .../messaging/emoji_to_markdown_spec.js | 4 +- .../file_upload_in_center_channel_spec.js | 2 +- .../channels}/messaging/focus_move_spec.js | 4 +- .../channels}/messaging/group_message_spec.js | 6 +- .../messaging/header_not_cloud_spec.js | 6 +- .../channels}/messaging/header_spec.js | 4 +- .../channels}/messaging/helpers.js | 0 .../messaging/image_attachment_spec.js | 2 +- .../inline_images_open_preview_window_spec.js | 2 +- ...line_markdown_image_link_open_link_spec.js | 2 +- .../messaging/input_box_expands_spec.js | 2 +- .../input_box_expands_with_rhs_spec.js | 6 +- .../messaging/invalid_emojis_as_text_spec.js | 2 +- .../messaging/local_date_time_spec.js | 4 +- .../channels}/messaging/long_draft_spec.js | 4 +- .../messaging/long_post_attachments_spec.js | 4 +- .../markdown_preview_inline_image_spec.js | 2 +- .../markdown_quotation_paragraphs_spec.js | 2 +- .../channels}/messaging/markdown_spec.js | 4 +- .../mention_autocomplete_overlap_spec.js | 6 +- .../messaging/message_auto_response_spec.js | 4 +- .../messaging/message_bullets_spec.js | 2 +- .../message_by_aeroplane_icon_spec.js | 2 +- .../messaging/message_channel_draw_spec.js | 8 +- .../message_channel_reference_spec.js | 4 +- .../message_deleted_on_reply_spec.js | 6 +- .../messaging/message_deletion_spec.js | 2 +- .../message_draft_persistance_spec.js | 2 +- .../channels}/messaging/message_draft_spec.js | 2 +- .../message_draft_then_switch_channel_spec.js | 2 +- ...ith_attachment_then_switch_channel_spec.js | 2 +- .../message_edit_post_clear_text_spec.js | 4 +- .../message_edit_post_history_spec.ts | 4 +- .../message_edit_post_with_attachment_spec.js | 4 +- .../messaging/message_emoji_jumbo_spec.js | 2 +- .../messaging/message_ephemeral_spec.js | 2 +- .../message_in_another_language_spec.js | 2 +- .../channels}/messaging/message_parse_spec.js | 2 +- .../messaging/message_permalink_spec.js | 4 +- .../message_pinning_unpinning_spec.js | 2 +- .../messaging/message_reaction_gm_spec.js | 2 +- .../messaging/message_reaction_spec.js | 2 +- .../messaging/message_reply_bot_post_spec.js | 4 +- .../messaging/message_reply_gm_spec.js | 6 +- .../message_reply_input_box_expand_spec.js | 4 +- .../messaging/message_reply_part2_spec.js | 4 +- .../message_reply_scrollable_spec.js | 2 +- .../channels}/messaging/message_reply_spec.js | 4 +- .../messaging/message_reply_too_long_spec.js | 2 +- .../messaging/message_shortlinking_spec.js | 2 +- .../channels}/messaging/message_spec.js | 8 +- .../messaging/message_with_gif_spec.js | 2 +- .../messaging/mobile_message_deletion_spec.js | 2 +- .../messaging/mobile_profile_popover_spec.js | 4 +- .../no_matches_for_autocomplete_spec.js | 2 +- .../messaging/permalink_click_spec.js | 6 +- .../permalink_loading_indicator_spec.js | 6 +- .../messaging/permalink_message_edit_spec.js | 4 +- .../messaging/pinned_parent_post_spec.js | 2 +- .../messaging/pinned_posts_1_spec.js | 2 +- .../messaging/pinned_posts_2_spec.js | 4 +- .../channels}/messaging/post_header_spec.js | 4 +- .../messaging/post_html_table_spec.js | 4 +- .../messaging/post_options_menu_spec.js | 2 +- .../messaging/post_pre_header_spec.js | 4 +- .../messaging/post_textbox_height_spec.js | 2 +- .../messaging/private_channel_open_spec.js | 4 +- .../channels}/messaging/quick_send_spec.js | 2 +- .../messaging/quote_notation_spec.js | 2 +- .../channels}/messaging/reactions_spec.js | 4 +- ...eceive_message_on_socket_reconnect_spec.js | 4 +- .../channels}/messaging/remove_gif_spec.js | 6 +- .../remove_last_post_in_channel_spec.js | 4 +- .../channels}/messaging/save_post_spec.js | 4 +- .../messaging/scroll_channel_messages_spec.js | 4 +- .../send_message_via_profile_popover_spec.js | 4 +- .../messaging/single_image_thumbnail_spec.js | 4 +- .../channels}/messaging/strikethrough_spec.js | 4 +- .../system_message_limited_options_spec.js | 4 +- .../messaging/system_message_spec.js | 2 +- ..._appears_and_scrollable_in_the_rhs_spec.js | 4 +- .../tooltip_visual_verification_spec.js | 2 +- ...ips_on_top_nav_channel_icons_posts_spec.js | 4 +- .../messaging/typing_on_middle_spec.js | 4 +- ...typing_should_show_up_when_editing_spec.js | 4 +- .../channels}/modals/quick_switcher_spec.js | 4 +- .../channel_user_count_spec.js | 2 +- .../check_user_status_spec.js | 6 +- .../close_current_dm_redirects_spec.js | 4 +- .../close_gm_via_menu_spec.js | 2 +- .../dm_more_searching_from_page_spec.js | 2 +- .../dm_more_show_user_count_spec.js | 4 +- .../existing_channel_name_spec.js | 4 +- .../favorite_and_close_spec.js | 2 +- .../multi_team_and_dm/gm_add_user_spec.js | 4 +- .../multi_team_and_dm/gm_header_spec.js | 6 +- .../join_open_team_from_dm_spec.js | 2 +- .../multi_team_and_dm/max_gm_members_spec.js | 2 +- .../multi_team_and_dm/multi_team_join_spec.js | 4 +- .../multi_team_and_dm/multi_team_spec.js | 4 +- .../send_dm_user_no_team_spec.js | 6 +- .../multi_team_and_dm/system_message_spec.js | 4 +- .../town_square_not_marked_as_unread_spec.js | 4 +- ...ons_list_with_deactivated_triggers_spec.js | 2 +- .../notifications/at_mentions_spec.js | 6 +- .../browser_tab_notification_1_spec.js | 4 +- .../browser_tab_notification_2_spec.js | 4 +- .../channel_links_show_as_links_spec.js | 6 +- .../deselect_username_mention_trigger_spec.js | 4 +- .../desktop_notifications_1_spec.js | 8 +- .../desktop_notifications_2_spec.js | 4 +- .../desktop_notifications_3_spec.js | 8 +- ...rect_messages_do_not_add_indicator_spec.js | 2 +- .../channels}/notifications/helper.js | 0 .../ignore_channel_mentions_spec.js | 4 +- .../mention_email_notification_spec.js | 6 +- .../notifications/message_bar_spec.js | 6 +- .../message_posted_while_scrolled_up_spec.js | 4 +- ...tification_preferences_do_not_save_spec.js | 4 +- ...user_posts_reply_while_scrolled_up_spec.js | 4 +- .../notifications/reply_notifications_spec.js | 4 +- .../unread_on_public_channel_spec.js | 4 +- ...th_same_firstname_channel_mentions_spec.js | 6 +- .../onboarding/existing_email_adress_spec.js | 6 +- ...validate_pending_email_invitations_spec.js | 8 +- .../login_page_link_account_creation_spec.js | 8 +- .../use_team_invite_link_to_sign_up_spec.js | 8 +- .../performance/channel_switch_spec.js | 2 +- .../channels}/performance/team_switch_spec.js | 0 .../channels}/performance/utils.js | 0 .../plugins/demo_plugin/webhook_spec.js | 6 +- .../integration/channels}/plugins/helpers.js | 2 +- .../channels}/plugins/link_tooltip_spec.js | 4 +- .../disabled_remote_marketplace_spec.js | 4 +- .../channels}/plugins/marketplace/helpers.js | 0 .../invalid_marketplace_url_spec.js | 4 +- .../not_render_in_main_menu_spec.js | 2 +- .../marketplace/render_in_main_menu_spec.js | 4 +- .../channels}/plugins/marketplace/ui_spec.js | 6 +- .../channels}/plugins/plugin_buttons_spec.js | 6 +- .../channels}/plugins/plugin_install_spec.js | 6 +- .../plugins/plugin_startup_fail_spec.js | 6 +- .../channels}/plugins/upgrade_spec.js | 6 +- .../profile_settings/profile_settings_spec.js | 2 +- .../channels}/scroll/channel_scroll_spec.js | 6 +- .../scroll/default_images_collapsed_spec.js | 0 .../scroll/deleting_image_scroll_spec.js | 2 +- .../channels}/scroll/deleting_scroll_spec.js | 2 +- .../channels}/scroll/editing_scroll_spec.js | 4 +- .../channels}/scroll/fixed_width_spec.js | 4 +- .../integration/channels}/scroll/helpers.js | 2 +- .../scroll/image_aspect_ratio_spec.js | 0 .../channels}/search/clear_input_spec.js | 6 +- .../search/cleared_search_term_spec.js | 4 +- .../channels}/search/mobile_search_spec.js | 2 +- .../post_search_display_not_cloud_spec.js | 4 +- .../search/post_search_display_spec.js | 4 +- .../search/results_post_comment_spec.js | 4 +- .../channels}/search/results_post_spec.js | 4 +- .../search/search_bar_popup_focus_spec.js | 2 +- .../search/search_group_message_spec.js | 2 +- .../channels}/search/search_user_file_spec.js | 2 +- .../channels}/search/search_user_post_spec.js | 2 +- .../search_autocomplete/channels_spec.js | 4 +- .../search_autocomplete/renaming_spec.js | 4 +- .../search_autocomplete/scroll_spec.js | 2 +- .../channels}/search_filter/after_spec.js | 4 +- .../channels}/search_filter/before_spec.js | 4 +- .../channels}/search_filter/edit_spec.js | 4 +- .../search_filter/future_date_spec.js | 4 +- .../channels}/search_filter/helpers.js | 4 +- .../channels}/search_filter/input_spec.js | 6 +- .../channels}/search_filter/invalid_spec.js | 4 +- .../channels}/search_filter/mixed_spec.js | 4 +- .../channels}/search_filter/negative_spec.js | 4 +- .../channels}/search_filter/on_spec.js | 4 +- .../display/channel_display_mode_spec.js | 2 +- .../display/clock_display_mode_spec.js | 4 +- ...age_display_mode_colorize_username_spec.js | 2 +- .../display/message_display_mode_spec.js | 4 +- .../display/theme/code_theme_colors_spec.js | 4 +- .../theme/custom_theme_color_picker_spec.js | 4 +- .../theme/custom_theme_sidebar_styles_spec.js | 4 +- .../settings/display/theme/save_theme_spec.js | 4 +- .../display/theme/settings_view_spec.js | 2 +- .../display/timezone_display_mode_spec.js | 10 +- .../channel_switcher_not_cloud_spec.js | 2 +- .../settings/sidebar/channel_switcher_spec.js | 4 +- .../settings/sidebar/fullname_spec.js | 4 +- .../authentication_spec.js | 4 +- .../desktop_session_expire_spec.js | 8 +- .../forgot_password_spec.js | 4 +- .../signin_authentication/helpers.js | 2 +- .../login_close_server_spec.js | 2 +- .../login_logout_smoke_spec.js | 2 +- .../login_open_server_spec.js | 4 +- .../mfa_authentication_spec.js | 4 +- .../signin_authentication/signup_spec.js | 4 +- .../slash_commands/autocomplete_spec.js | 4 +- .../channels}/status/status_dnd_1_spec.js | 2 +- .../subpath/subpath_channel_routing_spec.js | 4 +- .../subpath/subpath_dm_search_spec.js | 8 +- .../channels}/subpath/subpath_login_spec.js | 2 +- .../authentication/password_settings_spec.js | 2 +- .../custom_terms_of_service_spec.js | 2 +- .../system_console/demoted_user_spec.js | 6 +- .../system_console/environment_spec.js | 4 +- .../feature_discovery_cloud_spec.js | 2 +- .../feature_discovery_not_cloud_spec.js | 2 +- .../system_console/feature_discovery_spec.js | 2 +- .../system_console/inactive_users_spec.js | 2 +- .../lock_teammate_name_display_spec.js | 2 +- .../system_console/main_menu_spec.js | 2 +- .../system_console/mobile_settings_spec.js | 2 +- .../plugin_marketplace_url_spec.js | 2 +- .../reporting/server_logs_spec.js | 4 +- .../reporting/site_statistics_spec.js | 4 +- .../reporting/site_statistics_te_spec.js | 4 +- .../reporting/team_statistics_spec.js | 4 +- .../revoke_all_sessions_spec.js | 6 +- .../search_box_not_cloud_spec.js | 4 +- .../system_console/session_length_spec.js | 2 +- .../sidebar_link_navigation_team_spec.js | 6 +- .../announcement_banner_spec.js | 6 +- .../site_configuration/customization_spec.js | 4 +- .../site_configuration/helper.js | 2 +- .../link_customization_cloud_spec.js | 6 +- .../link_customization_e20_1_spec.js | 6 +- .../link_customization_e20_2_spec.js | 6 +- .../system_console/site_url_config_spec.js | 2 +- .../support_packet_generation_spec.js | 2 +- .../system_console/true_up_review_spec.js | 0 .../custom_site_name_description_spec.ts | 2 +- .../customization_not_cloud_spec.js | 4 +- .../ui_and_api/customization_spec.js | 4 +- .../system_console/unsaved_changes_spec.js | 4 +- .../users_deactivation_1_spec.js | 4 +- .../users_deactivation_not_cloud_spec.js | 4 +- .../users_deactivation_spec.js | 6 +- .../users_reactivation_spec.js | 8 +- .../user_management/users_spec.js | 4 +- .../user_management_not_cloud_spec.js | 4 +- .../system_console/user_management_spec.js | 6 +- .../system_console/workspace_deletion_spec.js | 2 +- .../team_settings/archive_team_spec.ts | 4 +- .../closed_team_invite_by_email_spec.js | 8 +- ..._invite_with_non_mattermost_domain_spec.js | 6 +- ...d_team_invite_with_specific_domain_spec.js | 6 +- .../team_settings/create_a_team_spec.js | 4 +- .../channels}/team_settings/helpers.js | 4 +- .../invite_members_backdrop_spec.js | 2 +- .../team_settings/invite_members_spec.js | 2 +- .../invite_user_to_closed_team_spec.js | 6 +- ...closed_team_with_not_allowed_email_spec.js | 6 +- .../team_settings/manage_members_spec.js | 2 +- .../team_settings/remove_team_icon_spec.js | 2 +- .../teammates_pagination_spec.js | 2 +- .../channels}/team_settings/teams_spec.js | 6 +- .../integration/channels}/toast/helpers.js | 4 +- .../toast/new_messages_toast_spec.js | 6 +- .../channels}/toast/permalink_jump_to_spec.js | 2 +- .../channels}/toast/permalink_post_spec.js | 2 +- .../permalink_post_with_new_message_spec.js | 4 +- .../integration/channels}/toast/toast_spec.js | 4 +- .../unread_with_bottom_start_toast_spec.js | 4 +- .../channel_created/new_sidebar_spec.js | 4 +- .../channel_created/old_sidebar_spec.js | 4 +- .../websocket/handle_new_post_spec.js | 8 +- .../websocket/handle_removed_user/helpers.js | 0 .../handle_removed_user/new_sidebar_spec.js | 4 +- .../playbooks/adminconsole/analytics_spec.js | 107 + .../integration/playbooks/api/runs_spec.js | 189 + .../playbooks/channels/app_bar_spec.js | 97 + .../playbooks/channels/broadcast_spec.js | 382 + .../playbooks/channels/channel_header_spec.js | 125 + .../channels/general_actions_spec.js | 367 + .../channels/playbook_run_actions.js | 644 ++ .../channels/post_type_components_spec.js | 173 + .../playbooks/channels/retrospective_spec.js | 242 + .../playbooks/channels/rhs/about_spec.js | 132 + .../playbooks/channels/rhs/checklist_spec.js | 489 ++ .../playbooks/channels/rhs/header_spec.js | 225 + .../playbooks/channels/rhs/home_spec.js | 159 + .../playbooks/channels/rhs/list_spec.js | 263 + .../channels/rhs/start_run_rhs_spec.js | 590 ++ .../channels/rhs/status_update_spec.js | 498 ++ .../playbooks/channels/rhs/template_spec.js | 82 + .../playbooks/channels/rhs/title_spec.js | 94 + .../playbooks/channels/rhs_spec.js | 417 + .../playbooks/channels/run_dialog_spec.js | 132 + .../playbooks/channels/run_spec.js | 111 + .../channels/slash_command/commands_spec.js | 558 ++ .../channels/slash_command/info_spec.js | 120 + .../channels/slash_command/owner_spec.js | 222 + .../channels/slash_command/test_spec.js | 255 + .../channels/slash_command/todo_spec.js | 322 + .../channels/update_request_post_spec.js | 192 + .../integration/playbooks/digest_spec.js | 178 + .../tests/integration/playbooks/lhs_spec.js | 450 ++ .../integration/playbooks/navigation_spec.js | 72 + .../playbooks/playbooks/access_spec.js | 114 + .../playbooks/creation_button_spec.js | 201 + .../playbooks/edit/task_actions_spec.js | 470 ++ .../playbooks/playbooks/edit_metrics_spec.js | 570 ++ .../playbooks/playbooks/edit_spec.js | 1708 ++++ .../playbooks/playbooks/feedback_spec.js | 102 + .../playbooks/playbooks/list_spec.js | 216 + .../playbooks/playbooks/overview_spec.js | 471 ++ .../playbooks/playbooks/pagination_spec.js | 68 + .../playbooks/playbooks/start_run_spec.js | 578 ++ .../playbooks/playbooks/status_update_spec.js | 196 + .../integration/playbooks/runs/list_spec.js | 262 + .../playbooks/runs/permissions_spec.js | 506 ++ .../playbooks/runs/rdp_general_spec.js | 83 + .../playbooks/runs/rdp_main_checklist_spec.js | 150 + .../playbooks/runs/rdp_main_finish_spec.js | 130 + .../playbooks/runs/rdp_main_header_spec.js | 896 +++ .../playbooks/runs/rdp_main_restore_spec.js | 107 + .../runs/rdp_main_retrospective_spec.js | 500 ++ .../runs/rdp_main_statusupdate_spec.js | 314 + .../playbooks/runs/rdp_main_summary_spec.js | 162 + .../runs/rdp_main_taskactions_spec.js | 712 ++ .../runs/rdp_rhs_participants_spec.js | 266 + .../playbooks/runs/rdp_rhs_runinfo_spec.js | 549 ++ .../playbooks/runs/rdp_rhs_spec.js | 129 + .../runs/rdp_rhs_statusupdates_spec.js | 146 + .../playbooks/runs/taskinbox_spec.js | 215 + .../playbooks/tours_spec_ignore_.js | 121 + .../cypress/tests/plugins/client_request.js | 0 .../cypress/tests/plugins/db_request.js | 0 .../cypress/tests/plugins/external_request.ts | 0 .../cypress/tests/plugins/file_util.js | 0 .../cypress/tests/plugins/get_pdf_content.js | 0 .../cypress/tests/plugins/get_recent_email.js | 0 .../cypress/tests/plugins/index.js | 0 .../cypress/tests/plugins/keycloak_request.js | 0 .../cypress/tests/plugins/okta_request.js | 0 .../cypress/tests/plugins/post_bot_message.js | 0 .../tests/plugins/post_incoming_webhook.js | 0 .../tests/plugins/post_list_of_messages.js | 0 .../cypress/tests/plugins/post_message_as.js | 0 .../tests/plugins/react_to_message_as.js | 0 .../cypress/tests/plugins/shell.js | 0 .../cypress/tests/plugins/url_health_check.js | 0 .../cypress/tests/support/api/bots.d.ts | 0 .../cypress/tests/support/api/bots.js | 0 .../cypress/tests/support/api/brand.d.ts | 0 .../cypress/tests/support/api/brand.js | 0 .../cypress/tests/support/api/channel.d.ts | 0 .../cypress/tests/support/api/channel.js | 0 .../cypress/tests/support/api/cloud.d.ts | 0 .../cypress/tests/support/api/cloud.js | 0 .../support/api/cloud_default_config.json | 0 .../cypress/tests/support/api/cluster.d.ts | 0 .../cypress/tests/support/api/cluster.js | 0 .../cypress/tests/support/api/common.d.ts | 0 .../cypress/tests/support/api/common.js | 0 .../tests/support/api/data_retention.d.ts | 0 .../tests/support/api/data_retention.js | 0 .../cypress/tests/support/api/helpers.js | 0 .../cypress/tests/support/api/index.js | 3 +- .../cypress/tests/support/api/keycloak.d.ts | 0 .../cypress/tests/support/api/keycloak.js | 0 .../tests/support/api/keycloak_realm.json | 0 .../cypress/tests/support/api/ldap.d.ts | 0 .../cypress/tests/support/api/ldap.js | 0 .../support/api/on_prem_default_config.json | 3 +- e2e/cypress/tests/support/api/playbooks.js | 491 ++ .../cypress/tests/support/api/plugin.d.ts | 0 .../cypress/tests/support/api/plugin.js | 0 .../cypress/tests/support/api/preference.d.ts | 0 .../cypress/tests/support/api/preference.js | 22 + .../cypress/tests/support/api/role.d.ts | 0 e2e/cypress/tests/support/api/role.js | 83 + .../cypress/tests/support/api/saml.d.ts | 0 .../cypress/tests/support/api/saml.js | 0 .../cypress/tests/support/api/scheme.d.ts | 0 .../cypress/tests/support/api/scheme.js | 0 .../cypress/tests/support/api/setup.ts | 0 .../cypress/tests/support/api/status.d.ts | 0 .../cypress/tests/support/api/status.js | 0 .../cypress/tests/support/api/system.d.ts | 0 .../cypress/tests/support/api/system.js | 0 .../cypress/tests/support/api/team.d.ts | 0 .../cypress/tests/support/api/team.js | 0 .../cypress/tests/support/api/user.d.ts | 0 .../cypress/tests/support/api/user.js | 20 +- .../cypress/tests/support/api/webhooks.d.ts | 0 .../cypress/tests/support/api/webhooks.js | 0 .../cypress/tests/support/api_commands.ts | 0 .../cypress/tests/support/assertions.js | 0 .../cypress/tests/support/client-impl.js | 0 .../cypress/tests/support/client.d.ts | 0 .../cypress/tests/support/client.js | 0 .../tests/support/common_login_commands.d.ts | 0 .../tests/support/common_login_commands.js | 0 .../cypress/tests/support/constants.js | 0 .../cypress/tests/support/db_commands.ts | 0 .../cypress/tests/support/email.ts | 0 .../e2e => e2e}/cypress/tests/support/env.ts | 0 .../tests/support/extended_commands.d.ts | 0 .../tests/support/extended_commands.js | 0 .../tests/support/external_commands.d.ts | 0 .../tests/support/external_commands.js | 0 .../cypress/tests/support/fetch_commands.js | 0 .../cypress/tests/support/index.d.ts | 0 .../cypress/tests/support/index.js | 2 - .../tests/support/keycloak_commands.d.ts | 0 .../tests/support/keycloak_commands.js | 0 .../cypress/tests/support/ldap_commands.d.ts | 0 .../cypress/tests/support/ldap_commands.js | 0 .../tests/support/ldap_server_commands.d.ts | 0 .../tests/support/ldap_server_commands.js | 0 .../cypress/tests/support/notification.ts | 0 .../cypress/tests/support/okta_commands.js | 0 .../cypress/tests/support/saml_commands.js | 0 .../cypress/tests/support/shell.d.ts | 0 .../cypress/tests/support/shell.js | 0 .../cypress/tests/support/task_commands.ts | 0 .../support/ui/account_settings_modal.d.ts | 0 .../support/ui/account_settings_modal.js | 0 .../tests/support/ui/announcement_bar.d.ts | 0 .../tests/support/ui/announcement_bar.js | 0 .../cypress/tests/support/ui/boards.d.ts | 0 .../cypress/tests/support/ui/boards.js | 0 .../cypress/tests/support/ui/channel.d.ts | 0 .../cypress/tests/support/ui/channel.js | 0 .../tests/support/ui/channel_header.d.ts | 0 .../tests/support/ui/channel_header.js | 0 .../tests/support/ui/channel_sidebar.js | 0 .../tests/support/ui/cloud_billing.d.ts | 0 .../cypress/tests/support/ui/cloud_billing.js | 0 .../cypress/tests/support/ui/common.d.ts | 0 .../cypress/tests/support/ui/common.js | 0 .../tests/support/ui/compliance_export.d.ts | 0 .../tests/support/ui/compliance_export.js | 0 .../tests/support/ui/data_retention.d.ts | 0 .../tests/support/ui/data_retention.js | 0 .../cypress/tests/support/ui/emoji.ts | 0 .../support/ui/extend_testing_library.d.ts | 0 .../support/ui/extend_testing_library.js | 0 .../tests/support/ui/file_preview.d.ts | 0 .../cypress/tests/support/ui/file_preview.js | 0 .../tests/support/ui/global_header.d.ts | 0 .../cypress/tests/support/ui/global_header.js | 0 .../cypress/tests/support/ui/index.js | 1 + .../cypress/tests/support/ui/login.d.ts | 0 .../cypress/tests/support/ui/login.js | 0 .../cypress/tests/support/ui/menu.d.ts | 0 .../cypress/tests/support/ui/menu.js | 0 .../cypress/tests/support/ui/mfa.d.ts | 0 .../cypress/tests/support/ui/mfa.js | 0 .../cypress/tests/support/ui/modal.d.ts | 0 .../cypress/tests/support/ui/modal.js | 0 e2e/cypress/tests/support/ui/playbooks.js | 334 + .../cypress/tests/support/ui/post.ts | 0 .../tests/support/ui/post_dropdown_menu.d.ts | 0 .../tests/support/ui/post_dropdown_menu.js | 0 .../cypress/tests/support/ui/search.js | 0 .../cypress/tests/support/ui/sidebar_left.ts | 0 .../tests/support/ui/sidebar_right.d.ts | 0 .../cypress/tests/support/ui/sidebar_right.js | 0 .../tests/support/ui/suggestion_list.d.ts | 0 .../tests/support/ui/suggestion_list.js | 0 .../cypress/tests/support/ui/system.d.ts | 0 .../cypress/tests/support/ui/system.js | 0 .../cypress/tests/support/ui/team.js | 0 .../cypress/tests/support/ui/tooltip.d.ts | 0 .../cypress/tests/support/ui/tooltip.js | 0 .../cypress/tests/support/ui_commands.ts | 47 + .../cypress/tests/support/win.d.ts | 0 .../e2e => e2e}/cypress/tests/types/index.ts | 0 .../cypress/tests/utils/admin_console.js | 0 .../cypress/tests/utils/benchmark.js | 0 .../e2e => e2e}/cypress/tests/utils/config.js | 0 .../cypress/tests/utils/constants.js | 0 .../e2e => e2e}/cypress/tests/utils/email.js | 0 .../e2e => e2e}/cypress/tests/utils/file.js | 0 .../e2e => e2e}/cypress/tests/utils/index.js | 0 .../cypress/tests/utils/plugins.js | 0 .../cypress/tests/utils/timezone.js | 0 .../e2e => e2e}/cypress/tsconfig.json | 6 +- .../e2e => e2e}/cypress/utils/artifacts.js | 0 .../e2e => e2e}/cypress/utils/constants.js | 0 .../e2e => e2e}/cypress/utils/dashboard.js | 0 .../cypress/utils/even_distribution.js | 0 .../cypress/utils/even_distribution.test.js | 0 .../e2e => e2e}/cypress/utils/file.js | 0 .../e2e => e2e}/cypress/utils/report.js | 0 .../e2e => e2e}/cypress/utils/test_cases.js | 0 .../cypress/utils/webhook_utils.js | 0 .../e2e => e2e}/cypress/webhook_serve.js | 2 +- .../e2e => e2e}/playwright/.eslintignore | 1 + .../e2e => e2e}/playwright/.eslintrc.json | 0 .../e2e => e2e}/playwright/.percy.yml | 0 .../e2e => e2e}/playwright/.prettierignore | 0 .../e2e => e2e}/playwright/.prettierrc.json | 0 .../channels/e2e => e2e}/playwright/README.md | 6 +- .../e2e => e2e}/playwright/global_setup.ts | 7 +- .../e2e => e2e}/playwright/package-lock.json | 0 .../e2e => e2e}/playwright/package.json | 0 .../playwright/playwright.config.ts | 0 .../support/asset/mattermost-icon_128x128.png | Bin .../playwright/support/browser_context.ts | 0 .../e2e => e2e}/playwright/support/flag.ts | 0 .../playwright/support/server/channel.ts | 0 .../playwright/support/server/client.ts | 0 .../support/server/default_config.ts | 3 + .../playwright/support/server/index.ts | 0 .../playwright/support/server/init.ts | 0 .../playwright/support/server/team.ts | 0 .../playwright/support/server/user.ts | 0 .../playwright/support/test_action.ts | 0 .../playwright/support/test_fixture.ts | 0 .../ui/components/boards/create_modal.ts | 0 .../support/ui/components/boards/sidebar.ts | 0 .../support/ui/components/channels/app_bar.ts | 0 .../support/ui/components/channels/post.ts | 0 .../ui/components/channels/post_create.ts | 0 .../support/ui/components/global_header.ts | 0 .../playwright/support/ui/components/index.ts | 0 .../support/ui/pages/boards_create.ts | 0 .../support/ui/pages/boards_view.ts | 0 .../playwright/support/ui/pages/channels.ts | 0 .../playwright/support/ui/pages/index.ts | 0 .../support/ui/pages/landing_login.ts | 0 .../playwright/support/ui/pages/login.ts | 0 .../playwright/support/ui/pages/signup.ts | 0 .../e2e => e2e}/playwright/support/util.ts | 0 .../playwright/support/visual/index.ts | 0 .../playwright/support/visual/percy.ts | 0 .../e2e => e2e}/playwright/test.config.ts | 0 .../create_empty_board.spec.ts | 0 .../visual/boards/board_template.spec.ts | 0 .../board-template-chrome-linux.png | Bin .../board-template-firefox-linux.png | Bin .../board-template-ipad-linux.png | Bin .../visual/boards/view_untitled_board.spec.ts | 0 .../view-untitled-board-chrome-linux.png | Bin .../view-untitled-board-firefox-linux.png | Bin .../view-untitled-board-ipad-linux.png | Bin .../visual/channels/intro_channel.spec.ts | 0 ...o-channel-as-regular-user-chrome-linux.png | Bin ...-channel-as-regular-user-firefox-linux.png | Bin ...-to-channel-as-regular-user-ipad-linux.png | Bin ...o-channel-as-regular-user-iphone-linux.png | Bin .../tests/visual/common/landing_page.spec.ts | 0 .../landing-login-chrome-linux.png | Bin .../landing-login-firefox-linux.png | Bin .../landing-login-ipad-linux.png | Bin .../landing-login-iphone-linux.png | Bin .../tests/visual/common/login.spec.ts | 0 .../login-chrome-linux.png | Bin .../login-error-chrome-linux.png | Bin .../login-error-firefox-linux.png | Bin .../login-error-ipad-linux.png | Bin .../login-error-iphone-linux.png | Bin .../login-firefox-linux.png | Bin .../login-ipad-linux.png | Bin .../login-iphone-linux.png | Bin .../tests/visual/common/signup_email.spec.ts | 0 .../signup-email-chrome-linux.png | Bin .../signup-email-error-chrome-linux.png | Bin .../signup-email-error-firefox-linux.png | Bin .../signup-email-error-ipad-linux.png | Bin .../signup-email-error-iphone-linux.png | Bin .../signup-email-firefox-linux.png | Bin .../signup-email-ipad-linux.png | Bin .../signup-email-iphone-linux.png | Bin .../e2e => e2e}/playwright/tsconfig.json | 4 +- webapp/channels/.gitignore | 19 - webapp/channels/e2e/cypress/.ignore | 1 - .../e2e/cypress/tests/support/api/role.js | 632 -- 1138 files changed, 26622 insertions(+), 2754 deletions(-) create mode 100644 .github/workflows/e2e-ci.yml create mode 100644 e2e/.gitignore create mode 100644 e2e/cypress/.eslintignore create mode 100644 e2e/cypress/.eslintrc.json rename {webapp/channels/e2e => e2e}/cypress/Dockerfile.webhook (100%) rename {webapp/channels/e2e => e2e}/cypress/README-Subpath.md (100%) rename {webapp/channels/e2e => e2e}/cypress/cypress.config.ts (100%) rename {webapp/channels/e2e => e2e}/cypress/generate_test_cycle.js (100%) rename {webapp/channels/e2e => e2e}/cypress/package-lock.json (78%) rename {webapp/channels/e2e => e2e}/cypress/package.json (72%) rename {webapp/channels/e2e => e2e}/cypress/patches/@testing-library+cypress+9.0.0.patch (100%) rename {webapp/channels/e2e => e2e}/cypress/run_test_cycle.js (100%) rename {webapp/channels/e2e => e2e}/cypress/run_tests.js (100%) rename {webapp/channels/e2e => e2e}/cypress/save_report.js (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/extensions/Ignore-X-Frame-headers/background.js (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/extensions/Ignore-X-Frame-headers/manifest.json (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/fixtures/MM-logo-horizontal.png (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/fixtures/animated-gif-image-file.gif (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/fixtures/bmp-image-file.bmp (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/fixtures/bot-default-avatar.png (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/fixtures/client_billing.json (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/fixtures/console-example-inputs.json (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/fixtures/date_time_format.js (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/fixtures/favicon-16x16.png (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/fixtures/favicon-default-16x16.png (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/fixtures/favicon-mentions-16x16.png (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/fixtures/favicon-unread-16x16.png (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/fixtures/gif-image-file-resized.gif (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/fixtures/gif-image-file.gif (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/fixtures/hooks/message_menus.json (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/fixtures/hooks/message_menus_with_datasource.json (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/fixtures/huge-image.jpg (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/fixtures/image-1000x40.jpg (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/fixtures/image-1600x40.jpg (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/fixtures/image-20x20.jpg (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/fixtures/image-400x40.jpg (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/fixtures/image-400x400.jpg (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/fixtures/image-40x400.jpg (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/fixtures/image-50x50.jpg (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/fixtures/image-60x60.jpg (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/fixtures/image-small-height.png (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/fixtures/image-small-width.png (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/fixtures/interactive_message_menus_options.json (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/fixtures/jpg-image-file.jpg (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/fixtures/ldap-add-user.ldif (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/fixtures/ldap-reset-data.ldif (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/fixtures/ldap_users.json (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/fixtures/long_text_post.txt (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/fixtures/m4a-audio-file.m4a (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/fixtures/markdown/markdown_basic.html (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/fixtures/markdown/markdown_basic.md (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/fixtures/markdown/markdown_block_quotes_1.html (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/fixtures/markdown/markdown_block_quotes_1.md (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/fixtures/markdown/markdown_block_quotes_2.md (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/fixtures/markdown/markdown_carriage_return.html (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/fixtures/markdown/markdown_carriage_return.md (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/fixtures/markdown/markdown_carriage_return_two_lines.html (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/fixtures/markdown/markdown_carriage_return_two_lines.md (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/fixtures/markdown/markdown_code_block.html (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/fixtures/markdown/markdown_code_block.md (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/fixtures/markdown/markdown_code_syntax.html (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/fixtures/markdown/markdown_escape_characters.html (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/fixtures/markdown/markdown_escape_characters.md (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/fixtures/markdown/markdown_headings.html (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/fixtures/markdown/markdown_headings.md (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/fixtures/markdown/markdown_inline_code.html (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/fixtures/markdown/markdown_inline_code.md (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/fixtures/markdown/markdown_inline_images_1.md (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/fixtures/markdown/markdown_inline_images_2.md (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/fixtures/markdown/markdown_inline_images_3.md (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/fixtures/markdown/markdown_inline_images_4.md (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/fixtures/markdown/markdown_inline_images_5.md (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/fixtures/markdown/markdown_inline_images_6.md (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/fixtures/markdown/markdown_latex.html (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/fixtures/markdown/markdown_latex.md (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/fixtures/markdown/markdown_lines.html (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/fixtures/markdown/markdown_lines.md (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/fixtures/markdown/markdown_list.html (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/fixtures/markdown/markdown_not_autolink.html (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/fixtures/markdown/markdown_not_autolink.md (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/fixtures/markdown/markdown_not_in_code_block.html (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/fixtures/markdown/markdown_not_in_code_block.md (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/fixtures/markdown/markdown_postgres.html (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/fixtures/markdown/markdown_postgres.md (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/fixtures/markdown/markdown_python.html (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/fixtures/markdown/markdown_python.md (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/fixtures/markdown/markdown_shell.html (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/fixtures/markdown/markdown_shell.md (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/fixtures/markdown/markdown_tables.html (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/fixtures/markdown/markdown_test_basic.html (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/fixtures/markdown/markdown_text_style.html (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/fixtures/markdown/markdown_text_style.md (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/fixtures/markdown/markdown_typescript.html (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/fixtures/markdown/markdown_typescript.md (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/fixtures/mattermost-icon.png (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/fixtures/mattermost-icon_128x128.png (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/fixtures/messages.js (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/fixtures/mm_file_testing/Audio/AAC.aac (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/fixtures/mm_file_testing/Audio/FLAC.flac (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/fixtures/mm_file_testing/Audio/M4A.m4a (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/fixtures/mm_file_testing/Audio/M4R.m4r (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/fixtures/mm_file_testing/Audio/MP3.mp3 (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/fixtures/mm_file_testing/Audio/OGG.ogg (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/fixtures/mm_file_testing/Audio/WAV.wav (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/fixtures/mm_file_testing/Audio/WMA.wma (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/fixtures/mm_file_testing/Code/JSON (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/fixtures/mm_file_testing/Code/Patch.diff (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/fixtures/mm_file_testing/Code/Python (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/fixtures/mm_file_testing/Documents/Excel.xlsx (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/fixtures/mm_file_testing/Documents/PDF.pdf (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/fixtures/mm_file_testing/Documents/PPT.pptx (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/fixtures/mm_file_testing/Documents/Text.txt (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/fixtures/mm_file_testing/Documents/Word.docx (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/fixtures/mm_file_testing/Images/BMP.bmp (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/fixtures/mm_file_testing/Images/GIF.gif (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/fixtures/mm_file_testing/Images/JPG.jpg (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/fixtures/mm_file_testing/Images/PNG.png (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/fixtures/mm_file_testing/Images/PSD.psd (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/fixtures/mm_file_testing/Images/TIFF.tif (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/fixtures/mm_file_testing/Video/AVI.avi (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/fixtures/mm_file_testing/Video/MKV.mkv (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/fixtures/mm_file_testing/Video/MOV.mov (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/fixtures/mm_file_testing/Video/MP4.mp4 (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/fixtures/mm_file_testing/Video/MPG.mpg (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/fixtures/mm_file_testing/Video/WEBM.webm (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/fixtures/mm_file_testing/Video/WMV.wmv (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/fixtures/mp3-audio-file.mp3 (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/fixtures/mp4-video-file.mp4 (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/fixtures/mpeg-video-file.mpg (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/fixtures/png-image-file.png (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/fixtures/powerpoint-file.ppt (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/fixtures/powerpointx-file.pptx (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/fixtures/saml_ldap_users.json (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/fixtures/saml_users.json (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/fixtures/small-image.png (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/fixtures/svg.svg (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/fixtures/system-roles-console-access.json (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/fixtures/theme.json (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/fixtures/tiff-image-file.tif (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/fixtures/timeouts.js (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/fixtures/txt-changed-as-png.png (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/fixtures/webhook_icon.jpg (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/fixtures/webhook_override_icon.png (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/fixtures/word-file.doc (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/fixtures/wordx-file.docx (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/integration/boards/card_badges_spec.ts (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/integration/boards/card_urlproperty_spec.ts (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/integration/boards/create_board_spec.ts (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/integration/boards/group_by_property_spec.ts (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/integration/boards/manage_groups_spec.ts (100%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/accessibility/accessibility_account_settings_spec.js (99%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/accessibility/accessibility_buttons_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/accessibility/accessibility_dropdowns_spec.js (99%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/accessibility/accessibility_image_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/accessibility/accessibility_keyboard_usability_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/accessibility/accessibility_nav_diff_regions_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/accessibility/accessibility_popovers_spec.js (99%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/accessibility/accessibility_post_spec.js (99%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/accessibility/accessibility_sidebar_dm_spec.js (97%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/accessibility/accessibility_sidebar_spec.ts (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/account_settings/account_settings_spec.ts (99%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/account_settings/main_menu_stays_open_spec.ts (94%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/account_settings/profile/account_settings_position_spec.ts (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/account_settings/profile/email_spec.ts (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/account_settings/profile/fullname_edit_spec.ts (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/account_settings/profile/fullname_truncate_spec.ts (97%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/account_settings/profile/help_text_link_spec.ts (97%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/account_settings/profile/nickname_spec.ts (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/account_settings/profile/profile_picture_change_spec.ts (96%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/account_settings/profile/profile_picture_spec.ts (96%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/account_settings/profile/username_spec.ts (99%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/account_settings/security/access_history_spec.ts (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/account_settings/security/active_sessions_spec.ts (96%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/account_settings/security/password_spec.ts (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/ad_ldap/saml_ldap_sync_id_attrib_spec.js (93%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/ad_ldap/saml_ldap_sync_remove_spec.js (94%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/ad_ldap/saml_ldap_sync_spec.js (94%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/archived_channel/archive_channel_add_reaction_spec.ts (97%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/archived_channel/archive_channel_header_spec.ts (99%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/archived_channel/archive_channel_member_spec.ts (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/archived_channel/archive_channel_operations_spec.ts (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/archived_channel/archive_channel_post_spec.ts (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/archived_channel/archive_channel_reaction_spec.ts (97%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/archived_channel/archive_channel_search_spec.ts (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/archived_channel/archived_channel_spec.ts (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/archived_channel/archived_leave_channel_spec.ts (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/archived_channel/helpers.ts (94%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/archived_channel/join_archived_channel_spec.ts (97%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/archived_channel/leave_archived_channel_spec.ts (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/archived_channel/post_menu_spec.ts (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/auth_sso/authentication_1_spec.ts (97%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/auth_sso/authentication_2_spec.ts (97%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/auth_sso/authentication_3_spec.ts (97%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/auth_sso/authentication_4_spec.ts (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/auth_sso/authentication_not_cloud_spec.ts (95%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/auth_sso/hide_create_account_spec.ts (90%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/autocomplete/common_test.ts (100%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/autocomplete/database/users_in_channel_switcher_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/autocomplete/database/users_in_message_input_box_spec.js (97%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/autocomplete/database/users_spec.js (94%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/autocomplete/helpers.ts (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/benchmark/message_spec.ts (94%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/bot_accounts/bot_api_1_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/bot_accounts/bot_api_2_spec.js (99%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/bot_accounts/bot_api_not_cloud_spec.js (96%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/bot_accounts/bot_channel_intro_spec.js (95%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/bot_accounts/create_bot_spec.js (96%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/bot_accounts/crud_not_cloud_spec.js (96%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/bot_accounts/crud_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/bot_accounts/display_name_spec.js (99%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/bot_accounts/edit_bot_spec.js (95%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/bot_accounts/edit_bot_username_spec.js (97%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/bot_accounts/helpers.js (90%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/bot_accounts/in_lists_1_spec.js (93%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/bot_accounts/in_lists_2_spec.js (96%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/bot_accounts/in_teams_and_channels_spec.js (95%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/bot_accounts/managing_bot_accounts_not_cloud_spec.js (95%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/bot_accounts/managing_bot_accounts_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/bot_accounts/post_message_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/bot_accounts/promote_demote_spec.js (95%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/bot_accounts/sidebar_display_spec.js (95%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/bot_accounts/tags_spec.js (97%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/channel/archived_channels_1_spec.js (99%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/channel/archived_channels_2_spec.js (97%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/channel/channel_info_rhs_spec.js (99%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/channel/channel_members_rhs_spec.js (99%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/channel/channel_mention_autocomplete_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/channel/channel_name_tooltips_spec.js (97%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/channel/channel_routing_spec.js (99%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/channel/channel_settings_spec.js (97%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/channel/channel_switcher_spec.js (99%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/channel/close_direct_group_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/channel/convert_channel_to_private_spec.js (99%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/channel/leave_and_archive_channel_destructive_spec.ts (99%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/channel/leave_channel_spec.js (97%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/channel/more_channels_spec.js (99%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/channel/more_public_channels_spec.js (99%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/channel/new_channel_with_board_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/channel/open_rhs_coming_from_system_console_spec.ts (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/channel/user_to_admin_updates_manage_channel_members_rhs_spec.js (96%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/channel/user_to_channel_admin_member_updates_manage_channel_members_rhs_spec.js (97%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/channel_settings/add_users_to_channel_spec.ts (99%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/channel_settings/channel_header_spec.ts (96%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/channel_settings/channel_name_validations_spec.ts (97%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/channel_settings/more_unreads_position_with_scroll_spec.ts (97%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/channel_sidebar/category.d.ts (100%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/channel_sidebar/category_collapsing_spec.ts (97%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/channel_sidebar/category_muting_spec.ts (97%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/channel_sidebar/category_sorting_1_spec.ts (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/channel_sidebar/category_sorting_spec.ts (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/channel_sidebar/channel_sidebar_spec.ts (96%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/channel_sidebar/custom_categories_spec.ts (96%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/channel_sidebar/dm_category_spec.ts (97%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/channel_sidebar/dm_gm_behaviour_spec.ts (99%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/channel_sidebar/dm_gm_filtering_sorting_spec.ts (97%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/channel_sidebar/dm_sidebar_not_remove_spec.ts (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/channel_sidebar/drag_and_drop_spec.ts (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/channel_sidebar/group_unreads_separately_spec.ts (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/channel_sidebar/helpers.ts (95%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/channel_sidebar/history_channel_switcher_spec.ts (94%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/channel_sidebar/hotkeys_spec.ts (97%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/channel_sidebar/new_category_badge_spec.ts (96%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/channel_sidebar/new_channel_dropdown_spec.ts (96%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/channel_sidebar/sidebar_category_menu_spec.ts (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/channel_sidebar/sidebar_channel_menu_spec.ts (97%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/channel_sidebar/unread_filter_spec.ts (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/collapsed_reply_threads/channel_notifications_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/collapsed_reply_threads/crt_settings_spec.js (97%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/collapsed_reply_threads/crt_tour_spec.js (99%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/collapsed_reply_threads/files_1_spec.js (95%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/collapsed_reply_threads/files_spec.js (97%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/collapsed_reply_threads/following_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/collapsed_reply_threads/global_threads_spec.js (99%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/collapsed_reply_threads/last_viewed_spec.js (97%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/collapsed_reply_threads/replies_spec.js (99%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/collapsed_reply_threads/unread_spec.js (96%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/commands/leave_channel_spec.ts (94%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/custom_status/custom_status_1_spec.ts (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/custom_status/custom_status_2_spec.ts (99%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/custom_status/custom_status_3_spec.ts (99%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/custom_status/custom_status_4_spec.ts (99%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/custom_status/custom_status_5_spec.ts (99%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/custom_status/custom_status_6_spec.ts (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/custom_status/custom_status_expiry/custom_status_expiry_1_spec.ts (99%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/custom_status/custom_status_expiry/custom_status_expiry_2_spec.ts (99%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/custom_status/custom_status_expiry/custom_status_expiry_3_spec.ts (99%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/custom_status/custom_status_expiry/custom_status_expiry_4_spec.ts (99%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/emoji/custom_emoji_1_1_spec.ts (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/emoji/custom_emoji_1_spec.ts (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/emoji/custom_emoji_2_1_spec.ts (97%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/emoji/custom_emoji_2_spec.ts (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/emoji/custom_emoji_3_spec.ts (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/emoji/helpers.js (95%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/emoji/recently_used_emoji_1_spec.ts (97%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/emoji/recently_used_emoji_2_spec.ts (94%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/emoji/sorted_emojis_spec.ts (97%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/enterprise/accessibility/accessibility_input_fields_spec.js (99%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/enterprise/accessibility/accessibility_modals_dialogs_1_spec.js (97%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/enterprise/accessibility/accessibility_modals_dialogs_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/enterprise/auth_sso/authentication_spec.js (95%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/enterprise/auth_sso/mfa_authentication_spec.js (97%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/enterprise/bot_accounts/managing_bot_accounts_spec.js (93%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/enterprise/channel/channel_groups_spec.ts (96%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/enterprise/cloud/billing/after_subscription_spec.js (99%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/enterprise/cloud/billing/billing_history_free_trial_spec.ts (99%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/enterprise/cloud/billing/cloud_pricing_modal_spec.ts (99%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/enterprise/cloud/billing/company_information_free_trial_spec.ts (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/enterprise/cloud/billing/downgrade_feedback_modal_spec.ts (99%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/enterprise/cloud/billing/notify_admin_spec.ts (99%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/enterprise/cloud/billing/payment_free_trial_spec.ts (99%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/enterprise/cloud/billing/subscriptions_free_trial_spec.ts (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/enterprise/cloud/billing/yearly_subscription_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/enterprise/elasticsearch_autocomplete/channels_spec.js (97%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/enterprise/elasticsearch_autocomplete/channels_with_special_characters_spec.js (97%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/enterprise/elasticsearch_autocomplete/helpers/index.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/enterprise/elasticsearch_autocomplete/renaming_spec.js (94%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/enterprise/elasticsearch_autocomplete/renaming_team_spec.js (93%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/enterprise/elasticsearch_autocomplete/system_console_spec.js (96%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/enterprise/elasticsearch_autocomplete/users_in_channel_switcher_spec.js (97%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/enterprise/elasticsearch_autocomplete/users_in_message_input_box_spec.js (97%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/enterprise/elasticsearch_autocomplete/users_spec.js (92%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/enterprise/extend_session/email_login_activity_spec.ts (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/enterprise/extend_session/not_extended_when_disabled/helpers.js (97%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/enterprise/extend_session/not_extended_when_disabled/with_email_login_spec.js (97%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/enterprise/extend_session/not_extended_when_disabled/with_ldap_login_spec.js (94%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/enterprise/extend_session/not_extended_when_disabled/with_saml_login_spec.js (95%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/enterprise/extend_session/session_length_spec.ts (99%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/enterprise/group_mentions/group_mentions_permissions_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/enterprise/group_mentions/group_mentions_posts_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/enterprise/group_mentions/group_mentions_system_messages_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/enterprise/group_mentions/helpers.js (95%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/enterprise/guest_accounts/guest_add_spec.ts (96%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/enterprise/guest_accounts/guest_experience_ui_spec.ts (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/enterprise/guest_accounts/guest_feature_spec.ts (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/enterprise/guest_accounts/guest_identification_spec.ts (97%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/enterprise/guest_accounts/guest_identification_ui_not_cloud_spec.ts (95%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/enterprise/guest_accounts/guest_identification_ui_spec.ts (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/enterprise/guest_accounts/guest_invitation_ui_more_spec.ts (97%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/enterprise/guest_accounts/guest_invitation_ui_spec.ts (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/enterprise/guest_accounts/guest_popover_ui_spec.ts (96%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/enterprise/guest_accounts/guest_removal_ui_spec.ts (97%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/enterprise/guest_accounts/helpers.ts (100%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/enterprise/guest_accounts/member_invitation_ui_spec.ts (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/enterprise/guest_accounts/system_console_guest_access_ui_spec.ts (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/enterprise/guest_accounts/system_console_manage_guest_not_cloud_spec.ts (97%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/enterprise/guest_accounts/system_console_manage_guest_spec.ts (96%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/enterprise/integrations/incoming_webhook_spec.js (94%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/enterprise/ldap/ldap_group_sync_spec.js (99%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/enterprise/ldap/ldap_guest_spec.js (97%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/enterprise/ldap/ldap_login_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/enterprise/ldap/ldap_setting_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/enterprise/ldap_group/channel_modes_spec.ts (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/enterprise/ldap_group/group_mentions_spec.ts (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/enterprise/ldap_group/groups_assign_roles_spec.ts (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/enterprise/ldap_group/invite_bot_spec.ts (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/enterprise/ldap_group/search_channels_spec.ts (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/enterprise/ldap_group/team_and_channel_assign_roles_spec.ts (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/enterprise/oauth/oauth_spec.ts (99%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/enterprise/permissions/team_permissions_spec.ts (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/enterprise/profile_popover/profile_popover_spec.ts (99%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/enterprise/profile_popover/profile_popover_spec_user_a_b_spec.ts (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/enterprise/saml/okta_login_spec.js (99%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/enterprise/saml/saml_automated_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/enterprise/saml/saml_guest_member_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/enterprise/saml/saml_metadata_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/enterprise/self-hosted/self_hosted_pricing_modal_spec.ts (99%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/enterprise/self-hosted/self_hosted_purchase_spec.ts (99%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/enterprise/system_console/about/edition_and_license_spec.js (96%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/enterprise/system_console/about/starter_edition_spec.js (93%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/enterprise/system_console/archived_channels_spec.js (96%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/enterprise/system_console/authentication_method_spec.js (94%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/enterprise/system_console/channel_members_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/enterprise/system_console/channel_moderation/channel_mentions_spec.js (99%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/enterprise/system_console/channel_moderation/constants.js (100%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/enterprise/system_console/channel_moderation/create_posts_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/enterprise/system_console/channel_moderation/helpers.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/enterprise/system_console/channel_moderation/higher_scoped_scheme_spec.js (99%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/enterprise/system_console/channel_moderation/manage_members_spec.js (97%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/enterprise/system_console/channel_moderation/post_reactions_spec.js (97%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/enterprise/system_console/channel_moderation/system_config_spec.js (96%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/enterprise/system_console/cluster_spec.js (97%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/enterprise/system_console/compliance/compliance_export_multiple_post_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/enterprise/system_console/compliance/compliance_export_ui_spec.js (97%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/enterprise/system_console/compliance/data_retention_policies_2_spec.js (99%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/enterprise/system_console/compliance/data_retention_policies_3_spec.js (99%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/enterprise/system_console/compliance/data_retention_policies_4_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/enterprise/system_console/compliance/data_retention_policies_spec.js (99%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/enterprise/system_console/compliance/download_bot_compliance_export_file_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/enterprise/system_console/compliance/download_compliance_export_file_spec.js (99%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/enterprise/system_console/compliance/helpers.js (99%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/enterprise/system_console/compliance/s3_bucket_storage_spec.js (96%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/enterprise/system_console/edition_and_license_link_spec.js (91%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/enterprise/system_console/environment_spec.js (96%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/enterprise/system_console/group_configuration_spec.js (99%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/enterprise/system_console/helpers.js (93%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/enterprise/system_console/limited_console_access_not_cloud_spec.js (96%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/enterprise/system_console/limited_console_access_spec.js (96%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/enterprise/system_console/main_menu_spec.js (97%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/enterprise/system_console/openid/openid_spec.js (97%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/enterprise/system_console/reporting/site_statistics_spec.js (97%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/enterprise/system_console/search_box_spec.js (95%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/enterprise/system_console/settings_spec.js (96%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/enterprise/system_console/sidebar_link_navigation_cloud_spec.js (93%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/enterprise/system_console/sidebar_link_navigation_e20_spec.js (92%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/enterprise/system_console/support_packet_generation_spec.js (97%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/enterprise/system_console/system_scheme_permission_part2_spec.js (97%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/enterprise/system_console/system_scheme_permission_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/enterprise/system_console/team_guest_channel_spec.js (95%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/enterprise/system_console/team_members_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/enterprise/system_console/team_scheme_permission_part2_spec.js (97%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/enterprise/system_console/team_scheme_permission_spec.js (99%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/enterprise/system_console/ui_and_api/notifications_spec.js (99%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/enterprise/teams/search_teams_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/files_and_attachments/cancel_file_upload_spec.js (100%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/files_and_attachments/channel_files_spec.js (97%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/files_and_attachments/cloud_upload_files_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/files_and_attachments/disabled_file_upload_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/files_and_attachments/edit_message_with_attachment_spec.js (95%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/files_and_attachments/file_preview_audio_spec.js (97%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/files_and_attachments/file_preview_generic_spec.js (97%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/files_and_attachments/file_preview_image_spec.js (97%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/files_and_attachments/file_preview_video_spec.js (97%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/files_and_attachments/helpers.js (97%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/files_and_attachments/image_link_preview_1_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/files_and_attachments/image_link_preview_new_window_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/files_and_attachments/image_link_preview_spec.js (99%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/files_and_attachments/paste_image_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/files_and_attachments/upload_files_not_cloud_spec.js (97%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/files_and_attachments/upload_files_spec.js (99%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/files_and_attachments/youtube_video_spec.js (97%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/insights/last_viewed_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/integrations/builtin_commands/common_commands_1_spec.js (97%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/integrations/builtin_commands/common_commands_2_spec.js (97%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/integrations/builtin_commands/common_commands_3_spec.js (92%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/integrations/builtin_commands/groupmsg_command_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/integrations/builtin_commands/helper.js (93%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/integrations/builtin_commands/invalid_commands_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/integrations/builtin_commands/invite_command_spec.js (99%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/integrations/builtin_commands/invite_people_command_spec.js (95%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/integrations/builtin_commands/user_status_commands_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/integrations/builtin_commands/user_status_spec.js (97%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/integrations/custom_slash_commands/custom_slash_commands_spec.js (99%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/integrations/custom_slash_commands/helpers.js (96%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/integrations/custom_slash_commands/slash_commands_spec.js (99%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/integrations/incoming_webhook/attachment_does_not_collapse_spec.ts (99%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/integrations/incoming_webhook/basic_formatting_spec.js (99%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/integrations/incoming_webhook/cancel_out_of_edit_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/integrations/incoming_webhook/copy_icon_spec.js (100%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/integrations/incoming_webhook/delete_incoming_webhook_spec.js (99%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/integrations/incoming_webhook/description_length_check_spec.js (97%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/integrations/incoming_webhook/disallow_username_profile_override_spec.js (97%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/integrations/incoming_webhook/edit_incoming_webhook_spec.js (99%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/integrations/incoming_webhook/helpers.js (100%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/integrations/incoming_webhook/inapp_username_profile_override_spec.js (97%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/integrations/incoming_webhook/incoming_webhook_creates_dm_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/integrations/incoming_webhook/incoming_webhook_is_image_only_spec.js (99%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/integrations/incoming_webhook/integrations_display_on_team_where_created_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/integrations/incoming_webhook/invalid_attachment_URL_webhook_spec.ts (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/integrations/incoming_webhook/long_url_embedded_image_spec.js (99%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/integrations/incoming_webhook/setting_spec.js (96%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/integrations/incoming_webhook/setup_incoming_webhook_spec.js (99%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/integrations/incoming_webhook/slack_formatting_spec.js (99%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/integrations/incoming_webhook/webhook_posts_when_creator_not_in_channel_spec.js (97%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/integrations/integrations_page_spec.js (99%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/integrations/integrations_search_gives_feedback_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/integrations/integrations_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/integrations/message_to_channel_via_slash_command_spec.js (99%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/integrations/outgoing_webhook/delete_outgoing_webhook_spec.js (97%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/integrations/outgoing_webhook/disable_outgoing_webhook_spec.js (97%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/integrations/outgoing_webhook/disable_override_username_profile_spec.js (99%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/integrations/outgoing_webhook/prompt_set_status_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/integrations/outgoing_webhook/regenerate_token_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/integrations/outgoing_webhook/search_on_outgoing_webhooks_spec.js (99%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/integrations/outgoing_webhook/token_copy_icon_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/integrations/plugin_slash_command_stays_visible_spec.js (93%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/integrations/poll_spec.js (97%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/integrations/regen_token_spec.js (96%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/integrations/slash_commands_spec.js (99%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/interactive_dialog/boolean_spec.js (97%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/interactive_dialog/demo_boolean_spec.ts (99%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/interactive_dialog/full_dialog_spec.js (99%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/interactive_dialog/scrollable_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/interactive_dialog/simple_dialog_spec.js (96%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/interactive_menu/basic_options_spec.js (99%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/interactive_menu/select_with_keys_spec.js (97%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/interactive_menu/slack_parsing_message_button_spec.js (97%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/keyboard_shortcuts/alt_option_plus_up_down_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/keyboard_shortcuts/backspace_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/keyboard_shortcuts/ctrl_cmd_alt_I_toggles_channel_info_rhs_spec.js (97%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/keyboard_shortcuts/ctrl_cmd_k_at_username_spec.js (97%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/keyboard_shortcuts/ctrl_cmd_k_channel_switch_spec.js (96%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/keyboard_shortcuts/ctrl_cmd_k_focuses_message_box_spec.js (94%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/keyboard_shortcuts/ctrl_cmd_k_open_channel_from_global_threads_spec.js (97%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/keyboard_shortcuts/ctrl_cmd_k_open_gm_with_mouse_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/keyboard_shortcuts/ctrl_cmd_k_unreads_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/keyboard_shortcuts/ctrl_cmd_k_user_from_other_team_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/keyboard_shortcuts/ctrl_cmd_l_set_message_focus_spec.js (97%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/keyboard_shortcuts/ctrl_cmd_shift_a_account_settings_spec.js (97%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/keyboard_shortcuts/ctrl_cmd_shift_l_does_not_change_focus_to_msgbox_spec.js (97%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/keyboard_shortcuts/ctrl_cmd_shift_m_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/keyboard_shortcuts/ctrl_cmd_shift_slash/helpers.js (95%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/keyboard_shortcuts/ctrl_cmd_shift_slash/not_open_emoji_picker_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/keyboard_shortcuts/ctrl_cmd_shift_slash/react_to_center_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/keyboard_shortcuts/ctrl_cmd_shift_slash/react_to_rhs_spec.js (95%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/keyboard_shortcuts/ctrl_cmd_up_down_in_rhs_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/keyboard_shortcuts/ctrl_cmd_up_down_no_action_spec.js (94%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/keyboard_shortcuts/dot_menu_spec.js (96%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/keyboard_shortcuts/esc_close_modal_spec.js (97%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/keyboard_shortcuts/keyboard_shortcuts_1_spec.js (99%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/keyboard_shortcuts/keyboard_shortcuts_2_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/keyboard_shortcuts/keyboard_shortcuts_3_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/keyboard_shortcuts/shift_up_focuses_on_rhs_spec.js (97%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/keyboard_shortcuts/system_message_not_open_for_edit_spec.js (97%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/keyboard_shortcuts/up_arrow_edit_message_rhs_spec.js (97%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/keyboard_shortcuts/up_arrow_edit_message_spec.js (99%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/large_data_sets/unreads_channels_spec.ts (96%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/mark_as_unread/archive_channel_mark_as_unread_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/mark_as_unread/bot_post_mark_as_unread_spec.js (96%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/mark_as_unread/channel_unread_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/mark_as_unread/helpers.js (97%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/mark_as_unread/leave_channel_unread_spec.js (96%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/mark_as_unread/mark_as_unread_spec.js (99%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/mark_as_unread/mark_as_unread_using_shortcuts_spec.js (97%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/mark_as_unread/mark_dm_post_as_unread_spec.js (99%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/mark_as_unread/mark_gm_as_unread_spec.js (97%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/mark_as_unread/mark_mentions_as_unread_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/mark_as_unread/toast_appears_unread_spec.js (99%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/mark_as_unread/unread_toast_count_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/markdown/markdown_image_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/markdown/markdown_text_spec.js (97%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/menus/main_menu_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/menus/status_dropdown_spec.js (96%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/message_forwarding/forward_message_from_dm_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/message_forwarding/forward_message_from_gm_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/message_forwarding/forward_message_from_private_channel_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/message_forwarding/forward_message_from_public_channel_spec.js (99%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/messaging/at_mentions_user_spec.js (97%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/messaging/autocomplete_shown_each_channel_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/messaging/autocomplete_spec.js (99%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/messaging/autocomplete_with_space_spec.js (99%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/messaging/center_channel_rhs_overlap_spec.js (99%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/messaging/channel_and_posts_links_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/messaging/channel_menu_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/messaging/channel_read_after_permalink_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/messaging/channel_users_interactions_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/messaging/collapse_link_spec.js (99%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/messaging/collapsed_message_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/messaging/copy_post_text_spec.js (97%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/messaging/ctrl_cmd_k_find_gm_by_matching_name_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/messaging/ctrl_cmd_k_open_dm_with_mouse_spec.js (96%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/messaging/date_separator_spec.js (97%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/messaging/direct_message_spec.js (97%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/messaging/dm_list_of_users_spec.js (97%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/messaging/draft_with_only_2_byte_characters_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/messaging/edit_message_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/messaging/emoji_followed_by_punctuation_spec.js (97%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/messaging/emoji_gender_spec.ts (97%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/messaging/emoji_insert_position_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/messaging/emoji_keyboard_entry_spec.js (99%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/messaging/emoji_no_overlap_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/messaging/emoji_picker_keyboard_usability_spec.js (99%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/messaging/emoji_recently_used_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/messaging/emoji_size_spec.js (99%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/messaging/emoji_skin_tone_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/messaging/emoji_to_markdown_spec.js (96%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/messaging/file_upload_in_center_channel_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/messaging/focus_move_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/messaging/group_message_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/messaging/header_not_cloud_spec.js (93%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/messaging/header_spec.js (97%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/messaging/helpers.js (100%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/messaging/image_attachment_spec.js (99%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/messaging/inline_images_open_preview_window_spec.js (97%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/messaging/inline_markdown_image_link_open_link_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/messaging/input_box_expands_spec.js (99%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/messaging/input_box_expands_with_rhs_spec.js (95%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/messaging/invalid_emojis_as_text_spec.js (96%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/messaging/local_date_time_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/messaging/long_draft_spec.js (97%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/messaging/long_post_attachments_spec.js (97%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/messaging/markdown_preview_inline_image_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/messaging/markdown_quotation_paragraphs_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/messaging/markdown_spec.js (97%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/messaging/mention_autocomplete_overlap_spec.js (97%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/messaging/message_auto_response_spec.js (97%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/messaging/message_bullets_spec.js (99%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/messaging/message_by_aeroplane_icon_spec.js (97%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/messaging/message_channel_draw_spec.js (93%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/messaging/message_channel_reference_spec.js (94%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/messaging/message_deleted_on_reply_spec.js (96%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/messaging/message_deletion_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/messaging/message_draft_persistance_spec.js (99%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/messaging/message_draft_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/messaging/message_draft_then_switch_channel_spec.js (99%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/messaging/message_draft_with_attachment_then_switch_channel_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/messaging/message_edit_post_clear_text_spec.js (95%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/messaging/message_edit_post_history_spec.ts (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/messaging/message_edit_post_with_attachment_spec.js (96%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/messaging/message_emoji_jumbo_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/messaging/message_ephemeral_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/messaging/message_in_another_language_spec.js (97%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/messaging/message_parse_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/messaging/message_permalink_spec.js (97%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/messaging/message_pinning_unpinning_spec.js (99%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/messaging/message_reaction_gm_spec.js (99%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/messaging/message_reaction_spec.js (99%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/messaging/message_reply_bot_post_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/messaging/message_reply_gm_spec.js (96%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/messaging/message_reply_input_box_expand_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/messaging/message_reply_part2_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/messaging/message_reply_scrollable_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/messaging/message_reply_spec.js (97%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/messaging/message_reply_too_long_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/messaging/message_shortlinking_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/messaging/message_spec.js (97%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/messaging/message_with_gif_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/messaging/mobile_message_deletion_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/messaging/mobile_profile_popover_spec.js (95%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/messaging/no_matches_for_autocomplete_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/messaging/permalink_click_spec.js (97%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/messaging/permalink_loading_indicator_spec.js (96%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/messaging/permalink_message_edit_spec.js (97%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/messaging/pinned_parent_post_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/messaging/pinned_posts_1_spec.js (99%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/messaging/pinned_posts_2_spec.js (99%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/messaging/post_header_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/messaging/post_html_table_spec.js (93%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/messaging/post_options_menu_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/messaging/post_pre_header_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/messaging/post_textbox_height_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/messaging/private_channel_open_spec.js (95%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/messaging/quick_send_spec.js (97%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/messaging/quote_notation_spec.js (99%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/messaging/reactions_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/messaging/receive_message_on_socket_reconnect_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/messaging/remove_gif_spec.js (97%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/messaging/remove_last_post_in_channel_spec.js (95%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/messaging/save_post_spec.js (96%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/messaging/scroll_channel_messages_spec.js (97%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/messaging/send_message_via_profile_popover_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/messaging/single_image_thumbnail_spec.js (95%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/messaging/strikethrough_spec.js (96%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/messaging/system_message_limited_options_spec.js (96%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/messaging/system_message_spec.js (99%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/messaging/thread_appears_and_scrollable_in_the_rhs_spec.js (97%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/messaging/tooltip_visual_verification_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/messaging/tooltips_on_top_nav_channel_icons_posts_spec.js (97%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/messaging/typing_on_middle_spec.js (93%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/messaging/typing_should_show_up_when_editing_spec.js (94%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/modals/quick_switcher_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/multi_team_and_dm/channel_user_count_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/multi_team_and_dm/check_user_status_spec.js (96%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/multi_team_and_dm/close_current_dm_redirects_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/multi_team_and_dm/close_gm_via_menu_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/multi_team_and_dm/dm_more_searching_from_page_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/multi_team_and_dm/dm_more_show_user_count_spec.js (96%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/multi_team_and_dm/existing_channel_name_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/multi_team_and_dm/favorite_and_close_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/multi_team_and_dm/gm_add_user_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/multi_team_and_dm/gm_header_spec.js (97%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/multi_team_and_dm/join_open_team_from_dm_spec.js (99%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/multi_team_and_dm/max_gm_members_spec.js (99%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/multi_team_and_dm/multi_team_join_spec.js (94%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/multi_team_and_dm/multi_team_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/multi_team_and_dm/send_dm_user_no_team_spec.js (94%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/multi_team_and_dm/system_message_spec.js (96%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/multi_team_and_dm/town_square_not_marked_as_unread_spec.js (96%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/notifications/at_icon_still_shows_mentions_list_with_deactivated_triggers_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/notifications/at_mentions_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/notifications/browser_tab_notification_1_spec.js (96%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/notifications/browser_tab_notification_2_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/notifications/channel_links_show_as_links_spec.js (97%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/notifications/deselect_username_mention_trigger_spec.js (96%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/notifications/desktop_notifications_1_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/notifications/desktop_notifications_2_spec.js (96%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/notifications/desktop_notifications_3_spec.js (95%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/notifications/direct_messages_do_not_add_indicator_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/notifications/helper.js (100%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/notifications/ignore_channel_mentions_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/notifications/mention_email_notification_spec.js (96%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/notifications/message_bar_spec.js (96%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/notifications/message_posted_while_scrolled_up_spec.js (96%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/notifications/notification_preferences_do_not_save_spec.js (96%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/notifications/own_user_posts_reply_while_scrolled_up_spec.js (95%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/notifications/reply_notifications_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/notifications/unread_on_public_channel_spec.js (97%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/notifications/users_with_same_firstname_channel_mentions_spec.js (97%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/onboarding/existing_email_adress_spec.js (94%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/onboarding/invalidate_pending_email_invitations_spec.js (95%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/onboarding/login_page_link_account_creation_spec.js (96%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/onboarding/use_team_invite_link_to_sign_up_spec.js (96%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/performance/channel_switch_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/performance/team_switch_spec.js (100%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/performance/utils.js (100%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/plugins/demo_plugin/webhook_spec.js (97%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/plugins/helpers.js (91%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/plugins/link_tooltip_spec.js (95%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/plugins/marketplace/disabled_remote_marketplace_spec.js (95%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/plugins/marketplace/helpers.js (100%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/plugins/marketplace/invalid_marketplace_url_spec.js (96%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/plugins/marketplace/not_render_in_main_menu_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/plugins/marketplace/render_in_main_menu_spec.js (95%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/plugins/marketplace/ui_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/plugins/plugin_buttons_spec.js (94%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/plugins/plugin_install_spec.js (95%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/plugins/plugin_startup_fail_spec.js (93%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/plugins/upgrade_spec.js (97%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/profile_settings/profile_settings_spec.js (97%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/scroll/channel_scroll_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/scroll/default_images_collapsed_spec.js (100%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/scroll/deleting_image_scroll_spec.js (99%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/scroll/deleting_scroll_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/scroll/editing_scroll_spec.js (97%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/scroll/fixed_width_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/scroll/helpers.js (97%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/scroll/image_aspect_ratio_spec.js (100%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/search/clear_input_spec.js (94%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/search/cleared_search_term_spec.js (95%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/search/mobile_search_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/search/post_search_display_not_cloud_spec.js (97%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/search/post_search_display_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/search/results_post_comment_spec.js (97%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/search/results_post_spec.js (97%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/search/search_bar_popup_focus_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/search/search_group_message_spec.js (99%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/search/search_user_file_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/search/search_user_post_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/search_autocomplete/channels_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/search_autocomplete/renaming_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/search_autocomplete/scroll_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/search_filter/after_spec.js (95%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/search_filter/before_spec.js (95%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/search_filter/edit_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/search_filter/future_date_spec.js (94%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/search_filter/helpers.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/search_filter/input_spec.js (96%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/search_filter/invalid_spec.js (94%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/search_filter/mixed_spec.js (95%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/search_filter/negative_spec.js (96%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/search_filter/on_spec.js (97%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/settings/display/channel_display_mode_spec.js (99%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/settings/display/clock_display_mode_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/settings/display/message_display_mode_colorize_username_spec.js (99%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/settings/display/message_display_mode_spec.js (96%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/settings/display/theme/code_theme_colors_spec.js (96%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/settings/display/theme/custom_theme_color_picker_spec.js (97%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/settings/display/theme/custom_theme_sidebar_styles_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/settings/display/theme/save_theme_spec.js (94%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/settings/display/theme/settings_view_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/settings/display/timezone_display_mode_spec.js (97%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/settings/sidebar/channel_switcher_not_cloud_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/settings/sidebar/channel_switcher_spec.js (95%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/settings/sidebar/fullname_spec.js (96%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/signin_authentication/authentication_spec.js (97%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/signin_authentication/desktop_session_expire_spec.js (92%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/signin_authentication/forgot_password_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/signin_authentication/helpers.js (90%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/signin_authentication/login_close_server_spec.js (96%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/signin_authentication/login_logout_smoke_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/signin_authentication/login_open_server_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/signin_authentication/mfa_authentication_spec.js (97%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/signin_authentication/signup_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/slash_commands/autocomplete_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/status/status_dnd_1_spec.js (99%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/subpath/subpath_channel_routing_spec.js (97%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/subpath/subpath_dm_search_spec.js (92%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/subpath/subpath_login_spec.js (97%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/system_console/authentication/password_settings_spec.js (92%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/system_console/compliance/custom_terms_of_service_spec.js (99%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/system_console/demoted_user_spec.js (92%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/system_console/environment_spec.js (99%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/system_console/feature_discovery_cloud_spec.js (99%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/system_console/feature_discovery_not_cloud_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/system_console/feature_discovery_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/system_console/inactive_users_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/system_console/lock_teammate_name_display_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/system_console/main_menu_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/system_console/mobile_settings_spec.js (96%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/system_console/plugin_marketplace_url_spec.js (97%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/system_console/reporting/server_logs_spec.js (92%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/system_console/reporting/site_statistics_spec.js (96%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/system_console/reporting/site_statistics_te_spec.js (95%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/system_console/reporting/team_statistics_spec.js (97%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/system_console/revoke_all_sessions_spec.js (95%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/system_console/search_box_not_cloud_spec.js (96%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/system_console/session_length_spec.js (99%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/system_console/sidebar_link_navigation_team_spec.js (93%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/system_console/site_configuration/announcement_banner_spec.js (96%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/system_console/site_configuration/customization_spec.js (99%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/system_console/site_configuration/helper.js (88%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/system_console/site_configuration/link_customization_cloud_spec.js (93%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/system_console/site_configuration/link_customization_e20_1_spec.js (97%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/system_console/site_configuration/link_customization_e20_2_spec.js (96%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/system_console/site_url_config_spec.js (97%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/system_console/support_packet_generation_spec.js (95%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/system_console/true_up_review_spec.js (100%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/system_console/ui_and_api/custom_site_name_description_spec.ts (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/system_console/ui_and_api/customization_not_cloud_spec.js (99%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/system_console/ui_and_api/customization_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/system_console/unsaved_changes_spec.js (96%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/system_console/user_management/users_deactivation_1_spec.js (96%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/system_console/user_management/users_deactivation_not_cloud_spec.js (95%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/system_console/user_management/users_deactivation_spec.js (97%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/system_console/user_management/users_reactivation_spec.js (93%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/system_console/user_management/users_spec.js (99%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/system_console/user_management_not_cloud_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/system_console/user_management_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/system_console/workspace_deletion_spec.js (99%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/team_settings/archive_team_spec.ts (96%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/team_settings/closed_team_invite_by_email_spec.js (96%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/team_settings/closed_team_invite_with_non_mattermost_domain_spec.js (93%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/team_settings/closed_team_invite_with_specific_domain_spec.js (92%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/team_settings/create_a_team_spec.js (97%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/team_settings/helpers.js (97%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/team_settings/invite_members_backdrop_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/team_settings/invite_members_spec.js (99%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/team_settings/invite_user_to_closed_team_spec.js (96%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/team_settings/join_closed_team_with_not_allowed_email_spec.js (97%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/team_settings/manage_members_spec.js (99%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/team_settings/remove_team_icon_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/team_settings/teammates_pagination_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/team_settings/teams_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/toast/helpers.js (94%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/toast/new_messages_toast_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/toast/permalink_jump_to_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/toast/permalink_post_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/toast/permalink_post_with_new_message_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/toast/toast_spec.js (99%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/toast/unread_with_bottom_start_toast_spec.js (98%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/websocket/channel_created/new_sidebar_spec.js (94%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/websocket/channel_created/old_sidebar_spec.js (94%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/websocket/handle_new_post_spec.js (96%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/websocket/handle_removed_user/helpers.js (100%) rename {webapp/channels/e2e/cypress/tests/integration => e2e/cypress/tests/integration/channels}/websocket/handle_removed_user/new_sidebar_spec.js (96%) create mode 100644 e2e/cypress/tests/integration/playbooks/adminconsole/analytics_spec.js create mode 100644 e2e/cypress/tests/integration/playbooks/api/runs_spec.js create mode 100644 e2e/cypress/tests/integration/playbooks/channels/app_bar_spec.js create mode 100644 e2e/cypress/tests/integration/playbooks/channels/broadcast_spec.js create mode 100644 e2e/cypress/tests/integration/playbooks/channels/channel_header_spec.js create mode 100644 e2e/cypress/tests/integration/playbooks/channels/general_actions_spec.js create mode 100644 e2e/cypress/tests/integration/playbooks/channels/playbook_run_actions.js create mode 100644 e2e/cypress/tests/integration/playbooks/channels/post_type_components_spec.js create mode 100644 e2e/cypress/tests/integration/playbooks/channels/retrospective_spec.js create mode 100644 e2e/cypress/tests/integration/playbooks/channels/rhs/about_spec.js create mode 100644 e2e/cypress/tests/integration/playbooks/channels/rhs/checklist_spec.js create mode 100644 e2e/cypress/tests/integration/playbooks/channels/rhs/header_spec.js create mode 100644 e2e/cypress/tests/integration/playbooks/channels/rhs/home_spec.js create mode 100644 e2e/cypress/tests/integration/playbooks/channels/rhs/list_spec.js create mode 100644 e2e/cypress/tests/integration/playbooks/channels/rhs/start_run_rhs_spec.js create mode 100644 e2e/cypress/tests/integration/playbooks/channels/rhs/status_update_spec.js create mode 100644 e2e/cypress/tests/integration/playbooks/channels/rhs/template_spec.js create mode 100644 e2e/cypress/tests/integration/playbooks/channels/rhs/title_spec.js create mode 100644 e2e/cypress/tests/integration/playbooks/channels/rhs_spec.js create mode 100644 e2e/cypress/tests/integration/playbooks/channels/run_dialog_spec.js create mode 100644 e2e/cypress/tests/integration/playbooks/channels/run_spec.js create mode 100644 e2e/cypress/tests/integration/playbooks/channels/slash_command/commands_spec.js create mode 100644 e2e/cypress/tests/integration/playbooks/channels/slash_command/info_spec.js create mode 100644 e2e/cypress/tests/integration/playbooks/channels/slash_command/owner_spec.js create mode 100644 e2e/cypress/tests/integration/playbooks/channels/slash_command/test_spec.js create mode 100644 e2e/cypress/tests/integration/playbooks/channels/slash_command/todo_spec.js create mode 100644 e2e/cypress/tests/integration/playbooks/channels/update_request_post_spec.js create mode 100644 e2e/cypress/tests/integration/playbooks/digest_spec.js create mode 100644 e2e/cypress/tests/integration/playbooks/lhs_spec.js create mode 100644 e2e/cypress/tests/integration/playbooks/navigation_spec.js create mode 100644 e2e/cypress/tests/integration/playbooks/playbooks/access_spec.js create mode 100644 e2e/cypress/tests/integration/playbooks/playbooks/creation_button_spec.js create mode 100644 e2e/cypress/tests/integration/playbooks/playbooks/edit/task_actions_spec.js create mode 100644 e2e/cypress/tests/integration/playbooks/playbooks/edit_metrics_spec.js create mode 100644 e2e/cypress/tests/integration/playbooks/playbooks/edit_spec.js create mode 100644 e2e/cypress/tests/integration/playbooks/playbooks/feedback_spec.js create mode 100644 e2e/cypress/tests/integration/playbooks/playbooks/list_spec.js create mode 100644 e2e/cypress/tests/integration/playbooks/playbooks/overview_spec.js create mode 100644 e2e/cypress/tests/integration/playbooks/playbooks/pagination_spec.js create mode 100644 e2e/cypress/tests/integration/playbooks/playbooks/start_run_spec.js create mode 100644 e2e/cypress/tests/integration/playbooks/playbooks/status_update_spec.js create mode 100644 e2e/cypress/tests/integration/playbooks/runs/list_spec.js create mode 100644 e2e/cypress/tests/integration/playbooks/runs/permissions_spec.js create mode 100644 e2e/cypress/tests/integration/playbooks/runs/rdp_general_spec.js create mode 100644 e2e/cypress/tests/integration/playbooks/runs/rdp_main_checklist_spec.js create mode 100644 e2e/cypress/tests/integration/playbooks/runs/rdp_main_finish_spec.js create mode 100644 e2e/cypress/tests/integration/playbooks/runs/rdp_main_header_spec.js create mode 100644 e2e/cypress/tests/integration/playbooks/runs/rdp_main_restore_spec.js create mode 100644 e2e/cypress/tests/integration/playbooks/runs/rdp_main_retrospective_spec.js create mode 100644 e2e/cypress/tests/integration/playbooks/runs/rdp_main_statusupdate_spec.js create mode 100644 e2e/cypress/tests/integration/playbooks/runs/rdp_main_summary_spec.js create mode 100644 e2e/cypress/tests/integration/playbooks/runs/rdp_main_taskactions_spec.js create mode 100644 e2e/cypress/tests/integration/playbooks/runs/rdp_rhs_participants_spec.js create mode 100644 e2e/cypress/tests/integration/playbooks/runs/rdp_rhs_runinfo_spec.js create mode 100644 e2e/cypress/tests/integration/playbooks/runs/rdp_rhs_spec.js create mode 100644 e2e/cypress/tests/integration/playbooks/runs/rdp_rhs_statusupdates_spec.js create mode 100644 e2e/cypress/tests/integration/playbooks/runs/taskinbox_spec.js create mode 100644 e2e/cypress/tests/integration/playbooks/tours_spec_ignore_.js rename {webapp/channels/e2e => e2e}/cypress/tests/plugins/client_request.js (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/plugins/db_request.js (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/plugins/external_request.ts (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/plugins/file_util.js (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/plugins/get_pdf_content.js (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/plugins/get_recent_email.js (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/plugins/index.js (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/plugins/keycloak_request.js (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/plugins/okta_request.js (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/plugins/post_bot_message.js (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/plugins/post_incoming_webhook.js (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/plugins/post_list_of_messages.js (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/plugins/post_message_as.js (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/plugins/react_to_message_as.js (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/plugins/shell.js (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/plugins/url_health_check.js (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/support/api/bots.d.ts (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/support/api/bots.js (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/support/api/brand.d.ts (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/support/api/brand.js (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/support/api/channel.d.ts (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/support/api/channel.js (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/support/api/cloud.d.ts (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/support/api/cloud.js (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/support/api/cloud_default_config.json (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/support/api/cluster.d.ts (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/support/api/cluster.js (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/support/api/common.d.ts (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/support/api/common.js (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/support/api/data_retention.d.ts (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/support/api/data_retention.js (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/support/api/helpers.js (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/support/api/index.js (95%) rename {webapp/channels/e2e => e2e}/cypress/tests/support/api/keycloak.d.ts (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/support/api/keycloak.js (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/support/api/keycloak_realm.json (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/support/api/ldap.d.ts (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/support/api/ldap.js (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/support/api/on_prem_default_config.json (99%) create mode 100644 e2e/cypress/tests/support/api/playbooks.js rename {webapp/channels/e2e => e2e}/cypress/tests/support/api/plugin.d.ts (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/support/api/plugin.js (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/support/api/preference.d.ts (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/support/api/preference.js (94%) rename {webapp/channels/e2e => e2e}/cypress/tests/support/api/role.d.ts (100%) create mode 100644 e2e/cypress/tests/support/api/role.js rename {webapp/channels/e2e => e2e}/cypress/tests/support/api/saml.d.ts (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/support/api/saml.js (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/support/api/scheme.d.ts (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/support/api/scheme.js (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/support/api/setup.ts (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/support/api/status.d.ts (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/support/api/status.js (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/support/api/system.d.ts (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/support/api/system.js (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/support/api/team.d.ts (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/support/api/team.js (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/support/api/user.d.ts (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/support/api/user.js (96%) rename {webapp/channels/e2e => e2e}/cypress/tests/support/api/webhooks.d.ts (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/support/api/webhooks.js (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/support/api_commands.ts (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/support/assertions.js (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/support/client-impl.js (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/support/client.d.ts (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/support/client.js (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/support/common_login_commands.d.ts (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/support/common_login_commands.js (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/support/constants.js (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/support/db_commands.ts (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/support/email.ts (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/support/env.ts (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/support/extended_commands.d.ts (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/support/extended_commands.js (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/support/external_commands.d.ts (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/support/external_commands.js (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/support/fetch_commands.js (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/support/index.d.ts (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/support/index.js (98%) rename {webapp/channels/e2e => e2e}/cypress/tests/support/keycloak_commands.d.ts (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/support/keycloak_commands.js (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/support/ldap_commands.d.ts (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/support/ldap_commands.js (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/support/ldap_server_commands.d.ts (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/support/ldap_server_commands.js (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/support/notification.ts (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/support/okta_commands.js (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/support/saml_commands.js (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/support/shell.d.ts (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/support/shell.js (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/support/task_commands.ts (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/support/ui/account_settings_modal.d.ts (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/support/ui/account_settings_modal.js (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/support/ui/announcement_bar.d.ts (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/support/ui/announcement_bar.js (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/support/ui/boards.d.ts (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/support/ui/boards.js (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/support/ui/channel.d.ts (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/support/ui/channel.js (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/support/ui/channel_header.d.ts (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/support/ui/channel_header.js (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/support/ui/channel_sidebar.js (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/support/ui/cloud_billing.d.ts (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/support/ui/cloud_billing.js (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/support/ui/common.d.ts (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/support/ui/common.js (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/support/ui/compliance_export.d.ts (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/support/ui/compliance_export.js (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/support/ui/data_retention.d.ts (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/support/ui/data_retention.js (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/support/ui/emoji.ts (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/support/ui/extend_testing_library.d.ts (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/support/ui/extend_testing_library.js (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/support/ui/file_preview.d.ts (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/support/ui/file_preview.js (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/support/ui/global_header.d.ts (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/support/ui/global_header.js (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/support/ui/index.js (97%) rename {webapp/channels/e2e => e2e}/cypress/tests/support/ui/login.d.ts (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/support/ui/login.js (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/support/ui/menu.d.ts (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/support/ui/menu.js (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/support/ui/mfa.d.ts (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/support/ui/mfa.js (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/support/ui/modal.d.ts (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/support/ui/modal.js (100%) create mode 100644 e2e/cypress/tests/support/ui/playbooks.js rename {webapp/channels/e2e => e2e}/cypress/tests/support/ui/post.ts (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/support/ui/post_dropdown_menu.d.ts (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/support/ui/post_dropdown_menu.js (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/support/ui/search.js (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/support/ui/sidebar_left.ts (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/support/ui/sidebar_right.d.ts (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/support/ui/sidebar_right.js (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/support/ui/suggestion_list.d.ts (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/support/ui/suggestion_list.js (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/support/ui/system.d.ts (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/support/ui/system.js (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/support/ui/team.js (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/support/ui/tooltip.d.ts (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/support/ui/tooltip.js (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/support/ui_commands.ts (93%) rename {webapp/channels/e2e => e2e}/cypress/tests/support/win.d.ts (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/types/index.ts (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/utils/admin_console.js (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/utils/benchmark.js (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/utils/config.js (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/utils/constants.js (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/utils/email.js (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/utils/file.js (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/utils/index.js (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/utils/plugins.js (100%) rename {webapp/channels/e2e => e2e}/cypress/tests/utils/timezone.js (100%) rename {webapp/channels/e2e => e2e}/cypress/tsconfig.json (71%) rename {webapp/channels/e2e => e2e}/cypress/utils/artifacts.js (100%) rename {webapp/channels/e2e => e2e}/cypress/utils/constants.js (100%) rename {webapp/channels/e2e => e2e}/cypress/utils/dashboard.js (100%) rename {webapp/channels/e2e => e2e}/cypress/utils/even_distribution.js (100%) rename {webapp/channels/e2e => e2e}/cypress/utils/even_distribution.test.js (100%) rename {webapp/channels/e2e => e2e}/cypress/utils/file.js (100%) rename {webapp/channels/e2e => e2e}/cypress/utils/report.js (100%) rename {webapp/channels/e2e => e2e}/cypress/utils/test_cases.js (100%) rename {webapp/channels/e2e => e2e}/cypress/utils/webhook_utils.js (100%) rename {webapp/channels/e2e => e2e}/cypress/webhook_serve.js (99%) rename {webapp/channels/e2e => e2e}/playwright/.eslintignore (61%) rename {webapp/channels/e2e => e2e}/playwright/.eslintrc.json (100%) rename {webapp/channels/e2e => e2e}/playwright/.percy.yml (100%) rename {webapp/channels/e2e => e2e}/playwright/.prettierignore (100%) rename {webapp/channels/e2e => e2e}/playwright/.prettierrc.json (100%) rename {webapp/channels/e2e => e2e}/playwright/README.md (87%) rename {webapp/channels/e2e => e2e}/playwright/global_setup.ts (97%) rename {webapp/channels/e2e => e2e}/playwright/package-lock.json (100%) rename {webapp/channels/e2e => e2e}/playwright/package.json (100%) rename {webapp/channels/e2e => e2e}/playwright/playwright.config.ts (100%) rename {webapp/channels/e2e => e2e}/playwright/support/asset/mattermost-icon_128x128.png (100%) rename {webapp/channels/e2e => e2e}/playwright/support/browser_context.ts (100%) rename {webapp/channels/e2e => e2e}/playwright/support/flag.ts (100%) rename {webapp/channels/e2e => e2e}/playwright/support/server/channel.ts (100%) rename {webapp/channels/e2e => e2e}/playwright/support/server/client.ts (100%) rename {webapp/channels/e2e => e2e}/playwright/support/server/default_config.ts (99%) rename {webapp/channels/e2e => e2e}/playwright/support/server/index.ts (100%) rename {webapp/channels/e2e => e2e}/playwright/support/server/init.ts (100%) rename {webapp/channels/e2e => e2e}/playwright/support/server/team.ts (100%) rename {webapp/channels/e2e => e2e}/playwright/support/server/user.ts (100%) rename {webapp/channels/e2e => e2e}/playwright/support/test_action.ts (100%) rename {webapp/channels/e2e => e2e}/playwright/support/test_fixture.ts (100%) rename {webapp/channels/e2e => e2e}/playwright/support/ui/components/boards/create_modal.ts (100%) rename {webapp/channels/e2e => e2e}/playwright/support/ui/components/boards/sidebar.ts (100%) rename {webapp/channels/e2e => e2e}/playwright/support/ui/components/channels/app_bar.ts (100%) rename {webapp/channels/e2e => e2e}/playwright/support/ui/components/channels/post.ts (100%) rename {webapp/channels/e2e => e2e}/playwright/support/ui/components/channels/post_create.ts (100%) rename {webapp/channels/e2e => e2e}/playwright/support/ui/components/global_header.ts (100%) rename {webapp/channels/e2e => e2e}/playwright/support/ui/components/index.ts (100%) rename {webapp/channels/e2e => e2e}/playwright/support/ui/pages/boards_create.ts (100%) rename {webapp/channels/e2e => e2e}/playwright/support/ui/pages/boards_view.ts (100%) rename {webapp/channels/e2e => e2e}/playwright/support/ui/pages/channels.ts (100%) rename {webapp/channels/e2e => e2e}/playwright/support/ui/pages/index.ts (100%) rename {webapp/channels/e2e => e2e}/playwright/support/ui/pages/landing_login.ts (100%) rename {webapp/channels/e2e => e2e}/playwright/support/ui/pages/login.ts (100%) rename {webapp/channels/e2e => e2e}/playwright/support/ui/pages/signup.ts (100%) rename {webapp/channels/e2e => e2e}/playwright/support/util.ts (100%) rename {webapp/channels/e2e => e2e}/playwright/support/visual/index.ts (100%) rename {webapp/channels/e2e => e2e}/playwright/support/visual/percy.ts (100%) rename {webapp/channels/e2e => e2e}/playwright/test.config.ts (100%) rename {webapp/channels/e2e => e2e}/playwright/tests/functional/boards/board-creation-and-set-up/create_empty_board.spec.ts (100%) rename {webapp/channels/e2e => e2e}/playwright/tests/visual/boards/board_template.spec.ts (100%) rename {webapp/channels/e2e => e2e}/playwright/tests/visual/boards/board_template.spec.ts-snapshots/board-template-chrome-linux.png (100%) rename {webapp/channels/e2e => e2e}/playwright/tests/visual/boards/board_template.spec.ts-snapshots/board-template-firefox-linux.png (100%) rename {webapp/channels/e2e => e2e}/playwright/tests/visual/boards/board_template.spec.ts-snapshots/board-template-ipad-linux.png (100%) rename {webapp/channels/e2e => e2e}/playwright/tests/visual/boards/view_untitled_board.spec.ts (100%) rename {webapp/channels/e2e => e2e}/playwright/tests/visual/boards/view_untitled_board.spec.ts-snapshots/view-untitled-board-chrome-linux.png (100%) rename {webapp/channels/e2e => e2e}/playwright/tests/visual/boards/view_untitled_board.spec.ts-snapshots/view-untitled-board-firefox-linux.png (100%) rename {webapp/channels/e2e => e2e}/playwright/tests/visual/boards/view_untitled_board.spec.ts-snapshots/view-untitled-board-ipad-linux.png (100%) rename {webapp/channels/e2e => e2e}/playwright/tests/visual/channels/intro_channel.spec.ts (100%) rename {webapp/channels/e2e => e2e}/playwright/tests/visual/channels/intro_channel.spec.ts-snapshots/intro-to-channel-as-regular-user-chrome-linux.png (100%) rename {webapp/channels/e2e => e2e}/playwright/tests/visual/channels/intro_channel.spec.ts-snapshots/intro-to-channel-as-regular-user-firefox-linux.png (100%) rename {webapp/channels/e2e => e2e}/playwright/tests/visual/channels/intro_channel.spec.ts-snapshots/intro-to-channel-as-regular-user-ipad-linux.png (100%) rename {webapp/channels/e2e => e2e}/playwright/tests/visual/channels/intro_channel.spec.ts-snapshots/intro-to-channel-as-regular-user-iphone-linux.png (100%) rename {webapp/channels/e2e => e2e}/playwright/tests/visual/common/landing_page.spec.ts (100%) rename {webapp/channels/e2e => e2e}/playwright/tests/visual/common/landing_page.spec.ts-snapshots/landing-login-chrome-linux.png (100%) rename {webapp/channels/e2e => e2e}/playwright/tests/visual/common/landing_page.spec.ts-snapshots/landing-login-firefox-linux.png (100%) rename {webapp/channels/e2e => e2e}/playwright/tests/visual/common/landing_page.spec.ts-snapshots/landing-login-ipad-linux.png (100%) rename {webapp/channels/e2e => e2e}/playwright/tests/visual/common/landing_page.spec.ts-snapshots/landing-login-iphone-linux.png (100%) rename {webapp/channels/e2e => e2e}/playwright/tests/visual/common/login.spec.ts (100%) rename {webapp/channels/e2e => e2e}/playwright/tests/visual/common/login.spec.ts-snapshots/login-chrome-linux.png (100%) rename {webapp/channels/e2e => e2e}/playwright/tests/visual/common/login.spec.ts-snapshots/login-error-chrome-linux.png (100%) rename {webapp/channels/e2e => e2e}/playwright/tests/visual/common/login.spec.ts-snapshots/login-error-firefox-linux.png (100%) rename {webapp/channels/e2e => e2e}/playwright/tests/visual/common/login.spec.ts-snapshots/login-error-ipad-linux.png (100%) rename {webapp/channels/e2e => e2e}/playwright/tests/visual/common/login.spec.ts-snapshots/login-error-iphone-linux.png (100%) rename {webapp/channels/e2e => e2e}/playwright/tests/visual/common/login.spec.ts-snapshots/login-firefox-linux.png (100%) rename {webapp/channels/e2e => e2e}/playwright/tests/visual/common/login.spec.ts-snapshots/login-ipad-linux.png (100%) rename {webapp/channels/e2e => e2e}/playwright/tests/visual/common/login.spec.ts-snapshots/login-iphone-linux.png (100%) rename {webapp/channels/e2e => e2e}/playwright/tests/visual/common/signup_email.spec.ts (100%) rename {webapp/channels/e2e => e2e}/playwright/tests/visual/common/signup_email.spec.ts-snapshots/signup-email-chrome-linux.png (100%) rename {webapp/channels/e2e => e2e}/playwright/tests/visual/common/signup_email.spec.ts-snapshots/signup-email-error-chrome-linux.png (100%) rename {webapp/channels/e2e => e2e}/playwright/tests/visual/common/signup_email.spec.ts-snapshots/signup-email-error-firefox-linux.png (100%) rename {webapp/channels/e2e => e2e}/playwright/tests/visual/common/signup_email.spec.ts-snapshots/signup-email-error-ipad-linux.png (100%) rename {webapp/channels/e2e => e2e}/playwright/tests/visual/common/signup_email.spec.ts-snapshots/signup-email-error-iphone-linux.png (100%) rename {webapp/channels/e2e => e2e}/playwright/tests/visual/common/signup_email.spec.ts-snapshots/signup-email-firefox-linux.png (100%) rename {webapp/channels/e2e => e2e}/playwright/tests/visual/common/signup_email.spec.ts-snapshots/signup-email-ipad-linux.png (100%) rename {webapp/channels/e2e => e2e}/playwright/tests/visual/common/signup_email.spec.ts-snapshots/signup-email-iphone-linux.png (100%) rename {webapp/channels/e2e => e2e}/playwright/tsconfig.json (70%) delete mode 100644 webapp/channels/e2e/cypress/.ignore delete mode 100644 webapp/channels/e2e/cypress/tests/support/api/role.js diff --git a/.github/workflows/e2e-ci.yml b/.github/workflows/e2e-ci.yml new file mode 100644 index 0000000000..746c3389d4 --- /dev/null +++ b/.github/workflows/e2e-ci.yml @@ -0,0 +1,58 @@ +name: mattermost-e2e +on: + pull_request: + push: + branches: + - master + - mono-repo* +defaults: + run: + shell: bash +jobs: + cypress-check: + runs-on: ubuntu-22.04 + defaults: + run: + working-directory: e2e/cypress + steps: + - name: ci/checkout-repo + uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3.3.0 + - name: ci/setup-node + uses: actions/setup-node@64ed1c7eab4cce3362f8c340dee64e5eaeef8f7c # v3.6.0 + id: setup_node + with: + node-version-file: ".nvmrc" + cache: npm + cache-dependency-path: 'e2e/cypress/package-lock.json' + - name: ci/cypress/npm-install + run: | + npm ci + - name: ci/cypress/npm-check + run: | + npm run check + playwright-check: + runs-on: ubuntu-22.04 + defaults: + run: + working-directory: e2e/playwright + steps: + - name: ci/checkout-repo + uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3.3.0 + - name: ci/setup-node + uses: actions/setup-node@64ed1c7eab4cce3362f8c340dee64e5eaeef8f7c # v3.6.0 + id: setup_node + with: + node-version-file: ".nvmrc" + cache: npm + cache-dependency-path: 'e2e/playwright/package-lock.json' + - name: ci/get-webapp-node-modules + working-directory: webapp + # requires build of client and types + run: | + make node_modules + - name: ci/playwright/npm-install + run: | + npm ci + - name: ci/playwright/npm-check + run: | + npm run check diff --git a/.gitignore b/.gitignore index f36686385c..ee81c1303e 100644 --- a/.gitignore +++ b/.gitignore @@ -22,6 +22,27 @@ config/config.json config/logging.json /plugins +# disable folders generated by Cypress +e2e/cypress/node_modules +e2e/cypress/tests/downloads +e2e/cypress/tests/screenshots +e2e/cypress/tests/videos +e2e/cypress/tests/integration/benchmark/__benchmarks__ +e2e/cypress/tests/integration/performance/logs +e2e/cypress/tests/fixtures/ldap_tmp +e2e/cypress/tests/fixtures/mmctl +e2e/cypress/results +e2e/cypress/.eslintcache + +# disable files/folders generated by Playwright +e2e/playwright/node_modules +e2e/playwright/playwright-report +e2e/playwright/storage_state +e2e/playwright/test-results +e2e/playwright/tests/**/*-darwin.png +e2e/playwright/tests/**/*-window.png +e2e/playwright/.eslintcache + # Enterprise & products imports files imports/imports.go diff --git a/e2e/.gitignore b/e2e/.gitignore new file mode 100644 index 0000000000..710358c8d0 --- /dev/null +++ b/e2e/.gitignore @@ -0,0 +1,8 @@ +# env, cert, key, license +.env* +*.crt +*.key +*.license + +# Plugin +*.tar.gz diff --git a/e2e/cypress/.eslintignore b/e2e/cypress/.eslintignore new file mode 100644 index 0000000000..b512c09d47 --- /dev/null +++ b/e2e/cypress/.eslintignore @@ -0,0 +1 @@ +node_modules \ No newline at end of file diff --git a/e2e/cypress/.eslintrc.json b/e2e/cypress/.eslintrc.json new file mode 100644 index 0000000000..6146b63be2 --- /dev/null +++ b/e2e/cypress/.eslintrc.json @@ -0,0 +1,122 @@ +{ + "extends": [ + "plugin:mattermost/react", + "plugin:cypress/recommended" + ], + "plugins": [ + "@babel/eslint-plugin", + "mattermost", + "import", + "no-only-tests", + "@typescript-eslint", + "cypress" + ], + "parser": "@typescript-eslint/parser", + "env": { + "cypress/globals": true + }, + "rules": { + "header/header": [ + 2, + "line", + " Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n See LICENSE.txt for license information.", + 2 + ], + "cypress/assertion-before-screenshot": "warn", + "cypress/no-assigning-return-values": "error", + "cypress/no-force": "warn", + "cypress/no-async-tests": "error", + "cypress/no-pause": "error", + "cypress/no-unnecessary-waiting": 0, + "func-names": 0, + "import/no-unresolved": 0, + "max-nested-callbacks": 0, + "no-unused-expressions": 0, + "no-process-env": 0, + "no-duplicate-imports": 0, + "no-undefined": 0, + "no-use-before-define": 0, + "import/no-duplicates": 2, + "mattermost/use-external-link": 2, + "eol-last": ["error", "always"], + "import/order": [ + 0, + { + "newlines-between": "always-and-inside-groups", + "groups": [ + "builtin", + "external", + [ + "internal", + "parent" + ], + "sibling", + "index" + ] + } + ], + "no-only-tests/no-only-tests": ["error", {"focus": ["only", "skip"]}], + "max-lines": ["warn", {"max": 800, "skipBlankLines": true, "skipComments": true}] + }, + "overrides": [ + { + "files": ["**/*.ts"], + "extends": [ + "plugin:@typescript-eslint/recommended" + ], + "rules": { + "camelcase": 0, + "no-shadow": 0, + "import/no-unresolved": 0, // ts handles this better + "@typescript-eslint/naming-convention": [ + 2, + { + "selector": "function", + "format": ["camelCase", "PascalCase"] + }, + { + "selector": "variable", + "format": ["camelCase", "PascalCase", "UPPER_CASE"] + }, + { + "selector": "parameter", + "format": ["camelCase", "PascalCase"], + "leadingUnderscore": "allow" + }, + { + "selector": "typeLike", + "format": ["PascalCase"] + } + ], + "@typescript-eslint/no-non-null-assertion": 0, + "@typescript-eslint/no-unused-vars": [ + 2, + { + "vars": "all", + "args": "after-used" + } + ], + "@typescript-eslint/no-var-requires": 0, + "@typescript-eslint/no-empty-function": 0, + "@typescript-eslint/prefer-interface": 0, + "@typescript-eslint/explicit-function-return-type": 0, + "@typescript-eslint/explicit-module-boundary-types": 0, + "@typescript-eslint/indent": [ + 2, + 4, + { + "SwitchCase": 0 + } + ], + "@typescript-eslint/no-use-before-define": [ + 2, + { + "classes": false, + "functions": false, + "variables": false + } + ] + } + } + ] +} diff --git a/webapp/channels/e2e/cypress/Dockerfile.webhook b/e2e/cypress/Dockerfile.webhook similarity index 100% rename from webapp/channels/e2e/cypress/Dockerfile.webhook rename to e2e/cypress/Dockerfile.webhook diff --git a/webapp/channels/e2e/cypress/README-Subpath.md b/e2e/cypress/README-Subpath.md similarity index 100% rename from webapp/channels/e2e/cypress/README-Subpath.md rename to e2e/cypress/README-Subpath.md diff --git a/webapp/channels/e2e/cypress/cypress.config.ts b/e2e/cypress/cypress.config.ts similarity index 100% rename from webapp/channels/e2e/cypress/cypress.config.ts rename to e2e/cypress/cypress.config.ts diff --git a/webapp/channels/e2e/cypress/generate_test_cycle.js b/e2e/cypress/generate_test_cycle.js similarity index 100% rename from webapp/channels/e2e/cypress/generate_test_cycle.js rename to e2e/cypress/generate_test_cycle.js diff --git a/webapp/channels/e2e/cypress/package-lock.json b/e2e/cypress/package-lock.json similarity index 78% rename from webapp/channels/e2e/cypress/package-lock.json rename to e2e/cypress/package-lock.json index 2d6a9ebeb3..a639b718bd 100644 --- a/webapp/channels/e2e/cypress/package-lock.json +++ b/e2e/cypress/package-lock.json @@ -9,7 +9,10 @@ "patch-package": "6.5.1" }, "devDependencies": { + "@babel/eslint-parser": "7.19.1", + "@babel/eslint-plugin": "7.19.1", "@cypress/request": "2.88.11", + "@cypress/skip-test": "2.6.1", "@mattermost/types": "7.4.0", "@testing-library/cypress": "9.0.0", "@types/async": "3.2.16", @@ -26,6 +29,8 @@ "@types/recursive-readdir": "2.2.1", "@types/shelljs": "0.8.11", "@types/uuid": "9.0.0", + "@typescript-eslint/eslint-plugin": "5.55.0", + "@typescript-eslint/parser": "5.55.0", "async": "3.2.4", "authenticator": "1.1.5", "aws-sdk": "2.1295.0", @@ -43,6 +48,14 @@ "dayjs": "1.11.7", "deepmerge": "4.2.2", "dotenv": "16.0.3", + "eslint": "7.32.0", + "eslint-import-resolver-webpack": "0.13.2", + "eslint-plugin-cypress": "2.12.1", + "eslint-plugin-header": "3.1.1", + "eslint-plugin-import": "2.27.5", + "eslint-plugin-mattermost": "github:mattermost/eslint-plugin-mattermost#5b0c972eacf19286e4c66221b39113bf8728a99e", + "eslint-plugin-no-only-tests": "3.1.0", + "eslint-plugin-react": "7.32.2", "express": "4.18.2", "extract-zip": "2.0.1", "knex": "2.4.0", @@ -100,9 +113,9 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.18.8", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.18.8.tgz", - "integrity": "sha512-HSmX4WZPPK3FUxYp7g2T6EyO8j96HlZJlxmKPSh6KAcqwyDrfx7hKjXpAW/0FhFfTJsR0Yt4lAjLI2coMptIHQ==", + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.21.0.tgz", + "integrity": "sha512-gMuZsmsgxk/ENC3O/fRw5QY8A9/uxQbbCEypnLIiYYc/qVJtEV7ouxC3EllIIwNzMqAQee5tanFabWsUOutS7g==", "dev": true, "peer": true, "engines": { @@ -110,26 +123,26 @@ } }, "node_modules/@babel/core": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.6.tgz", - "integrity": "sha512-cQbWBpxcbbs/IUredIPkHiAGULLV8iwgNRMFzvbhEXISp4f3rUUXE5+TIw6KwUWUR3DwyI6gmBRnmAtYaWehwQ==", + "version": "7.21.3", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.21.3.tgz", + "integrity": "sha512-qIJONzoa/qiHghnm0l1n4i/6IIziDpzqc36FBs4pzMhDUraHqponwJLiAKm1hGLP3OSB/TVNz6rMwVGpwxxySw==", "dev": true, "peer": true, "dependencies": { - "@ampproject/remapping": "^2.1.0", + "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.18.6", - "@babel/helper-compilation-targets": "^7.18.6", - "@babel/helper-module-transforms": "^7.18.6", - "@babel/helpers": "^7.18.6", - "@babel/parser": "^7.18.6", - "@babel/template": "^7.18.6", - "@babel/traverse": "^7.18.6", - "@babel/types": "^7.18.6", + "@babel/generator": "^7.21.3", + "@babel/helper-compilation-targets": "^7.20.7", + "@babel/helper-module-transforms": "^7.21.2", + "@babel/helpers": "^7.21.0", + "@babel/parser": "^7.21.3", + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.21.3", + "@babel/types": "^7.21.3", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", - "json5": "^2.2.1", + "json5": "^2.2.2", "semver": "^6.3.0" }, "engines": { @@ -140,15 +153,59 @@ "url": "https://opencollective.com/babel" } }, + "node_modules/@babel/eslint-parser": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.19.1.tgz", + "integrity": "sha512-AqNf2QWt1rtu2/1rLswy6CDP7H9Oh3mMhk177Y67Rg8d7RD9WfOLLv8CGn6tisFvS2htm86yIe1yLF6I1UDaGQ==", + "dev": true, + "dependencies": { + "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1", + "eslint-visitor-keys": "^2.1.0", + "semver": "^6.3.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || >=14.0.0" + }, + "peerDependencies": { + "@babel/core": ">=7.11.0", + "eslint": "^7.5.0 || ^8.0.0" + } + }, + "node_modules/@babel/eslint-parser/node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/@babel/eslint-plugin": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/eslint-plugin/-/eslint-plugin-7.19.1.tgz", + "integrity": "sha512-ElGPkQPapKMa3zVqXHkZYzuL7I5LbRw9UWBUArgWsdWDDb9XcACqOpBib5tRPA9XvbVZYrFUkoQPbiJ4BFvu4w==", + "dev": true, + "dependencies": { + "eslint-rule-composer": "^0.3.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || >=14.0.0" + }, + "peerDependencies": { + "@babel/eslint-parser": ">=7.11.0", + "eslint": ">=7.5.0" + } + }, "node_modules/@babel/generator": { - "version": "7.18.7", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.7.tgz", - "integrity": "sha512-shck+7VLlY72a2w9c3zYWuE1pwOKEiQHV7GTUbSnhyl5eu3i04t30tBY82ZRWrDfo3gkakCFtevExnxbkf2a3A==", + "version": "7.21.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.3.tgz", + "integrity": "sha512-QS3iR1GYC/YGUnW7IdggFeN5c1poPUurnGttOV/bZgPGV+izC/D8HnD6DLwod0fsatNyVn1G3EVWMYIF0nHbeA==", "dev": true, "peer": true, "dependencies": { - "@babel/types": "^7.18.7", + "@babel/types": "^7.21.3", "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" }, "engines": { @@ -198,15 +255,16 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.6.tgz", - "integrity": "sha512-vFjbfhNCzqdeAtZflUFrG5YIFqGTqsctrtkZ1D/NB0mDW9TwW3GmmUepYY4G9wCET5rY5ugz4OGTcLd614IzQg==", + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz", + "integrity": "sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==", "dev": true, "peer": true, "dependencies": { - "@babel/compat-data": "^7.18.6", + "@babel/compat-data": "^7.20.5", "@babel/helper-validator-option": "^7.18.6", - "browserslist": "^4.20.2", + "browserslist": "^4.21.3", + "lru-cache": "^5.1.1", "semver": "^6.3.0" }, "engines": { @@ -216,6 +274,23 @@ "@babel/core": "^7.0.0" } }, + "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "peer": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "peer": true + }, "node_modules/@babel/helper-create-class-features-plugin": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.18.6.tgz", @@ -239,14 +314,14 @@ } }, "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.18.6.tgz", - "integrity": "sha512-7LcpH1wnQLGrI+4v+nPp+zUvIkF9x0ddv1Hkdue10tg3gmRnLy97DXh4STiOf1qeIInyD69Qv5kKSZzKD8B/7A==", + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.21.0.tgz", + "integrity": "sha512-N+LaFW/auRSWdx7SHD/HiARwXQju1vXTW4fKr4u5SgBUTm51OKEjKgj+cs00ggW3kEvNqwErnlwuq7Y3xBe4eg==", "dev": true, "peer": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.18.6", - "regexpu-core": "^5.1.0" + "regexpu-core": "^5.3.1" }, "engines": { "node": ">=6.9.0" @@ -256,16 +331,14 @@ } }, "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.1.tgz", - "integrity": "sha512-J9hGMpJQmtWmj46B3kBHmL38UhJGhYX7eqkcq+2gsstyYt341HmPeWspihX43yVRA0mS+8GGk2Gckc7bY/HCmA==", + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz", + "integrity": "sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==", "dev": true, "peer": true, "dependencies": { - "@babel/helper-compilation-targets": "^7.13.0", - "@babel/helper-module-imports": "^7.12.13", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/traverse": "^7.13.0", + "@babel/helper-compilation-targets": "^7.17.7", + "@babel/helper-plugin-utils": "^7.16.7", "debug": "^4.1.1", "lodash.debounce": "^4.0.8", "resolve": "^1.14.2", @@ -276,9 +349,9 @@ } }, "node_modules/@babel/helper-environment-visitor": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.6.tgz", - "integrity": "sha512-8n6gSfn2baOY+qlp+VSzsosjCVGFqWKmDF0cCWOybh52Dw3SEyoWR1KrhMJASjLwIEkkAufZ0xvr+SxLHSpy2Q==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", + "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", "dev": true, "peer": true, "engines": { @@ -299,14 +372,14 @@ } }, "node_modules/@babel/helper-function-name": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.18.6.tgz", - "integrity": "sha512-0mWMxV1aC97dhjCah5U5Ua7668r5ZmSC2DLfH2EZnf9c3/dHZKiFa5pRLMH5tjSl471tY6496ZWk/kjNONBxhw==", + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz", + "integrity": "sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==", "dev": true, "peer": true, "dependencies": { - "@babel/template": "^7.18.6", - "@babel/types": "^7.18.6" + "@babel/template": "^7.20.7", + "@babel/types": "^7.21.0" }, "engines": { "node": ">=6.9.0" @@ -326,13 +399,13 @@ } }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.18.6.tgz", - "integrity": "sha512-CeHxqwwipekotzPDUuJOfIMtcIHBuc7WAzLmTYWctVigqS5RktNMQ5bEwQSuGewzYnCtTWa3BARXeiLxDTv+Ng==", + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.21.0.tgz", + "integrity": "sha512-Muu8cdZwNN6mRRNG6lAYErJ5X3bRevgYR2O8wN0yn7jJSnGDu6eG59RfT29JHxGUovyfrh6Pj0XzmR7drNVL3Q==", "dev": true, "peer": true, "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.21.0" }, "engines": { "node": ">=6.9.0" @@ -352,20 +425,20 @@ } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.18.8", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.8.tgz", - "integrity": "sha512-che3jvZwIcZxrwh63VfnFTUzcAM9v/lznYkkRxIBGMPt1SudOKHAEec0SIRCfiuIzTcF7VGj/CaTT6gY4eWxvA==", + "version": "7.21.2", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.21.2.tgz", + "integrity": "sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ==", "dev": true, "peer": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.18.6", + "@babel/helper-environment-visitor": "^7.18.9", "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-simple-access": "^7.18.6", + "@babel/helper-simple-access": "^7.20.2", "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.18.6", - "@babel/template": "^7.18.6", - "@babel/traverse": "^7.18.8", - "@babel/types": "^7.18.8" + "@babel/helper-validator-identifier": "^7.19.1", + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.21.2", + "@babel/types": "^7.21.2" }, "engines": { "node": ">=6.9.0" @@ -385,9 +458,9 @@ } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.18.6.tgz", - "integrity": "sha512-gvZnm1YAAxh13eJdkb9EWHBnF3eAub3XTLCZEehHT2kWxiKVRL64+ae5Y6Ivne0mVHmMYKT+xWgZO+gQhuLUBg==", + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz", + "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==", "dev": true, "peer": true, "engines": { @@ -395,16 +468,16 @@ } }, "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.6.tgz", - "integrity": "sha512-z5wbmV55TveUPZlCLZvxWHtrjuJd+8inFhk7DG0WW87/oJuGDcjDiu7HIvGcpf5464L6xKCg3vNkmlVVz9hwyQ==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz", + "integrity": "sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==", "dev": true, "peer": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.6", - "@babel/helper-wrap-function": "^7.18.6", - "@babel/types": "^7.18.6" + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-wrap-function": "^7.18.9", + "@babel/types": "^7.18.9" }, "engines": { "node": ">=6.9.0" @@ -414,43 +487,44 @@ } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.18.6.tgz", - "integrity": "sha512-fTf7zoXnUGl9gF25fXCWE26t7Tvtyn6H4hkLSYhATwJvw2uYxd3aoXplMSe0g9XbwK7bmxNes7+FGO0rB/xC0g==", + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.20.7.tgz", + "integrity": "sha512-vujDMtB6LVfNW13jhlCrp48QNslK6JXi7lQG736HVbHz/mbf4Dc7tIRh1Xf5C0rF7BP8iiSxGMCmY6Ci1ven3A==", "dev": true, "peer": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.18.6", - "@babel/helper-member-expression-to-functions": "^7.18.6", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-member-expression-to-functions": "^7.20.7", "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/traverse": "^7.18.6", - "@babel/types": "^7.18.6" + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.20.7", + "@babel/types": "^7.20.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-simple-access": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.18.6.tgz", - "integrity": "sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g==", + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", + "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", "dev": true, "peer": true, "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.20.2" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.18.6.tgz", - "integrity": "sha512-4KoLhwGS9vGethZpAhYnMejWkX64wsnHPDwvOsKWU6Fg4+AlK2Jz3TyjQLMEPvz+1zemi/WBdkYxCD0bAfIkiw==", + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz", + "integrity": "sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg==", "dev": true, "peer": true, "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.20.0" }, "engines": { "node": ">=6.9.0" @@ -469,10 +543,20 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/helper-string-parser": { + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", + "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", + "dev": true, + "peer": true, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz", - "integrity": "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==", + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", "dev": true, "engines": { "node": ">=6.9.0" @@ -489,31 +573,31 @@ } }, "node_modules/@babel/helper-wrap-function": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.18.6.tgz", - "integrity": "sha512-I5/LZfozwMNbwr/b1vhhuYD+J/mU+gfGAj5td7l5Rv9WYmH6i3Om69WGKNmlIpsVW/mF6O5bvTKbvDQZVgjqOw==", + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.20.5.tgz", + "integrity": "sha512-bYMxIWK5mh+TgXGVqAtnu5Yn1un+v8DDZtqyzKRLUzrh70Eal2O3aZ7aPYiMADO4uKlkzOiRiZ6GX5q3qxvW9Q==", "dev": true, "peer": true, "dependencies": { - "@babel/helper-function-name": "^7.18.6", - "@babel/template": "^7.18.6", - "@babel/traverse": "^7.18.6", - "@babel/types": "^7.18.6" + "@babel/helper-function-name": "^7.19.0", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.20.5", + "@babel/types": "^7.20.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.18.6.tgz", - "integrity": "sha512-vzSiiqbQOghPngUYt/zWGvK3LAsPhz55vc9XNN0xAl2gV4ieShI2OQli5duxWHD+72PZPTKAcfcZDE1Cwc5zsQ==", + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.21.0.tgz", + "integrity": "sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA==", "dev": true, "peer": true, "dependencies": { - "@babel/template": "^7.18.6", - "@babel/traverse": "^7.18.6", - "@babel/types": "^7.18.6" + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.21.0", + "@babel/types": "^7.21.0" }, "engines": { "node": ">=6.9.0" @@ -596,9 +680,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.18.8", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.8.tgz", - "integrity": "sha512-RSKRfYX20dyH+elbJK2uqAkVyucL+xXzhqlMD5/ZXx+dAAwpyB7HsvnHe/ZUGOF+xLr5Wx9/JoXVTj6BQE2/oA==", + "version": "7.21.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.3.tgz", + "integrity": "sha512-lobG0d7aOfQRXh8AyklEAgZGvA4FShxo6xQbUrrT/cNBPUdIDojlokwJsQyCC/eKia7ifqM0yP+2DRZ4WKw2RQ==", "dev": true, "peer": true, "bin": { @@ -625,15 +709,15 @@ } }, "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.18.6.tgz", - "integrity": "sha512-Udgu8ZRgrBrttVz6A0EVL0SJ1z+RLbIeqsu632SA1hf0awEppD6TvdznoH+orIF8wtFFAV/Enmw9Y+9oV8TQcw==", + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.20.7.tgz", + "integrity": "sha512-sbr9+wNE5aXMBBFBICk01tt7sBf2Oc9ikRFEcem/ZORup9IMUdNhW7/wVLEbbtlWOsEubJet46mHAL2C8+2jKQ==", "dev": true, "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-skip-transparent-expression-wrappers": "^7.18.6", - "@babel/plugin-proposal-optional-chaining": "^7.18.6" + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", + "@babel/plugin-proposal-optional-chaining": "^7.20.7" }, "engines": { "node": ">=6.9.0" @@ -643,15 +727,15 @@ } }, "node_modules/@babel/plugin-proposal-async-generator-functions": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.18.6.tgz", - "integrity": "sha512-WAz4R9bvozx4qwf74M+sfqPMKfSqwM0phxPTR6iJIi8robgzXwkEgmeJG1gEKhm6sDqT/U9aV3lfcqybIpev8w==", + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz", + "integrity": "sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==", "dev": true, "peer": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-remap-async-to-generator": "^7.18.6", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-remap-async-to-generator": "^7.18.9", "@babel/plugin-syntax-async-generators": "^7.8.4" }, "engines": { @@ -731,13 +815,13 @@ } }, "node_modules/@babel/plugin-proposal-export-namespace-from": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.6.tgz", - "integrity": "sha512-zr/QcUlUo7GPo6+X1wC98NJADqmy5QTFWWhqeQWiki4XHafJtLl/YMGkmRB2szDD2IYJCCdBTd4ElwhId9T7Xw==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz", + "integrity": "sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==", "dev": true, "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.9", "@babel/plugin-syntax-export-namespace-from": "^7.8.3" }, "engines": { @@ -765,13 +849,13 @@ } }, "node_modules/@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.18.6.tgz", - "integrity": "sha512-zMo66azZth/0tVd7gmkxOkOjs2rpHyhpcFo565PUP37hSp6hSd9uUKIfTDFMz58BwqgQKhJ9YxtM5XddjXVn+Q==", + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.20.7.tgz", + "integrity": "sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug==", "dev": true, "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-plugin-utils": "^7.20.2", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" }, "engines": { @@ -816,17 +900,17 @@ } }, "node_modules/@babel/plugin-proposal-object-rest-spread": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.18.6.tgz", - "integrity": "sha512-9yuM6wr4rIsKa1wlUAbZEazkCrgw2sMPEXCr4Rnwetu7cEW1NydkCWytLuYletbf8vFxdJxFhwEZqMpOx2eZyw==", + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz", + "integrity": "sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==", "dev": true, "peer": true, "dependencies": { - "@babel/compat-data": "^7.18.6", - "@babel/helper-compilation-targets": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", + "@babel/compat-data": "^7.20.5", + "@babel/helper-compilation-targets": "^7.20.7", + "@babel/helper-plugin-utils": "^7.20.2", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.18.6" + "@babel/plugin-transform-parameters": "^7.20.7" }, "engines": { "node": ">=6.9.0" @@ -853,14 +937,14 @@ } }, "node_modules/@babel/plugin-proposal-optional-chaining": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.18.6.tgz", - "integrity": "sha512-PatI6elL5eMzoypFAiYDpYQyMtXTn+iMhuxxQt5mAXD4fEmKorpSI3PHd+i3JXBJN3xyA6MvJv7at23HffFHwA==", + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz", + "integrity": "sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==", "dev": true, "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-skip-transparent-expression-wrappers": "^7.18.6", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", "@babel/plugin-syntax-optional-chaining": "^7.8.3" }, "engines": { @@ -1024,13 +1108,13 @@ } }, "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.18.6.tgz", - "integrity": "sha512-/DU3RXad9+bZwrgWJQKbr39gYbJpLJHezqEzRzi/BHRlJ9zsQb4CK2CA/5apllXNomwA1qHwzvHl+AdEmC5krQ==", + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.20.0.tgz", + "integrity": "sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ==", "dev": true, "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.19.0" }, "engines": { "node": ">=6.9.0" @@ -1245,13 +1329,13 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.18.6.tgz", - "integrity": "sha512-pRqwb91C42vs1ahSAWJkxOxU1RHWDn16XAa6ggQ72wjLlWyYeAcLvTtE0aM8ph3KNydy9CQF2nLYcjq1WysgxQ==", + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.21.0.tgz", + "integrity": "sha512-Mdrbunoh9SxwFZapeHVrwFmri16+oYotcZysSzhNIVDwIAb1UV+kvnxULSYq9J3/q5MDG+4X6w8QVgD1zhBXNQ==", "dev": true, "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.20.2" }, "engines": { "node": ">=6.9.0" @@ -1261,18 +1345,19 @@ } }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.18.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.18.8.tgz", - "integrity": "sha512-RySDoXdF6hgHSHuAW4aLGyVQdmvEX/iJtjVre52k0pxRq4hzqze+rAVP++NmNv596brBpYmaiKgTZby7ziBnVg==", + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.21.0.tgz", + "integrity": "sha512-RZhbYTCEUAe6ntPehC4hlslPWosNHDox+vAs4On/mCLRLfoDVHf6hVEd7kuxr1RnHwJmxFfUM3cZiZRmPxJPXQ==", "dev": true, "peer": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.6", - "@babel/helper-function-name": "^7.18.6", + "@babel/helper-compilation-targets": "^7.20.7", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.21.0", "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-replace-supers": "^7.18.6", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-replace-supers": "^7.20.7", "@babel/helper-split-export-declaration": "^7.18.6", "globals": "^11.1.0" }, @@ -1284,13 +1369,14 @@ } }, "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.18.6.tgz", - "integrity": "sha512-9repI4BhNrR0KenoR9vm3/cIc1tSBIo+u1WVjKCAynahj25O8zfbiE6JtAtHPGQSs4yZ+bA8mRasRP+qc+2R5A==", + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.20.7.tgz", + "integrity": "sha512-Lz7MvBK6DTjElHAmfu6bfANzKcxpyNPeYBGEafyA6E5HtRpjpZwU+u7Qrgz/2OR0z+5TvKYbPdphfSaAcZBrYQ==", "dev": true, "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/template": "^7.20.7" }, "engines": { "node": ">=6.9.0" @@ -1300,13 +1386,13 @@ } }, "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.18.6.tgz", - "integrity": "sha512-tgy3u6lRp17ilY8r1kP4i2+HDUwxlVqq3RTc943eAWSzGgpU1qhiKpqZ5CMyHReIYPHdo3Kg8v8edKtDqSVEyQ==", + "version": "7.21.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.21.3.tgz", + "integrity": "sha512-bp6hwMFzuiE4HqYEyoGJ/V2LeIWn+hLVKc4pnj++E5XQptwhtcGmSayM029d/j2X1bPKGTlsyPwAubuU22KhMA==", "dev": true, "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.20.2" }, "engines": { "node": ">=6.9.0" @@ -1333,13 +1419,13 @@ } }, "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.6.tgz", - "integrity": "sha512-NJU26U/208+sxYszf82nmGYqVF9QN8py2HFTblPT9hbawi8+1C5a9JubODLTGFuT0qlkqVinmkwOD13s0sZktg==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz", + "integrity": "sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==", "dev": true, "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.18.9" }, "engines": { "node": ">=6.9.0" @@ -1399,15 +1485,15 @@ } }, "node_modules/@babel/plugin-transform-function-name": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.6.tgz", - "integrity": "sha512-kJha/Gbs5RjzIu0CxZwf5e3aTTSlhZnHMT8zPWnJMjNpLOUgqevg+PN5oMH68nMCXnfiMo4Bhgxqj59KHTlAnA==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz", + "integrity": "sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==", "dev": true, "peer": true, "dependencies": { - "@babel/helper-compilation-targets": "^7.18.6", - "@babel/helper-function-name": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-compilation-targets": "^7.18.9", + "@babel/helper-function-name": "^7.18.9", + "@babel/helper-plugin-utils": "^7.18.9" }, "engines": { "node": ">=6.9.0" @@ -1417,13 +1503,13 @@ } }, "node_modules/@babel/plugin-transform-literals": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.6.tgz", - "integrity": "sha512-x3HEw0cJZVDoENXOp20HlypIHfl0zMIhMVZEBVTfmqbObIpsMxMbmU5nOEO8R7LYT+z5RORKPlTI5Hj4OsO9/Q==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz", + "integrity": "sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==", "dev": true, "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.18.9" }, "engines": { "node": ">=6.9.0" @@ -1449,15 +1535,14 @@ } }, "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.18.6.tgz", - "integrity": "sha512-Pra5aXsmTsOnjM3IajS8rTaLCy++nGM4v3YR4esk5PCsyg9z8NA5oQLwxzMUtDBd8F+UmVza3VxoAaWCbzH1rg==", + "version": "7.20.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.20.11.tgz", + "integrity": "sha512-NuzCt5IIYOW0O30UvqktzHYR2ud5bOWbY0yaxWZ6G+aFzOMJvrs5YHNikrbdaT15+KNO31nPOy5Fim3ku6Zb5g==", "dev": true, "peer": true, "dependencies": { - "@babel/helper-module-transforms": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "babel-plugin-dynamic-import-node": "^2.3.3" + "@babel/helper-module-transforms": "^7.20.11", + "@babel/helper-plugin-utils": "^7.20.2" }, "engines": { "node": ">=6.9.0" @@ -1467,16 +1552,15 @@ } }, "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.18.6.tgz", - "integrity": "sha512-Qfv2ZOWikpvmedXQJDSbxNqy7Xr/j2Y8/KfijM0iJyKkBTmWuvCA1yeH1yDM7NJhBW/2aXxeucLj6i80/LAJ/Q==", + "version": "7.21.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.21.2.tgz", + "integrity": "sha512-Cln+Yy04Gxua7iPdj6nOV96smLGjpElir5YwzF0LBPKoPlLDNJePNlrGGaybAJkd0zKRnOVXOgizSqPYMNYkzA==", "dev": true, "peer": true, "dependencies": { - "@babel/helper-module-transforms": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-simple-access": "^7.18.6", - "babel-plugin-dynamic-import-node": "^2.3.3" + "@babel/helper-module-transforms": "^7.21.2", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-simple-access": "^7.20.2" }, "engines": { "node": ">=6.9.0" @@ -1486,17 +1570,16 @@ } }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.18.6.tgz", - "integrity": "sha512-UbPYpXxLjTw6w6yXX2BYNxF3p6QY225wcTkfQCy3OMnSlS/C3xGtwUjEzGkldb/sy6PWLiCQ3NbYfjWUTI3t4g==", + "version": "7.20.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.20.11.tgz", + "integrity": "sha512-vVu5g9BPQKSFEmvt2TA4Da5N+QVS66EX21d8uoOihC+OCpUoGvzVsXeqFdtAEfVa5BILAeFt+U7yVmLbQnAJmw==", "dev": true, "peer": true, "dependencies": { "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-module-transforms": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-validator-identifier": "^7.18.6", - "babel-plugin-dynamic-import-node": "^2.3.3" + "@babel/helper-module-transforms": "^7.20.11", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-validator-identifier": "^7.19.1" }, "engines": { "node": ">=6.9.0" @@ -1523,14 +1606,14 @@ } }, "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.18.6.tgz", - "integrity": "sha512-UmEOGF8XgaIqD74bC8g7iV3RYj8lMf0Bw7NJzvnS9qQhM4mg+1WHKotUIdjxgD2RGrgFLZZPCFPFj3P/kVDYhg==", + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.20.5.tgz", + "integrity": "sha512-mOW4tTzi5iTLnw+78iEq3gr8Aoq4WNRGpmSlrogqaiCBoR1HFhpU4JkpQFOHfeYx3ReVIFWOQJS4aZBRvuZ6mA==", "dev": true, "peer": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-create-regexp-features-plugin": "^7.20.5", + "@babel/helper-plugin-utils": "^7.20.2" }, "engines": { "node": ">=6.9.0" @@ -1573,13 +1656,13 @@ } }, "node_modules/@babel/plugin-transform-parameters": { - "version": "7.18.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.18.8.tgz", - "integrity": "sha512-ivfbE3X2Ss+Fj8nnXvKJS6sjRG4gzwPMsP+taZC+ZzEGjAYlvENixmt1sZ5Ca6tWls+BlKSGKPJ6OOXvXCbkFg==", + "version": "7.21.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.21.3.tgz", + "integrity": "sha512-Wxc+TvppQG9xWFYatvCGPvZ6+SIUxQ2ZdiBP+PHYMIjnPXD+uThCshaz4NZOnODAtBjjcVQQ/3OKs9LW28purQ==", "dev": true, "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.20.2" }, "engines": { "node": ">=6.9.0" @@ -1743,14 +1826,14 @@ } }, "node_modules/@babel/plugin-transform-spread": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.18.6.tgz", - "integrity": "sha512-ayT53rT/ENF8WWexIRg9AiV9h0aIteyWn5ptfZTZQrjk/+f3WdrJGCY4c9wcgl2+MKkKPhzbYp97FTsquZpDCw==", + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.20.7.tgz", + "integrity": "sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw==", "dev": true, "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-skip-transparent-expression-wrappers": "^7.18.6" + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0" }, "engines": { "node": ">=6.9.0" @@ -1776,13 +1859,13 @@ } }, "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.6.tgz", - "integrity": "sha512-UuqlRrQmT2SWRvahW46cGSany0uTlcj8NYOS5sRGYi8FxPYPoLd5DDmMd32ZXEj2Jq+06uGVQKHxa/hJx2EzKw==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz", + "integrity": "sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==", "dev": true, "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.18.9" }, "engines": { "node": ">=6.9.0" @@ -1792,13 +1875,13 @@ } }, "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.6.tgz", - "integrity": "sha512-7m71iS/QhsPk85xSjFPovHPcH3H9qeyzsujhTc+vcdnsXavoWYJ74zx0lP5RhpC5+iDnVLO+PPMHzC11qels1g==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz", + "integrity": "sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==", "dev": true, "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.18.9" }, "engines": { "node": ">=6.9.0" @@ -1826,13 +1909,13 @@ } }, "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.6.tgz", - "integrity": "sha512-XNRwQUXYMP7VLuy54cr/KS/WeL3AZeORhrmeZ7iewgu+X2eBqmpaLI/hzqr9ZxCeUoq0ASK4GUzSM0BDhZkLFw==", + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.10.tgz", + "integrity": "sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ==", "dev": true, "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.18.9" }, "engines": { "node": ">=6.9.0" @@ -1859,30 +1942,30 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.18.6.tgz", - "integrity": "sha512-WrthhuIIYKrEFAwttYzgRNQ5hULGmwTj+D6l7Zdfsv5M7IWV/OZbUfbeL++Qrzx1nVJwWROIFhCHRYQV4xbPNw==", + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.20.2.tgz", + "integrity": "sha512-1G0efQEWR1EHkKvKHqbG+IN/QdgwfByUpM5V5QroDzGV2t3S/WXNQd693cHiHTlCFMpr9B6FkPFXDA2lQcKoDg==", "dev": true, "peer": true, "dependencies": { - "@babel/compat-data": "^7.18.6", - "@babel/helper-compilation-targets": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", + "@babel/compat-data": "^7.20.1", + "@babel/helper-compilation-targets": "^7.20.0", + "@babel/helper-plugin-utils": "^7.20.2", "@babel/helper-validator-option": "^7.18.6", "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.18.6", - "@babel/plugin-proposal-async-generator-functions": "^7.18.6", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.18.9", + "@babel/plugin-proposal-async-generator-functions": "^7.20.1", "@babel/plugin-proposal-class-properties": "^7.18.6", "@babel/plugin-proposal-class-static-block": "^7.18.6", "@babel/plugin-proposal-dynamic-import": "^7.18.6", - "@babel/plugin-proposal-export-namespace-from": "^7.18.6", + "@babel/plugin-proposal-export-namespace-from": "^7.18.9", "@babel/plugin-proposal-json-strings": "^7.18.6", - "@babel/plugin-proposal-logical-assignment-operators": "^7.18.6", + "@babel/plugin-proposal-logical-assignment-operators": "^7.18.9", "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6", "@babel/plugin-proposal-numeric-separator": "^7.18.6", - "@babel/plugin-proposal-object-rest-spread": "^7.18.6", + "@babel/plugin-proposal-object-rest-spread": "^7.20.2", "@babel/plugin-proposal-optional-catch-binding": "^7.18.6", - "@babel/plugin-proposal-optional-chaining": "^7.18.6", + "@babel/plugin-proposal-optional-chaining": "^7.18.9", "@babel/plugin-proposal-private-methods": "^7.18.6", "@babel/plugin-proposal-private-property-in-object": "^7.18.6", "@babel/plugin-proposal-unicode-property-regex": "^7.18.6", @@ -1891,7 +1974,7 @@ "@babel/plugin-syntax-class-static-block": "^7.14.5", "@babel/plugin-syntax-dynamic-import": "^7.8.3", "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.18.6", + "@babel/plugin-syntax-import-assertions": "^7.20.0", "@babel/plugin-syntax-json-strings": "^7.8.3", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", @@ -1904,41 +1987,41 @@ "@babel/plugin-transform-arrow-functions": "^7.18.6", "@babel/plugin-transform-async-to-generator": "^7.18.6", "@babel/plugin-transform-block-scoped-functions": "^7.18.6", - "@babel/plugin-transform-block-scoping": "^7.18.6", - "@babel/plugin-transform-classes": "^7.18.6", - "@babel/plugin-transform-computed-properties": "^7.18.6", - "@babel/plugin-transform-destructuring": "^7.18.6", + "@babel/plugin-transform-block-scoping": "^7.20.2", + "@babel/plugin-transform-classes": "^7.20.2", + "@babel/plugin-transform-computed-properties": "^7.18.9", + "@babel/plugin-transform-destructuring": "^7.20.2", "@babel/plugin-transform-dotall-regex": "^7.18.6", - "@babel/plugin-transform-duplicate-keys": "^7.18.6", + "@babel/plugin-transform-duplicate-keys": "^7.18.9", "@babel/plugin-transform-exponentiation-operator": "^7.18.6", - "@babel/plugin-transform-for-of": "^7.18.6", - "@babel/plugin-transform-function-name": "^7.18.6", - "@babel/plugin-transform-literals": "^7.18.6", + "@babel/plugin-transform-for-of": "^7.18.8", + "@babel/plugin-transform-function-name": "^7.18.9", + "@babel/plugin-transform-literals": "^7.18.9", "@babel/plugin-transform-member-expression-literals": "^7.18.6", - "@babel/plugin-transform-modules-amd": "^7.18.6", - "@babel/plugin-transform-modules-commonjs": "^7.18.6", - "@babel/plugin-transform-modules-systemjs": "^7.18.6", + "@babel/plugin-transform-modules-amd": "^7.19.6", + "@babel/plugin-transform-modules-commonjs": "^7.19.6", + "@babel/plugin-transform-modules-systemjs": "^7.19.6", "@babel/plugin-transform-modules-umd": "^7.18.6", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.18.6", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.19.1", "@babel/plugin-transform-new-target": "^7.18.6", "@babel/plugin-transform-object-super": "^7.18.6", - "@babel/plugin-transform-parameters": "^7.18.6", + "@babel/plugin-transform-parameters": "^7.20.1", "@babel/plugin-transform-property-literals": "^7.18.6", "@babel/plugin-transform-regenerator": "^7.18.6", "@babel/plugin-transform-reserved-words": "^7.18.6", "@babel/plugin-transform-shorthand-properties": "^7.18.6", - "@babel/plugin-transform-spread": "^7.18.6", + "@babel/plugin-transform-spread": "^7.19.0", "@babel/plugin-transform-sticky-regex": "^7.18.6", - "@babel/plugin-transform-template-literals": "^7.18.6", - "@babel/plugin-transform-typeof-symbol": "^7.18.6", - "@babel/plugin-transform-unicode-escapes": "^7.18.6", + "@babel/plugin-transform-template-literals": "^7.18.9", + "@babel/plugin-transform-typeof-symbol": "^7.18.9", + "@babel/plugin-transform-unicode-escapes": "^7.18.10", "@babel/plugin-transform-unicode-regex": "^7.18.6", "@babel/preset-modules": "^0.1.5", - "@babel/types": "^7.18.6", - "babel-plugin-polyfill-corejs2": "^0.3.1", - "babel-plugin-polyfill-corejs3": "^0.5.2", - "babel-plugin-polyfill-regenerator": "^0.3.1", - "core-js-compat": "^3.22.1", + "@babel/types": "^7.20.2", + "babel-plugin-polyfill-corejs2": "^0.3.3", + "babel-plugin-polyfill-corejs3": "^0.6.0", + "babel-plugin-polyfill-regenerator": "^0.4.1", + "core-js-compat": "^3.25.1", "semver": "^6.3.0" }, "engines": { @@ -1948,6 +2031,33 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/preset-env/node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.6.0.tgz", + "integrity": "sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.3.3", + "core-js-compat": "^3.25.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-env/node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz", + "integrity": "sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.3.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@babel/preset-flow": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/preset-flow/-/preset-flow-7.18.6.tgz", @@ -2021,48 +2131,55 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==", + "dev": true, + "peer": true + }, "node_modules/@babel/runtime": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.6.tgz", - "integrity": "sha512-t9wi7/AW6XtKahAe20Yw0/mMljKq0B1r2fPdvaAdV/KPDZewFXdaaa6K7lxmZBZ8FBNpCiAT6iHPmd6QO9bKfQ==", + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.0.tgz", + "integrity": "sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==", "dev": true, "dependencies": { - "regenerator-runtime": "^0.13.4" + "regenerator-runtime": "^0.13.11" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/template": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.6.tgz", - "integrity": "sha512-JoDWzPe+wgBsTTgdnIma3iHNFC7YVJoPssVBDjiHfNlyt4YcunDtcDOUmfVDfCK5MfdsaIoX9PkijPhjH3nYUw==", + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz", + "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==", "dev": true, "peer": true, "dependencies": { "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.18.6", - "@babel/types": "^7.18.6" + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.18.8", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.8.tgz", - "integrity": "sha512-UNg/AcSySJYR/+mIcJQDCv00T+AqRO7j/ZEJLzpaYtgM48rMg5MnkJgyNqkzo88+p4tfRvZJCEiwwfG6h4jkRg==", + "version": "7.21.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.3.tgz", + "integrity": "sha512-XLyopNeaTancVitYZe2MlUEvgKb6YVVPXzofHgqHijCImG33b/uTurMS488ht/Hbsb2XK3U2BnSTxKVNGV3nGQ==", "dev": true, "peer": true, "dependencies": { "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.18.7", - "@babel/helper-environment-visitor": "^7.18.6", - "@babel/helper-function-name": "^7.18.6", + "@babel/generator": "^7.21.3", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.21.0", "@babel/helper-hoist-variables": "^7.18.6", "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.18.8", - "@babel/types": "^7.18.8", + "@babel/parser": "^7.21.3", + "@babel/types": "^7.21.3", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -2071,13 +2188,14 @@ } }, "node_modules/@babel/types": { - "version": "7.18.8", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.8.tgz", - "integrity": "sha512-qwpdsmraq0aJ3osLJRApsc2ouSJCdnMeZwB0DhbtHAtRpZNZCdlbRnHIgcRKzdE1g0iOGg644fzjOBcdOz9cPw==", + "version": "7.21.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.3.tgz", + "integrity": "sha512-sBGdETxC+/M4o/zKC0sl6sjWv62WFR/uzxrJ6uYyMLZOUlPnwzw0tKgVHOXxaAd5l2g8pEDM5RZ495GPQI77kg==", "dev": true, "peer": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.18.6", + "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-validator-identifier": "^7.19.1", "to-fast-properties": "^2.0.0" }, "engines": { @@ -2132,6 +2250,12 @@ "uuid": "dist/bin/uuid" } }, + "node_modules/@cypress/skip-test": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/@cypress/skip-test/-/skip-test-2.6.1.tgz", + "integrity": "sha512-X+ibefBiuOmC5gKG91wRIT0/OqXeETYvu7zXktjZ3yLeO186Y8ia0K7/gQUpAwuUi28DuqMd1+7tBQVtPkzbPA==", + "dev": true + }, "node_modules/@cypress/xvfb": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/@cypress/xvfb/-/xvfb-1.2.4.tgz", @@ -2151,6 +2275,133 @@ "ms": "^2.1.1" } }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.2.0.tgz", + "integrity": "sha512-gB8T4H4DEfX2IV9zGDJPOBgP1e/DbfCPDTtEqUMckpvzS1OYtva8JdFYBqMwYk7xAQ429WGF/UPqn8uQ//h2vQ==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.4.0.tgz", + "integrity": "sha512-A9983Q0LnDGdLPjxyXQ00sbV+K+O+ko2Dr+CZigbHWtX9pNfxlaBkMR8X1CztI73zuEyEBXTVjx7CE+/VSwDiQ==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", + "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.1.1", + "espree": "^7.3.0", + "globals": "^13.9.0", + "ignore": "^4.0.6", + "import-fresh": "^3.2.1", + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/@eslint/eslintrc/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/eslintrc/node_modules/ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/@eslint/eslintrc/node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/eslintrc/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@eslint/eslintrc/node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@eslint/eslintrc/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@hapi/hoek": { "version": "9.3.0", "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", @@ -2168,6 +2419,26 @@ "@hapi/hoek": "^9.0.0" } }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", + "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^1.2.0", + "debug": "^4.1.1", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true + }, "node_modules/@jest/create-cache-key-function": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/@jest/create-cache-key-function/-/create-cache-key-function-27.5.1.tgz", @@ -2232,6 +2503,32 @@ "node": ">=6.0.0" } }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", + "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", + "dev": true, + "peer": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "node_modules/@jridgewell/source-map/node_modules/@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "dev": true, + "peer": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/@jridgewell/sourcemap-codec": { "version": "1.4.14", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", @@ -2240,14 +2537,14 @@ "peer": true }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.14", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.14.tgz", - "integrity": "sha512-bJWEfQ9lPTvm3SneWwRFVLzrh6nhjwqw7TUFFBEMzwvg7t7PCDenf2lDwqo4NQXzdpgBXyFgDWnQA+2vkruksQ==", + "version": "0.3.17", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", + "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", "dev": true, "peer": true, "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" } }, "node_modules/@mattermost/types": { @@ -2264,6 +2561,50 @@ } } }, + "node_modules/@nicolo-ribaudo/eslint-scope-5-internals": { + "version": "5.1.1-v1", + "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz", + "integrity": "sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==", + "dev": true, + "dependencies": { + "eslint-scope": "5.1.1" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, "node_modules/@react-native-community/cli": { "version": "8.0.3", "resolved": "https://registry.npmjs.org/@react-native-community/cli/-/cli-8.0.3.tgz", @@ -3479,6 +3820,35 @@ "@types/node": "*" } }, + "node_modules/@types/eslint": { + "version": "8.21.2", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.21.2.tgz", + "integrity": "sha512-EMpxUyystd3uZVByZap1DACsMXvb82ypQnGn89e1Y0a+LYu3JJscUd/gqhRsVFDkaD2MIiWo0MT8EfXr3DGRKw==", + "dev": true, + "peer": true, + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.4", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", + "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", + "dev": true, + "peer": true, + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.0.tgz", + "integrity": "sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==", + "dev": true, + "peer": true + }, "node_modules/@types/express": { "version": "4.17.15", "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.15.tgz", @@ -3559,6 +3929,18 @@ "@types/istanbul-lib-report": "*" } }, + "node_modules/@types/json-schema": { + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", + "dev": true + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true + }, "node_modules/@types/jsonfile": { "version": "6.1.1", "resolved": "https://registry.npmjs.org/@types/jsonfile/-/jsonfile-6.1.1.tgz", @@ -3667,6 +4049,12 @@ "@types/node": "*" } }, + "node_modules/@types/semver": { + "version": "7.3.13", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz", + "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==", + "dev": true + }, "node_modules/@types/serve-static": { "version": "1.13.10", "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.10.tgz", @@ -3738,6 +4126,414 @@ "@types/node": "*" } }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "5.55.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.55.0.tgz", + "integrity": "sha512-IZGc50rtbjk+xp5YQoJvmMPmJEYoC53SiKPXyqWfv15XoD2Y5Kju6zN0DwlmaGJp1Iw33JsWJcQ7nw0lGCGjVg==", + "dev": true, + "dependencies": { + "@eslint-community/regexpp": "^4.4.0", + "@typescript-eslint/scope-manager": "5.55.0", + "@typescript-eslint/type-utils": "5.55.0", + "@typescript-eslint/utils": "5.55.0", + "debug": "^4.3.4", + "grapheme-splitter": "^1.0.4", + "ignore": "^5.2.0", + "natural-compare-lite": "^1.4.0", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^5.0.0", + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "5.55.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.55.0.tgz", + "integrity": "sha512-ppvmeF7hvdhUUZWSd2EEWfzcFkjJzgNQzVST22nzg958CR+sphy8A6K7LXQZd6V75m1VKjp+J4g/PCEfSCmzhw==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "5.55.0", + "@typescript-eslint/types": "5.55.0", + "@typescript-eslint/typescript-estree": "5.55.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "5.55.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.55.0.tgz", + "integrity": "sha512-OK+cIO1ZGhJYNCL//a3ROpsd83psf4dUJ4j7pdNVzd5DmIk+ffkuUIX2vcZQbEW/IR41DYsfJTB19tpCboxQuw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.55.0", + "@typescript-eslint/visitor-keys": "5.55.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "5.55.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.55.0.tgz", + "integrity": "sha512-ObqxBgHIXj8rBNm0yh8oORFrICcJuZPZTqtAFh0oZQyr5DnAHZWfyw54RwpEEH+fD8suZaI0YxvWu5tYE/WswA==", + "dev": true, + "dependencies": { + "@typescript-eslint/typescript-estree": "5.55.0", + "@typescript-eslint/utils": "5.55.0", + "debug": "^4.3.4", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "5.55.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.55.0.tgz", + "integrity": "sha512-M4iRh4AG1ChrOL6Y+mETEKGeDnT7Sparn6fhZ5LtVJF1909D5O4uqK+C5NPbLmpfZ0XIIxCdwzKiijpZUOvOug==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "5.55.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.55.0.tgz", + "integrity": "sha512-I7X4A9ovA8gdpWMpr7b1BN9eEbvlEtWhQvpxp/yogt48fy9Lj3iE3ild/1H3jKBBIYj5YYJmS2+9ystVhC7eaQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.55.0", + "@typescript-eslint/visitor-keys": "5.55.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "5.55.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.55.0.tgz", + "integrity": "sha512-FkW+i2pQKcpDC3AY6DU54yl8Lfl14FVGYDgBTyGKB75cCwV3KpkpTMFi9d9j2WAJ4271LR2HeC5SEWF/CZmmfw==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.55.0", + "@typescript-eslint/types": "5.55.0", + "@typescript-eslint/typescript-estree": "5.55.0", + "eslint-scope": "^5.1.1", + "semver": "^7.3.7" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/semver": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "5.55.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.55.0.tgz", + "integrity": "sha512-q2dlHHwWgirKh1D3acnuApXG+VNXpEY5/AwRxDVuEQpxWaB0jCDe0jFMVMALJ3ebSfuOVE8/rMS+9ZOYGg1GWw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.55.0", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", + "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", + "dev": true, + "peer": true, + "dependencies": { + "@webassemblyjs/helper-numbers": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", + "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==", + "dev": true, + "peer": true + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", + "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==", + "dev": true, + "peer": true + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", + "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==", + "dev": true, + "peer": true + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", + "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", + "dev": true, + "peer": true, + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.11.1", + "@webassemblyjs/helper-api-error": "1.11.1", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", + "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==", + "dev": true, + "peer": true + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", + "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", + "dev": true, + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", + "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", + "dev": true, + "peer": true, + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", + "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", + "dev": true, + "peer": true, + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", + "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==", + "dev": true, + "peer": true + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", + "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", + "dev": true, + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/helper-wasm-section": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1", + "@webassemblyjs/wasm-opt": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "@webassemblyjs/wast-printer": "1.11.1" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", + "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", + "dev": true, + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/ieee754": "1.11.1", + "@webassemblyjs/leb128": "1.11.1", + "@webassemblyjs/utf8": "1.11.1" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", + "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", + "dev": true, + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", + "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", + "dev": true, + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-api-error": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/ieee754": "1.11.1", + "@webassemblyjs/leb128": "1.11.1", + "@webassemblyjs/utf8": "1.11.1" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", + "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", + "dev": true, + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true, + "peer": true + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true, + "peer": true + }, "node_modules/@yarnpkg/lockfile": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", @@ -3776,6 +4572,27 @@ "node": ">= 0.6" } }, + "node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, "node_modules/aggregate-error": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", @@ -3789,6 +4606,32 @@ "node": ">=8" } }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "peer": true, + "peerDependencies": { + "ajv": "^6.9.1" + } + }, "node_modules/ally.js": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/ally.js/-/ally.js-1.4.1.tgz", @@ -3977,12 +4820,12 @@ "dev": true }, "node_modules/aria-query": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.0.0.tgz", - "integrity": "sha512-V+SM7AbUwJ+EBnB8+DXs0hPZHO0W6pqBcc0dW90OwtVG02PswOu/teuARoLQjdDOH+t9pJgGnW5/Qmouf3gPJg==", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", + "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", "dev": true, - "engines": { - "node": ">=6.0" + "dependencies": { + "deep-equal": "^2.0.5" } }, "node_modules/arr-diff": { @@ -4015,12 +4858,59 @@ "node": ">=0.10.0" } }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", + "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "is-array-buffer": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-find": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-find/-/array-find-1.0.0.tgz", + "integrity": "sha512-kO/vVCacW9mnpn3WPWbTVlEnOabK2L7LWi2HViURtCM46y1zb6I8UMjx4LgbiqadTgHnLInUronwn3ampNTJtQ==", + "dev": true + }, "node_modules/array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", "dev": true }, + "node_modules/array-includes": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", + "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "get-intrinsic": "^1.1.3", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/array-unique": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", @@ -4031,6 +4921,55 @@ "node": ">=0.10.0" } }, + "node_modules/array.prototype.flat": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz", + "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", + "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.tosorted": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.1.tgz", + "integrity": "sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0", + "get-intrinsic": "^1.1.3" + } + }, "node_modules/asap": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", @@ -4088,6 +5027,12 @@ "node": ">=4" } }, + "node_modules/ast-types-flow": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", + "integrity": "sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==", + "dev": true + }, "node_modules/astral-regex": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", @@ -4235,6 +5180,15 @@ "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", "dev": true }, + "node_modules/axe-core": { + "version": "4.6.3", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.6.3.tgz", + "integrity": "sha512-/BQzOX780JhsxDnPpH4ZiyrJAzcd8AfzFPkv+89veFSr1rcMjuq2JDCwypKaPeB6ljHp9KjXhPpjgCvQlWYuqg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/axios": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/axios/-/axios-1.2.2.tgz", @@ -4276,6 +5230,15 @@ "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", "dev": true }, + "node_modules/axobject-query": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.1.1.tgz", + "integrity": "sha512-goKlv8DZrK9hUh975fnHzhNIO4jUnFCfv/dszV5VwUGDFjI6vQ2VwoyjYjYNEbBE8AH87TduWP5uyDR1D+Iteg==", + "dev": true, + "dependencies": { + "deep-equal": "^2.0.5" + } + }, "node_modules/babel-core": { "version": "7.0.0-bridge.0", "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-7.0.0-bridge.0.tgz", @@ -4286,25 +5249,15 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/babel-plugin-dynamic-import-node": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", - "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", - "dev": true, - "peer": true, - "dependencies": { - "object.assign": "^4.1.0" - } - }, "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.1.tgz", - "integrity": "sha512-v7/T6EQcNfVLfcN2X8Lulb7DjprieyLWJK/zOWH5DUYcAgex9sP3h25Q+DLsX9TloXe3y1O8l2q2Jv9q8UVB9w==", + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz", + "integrity": "sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==", "dev": true, "peer": true, "dependencies": { - "@babel/compat-data": "^7.13.11", - "@babel/helper-define-polyfill-provider": "^0.3.1", + "@babel/compat-data": "^7.17.7", + "@babel/helper-define-polyfill-provider": "^0.3.3", "semver": "^6.1.1" }, "peerDependencies": { @@ -4649,9 +5602,9 @@ "dev": true }, "node_modules/browserslist": { - "version": "4.21.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.1.tgz", - "integrity": "sha512-Nq8MFCSrnJXSc88yliwlzQe3qNe3VntIjhsArW9IJOEPSHNx23FalwApUVbzAWABLhYJJ7y8AynWI/XM8OdfjQ==", + "version": "4.21.5", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", + "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==", "dev": true, "funding": [ { @@ -4665,10 +5618,10 @@ ], "peer": true, "dependencies": { - "caniuse-lite": "^1.0.30001359", - "electron-to-chromium": "^1.4.172", - "node-releases": "^2.0.5", - "update-browserslist-db": "^1.0.4" + "caniuse-lite": "^1.0.30001449", + "electron-to-chromium": "^1.4.284", + "node-releases": "^2.0.8", + "update-browserslist-db": "^1.0.10" }, "bin": { "browserslist": "cli.js" @@ -4830,9 +5783,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001366", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001366.tgz", - "integrity": "sha512-yy7XLWCubDobokgzudpkKux8e0UOOnLHE6mlNJBzT3lZJz6s5atSEzjoL+fsCPkI0G8MP5uVdDx1ur/fXEWkZA==", + "version": "1.0.30001466", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001466.tgz", + "integrity": "sha512-ewtFBSfWjEmxUgNBSZItFSmVtvk9zkwkl1OfRZlKA8slltRN+/C/tuGVrF9styXkN36Yu3+SeJ1qkXxDEyNZ5w==", "dev": true, "funding": [ { @@ -4939,6 +5892,16 @@ "fsevents": "~2.3.2" } }, + "node_modules/chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "dev": true, + "peer": true, + "engines": { + "node": ">=6.0" + } + }, "node_modules/ci-info": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.2.0.tgz", @@ -5456,30 +6419,19 @@ } }, "node_modules/core-js-compat": { - "version": "3.23.4", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.23.4.tgz", - "integrity": "sha512-RkSRPe+JYEoflcsuxJWaiMPhnZoFS51FcIxm53k4KzhISCBTmaGlto9dTIrYuk0hnJc3G6pKufAKepHnBq6B6Q==", + "version": "3.29.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.29.1.tgz", + "integrity": "sha512-QmchCua884D8wWskMX8tW5ydINzd8oSJVx38lx/pVkFGqztxt73GYre3pm/hyYq8bPf+MW5In4I/uRShFDsbrA==", "dev": true, "peer": true, "dependencies": { - "browserslist": "^4.21.1", - "semver": "7.0.0" + "browserslist": "^4.21.5" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/core-js" } }, - "node_modules/core-js-compat/node_modules/semver": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", - "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", - "dev": true, - "peer": true, - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", @@ -5727,6 +6679,12 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, + "node_modules/damerau-levenshtein": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", + "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", + "dev": true + }, "node_modules/dashdash": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", @@ -5805,6 +6763,46 @@ "node": ">=6" } }, + "node_modules/deep-equal": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.0.tgz", + "integrity": "sha512-RdpzE0Hv4lhowpIUKKMJfeH6C1pXdtT1/it80ubgWqwI3qpuxUBpC1S4hnHg+zjnuOoDkzUtUCEEkG+XG5l3Mw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "es-get-iterator": "^1.1.2", + "get-intrinsic": "^1.1.3", + "is-arguments": "^1.1.1", + "is-array-buffer": "^3.0.1", + "is-date-object": "^1.0.5", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "isarray": "^2.0.5", + "object-is": "^1.1.5", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.4.3", + "side-channel": "^1.0.4", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.9" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/deep-equal/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, "node_modules/deepmerge": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", @@ -5835,11 +6833,10 @@ } }, "node_modules/define-properties": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", - "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", + "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", "dev": true, - "peer": true, "dependencies": { "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" @@ -5909,6 +6906,30 @@ "node": ">=0.3.1" } }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/dom-accessibility-api": { "version": "0.5.14", "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.14.tgz", @@ -5941,9 +6962,9 @@ "dev": true }, "node_modules/electron-to-chromium": { - "version": "1.4.187", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.187.tgz", - "integrity": "sha512-t3iFLHVIMhB8jGZ+8ui951nz6Bna5qKfhxezG3wzXdBJ79qFKPsE2chjjVFNqC1ewhfrPQrw9pmVeo4FFpZeQA==", + "version": "1.4.330", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.330.tgz", + "integrity": "sha512-PqyefhybrVdjAJ45HaPLtuVaehiSw7C3ya0aad+rvmV53IVyXmYRk3pwIOb2TxTDTnmgQdn46NjMMaysx79/6Q==", "dev": true, "peer": true }, @@ -5971,6 +6992,20 @@ "once": "^1.4.0" } }, + "node_modules/enhanced-resolve": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-0.9.1.tgz", + "integrity": "sha512-kxpoMgrdtkXZ5h0SeraBS1iRntpTpQ3R8ussdb38+UAFnMGX5DDyJXePm+OCHOcoXvHDw7mc2erbJBpDnl7TPw==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.2.0", + "tapable": "^0.1.8" + }, + "engines": { + "node": ">=0.6" + } + }, "node_modules/enquirer": { "version": "2.3.6", "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", @@ -6030,6 +7065,127 @@ "node": ">= 0.8" } }, + "node_modules/es-abstract": { + "version": "1.21.2", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.2.tgz", + "integrity": "sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "es-set-tostringtag": "^2.0.1", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.5", + "get-intrinsic": "^1.2.0", + "get-symbol-description": "^1.0.0", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.5", + "is-array-buffer": "^3.0.2", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.10", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.3", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.4.3", + "safe-regex-test": "^1.0.0", + "string.prototype.trim": "^1.2.7", + "string.prototype.trimend": "^1.0.6", + "string.prototype.trimstart": "^1.0.6", + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-get-iterator": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", + "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "has-symbols": "^1.0.3", + "is-arguments": "^1.1.1", + "is-map": "^2.0.2", + "is-set": "^2.0.2", + "is-string": "^1.0.7", + "isarray": "^2.0.5", + "stop-iteration-iterator": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-get-iterator/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, + "node_modules/es-module-lexer": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", + "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", + "dev": true, + "peer": true + }, + "node_modules/es-set-tostringtag": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", + "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3", + "has": "^1.0.3", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", + "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", @@ -6054,6 +7210,585 @@ "node": ">=0.8.0" } }, + "node_modules/eslint": { + "version": "7.32.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", + "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "7.12.11", + "@eslint/eslintrc": "^0.4.3", + "@humanwhocodes/config-array": "^0.5.0", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "enquirer": "^2.3.5", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^2.1.0", + "eslint-visitor-keys": "^2.0.0", + "espree": "^7.3.1", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.1.2", + "globals": "^13.6.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "progress": "^2.0.0", + "regexpp": "^3.1.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.0", + "strip-json-comments": "^3.1.0", + "table": "^6.0.9", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.7", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz", + "integrity": "sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==", + "dev": true, + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.11.0", + "resolve": "^1.22.1" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/resolve": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/eslint-import-resolver-webpack": { + "version": "0.13.2", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-webpack/-/eslint-import-resolver-webpack-0.13.2.tgz", + "integrity": "sha512-XodIPyg1OgE2h5BDErz3WJoK7lawxKTJNhgPNafRST6csC/MZC+L5P6kKqsZGRInpbgc02s/WZMrb4uGJzcuRg==", + "dev": true, + "dependencies": { + "array-find": "^1.0.0", + "debug": "^3.2.7", + "enhanced-resolve": "^0.9.1", + "find-root": "^1.1.0", + "has": "^1.0.3", + "interpret": "^1.4.0", + "is-core-module": "^2.7.0", + "is-regex": "^1.1.4", + "lodash": "^4.17.21", + "resolve": "^1.20.0", + "semver": "^5.7.1" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "eslint-plugin-import": ">=1.4.0", + "webpack": ">=1.11.0" + } + }, + "node_modules/eslint-import-resolver-webpack/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-import-resolver-webpack/node_modules/interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/eslint-import-resolver-webpack/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/eslint-module-utils": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz", + "integrity": "sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==", + "dev": true, + "dependencies": { + "debug": "^3.2.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-cypress": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-cypress/-/eslint-plugin-cypress-2.12.1.tgz", + "integrity": "sha512-c2W/uPADl5kospNDihgiLc7n87t5XhUbFDoTl6CfVkmG+kDAb5Ux10V9PoLPu9N+r7znpc+iQlcmAqT1A/89HA==", + "dev": true, + "dependencies": { + "globals": "^11.12.0" + }, + "peerDependencies": { + "eslint": ">= 3.2.1" + } + }, + "node_modules/eslint-plugin-header": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-header/-/eslint-plugin-header-3.1.1.tgz", + "integrity": "sha512-9vlKxuJ4qf793CmeeSrZUvVClw6amtpghq3CuWcB5cUNnWHQhgcqy5eF8oVKFk1G3Y/CbchGfEaw3wiIJaNmVg==", + "dev": true, + "peerDependencies": { + "eslint": ">=7.7.0" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.27.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz", + "integrity": "sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "array.prototype.flatmap": "^1.3.1", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.7", + "eslint-module-utils": "^2.7.4", + "has": "^1.0.3", + "is-core-module": "^2.11.0", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.values": "^1.1.6", + "resolve": "^1.22.1", + "semver": "^6.3.0", + "tsconfig-paths": "^3.14.1" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" + } + }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-import/node_modules/resolve": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/eslint-plugin-jsx-a11y": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.7.1.tgz", + "integrity": "sha512-63Bog4iIethyo8smBklORknVjB0T2dwB8Mr/hIC+fBS0uyHdYYpzM/Ed+YC8VxTjlXHEWFOdmgwcDn1U2L9VCA==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.20.7", + "aria-query": "^5.1.3", + "array-includes": "^3.1.6", + "array.prototype.flatmap": "^1.3.1", + "ast-types-flow": "^0.0.7", + "axe-core": "^4.6.2", + "axobject-query": "^3.1.1", + "damerau-levenshtein": "^1.0.8", + "emoji-regex": "^9.2.2", + "has": "^1.0.3", + "jsx-ast-utils": "^3.3.3", + "language-tags": "=1.0.5", + "minimatch": "^3.1.2", + "object.entries": "^1.1.6", + "object.fromentries": "^2.0.6", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=4.0" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" + } + }, + "node_modules/eslint-plugin-jsx-a11y/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "node_modules/eslint-plugin-mattermost": { + "version": "1.0.0", + "resolved": "git+ssh://git@github.com/mattermost/eslint-plugin-mattermost.git#5b0c972eacf19286e4c66221b39113bf8728a99e", + "integrity": "sha512-U73c9Uns3pi8aUxvr3+FcJv+bsMudylcp1Ah6OMrjNRodq6dLmhDOMbMir2so+dw1M0XF9t6jzemLRPedfikXg==", + "dev": true, + "license": "Apache 2.0", + "dependencies": { + "eslint-plugin-jsx-a11y": "^6.7.1", + "jsx-ast-utils": "^3.3.3" + } + }, + "node_modules/eslint-plugin-no-only-tests": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-no-only-tests/-/eslint-plugin-no-only-tests-3.1.0.tgz", + "integrity": "sha512-Lf4YW/bL6Un1R6A76pRZyE1dl1vr31G/ev8UzIc/geCgFWyrKil8hVjYqWVKGB/UIGmb6Slzs9T0wNezdSVegw==", + "dev": true, + "engines": { + "node": ">=5.0.0" + } + }, + "node_modules/eslint-plugin-react": { + "version": "7.32.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.32.2.tgz", + "integrity": "sha512-t2fBMa+XzonrrNkyVirzKlvn5RXzzPwRHtMvLAtVZrt8oxgnTQaYbU6SXTOO1mwQgp1y5+toMSKInnzGr0Knqg==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flatmap": "^1.3.1", + "array.prototype.tosorted": "^1.1.1", + "doctrine": "^2.1.0", + "estraverse": "^5.3.0", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.6", + "object.fromentries": "^2.0.6", + "object.hasown": "^1.1.2", + "object.values": "^1.1.6", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.4", + "semver": "^6.3.0", + "string.prototype.matchall": "^4.0.8" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" + } + }, + "node_modules/eslint-plugin-react/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-react/node_modules/resolve": { + "version": "2.0.0-next.4", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.4.tgz", + "integrity": "sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==", + "dev": true, + "dependencies": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/eslint-rule-composer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/eslint-rule-composer/-/eslint-rule-composer-0.3.0.tgz", + "integrity": "sha512-bt+Sh8CtDmn2OajxvNO+BX7Wn4CIWMpTRm3MaiKPCQcnnlm0CS2mhui6QaoeQugs+3Kj2ESKEEGJUdVafwhiCg==", + "dev": true, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/eslint-scope/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^1.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/eslint/node_modules/@babel/code-frame": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", + "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.10.4" + } + }, + "node_modules/eslint/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/eslint/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint/node_modules/globals": { + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/eslint/node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/eslint/node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint/node_modules/semver": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/esm": { "version": "3.2.25", "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz", @@ -6063,12 +7798,34 @@ "node": ">=6" } }, + "node_modules/espree": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", + "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", + "dev": true, + "dependencies": { + "acorn": "^7.4.0", + "acorn-jsx": "^5.3.1", + "eslint-visitor-keys": "^1.3.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true, - "peer": true, "bin": { "esparse": "bin/esparse.js", "esvalidate": "bin/esvalidate.js" @@ -6077,12 +7834,44 @@ "node": ">=4" } }, + "node_modules/esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, "node_modules/esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true, - "peer": true, "engines": { "node": ">=0.10.0" } @@ -6530,6 +8319,49 @@ "node >=0.6.0" ] }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.2.12", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", + "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "node_modules/fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, "node_modules/fb-watchman": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz", @@ -6564,6 +8396,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, "node_modules/fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -6626,6 +8470,12 @@ "node": ">=6" } }, + "node_modules/find-root": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==", + "dev": true + }, "node_modules/find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", @@ -6659,6 +8509,40 @@ "flat": "cli.js" } }, + "node_modules/flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "dependencies": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flat-cache/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/flatted": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", + "dev": true + }, "node_modules/flow-parser": { "version": "0.121.0", "resolved": "https://registry.npmjs.org/flow-parser/-/flow-parser-0.121.0.tgz", @@ -6807,6 +8691,39 @@ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", "dev": true }, + "node_modules/function.prototype.name": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", + "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0", + "functions-have-names": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", + "dev": true + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -6836,9 +8753,9 @@ } }, "node_modules/get-intrinsic": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", - "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", + "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", "dev": true, "dependencies": { "function-bind": "^1.1.1", @@ -6879,6 +8796,22 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/get-value": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", @@ -6953,6 +8886,13 @@ "node": ">= 6" } }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true, + "peer": true + }, "node_modules/global-dirs": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.0.tgz", @@ -6973,11 +8913,45 @@ "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "dev": true, - "peer": true, "engines": { "node": ">=4" } }, + "node_modules/globalthis": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/gopd": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", @@ -6995,6 +8969,12 @@ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" }, + "node_modules/grapheme-splitter": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", + "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", + "dev": true + }, "node_modules/has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -7007,6 +8987,15 @@ "node": ">= 0.4.0" } }, + "node_modules/has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -7020,7 +9009,6 @@ "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", "dev": true, - "peer": true, "dependencies": { "get-intrinsic": "^1.1.1" }, @@ -7028,6 +9016,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/has-symbols": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", @@ -7235,6 +9235,15 @@ "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", "dev": true }, + "node_modules/ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, "node_modules/image-size": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.6.3.tgz", @@ -7309,6 +9318,20 @@ "node": ">=10" } }, + "node_modules/internal-slot": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", + "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/interpret": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", @@ -7382,6 +9405,20 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-array-buffer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", + "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "is-typed-array": "^1.1.10" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", @@ -7389,6 +9426,18 @@ "dev": true, "peer": true }, + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", @@ -7401,6 +9450,22 @@ "node": ">=8" } }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-buffer": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", @@ -7432,9 +9497,9 @@ } }, "node_modules/is-core-module": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.5.0.tgz", - "integrity": "sha512-TXCMSDsEHMEEZ6eCA8rwRDbLu55MRGmrctljsBX/2v1d9/GzqHOxW5c5oPSgrUt2vBFXebu9rGqckXGPWOlYpg==", + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", + "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", "dev": true, "dependencies": { "has": "^1.0.3" @@ -7456,6 +9521,21 @@ "node": ">=0.10.0" } }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-descriptor": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", @@ -7579,6 +9659,27 @@ "node": ">=8" } }, + "node_modules/is-map": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", + "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -7587,6 +9688,21 @@ "node": ">=0.12.0" } }, + "node_modules/is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-path-inside": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", @@ -7618,6 +9734,22 @@ "node": ">=0.10.0" } }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-retry-allowed": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-2.2.0.tgz", @@ -7630,6 +9762,27 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-set": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", + "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", @@ -7639,6 +9792,36 @@ "node": ">=8" } }, + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-typed-array": { "version": "1.1.10", "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", @@ -7676,6 +9859,40 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-weakmap": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", + "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz", + "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-windows": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", @@ -8169,12 +10386,31 @@ "dev": true, "peer": true }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true, + "peer": true + }, "node_modules/json-schema": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", "dev": true }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, "node_modules/json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", @@ -8182,9 +10418,9 @@ "dev": true }, "node_modules/json5": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", - "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true, "peer": true, "bin": { @@ -8220,6 +10456,19 @@ "verror": "1.10.0" } }, + "node_modules/jsx-ast-utils": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz", + "integrity": "sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.5", + "object.assign": "^4.1.3" + }, + "engines": { + "node": ">=4.0" + } + }, "node_modules/kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", @@ -8345,6 +10594,21 @@ "node": ">=8" } }, + "node_modules/language-subtag-registry": { + "version": "0.3.22", + "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz", + "integrity": "sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==", + "dev": true + }, + "node_modules/language-tags": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.5.tgz", + "integrity": "sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ==", + "dev": true, + "dependencies": { + "language-subtag-registry": "~0.3.2" + } + }, "node_modules/lazy-ass": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/lazy-ass/-/lazy-ass-1.6.0.tgz", @@ -8364,6 +10628,19 @@ "node": ">=6" } }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/lie": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/lie/-/lie-3.1.1.tgz", @@ -8400,6 +10677,16 @@ "enquirer": ">= 2.3.0 < 3" } }, + "node_modules/loader-runner": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "dev": true, + "peer": true, + "engines": { + "node": ">=6.11.5" + } + }, "node_modules/localforage": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/localforage/-/localforage-1.10.0.tgz", @@ -8479,6 +10766,12 @@ "integrity": "sha1-3yz6Ix18V8eorQA6va1dc9PqUZU=", "dev": true }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, "node_modules/lodash.once": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", @@ -8492,6 +10785,12 @@ "dev": true, "peer": true }, + "node_modules/lodash.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", + "dev": true + }, "node_modules/lodash.without": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/lodash.without/-/lodash.without-4.4.0.tgz", @@ -8956,6 +11255,12 @@ "dev": true, "peer": true }, + "node_modules/memory-fs": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.2.0.tgz", + "integrity": "sha512-+y4mDxU4rvXXu5UDSGCGNiesFmwCHuefGMoPCO1WYucNYj7DsLqrFaa2fXVI0H+NNiPTwwzKwspn9yTZqUGqng==", + "dev": true + }, "node_modules/merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", @@ -8968,6 +11273,15 @@ "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", "dev": true }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, "node_modules/methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", @@ -10385,6 +12699,18 @@ "node": ">=0.10.0" } }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "node_modules/natural-compare-lite": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", + "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", + "dev": true + }, "node_modules/negotiator": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", @@ -10487,9 +12813,9 @@ } }, "node_modules/node-releases": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", - "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==", + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz", + "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==", "dev": true, "peer": true }, @@ -10653,20 +12979,35 @@ } }, "node_modules/object-inspect": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", - "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/object-is": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", + "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/object-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "dev": true, - "peer": true, "engines": { "node": ">= 0.4" } @@ -10685,15 +13026,14 @@ } }, "node_modules/object.assign": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", - "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", "dev": true, - "peer": true, "dependencies": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "has-symbols": "^1.0.1", + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", "object-keys": "^1.1.1" }, "engines": { @@ -10703,6 +13043,50 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/object.entries": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.6.tgz", + "integrity": "sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.6.tgz", + "integrity": "sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.hasown": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.2.tgz", + "integrity": "sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/object.pick": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", @@ -10716,6 +13100,23 @@ "node": ">=0.10.0" } }, + "node_modules/object.values": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", + "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/on-finished": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", @@ -10784,6 +13185,23 @@ "opener": "bin/opener-bin.js" } }, + "node_modules/optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/ora": { "version": "5.4.1", "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", @@ -10905,6 +13323,27 @@ "integrity": "sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ==", "dev": true }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parent-module/node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/parse-json": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", @@ -11136,6 +13575,15 @@ "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", "dev": true }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/pathval": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", @@ -11546,6 +13994,15 @@ "node": ">=0.10.0" } }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/pretty-bytes": { "version": "5.6.0", "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", @@ -11616,6 +14073,15 @@ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", "dev": true }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/promise": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/promise/-/promise-8.1.0.tgz", @@ -11641,14 +14107,14 @@ } }, "node_modules/prop-types": { - "version": "15.7.2", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", - "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", "dev": true, "dependencies": { "loose-envify": "^1.4.0", "object-assign": "^4.1.1", - "react-is": "^16.8.1" + "react-is": "^16.13.1" } }, "node_modules/prop-types/node_modules/react-is": { @@ -11735,6 +14201,26 @@ "node": ">=0.4.x" } }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, "node_modules/randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", @@ -12103,9 +14589,9 @@ "peer": true }, "node_modules/regenerate-unicode-properties": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.0.1.tgz", - "integrity": "sha512-vn5DU6yg6h8hP/2OkQo3K7uVILvY4iu0oI4t3HFa81UPkhGJwkRwM10JEc3upjdhHjs/k8GJY1sRBhk5sr69Bw==", + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz", + "integrity": "sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==", "dev": true, "peer": true, "dependencies": { @@ -12116,9 +14602,9 @@ } }, "node_modules/regenerator-runtime": { - "version": "0.13.7", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", - "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==", + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", "dev": true }, "node_modules/regenerator-transform": { @@ -12145,35 +14631,57 @@ "node": ">=0.10.0" } }, + "node_modules/regexp.prototype.flags": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", + "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "functions-have-names": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, "node_modules/regexpu-core": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.1.0.tgz", - "integrity": "sha512-bb6hk+xWd2PEOkj5It46A16zFMs2mv86Iwpdu94la4S3sJ7C973h2dHpYKwIBGaWSO7cIRJ+UX0IeMaWcO4qwA==", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", + "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", "dev": true, "peer": true, "dependencies": { + "@babel/regjsgen": "^0.8.0", "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.0.1", - "regjsgen": "^0.6.0", - "regjsparser": "^0.8.2", + "regenerate-unicode-properties": "^10.1.0", + "regjsparser": "^0.9.1", "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.0.0" + "unicode-match-property-value-ecmascript": "^2.1.0" }, "engines": { "node": ">=4" } }, - "node_modules/regjsgen": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.6.0.tgz", - "integrity": "sha512-ozE883Uigtqj3bx7OhL1KNbCzGyW2NQZPl6Hs09WTvCuZD5sTI4JY58bkbQWa/Y9hxIsvJ3M8Nbf7j54IqeZbA==", - "dev": true, - "peer": true - }, "node_modules/regjsparser": { - "version": "0.8.4", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.8.4.tgz", - "integrity": "sha512-J3LABycON/VNEu3abOviqGHuB/LOtOQj8SKmfP9anY5GfAVw/SPjwzSjxGjbZXIxbGfqTHtJw58C2Li/WkStmA==", + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", + "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", "dev": true, "peer": true, "dependencies": { @@ -12255,6 +14763,15 @@ "node": ">=0.10.0" } }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/require-main-filename": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", @@ -12321,6 +14838,16 @@ "node": ">=0.12" } }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, "node_modules/rimraf": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", @@ -12345,6 +14872,29 @@ "deprecated": "1.x.x versions of the SDK are deprecated. Please upgrade to the latest (2.x.x) version", "dev": true }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, "node_modules/rxjs": { "version": "6.6.7", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", @@ -12393,6 +14943,20 @@ "ret": "~0.1.10" } }, + "node_modules/safe-regex-test": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", + "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-regex": "^1.1.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", @@ -12436,12 +15000,30 @@ "loose-envify": "^1.1.0" } }, + "node_modules/schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dev": true, + "peer": true, + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, "node_modules/semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true, - "peer": true, "bin": { "semver": "bin/semver.js" } @@ -12742,7 +15324,6 @@ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true, - "peer": true, "engines": { "node": ">=8" } @@ -13137,8 +15718,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true, - "peer": true + "dev": true }, "node_modules/sqlstring": { "version": "2.3.1", @@ -13318,6 +15898,18 @@ "node": ">= 0.6" } }, + "node_modules/stop-iteration-iterator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz", + "integrity": "sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==", + "dev": true, + "dependencies": { + "internal-slot": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -13359,6 +15951,70 @@ "node": ">=8" } }, + "node_modules/string.prototype.matchall": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz", + "integrity": "sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "get-intrinsic": "^1.1.3", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.3", + "regexp.prototype.flags": "^1.4.3", + "side-channel": "^1.0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", + "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", + "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", + "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/strip-ansi": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", @@ -13382,6 +16038,15 @@ "node": ">=6" } }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/strip-eof": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", @@ -13431,6 +16096,18 @@ "node": ">=8" } }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/symbol-observable": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", @@ -13440,6 +16117,82 @@ "node": ">=0.10.0" } }, + "node_modules/table": { + "version": "6.8.1", + "resolved": "https://registry.npmjs.org/table/-/table-6.8.1.tgz", + "integrity": "sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==", + "dev": true, + "dependencies": { + "ajv": "^8.0.1", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/table/node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/table/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/table/node_modules/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/table/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tapable": { + "version": "0.1.10", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-0.1.10.tgz", + "integrity": "sha512-jX8Et4hHg57mug1/079yitEKWGB3LCwoxByLsNim89LABq8NqgiX+6iYVOsq0vX8uJHkU+DZ5fnq95f800bEsQ==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, "node_modules/tarn": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/tarn/-/tarn-3.0.2.tgz", @@ -13488,6 +16241,96 @@ "rimraf": "bin.js" } }, + "node_modules/terser": { + "version": "5.16.6", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.16.6.tgz", + "integrity": "sha512-IBZ+ZQIA9sMaXmRZCUMDjNH0D5AQQfdn4WUjHL0+1lF4TP1IHRJbrhb6fNaXWikrYQTSkb7SLxkeXAiy1p7mbg==", + "dev": true, + "peer": true, + "dependencies": { + "@jridgewell/source-map": "^0.3.2", + "acorn": "^8.5.0", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "5.3.7", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.7.tgz", + "integrity": "sha512-AfKwIktyP7Cu50xNjXF/6Qb5lBNzYaWpU6YfoX3uZicTx0zTy0stDDCsvjDapKsSDvOeWo5MEq4TmdBy2cNoHw==", + "dev": true, + "peer": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.17", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.1", + "terser": "^5.16.5" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/terser-webpack-plugin/node_modules/serialize-javascript": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", + "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", + "dev": true, + "peer": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/terser/node_modules/acorn": { + "version": "8.8.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", + "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", + "dev": true, + "peer": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true, + "peer": true + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, "node_modules/thirty-two": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/thirty-two/-/thirty-two-0.0.2.tgz", @@ -13680,6 +16523,30 @@ "integrity": "sha512-e4g0EJtAjk64xgnFPD6kTBUtpnMVzDrMb12N1YZV0VvSlhnVT3SGxiYTLdGy8Q5cYHOIC/FAHmZ10eGrAguicQ==", "dev": true }, + "node_modules/tsconfig-paths": { + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", + "integrity": "sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==", + "dev": true, + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "node_modules/tsconfig-paths/node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, "node_modules/tslib": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", @@ -13687,6 +16554,27 @@ "dev": true, "peer": true }, + "node_modules/tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, + "dependencies": { + "tslib": "^1.8.1" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + } + }, + "node_modules/tsutils/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, "node_modules/tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", @@ -13705,6 +16593,18 @@ "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", "dev": true }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/type-detect": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", @@ -13739,6 +16639,20 @@ "node": ">= 0.6" } }, + "node_modules/typed-array-length": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", + "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "is-typed-array": "^1.1.9" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/typescript": { "version": "4.9.4", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.4.tgz", @@ -13787,6 +16701,21 @@ "node": ">=0.10.0" } }, + "node_modules/unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/unicode-canonical-property-names-ecmascript": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", @@ -13812,9 +16741,9 @@ } }, "node_modules/unicode-match-property-value-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz", - "integrity": "sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", + "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", "dev": true, "peer": true, "engines": { @@ -13822,9 +16751,9 @@ } }, "node_modules/unicode-property-aliases-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz", - "integrity": "sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", + "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", "dev": true, "peer": true, "engines": { @@ -13936,9 +16865,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.4.tgz", - "integrity": "sha512-jnmO2BEGUjsMOe/Fg9u0oczOe/ppIDZPebzccl1yDWGLFP16Pa1/RM5wEoKYPG2zstNcDuAStejyxsOuKINdGA==", + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", + "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", "dev": true, "funding": [ { @@ -13962,6 +16891,15 @@ "browserslist": ">= 4.21.0" } }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, "node_modules/urix": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", @@ -14045,6 +16983,12 @@ "uuid": "dist/bin/uuid" } }, + "node_modules/v8-compile-cache": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", + "dev": true + }, "node_modules/validator": { "version": "13.7.0", "resolved": "https://registry.npmjs.org/validator/-/validator-13.7.0.tgz", @@ -14094,6 +17038,20 @@ "makeerror": "1.0.12" } }, + "node_modules/watchpack": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", + "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "dev": true, + "peer": true, + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, "node_modules/wcwidth": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", @@ -14111,6 +17069,128 @@ "dev": true, "peer": true }, + "node_modules/webpack": { + "version": "5.76.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.76.1.tgz", + "integrity": "sha512-4+YIK4Abzv8172/SGqObnUjaIHjLEuUasz9EwQj/9xmPPkYJy2Mh03Q/lJfSD3YLzbxy5FeTq5Uw0323Oh6SJQ==", + "dev": true, + "peer": true, + "dependencies": { + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^0.0.51", + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/wasm-edit": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "acorn": "^8.7.1", + "acorn-import-assertions": "^1.7.6", + "browserslist": "^4.14.5", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.10.0", + "es-module-lexer": "^0.9.0", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.9", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.1.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.1.3", + "watchpack": "^2.4.0", + "webpack-sources": "^3.2.3" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-sources": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "dev": true, + "peer": true, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack/node_modules/@types/estree": { + "version": "0.0.51", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", + "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==", + "dev": true, + "peer": true + }, + "node_modules/webpack/node_modules/acorn": { + "version": "8.8.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", + "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", + "dev": true, + "peer": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/webpack/node_modules/acorn-import-assertions": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", + "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", + "dev": true, + "peer": true, + "peerDependencies": { + "acorn": "^8" + } + }, + "node_modules/webpack/node_modules/enhanced-resolve": { + "version": "5.12.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz", + "integrity": "sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ==", + "dev": true, + "peer": true, + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack/node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, + "peer": true, + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/webpack/node_modules/tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "dev": true, + "peer": true, + "engines": { + "node": ">=6" + } + }, "node_modules/whatwg-fetch": { "version": "3.6.2", "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.2.tgz", @@ -14144,6 +17224,37 @@ "node": ">= 8" } }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-collection": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", + "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", + "dev": true, + "dependencies": { + "is-map": "^2.0.1", + "is-set": "^2.0.1", + "is-weakmap": "^2.0.1", + "is-weakset": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/which-module": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", @@ -14170,6 +17281,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/workerpool": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", @@ -14411,45 +17531,74 @@ } }, "@babel/compat-data": { - "version": "7.18.8", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.18.8.tgz", - "integrity": "sha512-HSmX4WZPPK3FUxYp7g2T6EyO8j96HlZJlxmKPSh6KAcqwyDrfx7hKjXpAW/0FhFfTJsR0Yt4lAjLI2coMptIHQ==", + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.21.0.tgz", + "integrity": "sha512-gMuZsmsgxk/ENC3O/fRw5QY8A9/uxQbbCEypnLIiYYc/qVJtEV7ouxC3EllIIwNzMqAQee5tanFabWsUOutS7g==", "dev": true, "peer": true }, "@babel/core": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.6.tgz", - "integrity": "sha512-cQbWBpxcbbs/IUredIPkHiAGULLV8iwgNRMFzvbhEXISp4f3rUUXE5+TIw6KwUWUR3DwyI6gmBRnmAtYaWehwQ==", + "version": "7.21.3", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.21.3.tgz", + "integrity": "sha512-qIJONzoa/qiHghnm0l1n4i/6IIziDpzqc36FBs4pzMhDUraHqponwJLiAKm1hGLP3OSB/TVNz6rMwVGpwxxySw==", "dev": true, "peer": true, "requires": { - "@ampproject/remapping": "^2.1.0", + "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.18.6", - "@babel/helper-compilation-targets": "^7.18.6", - "@babel/helper-module-transforms": "^7.18.6", - "@babel/helpers": "^7.18.6", - "@babel/parser": "^7.18.6", - "@babel/template": "^7.18.6", - "@babel/traverse": "^7.18.6", - "@babel/types": "^7.18.6", + "@babel/generator": "^7.21.3", + "@babel/helper-compilation-targets": "^7.20.7", + "@babel/helper-module-transforms": "^7.21.2", + "@babel/helpers": "^7.21.0", + "@babel/parser": "^7.21.3", + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.21.3", + "@babel/types": "^7.21.3", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", - "json5": "^2.2.1", + "json5": "^2.2.2", "semver": "^6.3.0" } }, + "@babel/eslint-parser": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.19.1.tgz", + "integrity": "sha512-AqNf2QWt1rtu2/1rLswy6CDP7H9Oh3mMhk177Y67Rg8d7RD9WfOLLv8CGn6tisFvS2htm86yIe1yLF6I1UDaGQ==", + "dev": true, + "requires": { + "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1", + "eslint-visitor-keys": "^2.1.0", + "semver": "^6.3.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true + } + } + }, + "@babel/eslint-plugin": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/eslint-plugin/-/eslint-plugin-7.19.1.tgz", + "integrity": "sha512-ElGPkQPapKMa3zVqXHkZYzuL7I5LbRw9UWBUArgWsdWDDb9XcACqOpBib5tRPA9XvbVZYrFUkoQPbiJ4BFvu4w==", + "dev": true, + "requires": { + "eslint-rule-composer": "^0.3.0" + } + }, "@babel/generator": { - "version": "7.18.7", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.7.tgz", - "integrity": "sha512-shck+7VLlY72a2w9c3zYWuE1pwOKEiQHV7GTUbSnhyl5eu3i04t30tBY82ZRWrDfo3gkakCFtevExnxbkf2a3A==", + "version": "7.21.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.3.tgz", + "integrity": "sha512-QS3iR1GYC/YGUnW7IdggFeN5c1poPUurnGttOV/bZgPGV+izC/D8HnD6DLwod0fsatNyVn1G3EVWMYIF0nHbeA==", "dev": true, "peer": true, "requires": { - "@babel/types": "^7.18.7", + "@babel/types": "^7.21.3", "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" }, "dependencies": { @@ -14489,16 +17638,36 @@ } }, "@babel/helper-compilation-targets": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.6.tgz", - "integrity": "sha512-vFjbfhNCzqdeAtZflUFrG5YIFqGTqsctrtkZ1D/NB0mDW9TwW3GmmUepYY4G9wCET5rY5ugz4OGTcLd614IzQg==", + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz", + "integrity": "sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==", "dev": true, "peer": true, "requires": { - "@babel/compat-data": "^7.18.6", + "@babel/compat-data": "^7.20.5", "@babel/helper-validator-option": "^7.18.6", - "browserslist": "^4.20.2", + "browserslist": "^4.21.3", + "lru-cache": "^5.1.1", "semver": "^6.3.0" + }, + "dependencies": { + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "peer": true, + "requires": { + "yallist": "^3.0.2" + } + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "peer": true + } } }, "@babel/helper-create-class-features-plugin": { @@ -14518,27 +17687,25 @@ } }, "@babel/helper-create-regexp-features-plugin": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.18.6.tgz", - "integrity": "sha512-7LcpH1wnQLGrI+4v+nPp+zUvIkF9x0ddv1Hkdue10tg3gmRnLy97DXh4STiOf1qeIInyD69Qv5kKSZzKD8B/7A==", + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.21.0.tgz", + "integrity": "sha512-N+LaFW/auRSWdx7SHD/HiARwXQju1vXTW4fKr4u5SgBUTm51OKEjKgj+cs00ggW3kEvNqwErnlwuq7Y3xBe4eg==", "dev": true, "peer": true, "requires": { "@babel/helper-annotate-as-pure": "^7.18.6", - "regexpu-core": "^5.1.0" + "regexpu-core": "^5.3.1" } }, "@babel/helper-define-polyfill-provider": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.1.tgz", - "integrity": "sha512-J9hGMpJQmtWmj46B3kBHmL38UhJGhYX7eqkcq+2gsstyYt341HmPeWspihX43yVRA0mS+8GGk2Gckc7bY/HCmA==", + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz", + "integrity": "sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==", "dev": true, "peer": true, "requires": { - "@babel/helper-compilation-targets": "^7.13.0", - "@babel/helper-module-imports": "^7.12.13", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/traverse": "^7.13.0", + "@babel/helper-compilation-targets": "^7.17.7", + "@babel/helper-plugin-utils": "^7.16.7", "debug": "^4.1.1", "lodash.debounce": "^4.0.8", "resolve": "^1.14.2", @@ -14546,9 +17713,9 @@ } }, "@babel/helper-environment-visitor": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.6.tgz", - "integrity": "sha512-8n6gSfn2baOY+qlp+VSzsosjCVGFqWKmDF0cCWOybh52Dw3SEyoWR1KrhMJASjLwIEkkAufZ0xvr+SxLHSpy2Q==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", + "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", "dev": true, "peer": true }, @@ -14563,14 +17730,14 @@ } }, "@babel/helper-function-name": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.18.6.tgz", - "integrity": "sha512-0mWMxV1aC97dhjCah5U5Ua7668r5ZmSC2DLfH2EZnf9c3/dHZKiFa5pRLMH5tjSl471tY6496ZWk/kjNONBxhw==", + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz", + "integrity": "sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==", "dev": true, "peer": true, "requires": { - "@babel/template": "^7.18.6", - "@babel/types": "^7.18.6" + "@babel/template": "^7.20.7", + "@babel/types": "^7.21.0" } }, "@babel/helper-hoist-variables": { @@ -14584,13 +17751,13 @@ } }, "@babel/helper-member-expression-to-functions": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.18.6.tgz", - "integrity": "sha512-CeHxqwwipekotzPDUuJOfIMtcIHBuc7WAzLmTYWctVigqS5RktNMQ5bEwQSuGewzYnCtTWa3BARXeiLxDTv+Ng==", + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.21.0.tgz", + "integrity": "sha512-Muu8cdZwNN6mRRNG6lAYErJ5X3bRevgYR2O8wN0yn7jJSnGDu6eG59RfT29JHxGUovyfrh6Pj0XzmR7drNVL3Q==", "dev": true, "peer": true, "requires": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.21.0" } }, "@babel/helper-module-imports": { @@ -14604,20 +17771,20 @@ } }, "@babel/helper-module-transforms": { - "version": "7.18.8", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.8.tgz", - "integrity": "sha512-che3jvZwIcZxrwh63VfnFTUzcAM9v/lznYkkRxIBGMPt1SudOKHAEec0SIRCfiuIzTcF7VGj/CaTT6gY4eWxvA==", + "version": "7.21.2", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.21.2.tgz", + "integrity": "sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ==", "dev": true, "peer": true, "requires": { - "@babel/helper-environment-visitor": "^7.18.6", + "@babel/helper-environment-visitor": "^7.18.9", "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-simple-access": "^7.18.6", + "@babel/helper-simple-access": "^7.20.2", "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.18.6", - "@babel/template": "^7.18.6", - "@babel/traverse": "^7.18.8", - "@babel/types": "^7.18.8" + "@babel/helper-validator-identifier": "^7.19.1", + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.21.2", + "@babel/types": "^7.21.2" } }, "@babel/helper-optimise-call-expression": { @@ -14631,57 +17798,58 @@ } }, "@babel/helper-plugin-utils": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.18.6.tgz", - "integrity": "sha512-gvZnm1YAAxh13eJdkb9EWHBnF3eAub3XTLCZEehHT2kWxiKVRL64+ae5Y6Ivne0mVHmMYKT+xWgZO+gQhuLUBg==", + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz", + "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==", "dev": true, "peer": true }, "@babel/helper-remap-async-to-generator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.6.tgz", - "integrity": "sha512-z5wbmV55TveUPZlCLZvxWHtrjuJd+8inFhk7DG0WW87/oJuGDcjDiu7HIvGcpf5464L6xKCg3vNkmlVVz9hwyQ==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz", + "integrity": "sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==", "dev": true, "peer": true, "requires": { "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.6", - "@babel/helper-wrap-function": "^7.18.6", - "@babel/types": "^7.18.6" + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-wrap-function": "^7.18.9", + "@babel/types": "^7.18.9" } }, "@babel/helper-replace-supers": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.18.6.tgz", - "integrity": "sha512-fTf7zoXnUGl9gF25fXCWE26t7Tvtyn6H4hkLSYhATwJvw2uYxd3aoXplMSe0g9XbwK7bmxNes7+FGO0rB/xC0g==", + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.20.7.tgz", + "integrity": "sha512-vujDMtB6LVfNW13jhlCrp48QNslK6JXi7lQG736HVbHz/mbf4Dc7tIRh1Xf5C0rF7BP8iiSxGMCmY6Ci1ven3A==", "dev": true, "peer": true, "requires": { - "@babel/helper-environment-visitor": "^7.18.6", - "@babel/helper-member-expression-to-functions": "^7.18.6", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-member-expression-to-functions": "^7.20.7", "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/traverse": "^7.18.6", - "@babel/types": "^7.18.6" + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.20.7", + "@babel/types": "^7.20.7" } }, "@babel/helper-simple-access": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.18.6.tgz", - "integrity": "sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g==", + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", + "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", "dev": true, "peer": true, "requires": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.20.2" } }, "@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.18.6.tgz", - "integrity": "sha512-4KoLhwGS9vGethZpAhYnMejWkX64wsnHPDwvOsKWU6Fg4+AlK2Jz3TyjQLMEPvz+1zemi/WBdkYxCD0bAfIkiw==", + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz", + "integrity": "sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg==", "dev": true, "peer": true, "requires": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.20.0" } }, "@babel/helper-split-export-declaration": { @@ -14694,10 +17862,17 @@ "@babel/types": "^7.18.6" } }, + "@babel/helper-string-parser": { + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", + "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", + "dev": true, + "peer": true + }, "@babel/helper-validator-identifier": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz", - "integrity": "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==", + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", "dev": true }, "@babel/helper-validator-option": { @@ -14708,28 +17883,28 @@ "peer": true }, "@babel/helper-wrap-function": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.18.6.tgz", - "integrity": "sha512-I5/LZfozwMNbwr/b1vhhuYD+J/mU+gfGAj5td7l5Rv9WYmH6i3Om69WGKNmlIpsVW/mF6O5bvTKbvDQZVgjqOw==", + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.20.5.tgz", + "integrity": "sha512-bYMxIWK5mh+TgXGVqAtnu5Yn1un+v8DDZtqyzKRLUzrh70Eal2O3aZ7aPYiMADO4uKlkzOiRiZ6GX5q3qxvW9Q==", "dev": true, "peer": true, "requires": { - "@babel/helper-function-name": "^7.18.6", - "@babel/template": "^7.18.6", - "@babel/traverse": "^7.18.6", - "@babel/types": "^7.18.6" + "@babel/helper-function-name": "^7.19.0", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.20.5", + "@babel/types": "^7.20.5" } }, "@babel/helpers": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.18.6.tgz", - "integrity": "sha512-vzSiiqbQOghPngUYt/zWGvK3LAsPhz55vc9XNN0xAl2gV4ieShI2OQli5duxWHD+72PZPTKAcfcZDE1Cwc5zsQ==", + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.21.0.tgz", + "integrity": "sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA==", "dev": true, "peer": true, "requires": { - "@babel/template": "^7.18.6", - "@babel/traverse": "^7.18.6", - "@babel/types": "^7.18.6" + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.21.0", + "@babel/types": "^7.21.0" } }, "@babel/highlight": { @@ -14796,9 +17971,9 @@ } }, "@babel/parser": { - "version": "7.18.8", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.8.tgz", - "integrity": "sha512-RSKRfYX20dyH+elbJK2uqAkVyucL+xXzhqlMD5/ZXx+dAAwpyB7HsvnHe/ZUGOF+xLr5Wx9/JoXVTj6BQE2/oA==", + "version": "7.21.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.3.tgz", + "integrity": "sha512-lobG0d7aOfQRXh8AyklEAgZGvA4FShxo6xQbUrrT/cNBPUdIDojlokwJsQyCC/eKia7ifqM0yP+2DRZ4WKw2RQ==", "dev": true, "peer": true }, @@ -14813,27 +17988,27 @@ } }, "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.18.6.tgz", - "integrity": "sha512-Udgu8ZRgrBrttVz6A0EVL0SJ1z+RLbIeqsu632SA1hf0awEppD6TvdznoH+orIF8wtFFAV/Enmw9Y+9oV8TQcw==", + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.20.7.tgz", + "integrity": "sha512-sbr9+wNE5aXMBBFBICk01tt7sBf2Oc9ikRFEcem/ZORup9IMUdNhW7/wVLEbbtlWOsEubJet46mHAL2C8+2jKQ==", "dev": true, "peer": true, "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-skip-transparent-expression-wrappers": "^7.18.6", - "@babel/plugin-proposal-optional-chaining": "^7.18.6" + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", + "@babel/plugin-proposal-optional-chaining": "^7.20.7" } }, "@babel/plugin-proposal-async-generator-functions": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.18.6.tgz", - "integrity": "sha512-WAz4R9bvozx4qwf74M+sfqPMKfSqwM0phxPTR6iJIi8robgzXwkEgmeJG1gEKhm6sDqT/U9aV3lfcqybIpev8w==", + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz", + "integrity": "sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==", "dev": true, "peer": true, "requires": { - "@babel/helper-environment-visitor": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-remap-async-to-generator": "^7.18.6", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-remap-async-to-generator": "^7.18.9", "@babel/plugin-syntax-async-generators": "^7.8.4" } }, @@ -14883,13 +18058,13 @@ } }, "@babel/plugin-proposal-export-namespace-from": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.6.tgz", - "integrity": "sha512-zr/QcUlUo7GPo6+X1wC98NJADqmy5QTFWWhqeQWiki4XHafJtLl/YMGkmRB2szDD2IYJCCdBTd4ElwhId9T7Xw==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz", + "integrity": "sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==", "dev": true, "peer": true, "requires": { - "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.9", "@babel/plugin-syntax-export-namespace-from": "^7.8.3" } }, @@ -14905,13 +18080,13 @@ } }, "@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.18.6.tgz", - "integrity": "sha512-zMo66azZth/0tVd7gmkxOkOjs2rpHyhpcFo565PUP37hSp6hSd9uUKIfTDFMz58BwqgQKhJ9YxtM5XddjXVn+Q==", + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.20.7.tgz", + "integrity": "sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug==", "dev": true, "peer": true, "requires": { - "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-plugin-utils": "^7.20.2", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" } }, @@ -14938,17 +18113,17 @@ } }, "@babel/plugin-proposal-object-rest-spread": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.18.6.tgz", - "integrity": "sha512-9yuM6wr4rIsKa1wlUAbZEazkCrgw2sMPEXCr4Rnwetu7cEW1NydkCWytLuYletbf8vFxdJxFhwEZqMpOx2eZyw==", + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz", + "integrity": "sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==", "dev": true, "peer": true, "requires": { - "@babel/compat-data": "^7.18.6", - "@babel/helper-compilation-targets": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", + "@babel/compat-data": "^7.20.5", + "@babel/helper-compilation-targets": "^7.20.7", + "@babel/helper-plugin-utils": "^7.20.2", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.18.6" + "@babel/plugin-transform-parameters": "^7.20.7" } }, "@babel/plugin-proposal-optional-catch-binding": { @@ -14963,14 +18138,14 @@ } }, "@babel/plugin-proposal-optional-chaining": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.18.6.tgz", - "integrity": "sha512-PatI6elL5eMzoypFAiYDpYQyMtXTn+iMhuxxQt5mAXD4fEmKorpSI3PHd+i3JXBJN3xyA6MvJv7at23HffFHwA==", + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz", + "integrity": "sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==", "dev": true, "peer": true, "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-skip-transparent-expression-wrappers": "^7.18.6", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", "@babel/plugin-syntax-optional-chaining": "^7.8.3" } }, @@ -15080,13 +18255,13 @@ } }, "@babel/plugin-syntax-import-assertions": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.18.6.tgz", - "integrity": "sha512-/DU3RXad9+bZwrgWJQKbr39gYbJpLJHezqEzRzi/BHRlJ9zsQb4CK2CA/5apllXNomwA1qHwzvHl+AdEmC5krQ==", + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.20.0.tgz", + "integrity": "sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ==", "dev": true, "peer": true, "requires": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.19.0" } }, "@babel/plugin-syntax-json-strings": { @@ -15232,50 +18407,52 @@ } }, "@babel/plugin-transform-block-scoping": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.18.6.tgz", - "integrity": "sha512-pRqwb91C42vs1ahSAWJkxOxU1RHWDn16XAa6ggQ72wjLlWyYeAcLvTtE0aM8ph3KNydy9CQF2nLYcjq1WysgxQ==", + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.21.0.tgz", + "integrity": "sha512-Mdrbunoh9SxwFZapeHVrwFmri16+oYotcZysSzhNIVDwIAb1UV+kvnxULSYq9J3/q5MDG+4X6w8QVgD1zhBXNQ==", "dev": true, "peer": true, "requires": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.20.2" } }, "@babel/plugin-transform-classes": { - "version": "7.18.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.18.8.tgz", - "integrity": "sha512-RySDoXdF6hgHSHuAW4aLGyVQdmvEX/iJtjVre52k0pxRq4hzqze+rAVP++NmNv596brBpYmaiKgTZby7ziBnVg==", + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.21.0.tgz", + "integrity": "sha512-RZhbYTCEUAe6ntPehC4hlslPWosNHDox+vAs4On/mCLRLfoDVHf6hVEd7kuxr1RnHwJmxFfUM3cZiZRmPxJPXQ==", "dev": true, "peer": true, "requires": { "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.6", - "@babel/helper-function-name": "^7.18.6", + "@babel/helper-compilation-targets": "^7.20.7", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.21.0", "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-replace-supers": "^7.18.6", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-replace-supers": "^7.20.7", "@babel/helper-split-export-declaration": "^7.18.6", "globals": "^11.1.0" } }, "@babel/plugin-transform-computed-properties": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.18.6.tgz", - "integrity": "sha512-9repI4BhNrR0KenoR9vm3/cIc1tSBIo+u1WVjKCAynahj25O8zfbiE6JtAtHPGQSs4yZ+bA8mRasRP+qc+2R5A==", + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.20.7.tgz", + "integrity": "sha512-Lz7MvBK6DTjElHAmfu6bfANzKcxpyNPeYBGEafyA6E5HtRpjpZwU+u7Qrgz/2OR0z+5TvKYbPdphfSaAcZBrYQ==", "dev": true, "peer": true, "requires": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/template": "^7.20.7" } }, "@babel/plugin-transform-destructuring": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.18.6.tgz", - "integrity": "sha512-tgy3u6lRp17ilY8r1kP4i2+HDUwxlVqq3RTc943eAWSzGgpU1qhiKpqZ5CMyHReIYPHdo3Kg8v8edKtDqSVEyQ==", + "version": "7.21.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.21.3.tgz", + "integrity": "sha512-bp6hwMFzuiE4HqYEyoGJ/V2LeIWn+hLVKc4pnj++E5XQptwhtcGmSayM029d/j2X1bPKGTlsyPwAubuU22KhMA==", "dev": true, "peer": true, "requires": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.20.2" } }, "@babel/plugin-transform-dotall-regex": { @@ -15290,13 +18467,13 @@ } }, "@babel/plugin-transform-duplicate-keys": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.6.tgz", - "integrity": "sha512-NJU26U/208+sxYszf82nmGYqVF9QN8py2HFTblPT9hbawi8+1C5a9JubODLTGFuT0qlkqVinmkwOD13s0sZktg==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz", + "integrity": "sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==", "dev": true, "peer": true, "requires": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.18.9" } }, "@babel/plugin-transform-exponentiation-operator": { @@ -15332,25 +18509,25 @@ } }, "@babel/plugin-transform-function-name": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.6.tgz", - "integrity": "sha512-kJha/Gbs5RjzIu0CxZwf5e3aTTSlhZnHMT8zPWnJMjNpLOUgqevg+PN5oMH68nMCXnfiMo4Bhgxqj59KHTlAnA==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz", + "integrity": "sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==", "dev": true, "peer": true, "requires": { - "@babel/helper-compilation-targets": "^7.18.6", - "@babel/helper-function-name": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-compilation-targets": "^7.18.9", + "@babel/helper-function-name": "^7.18.9", + "@babel/helper-plugin-utils": "^7.18.9" } }, "@babel/plugin-transform-literals": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.6.tgz", - "integrity": "sha512-x3HEw0cJZVDoENXOp20HlypIHfl0zMIhMVZEBVTfmqbObIpsMxMbmU5nOEO8R7LYT+z5RORKPlTI5Hj4OsO9/Q==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz", + "integrity": "sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==", "dev": true, "peer": true, "requires": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.18.9" } }, "@babel/plugin-transform-member-expression-literals": { @@ -15364,42 +18541,39 @@ } }, "@babel/plugin-transform-modules-amd": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.18.6.tgz", - "integrity": "sha512-Pra5aXsmTsOnjM3IajS8rTaLCy++nGM4v3YR4esk5PCsyg9z8NA5oQLwxzMUtDBd8F+UmVza3VxoAaWCbzH1rg==", + "version": "7.20.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.20.11.tgz", + "integrity": "sha512-NuzCt5IIYOW0O30UvqktzHYR2ud5bOWbY0yaxWZ6G+aFzOMJvrs5YHNikrbdaT15+KNO31nPOy5Fim3ku6Zb5g==", "dev": true, "peer": true, "requires": { - "@babel/helper-module-transforms": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "babel-plugin-dynamic-import-node": "^2.3.3" + "@babel/helper-module-transforms": "^7.20.11", + "@babel/helper-plugin-utils": "^7.20.2" } }, "@babel/plugin-transform-modules-commonjs": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.18.6.tgz", - "integrity": "sha512-Qfv2ZOWikpvmedXQJDSbxNqy7Xr/j2Y8/KfijM0iJyKkBTmWuvCA1yeH1yDM7NJhBW/2aXxeucLj6i80/LAJ/Q==", + "version": "7.21.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.21.2.tgz", + "integrity": "sha512-Cln+Yy04Gxua7iPdj6nOV96smLGjpElir5YwzF0LBPKoPlLDNJePNlrGGaybAJkd0zKRnOVXOgizSqPYMNYkzA==", "dev": true, "peer": true, "requires": { - "@babel/helper-module-transforms": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-simple-access": "^7.18.6", - "babel-plugin-dynamic-import-node": "^2.3.3" + "@babel/helper-module-transforms": "^7.21.2", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-simple-access": "^7.20.2" } }, "@babel/plugin-transform-modules-systemjs": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.18.6.tgz", - "integrity": "sha512-UbPYpXxLjTw6w6yXX2BYNxF3p6QY225wcTkfQCy3OMnSlS/C3xGtwUjEzGkldb/sy6PWLiCQ3NbYfjWUTI3t4g==", + "version": "7.20.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.20.11.tgz", + "integrity": "sha512-vVu5g9BPQKSFEmvt2TA4Da5N+QVS66EX21d8uoOihC+OCpUoGvzVsXeqFdtAEfVa5BILAeFt+U7yVmLbQnAJmw==", "dev": true, "peer": true, "requires": { "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-module-transforms": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-validator-identifier": "^7.18.6", - "babel-plugin-dynamic-import-node": "^2.3.3" + "@babel/helper-module-transforms": "^7.20.11", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-validator-identifier": "^7.19.1" } }, "@babel/plugin-transform-modules-umd": { @@ -15414,14 +18588,14 @@ } }, "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.18.6.tgz", - "integrity": "sha512-UmEOGF8XgaIqD74bC8g7iV3RYj8lMf0Bw7NJzvnS9qQhM4mg+1WHKotUIdjxgD2RGrgFLZZPCFPFj3P/kVDYhg==", + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.20.5.tgz", + "integrity": "sha512-mOW4tTzi5iTLnw+78iEq3gr8Aoq4WNRGpmSlrogqaiCBoR1HFhpU4JkpQFOHfeYx3ReVIFWOQJS4aZBRvuZ6mA==", "dev": true, "peer": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-create-regexp-features-plugin": "^7.20.5", + "@babel/helper-plugin-utils": "^7.20.2" } }, "@babel/plugin-transform-new-target": { @@ -15446,13 +18620,13 @@ } }, "@babel/plugin-transform-parameters": { - "version": "7.18.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.18.8.tgz", - "integrity": "sha512-ivfbE3X2Ss+Fj8nnXvKJS6sjRG4gzwPMsP+taZC+ZzEGjAYlvENixmt1sZ5Ca6tWls+BlKSGKPJ6OOXvXCbkFg==", + "version": "7.21.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.21.3.tgz", + "integrity": "sha512-Wxc+TvppQG9xWFYatvCGPvZ6+SIUxQ2ZdiBP+PHYMIjnPXD+uThCshaz4NZOnODAtBjjcVQQ/3OKs9LW28purQ==", "dev": true, "peer": true, "requires": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.20.2" } }, "@babel/plugin-transform-property-literals": { @@ -15556,14 +18730,14 @@ } }, "@babel/plugin-transform-spread": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.18.6.tgz", - "integrity": "sha512-ayT53rT/ENF8WWexIRg9AiV9h0aIteyWn5ptfZTZQrjk/+f3WdrJGCY4c9wcgl2+MKkKPhzbYp97FTsquZpDCw==", + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.20.7.tgz", + "integrity": "sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw==", "dev": true, "peer": true, "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-skip-transparent-expression-wrappers": "^7.18.6" + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0" } }, "@babel/plugin-transform-sticky-regex": { @@ -15577,23 +18751,23 @@ } }, "@babel/plugin-transform-template-literals": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.6.tgz", - "integrity": "sha512-UuqlRrQmT2SWRvahW46cGSany0uTlcj8NYOS5sRGYi8FxPYPoLd5DDmMd32ZXEj2Jq+06uGVQKHxa/hJx2EzKw==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz", + "integrity": "sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==", "dev": true, "peer": true, "requires": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.18.9" } }, "@babel/plugin-transform-typeof-symbol": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.6.tgz", - "integrity": "sha512-7m71iS/QhsPk85xSjFPovHPcH3H9qeyzsujhTc+vcdnsXavoWYJ74zx0lP5RhpC5+iDnVLO+PPMHzC11qels1g==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz", + "integrity": "sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==", "dev": true, "peer": true, "requires": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.18.9" } }, "@babel/plugin-transform-typescript": { @@ -15609,13 +18783,13 @@ } }, "@babel/plugin-transform-unicode-escapes": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.6.tgz", - "integrity": "sha512-XNRwQUXYMP7VLuy54cr/KS/WeL3AZeORhrmeZ7iewgu+X2eBqmpaLI/hzqr9ZxCeUoq0ASK4GUzSM0BDhZkLFw==", + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.10.tgz", + "integrity": "sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ==", "dev": true, "peer": true, "requires": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.18.9" } }, "@babel/plugin-transform-unicode-regex": { @@ -15630,30 +18804,30 @@ } }, "@babel/preset-env": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.18.6.tgz", - "integrity": "sha512-WrthhuIIYKrEFAwttYzgRNQ5hULGmwTj+D6l7Zdfsv5M7IWV/OZbUfbeL++Qrzx1nVJwWROIFhCHRYQV4xbPNw==", + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.20.2.tgz", + "integrity": "sha512-1G0efQEWR1EHkKvKHqbG+IN/QdgwfByUpM5V5QroDzGV2t3S/WXNQd693cHiHTlCFMpr9B6FkPFXDA2lQcKoDg==", "dev": true, "peer": true, "requires": { - "@babel/compat-data": "^7.18.6", - "@babel/helper-compilation-targets": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", + "@babel/compat-data": "^7.20.1", + "@babel/helper-compilation-targets": "^7.20.0", + "@babel/helper-plugin-utils": "^7.20.2", "@babel/helper-validator-option": "^7.18.6", "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.18.6", - "@babel/plugin-proposal-async-generator-functions": "^7.18.6", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.18.9", + "@babel/plugin-proposal-async-generator-functions": "^7.20.1", "@babel/plugin-proposal-class-properties": "^7.18.6", "@babel/plugin-proposal-class-static-block": "^7.18.6", "@babel/plugin-proposal-dynamic-import": "^7.18.6", - "@babel/plugin-proposal-export-namespace-from": "^7.18.6", + "@babel/plugin-proposal-export-namespace-from": "^7.18.9", "@babel/plugin-proposal-json-strings": "^7.18.6", - "@babel/plugin-proposal-logical-assignment-operators": "^7.18.6", + "@babel/plugin-proposal-logical-assignment-operators": "^7.18.9", "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6", "@babel/plugin-proposal-numeric-separator": "^7.18.6", - "@babel/plugin-proposal-object-rest-spread": "^7.18.6", + "@babel/plugin-proposal-object-rest-spread": "^7.20.2", "@babel/plugin-proposal-optional-catch-binding": "^7.18.6", - "@babel/plugin-proposal-optional-chaining": "^7.18.6", + "@babel/plugin-proposal-optional-chaining": "^7.18.9", "@babel/plugin-proposal-private-methods": "^7.18.6", "@babel/plugin-proposal-private-property-in-object": "^7.18.6", "@babel/plugin-proposal-unicode-property-regex": "^7.18.6", @@ -15662,7 +18836,7 @@ "@babel/plugin-syntax-class-static-block": "^7.14.5", "@babel/plugin-syntax-dynamic-import": "^7.8.3", "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.18.6", + "@babel/plugin-syntax-import-assertions": "^7.20.0", "@babel/plugin-syntax-json-strings": "^7.8.3", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", @@ -15675,42 +18849,65 @@ "@babel/plugin-transform-arrow-functions": "^7.18.6", "@babel/plugin-transform-async-to-generator": "^7.18.6", "@babel/plugin-transform-block-scoped-functions": "^7.18.6", - "@babel/plugin-transform-block-scoping": "^7.18.6", - "@babel/plugin-transform-classes": "^7.18.6", - "@babel/plugin-transform-computed-properties": "^7.18.6", - "@babel/plugin-transform-destructuring": "^7.18.6", + "@babel/plugin-transform-block-scoping": "^7.20.2", + "@babel/plugin-transform-classes": "^7.20.2", + "@babel/plugin-transform-computed-properties": "^7.18.9", + "@babel/plugin-transform-destructuring": "^7.20.2", "@babel/plugin-transform-dotall-regex": "^7.18.6", - "@babel/plugin-transform-duplicate-keys": "^7.18.6", + "@babel/plugin-transform-duplicate-keys": "^7.18.9", "@babel/plugin-transform-exponentiation-operator": "^7.18.6", - "@babel/plugin-transform-for-of": "^7.18.6", - "@babel/plugin-transform-function-name": "^7.18.6", - "@babel/plugin-transform-literals": "^7.18.6", + "@babel/plugin-transform-for-of": "^7.18.8", + "@babel/plugin-transform-function-name": "^7.18.9", + "@babel/plugin-transform-literals": "^7.18.9", "@babel/plugin-transform-member-expression-literals": "^7.18.6", - "@babel/plugin-transform-modules-amd": "^7.18.6", - "@babel/plugin-transform-modules-commonjs": "^7.18.6", - "@babel/plugin-transform-modules-systemjs": "^7.18.6", + "@babel/plugin-transform-modules-amd": "^7.19.6", + "@babel/plugin-transform-modules-commonjs": "^7.19.6", + "@babel/plugin-transform-modules-systemjs": "^7.19.6", "@babel/plugin-transform-modules-umd": "^7.18.6", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.18.6", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.19.1", "@babel/plugin-transform-new-target": "^7.18.6", "@babel/plugin-transform-object-super": "^7.18.6", - "@babel/plugin-transform-parameters": "^7.18.6", + "@babel/plugin-transform-parameters": "^7.20.1", "@babel/plugin-transform-property-literals": "^7.18.6", "@babel/plugin-transform-regenerator": "^7.18.6", "@babel/plugin-transform-reserved-words": "^7.18.6", "@babel/plugin-transform-shorthand-properties": "^7.18.6", - "@babel/plugin-transform-spread": "^7.18.6", + "@babel/plugin-transform-spread": "^7.19.0", "@babel/plugin-transform-sticky-regex": "^7.18.6", - "@babel/plugin-transform-template-literals": "^7.18.6", - "@babel/plugin-transform-typeof-symbol": "^7.18.6", - "@babel/plugin-transform-unicode-escapes": "^7.18.6", + "@babel/plugin-transform-template-literals": "^7.18.9", + "@babel/plugin-transform-typeof-symbol": "^7.18.9", + "@babel/plugin-transform-unicode-escapes": "^7.18.10", "@babel/plugin-transform-unicode-regex": "^7.18.6", "@babel/preset-modules": "^0.1.5", - "@babel/types": "^7.18.6", - "babel-plugin-polyfill-corejs2": "^0.3.1", - "babel-plugin-polyfill-corejs3": "^0.5.2", - "babel-plugin-polyfill-regenerator": "^0.3.1", - "core-js-compat": "^3.22.1", + "@babel/types": "^7.20.2", + "babel-plugin-polyfill-corejs2": "^0.3.3", + "babel-plugin-polyfill-corejs3": "^0.6.0", + "babel-plugin-polyfill-regenerator": "^0.4.1", + "core-js-compat": "^3.25.1", "semver": "^6.3.0" + }, + "dependencies": { + "babel-plugin-polyfill-corejs3": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.6.0.tgz", + "integrity": "sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA==", + "dev": true, + "peer": true, + "requires": { + "@babel/helper-define-polyfill-provider": "^0.3.3", + "core-js-compat": "^3.25.1" + } + }, + "babel-plugin-polyfill-regenerator": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz", + "integrity": "sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw==", + "dev": true, + "peer": true, + "requires": { + "@babel/helper-define-polyfill-provider": "^0.3.3" + } + } } }, "@babel/preset-flow": { @@ -15765,54 +18962,62 @@ "source-map-support": "^0.5.16" } }, + "@babel/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==", + "dev": true, + "peer": true + }, "@babel/runtime": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.6.tgz", - "integrity": "sha512-t9wi7/AW6XtKahAe20Yw0/mMljKq0B1r2fPdvaAdV/KPDZewFXdaaa6K7lxmZBZ8FBNpCiAT6iHPmd6QO9bKfQ==", + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.0.tgz", + "integrity": "sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==", "dev": true, "requires": { - "regenerator-runtime": "^0.13.4" + "regenerator-runtime": "^0.13.11" } }, "@babel/template": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.6.tgz", - "integrity": "sha512-JoDWzPe+wgBsTTgdnIma3iHNFC7YVJoPssVBDjiHfNlyt4YcunDtcDOUmfVDfCK5MfdsaIoX9PkijPhjH3nYUw==", + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz", + "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==", "dev": true, "peer": true, "requires": { "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.18.6", - "@babel/types": "^7.18.6" + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7" } }, "@babel/traverse": { - "version": "7.18.8", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.8.tgz", - "integrity": "sha512-UNg/AcSySJYR/+mIcJQDCv00T+AqRO7j/ZEJLzpaYtgM48rMg5MnkJgyNqkzo88+p4tfRvZJCEiwwfG6h4jkRg==", + "version": "7.21.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.3.tgz", + "integrity": "sha512-XLyopNeaTancVitYZe2MlUEvgKb6YVVPXzofHgqHijCImG33b/uTurMS488ht/Hbsb2XK3U2BnSTxKVNGV3nGQ==", "dev": true, "peer": true, "requires": { "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.18.7", - "@babel/helper-environment-visitor": "^7.18.6", - "@babel/helper-function-name": "^7.18.6", + "@babel/generator": "^7.21.3", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.21.0", "@babel/helper-hoist-variables": "^7.18.6", "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.18.8", - "@babel/types": "^7.18.8", + "@babel/parser": "^7.21.3", + "@babel/types": "^7.21.3", "debug": "^4.1.0", "globals": "^11.1.0" } }, "@babel/types": { - "version": "7.18.8", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.8.tgz", - "integrity": "sha512-qwpdsmraq0aJ3osLJRApsc2ouSJCdnMeZwB0DhbtHAtRpZNZCdlbRnHIgcRKzdE1g0iOGg644fzjOBcdOz9cPw==", + "version": "7.21.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.3.tgz", + "integrity": "sha512-sBGdETxC+/M4o/zKC0sl6sjWv62WFR/uzxrJ6uYyMLZOUlPnwzw0tKgVHOXxaAd5l2g8pEDM5RZ495GPQI77kg==", "dev": true, "peer": true, "requires": { - "@babel/helper-validator-identifier": "^7.18.6", + "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-validator-identifier": "^7.19.1", "to-fast-properties": "^2.0.0" } }, @@ -15857,6 +19062,12 @@ } } }, + "@cypress/skip-test": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/@cypress/skip-test/-/skip-test-2.6.1.tgz", + "integrity": "sha512-X+ibefBiuOmC5gKG91wRIT0/OqXeETYvu7zXktjZ3yLeO186Y8ia0K7/gQUpAwuUi28DuqMd1+7tBQVtPkzbPA==", + "dev": true + }, "@cypress/xvfb": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/@cypress/xvfb/-/xvfb-1.2.4.tgz", @@ -15878,6 +19089,96 @@ } } }, + "@eslint-community/eslint-utils": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.2.0.tgz", + "integrity": "sha512-gB8T4H4DEfX2IV9zGDJPOBgP1e/DbfCPDTtEqUMckpvzS1OYtva8JdFYBqMwYk7xAQ429WGF/UPqn8uQ//h2vQ==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^3.3.0" + } + }, + "@eslint-community/regexpp": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.4.0.tgz", + "integrity": "sha512-A9983Q0LnDGdLPjxyXQ00sbV+K+O+ko2Dr+CZigbHWtX9pNfxlaBkMR8X1CztI73zuEyEBXTVjx7CE+/VSwDiQ==", + "dev": true + }, + "@eslint/eslintrc": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", + "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", + "dev": true, + "requires": { + "ajv": "^6.12.4", + "debug": "^4.1.1", + "espree": "^7.3.0", + "globals": "^13.9.0", + "ignore": "^4.0.6", + "import-fresh": "^3.2.1", + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" + }, + "dependencies": { + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "globals": { + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "dev": true, + "requires": { + "type-fest": "^0.20.2" + } + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + }, + "import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + }, + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true + } + } + }, "@hapi/hoek": { "version": "9.3.0", "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", @@ -15895,6 +19196,23 @@ "@hapi/hoek": "^9.0.0" } }, + "@humanwhocodes/config-array": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", + "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", + "dev": true, + "requires": { + "@humanwhocodes/object-schema": "^1.2.0", + "debug": "^4.1.1", + "minimatch": "^3.0.4" + } + }, + "@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true + }, "@jest/create-cache-key-function": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/@jest/create-cache-key-function/-/create-cache-key-function-27.5.1.tgz", @@ -15944,6 +19262,31 @@ "dev": true, "peer": true }, + "@jridgewell/source-map": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", + "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", + "dev": true, + "peer": true, + "requires": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "dependencies": { + "@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "dev": true, + "peer": true, + "requires": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + } + } + } + }, "@jridgewell/sourcemap-codec": { "version": "1.4.14", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", @@ -15952,14 +19295,14 @@ "peer": true }, "@jridgewell/trace-mapping": { - "version": "0.3.14", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.14.tgz", - "integrity": "sha512-bJWEfQ9lPTvm3SneWwRFVLzrh6nhjwqw7TUFFBEMzwvg7t7PCDenf2lDwqo4NQXzdpgBXyFgDWnQA+2vkruksQ==", + "version": "0.3.17", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", + "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", "dev": true, "peer": true, "requires": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" } }, "@mattermost/types": { @@ -15969,6 +19312,41 @@ "dev": true, "requires": {} }, + "@nicolo-ribaudo/eslint-scope-5-internals": { + "version": "5.1.1-v1", + "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz", + "integrity": "sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==", + "dev": true, + "requires": { + "eslint-scope": "5.1.1" + } + }, + "@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true + }, + "@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } + }, "@react-native-community/cli": { "version": "8.0.3", "resolved": "https://registry.npmjs.org/@react-native-community/cli/-/cli-8.0.3.tgz", @@ -16975,6 +20353,35 @@ "@types/node": "*" } }, + "@types/eslint": { + "version": "8.21.2", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.21.2.tgz", + "integrity": "sha512-EMpxUyystd3uZVByZap1DACsMXvb82ypQnGn89e1Y0a+LYu3JJscUd/gqhRsVFDkaD2MIiWo0MT8EfXr3DGRKw==", + "dev": true, + "peer": true, + "requires": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "@types/eslint-scope": { + "version": "3.7.4", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", + "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", + "dev": true, + "peer": true, + "requires": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "@types/estree": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.0.tgz", + "integrity": "sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==", + "dev": true, + "peer": true + }, "@types/express": { "version": "4.17.15", "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.15.tgz", @@ -17055,6 +20462,18 @@ "@types/istanbul-lib-report": "*" } }, + "@types/json-schema": { + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", + "dev": true + }, + "@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true + }, "@types/jsonfile": { "version": "6.1.1", "resolved": "https://registry.npmjs.org/@types/jsonfile/-/jsonfile-6.1.1.tgz", @@ -17163,6 +20582,12 @@ "@types/node": "*" } }, + "@types/semver": { + "version": "7.3.13", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz", + "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==", + "dev": true + }, "@types/serve-static": { "version": "1.13.10", "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.10.tgz", @@ -17234,6 +20659,313 @@ "@types/node": "*" } }, + "@typescript-eslint/eslint-plugin": { + "version": "5.55.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.55.0.tgz", + "integrity": "sha512-IZGc50rtbjk+xp5YQoJvmMPmJEYoC53SiKPXyqWfv15XoD2Y5Kju6zN0DwlmaGJp1Iw33JsWJcQ7nw0lGCGjVg==", + "dev": true, + "requires": { + "@eslint-community/regexpp": "^4.4.0", + "@typescript-eslint/scope-manager": "5.55.0", + "@typescript-eslint/type-utils": "5.55.0", + "@typescript-eslint/utils": "5.55.0", + "debug": "^4.3.4", + "grapheme-splitter": "^1.0.4", + "ignore": "^5.2.0", + "natural-compare-lite": "^1.4.0", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "dependencies": { + "semver": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "@typescript-eslint/parser": { + "version": "5.55.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.55.0.tgz", + "integrity": "sha512-ppvmeF7hvdhUUZWSd2EEWfzcFkjJzgNQzVST22nzg958CR+sphy8A6K7LXQZd6V75m1VKjp+J4g/PCEfSCmzhw==", + "dev": true, + "requires": { + "@typescript-eslint/scope-manager": "5.55.0", + "@typescript-eslint/types": "5.55.0", + "@typescript-eslint/typescript-estree": "5.55.0", + "debug": "^4.3.4" + } + }, + "@typescript-eslint/scope-manager": { + "version": "5.55.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.55.0.tgz", + "integrity": "sha512-OK+cIO1ZGhJYNCL//a3ROpsd83psf4dUJ4j7pdNVzd5DmIk+ffkuUIX2vcZQbEW/IR41DYsfJTB19tpCboxQuw==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.55.0", + "@typescript-eslint/visitor-keys": "5.55.0" + } + }, + "@typescript-eslint/type-utils": { + "version": "5.55.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.55.0.tgz", + "integrity": "sha512-ObqxBgHIXj8rBNm0yh8oORFrICcJuZPZTqtAFh0oZQyr5DnAHZWfyw54RwpEEH+fD8suZaI0YxvWu5tYE/WswA==", + "dev": true, + "requires": { + "@typescript-eslint/typescript-estree": "5.55.0", + "@typescript-eslint/utils": "5.55.0", + "debug": "^4.3.4", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/types": { + "version": "5.55.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.55.0.tgz", + "integrity": "sha512-M4iRh4AG1ChrOL6Y+mETEKGeDnT7Sparn6fhZ5LtVJF1909D5O4uqK+C5NPbLmpfZ0XIIxCdwzKiijpZUOvOug==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "5.55.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.55.0.tgz", + "integrity": "sha512-I7X4A9ovA8gdpWMpr7b1BN9eEbvlEtWhQvpxp/yogt48fy9Lj3iE3ild/1H3jKBBIYj5YYJmS2+9ystVhC7eaQ==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.55.0", + "@typescript-eslint/visitor-keys": "5.55.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "dependencies": { + "semver": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "@typescript-eslint/utils": { + "version": "5.55.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.55.0.tgz", + "integrity": "sha512-FkW+i2pQKcpDC3AY6DU54yl8Lfl14FVGYDgBTyGKB75cCwV3KpkpTMFi9d9j2WAJ4271LR2HeC5SEWF/CZmmfw==", + "dev": true, + "requires": { + "@eslint-community/eslint-utils": "^4.2.0", + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.55.0", + "@typescript-eslint/types": "5.55.0", + "@typescript-eslint/typescript-estree": "5.55.0", + "eslint-scope": "^5.1.1", + "semver": "^7.3.7" + }, + "dependencies": { + "semver": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "@typescript-eslint/visitor-keys": { + "version": "5.55.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.55.0.tgz", + "integrity": "sha512-q2dlHHwWgirKh1D3acnuApXG+VNXpEY5/AwRxDVuEQpxWaB0jCDe0jFMVMALJ3ebSfuOVE8/rMS+9ZOYGg1GWw==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.55.0", + "eslint-visitor-keys": "^3.3.0" + } + }, + "@webassemblyjs/ast": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", + "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", + "dev": true, + "peer": true, + "requires": { + "@webassemblyjs/helper-numbers": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1" + } + }, + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", + "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==", + "dev": true, + "peer": true + }, + "@webassemblyjs/helper-api-error": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", + "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==", + "dev": true, + "peer": true + }, + "@webassemblyjs/helper-buffer": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", + "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==", + "dev": true, + "peer": true + }, + "@webassemblyjs/helper-numbers": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", + "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", + "dev": true, + "peer": true, + "requires": { + "@webassemblyjs/floating-point-hex-parser": "1.11.1", + "@webassemblyjs/helper-api-error": "1.11.1", + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", + "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==", + "dev": true, + "peer": true + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", + "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", + "dev": true, + "peer": true, + "requires": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1" + } + }, + "@webassemblyjs/ieee754": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", + "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", + "dev": true, + "peer": true, + "requires": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "@webassemblyjs/leb128": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", + "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", + "dev": true, + "peer": true, + "requires": { + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/utf8": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", + "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==", + "dev": true, + "peer": true + }, + "@webassemblyjs/wasm-edit": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", + "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", + "dev": true, + "peer": true, + "requires": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/helper-wasm-section": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1", + "@webassemblyjs/wasm-opt": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "@webassemblyjs/wast-printer": "1.11.1" + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", + "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", + "dev": true, + "peer": true, + "requires": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/ieee754": "1.11.1", + "@webassemblyjs/leb128": "1.11.1", + "@webassemblyjs/utf8": "1.11.1" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", + "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", + "dev": true, + "peer": true, + "requires": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1" + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", + "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", + "dev": true, + "peer": true, + "requires": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-api-error": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/ieee754": "1.11.1", + "@webassemblyjs/leb128": "1.11.1", + "@webassemblyjs/utf8": "1.11.1" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", + "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", + "dev": true, + "peer": true, + "requires": { + "@webassemblyjs/ast": "1.11.1", + "@xtuc/long": "4.2.2" + } + }, + "@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true, + "peer": true + }, + "@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true, + "peer": true + }, "@yarnpkg/lockfile": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", @@ -17266,6 +20998,19 @@ "negotiator": "0.6.3" } }, + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true + }, + "acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "requires": {} + }, "aggregate-error": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", @@ -17276,6 +21021,26 @@ "indent-string": "^4.0.0" } }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "peer": true, + "requires": {} + }, "ally.js": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/ally.js/-/ally.js-1.4.1.tgz", @@ -17419,10 +21184,13 @@ "dev": true }, "aria-query": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.0.0.tgz", - "integrity": "sha512-V+SM7AbUwJ+EBnB8+DXs0hPZHO0W6pqBcc0dW90OwtVG02PswOu/teuARoLQjdDOH+t9pJgGnW5/Qmouf3gPJg==", - "dev": true + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", + "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", + "dev": true, + "requires": { + "deep-equal": "^2.0.5" + } }, "arr-diff": { "version": "4.0.0", @@ -17445,12 +21213,47 @@ "dev": true, "peer": true }, + "array-buffer-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", + "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "is-array-buffer": "^3.0.1" + } + }, + "array-find": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-find/-/array-find-1.0.0.tgz", + "integrity": "sha512-kO/vVCacW9mnpn3WPWbTVlEnOabK2L7LWi2HViURtCM46y1zb6I8UMjx4LgbiqadTgHnLInUronwn3ampNTJtQ==", + "dev": true + }, "array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", "dev": true }, + "array-includes": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", + "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "get-intrinsic": "^1.1.3", + "is-string": "^1.0.7" + } + }, + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true + }, "array-unique": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", @@ -17458,6 +21261,43 @@ "dev": true, "peer": true }, + "array.prototype.flat": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz", + "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0" + } + }, + "array.prototype.flatmap": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", + "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0" + } + }, + "array.prototype.tosorted": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.1.tgz", + "integrity": "sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0", + "get-intrinsic": "^1.1.3" + } + }, "asap": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", @@ -17503,6 +21343,12 @@ "tslib": "^2.0.1" } }, + "ast-types-flow": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", + "integrity": "sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==", + "dev": true + }, "astral-regex": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", @@ -17619,6 +21465,12 @@ "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", "dev": true }, + "axe-core": { + "version": "4.6.3", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.6.3.tgz", + "integrity": "sha512-/BQzOX780JhsxDnPpH4ZiyrJAzcd8AfzFPkv+89veFSr1rcMjuq2JDCwypKaPeB6ljHp9KjXhPpjgCvQlWYuqg==", + "dev": true + }, "axios": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/axios/-/axios-1.2.2.tgz", @@ -17659,6 +21511,15 @@ "is-retry-allowed": "^2.2.0" } }, + "axobject-query": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.1.1.tgz", + "integrity": "sha512-goKlv8DZrK9hUh975fnHzhNIO4jUnFCfv/dszV5VwUGDFjI6vQ2VwoyjYjYNEbBE8AH87TduWP5uyDR1D+Iteg==", + "dev": true, + "requires": { + "deep-equal": "^2.0.5" + } + }, "babel-core": { "version": "7.0.0-bridge.0", "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-7.0.0-bridge.0.tgz", @@ -17667,25 +21528,15 @@ "peer": true, "requires": {} }, - "babel-plugin-dynamic-import-node": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", - "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", - "dev": true, - "peer": true, - "requires": { - "object.assign": "^4.1.0" - } - }, "babel-plugin-polyfill-corejs2": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.1.tgz", - "integrity": "sha512-v7/T6EQcNfVLfcN2X8Lulb7DjprieyLWJK/zOWH5DUYcAgex9sP3h25Q+DLsX9TloXe3y1O8l2q2Jv9q8UVB9w==", + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz", + "integrity": "sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==", "dev": true, "peer": true, "requires": { - "@babel/compat-data": "^7.13.11", - "@babel/helper-define-polyfill-provider": "^0.3.1", + "@babel/compat-data": "^7.17.7", + "@babel/helper-define-polyfill-provider": "^0.3.3", "semver": "^6.1.1" } }, @@ -17965,16 +21816,16 @@ "dev": true }, "browserslist": { - "version": "4.21.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.1.tgz", - "integrity": "sha512-Nq8MFCSrnJXSc88yliwlzQe3qNe3VntIjhsArW9IJOEPSHNx23FalwApUVbzAWABLhYJJ7y8AynWI/XM8OdfjQ==", + "version": "4.21.5", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", + "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==", "dev": true, "peer": true, "requires": { - "caniuse-lite": "^1.0.30001359", - "electron-to-chromium": "^1.4.172", - "node-releases": "^2.0.5", - "update-browserslist-db": "^1.0.4" + "caniuse-lite": "^1.0.30001449", + "electron-to-chromium": "^1.4.284", + "node-releases": "^2.0.8", + "update-browserslist-db": "^1.0.10" } }, "bser": { @@ -18097,9 +21948,9 @@ "dev": true }, "caniuse-lite": { - "version": "1.0.30001366", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001366.tgz", - "integrity": "sha512-yy7XLWCubDobokgzudpkKux8e0UOOnLHE6mlNJBzT3lZJz6s5atSEzjoL+fsCPkI0G8MP5uVdDx1ur/fXEWkZA==", + "version": "1.0.30001466", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001466.tgz", + "integrity": "sha512-ewtFBSfWjEmxUgNBSZItFSmVtvk9zkwkl1OfRZlKA8slltRN+/C/tuGVrF9styXkN36Yu3+SeJ1qkXxDEyNZ5w==", "dev": true, "peer": true }, @@ -18167,6 +22018,13 @@ "readdirp": "~3.6.0" } }, + "chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "dev": true, + "peer": true + }, "ci-info": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.2.0.tgz", @@ -18590,23 +22448,13 @@ "dev": true }, "core-js-compat": { - "version": "3.23.4", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.23.4.tgz", - "integrity": "sha512-RkSRPe+JYEoflcsuxJWaiMPhnZoFS51FcIxm53k4KzhISCBTmaGlto9dTIrYuk0hnJc3G6pKufAKepHnBq6B6Q==", + "version": "3.29.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.29.1.tgz", + "integrity": "sha512-QmchCua884D8wWskMX8tW5ydINzd8oSJVx38lx/pVkFGqztxt73GYre3pm/hyYq8bPf+MW5In4I/uRShFDsbrA==", "dev": true, "peer": true, "requires": { - "browserslist": "^4.21.1", - "semver": "7.0.0" - }, - "dependencies": { - "semver": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", - "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", - "dev": true, - "peer": true - } + "browserslist": "^4.21.5" } }, "core-util-is": { @@ -18795,6 +22643,12 @@ "integrity": "sha512-uZ+M8/MqRcpf+FII/UZrU7g1qYZ4aVlHcgyVopnladyoBrpoaMJ4PKZDrdOJ05H5RHbr7s9Tid635X3E+ZLU/Q==", "dev": true }, + "damerau-levenshtein": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", + "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", + "dev": true + }, "dashdash": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", @@ -18847,6 +22701,45 @@ "type-detect": "^4.0.0" } }, + "deep-equal": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.0.tgz", + "integrity": "sha512-RdpzE0Hv4lhowpIUKKMJfeH6C1pXdtT1/it80ubgWqwI3qpuxUBpC1S4hnHg+zjnuOoDkzUtUCEEkG+XG5l3Mw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "es-get-iterator": "^1.1.2", + "get-intrinsic": "^1.1.3", + "is-arguments": "^1.1.1", + "is-array-buffer": "^3.0.1", + "is-date-object": "^1.0.5", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "isarray": "^2.0.5", + "object-is": "^1.1.5", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.4.3", + "side-channel": "^1.0.4", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.9" + }, + "dependencies": { + "isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + } + } + }, + "deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, "deepmerge": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", @@ -18873,11 +22766,10 @@ } }, "define-properties": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", - "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", + "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", "dev": true, - "peer": true, "requires": { "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" @@ -18925,6 +22817,24 @@ "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", "dev": true }, + "dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "requires": { + "path-type": "^4.0.0" + } + }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, "dom-accessibility-api": { "version": "0.5.14", "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.14.tgz", @@ -18954,9 +22864,9 @@ "dev": true }, "electron-to-chromium": { - "version": "1.4.187", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.187.tgz", - "integrity": "sha512-t3iFLHVIMhB8jGZ+8ui951nz6Bna5qKfhxezG3wzXdBJ79qFKPsE2chjjVFNqC1ewhfrPQrw9pmVeo4FFpZeQA==", + "version": "1.4.330", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.330.tgz", + "integrity": "sha512-PqyefhybrVdjAJ45HaPLtuVaehiSw7C3ya0aad+rvmV53IVyXmYRk3pwIOb2TxTDTnmgQdn46NjMMaysx79/6Q==", "dev": true, "peer": true }, @@ -18981,6 +22891,17 @@ "once": "^1.4.0" } }, + "enhanced-resolve": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-0.9.1.tgz", + "integrity": "sha512-kxpoMgrdtkXZ5h0SeraBS1iRntpTpQ3R8ussdb38+UAFnMGX5DDyJXePm+OCHOcoXvHDw7mc2erbJBpDnl7TPw==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.2.0", + "tapable": "^0.1.8" + } + }, "enquirer": { "version": "2.3.6", "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", @@ -19028,6 +22949,111 @@ "escape-html": "~1.0.3" } }, + "es-abstract": { + "version": "1.21.2", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.2.tgz", + "integrity": "sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg==", + "dev": true, + "requires": { + "array-buffer-byte-length": "^1.0.0", + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "es-set-tostringtag": "^2.0.1", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.5", + "get-intrinsic": "^1.2.0", + "get-symbol-description": "^1.0.0", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.5", + "is-array-buffer": "^3.0.2", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.10", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.3", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.4.3", + "safe-regex-test": "^1.0.0", + "string.prototype.trim": "^1.2.7", + "string.prototype.trimend": "^1.0.6", + "string.prototype.trimstart": "^1.0.6", + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.9" + } + }, + "es-get-iterator": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", + "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "has-symbols": "^1.0.3", + "is-arguments": "^1.1.1", + "is-map": "^2.0.2", + "is-set": "^2.0.2", + "is-string": "^1.0.7", + "isarray": "^2.0.5", + "stop-iteration-iterator": "^1.0.0" + }, + "dependencies": { + "isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + } + } + }, + "es-module-lexer": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", + "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", + "dev": true, + "peer": true + }, + "es-set-tostringtag": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", + "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.3", + "has": "^1.0.3", + "has-tostringtag": "^1.0.0" + } + }, + "es-shim-unscopables": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", + "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, "escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", @@ -19046,25 +23072,516 @@ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", "dev": true }, + "eslint": { + "version": "7.32.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", + "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", + "dev": true, + "requires": { + "@babel/code-frame": "7.12.11", + "@eslint/eslintrc": "^0.4.3", + "@humanwhocodes/config-array": "^0.5.0", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "enquirer": "^2.3.5", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^2.1.0", + "eslint-visitor-keys": "^2.0.0", + "espree": "^7.3.1", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.1.2", + "globals": "^13.6.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "progress": "^2.0.0", + "regexpp": "^3.1.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.0", + "strip-json-comments": "^3.1.0", + "table": "^6.0.9", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", + "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.10.4" + } + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true + }, + "eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true + }, + "globals": { + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "dev": true, + "requires": { + "type-fest": "^0.20.2" + } + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + }, + "import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + }, + "semver": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true + } + } + }, + "eslint-import-resolver-node": { + "version": "0.3.7", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz", + "integrity": "sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==", + "dev": true, + "requires": { + "debug": "^3.2.7", + "is-core-module": "^2.11.0", + "resolve": "^1.22.1" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "resolve": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "dev": true, + "requires": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + } + } + }, + "eslint-import-resolver-webpack": { + "version": "0.13.2", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-webpack/-/eslint-import-resolver-webpack-0.13.2.tgz", + "integrity": "sha512-XodIPyg1OgE2h5BDErz3WJoK7lawxKTJNhgPNafRST6csC/MZC+L5P6kKqsZGRInpbgc02s/WZMrb4uGJzcuRg==", + "dev": true, + "requires": { + "array-find": "^1.0.0", + "debug": "^3.2.7", + "enhanced-resolve": "^0.9.1", + "find-root": "^1.1.0", + "has": "^1.0.3", + "interpret": "^1.4.0", + "is-core-module": "^2.7.0", + "is-regex": "^1.1.4", + "lodash": "^4.17.21", + "resolve": "^1.20.0", + "semver": "^5.7.1" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "dev": true + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "eslint-module-utils": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz", + "integrity": "sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==", + "dev": true, + "requires": { + "debug": "^3.2.7" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "eslint-plugin-cypress": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-cypress/-/eslint-plugin-cypress-2.12.1.tgz", + "integrity": "sha512-c2W/uPADl5kospNDihgiLc7n87t5XhUbFDoTl6CfVkmG+kDAb5Ux10V9PoLPu9N+r7znpc+iQlcmAqT1A/89HA==", + "dev": true, + "requires": { + "globals": "^11.12.0" + } + }, + "eslint-plugin-header": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-header/-/eslint-plugin-header-3.1.1.tgz", + "integrity": "sha512-9vlKxuJ4qf793CmeeSrZUvVClw6amtpghq3CuWcB5cUNnWHQhgcqy5eF8oVKFk1G3Y/CbchGfEaw3wiIJaNmVg==", + "dev": true, + "requires": {} + }, + "eslint-plugin-import": { + "version": "2.27.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz", + "integrity": "sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==", + "dev": true, + "requires": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "array.prototype.flatmap": "^1.3.1", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.7", + "eslint-module-utils": "^2.7.4", + "has": "^1.0.3", + "is-core-module": "^2.11.0", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.values": "^1.1.6", + "resolve": "^1.22.1", + "semver": "^6.3.0", + "tsconfig-paths": "^3.14.1" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "resolve": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "dev": true, + "requires": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + } + } + }, + "eslint-plugin-jsx-a11y": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.7.1.tgz", + "integrity": "sha512-63Bog4iIethyo8smBklORknVjB0T2dwB8Mr/hIC+fBS0uyHdYYpzM/Ed+YC8VxTjlXHEWFOdmgwcDn1U2L9VCA==", + "dev": true, + "requires": { + "@babel/runtime": "^7.20.7", + "aria-query": "^5.1.3", + "array-includes": "^3.1.6", + "array.prototype.flatmap": "^1.3.1", + "ast-types-flow": "^0.0.7", + "axe-core": "^4.6.2", + "axobject-query": "^3.1.1", + "damerau-levenshtein": "^1.0.8", + "emoji-regex": "^9.2.2", + "has": "^1.0.3", + "jsx-ast-utils": "^3.3.3", + "language-tags": "=1.0.5", + "minimatch": "^3.1.2", + "object.entries": "^1.1.6", + "object.fromentries": "^2.0.6", + "semver": "^6.3.0" + }, + "dependencies": { + "emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + } + } + }, + "eslint-plugin-mattermost": { + "version": "git+ssh://git@github.com/mattermost/eslint-plugin-mattermost.git#5b0c972eacf19286e4c66221b39113bf8728a99e", + "integrity": "sha512-U73c9Uns3pi8aUxvr3+FcJv+bsMudylcp1Ah6OMrjNRodq6dLmhDOMbMir2so+dw1M0XF9t6jzemLRPedfikXg==", + "dev": true, + "from": "eslint-plugin-mattermost@github:mattermost/eslint-plugin-mattermost#5b0c972eacf19286e4c66221b39113bf8728a99e", + "requires": { + "eslint-plugin-jsx-a11y": "^6.7.1", + "jsx-ast-utils": "^3.3.3" + } + }, + "eslint-plugin-no-only-tests": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-no-only-tests/-/eslint-plugin-no-only-tests-3.1.0.tgz", + "integrity": "sha512-Lf4YW/bL6Un1R6A76pRZyE1dl1vr31G/ev8UzIc/geCgFWyrKil8hVjYqWVKGB/UIGmb6Slzs9T0wNezdSVegw==", + "dev": true + }, + "eslint-plugin-react": { + "version": "7.32.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.32.2.tgz", + "integrity": "sha512-t2fBMa+XzonrrNkyVirzKlvn5RXzzPwRHtMvLAtVZrt8oxgnTQaYbU6SXTOO1mwQgp1y5+toMSKInnzGr0Knqg==", + "dev": true, + "requires": { + "array-includes": "^3.1.6", + "array.prototype.flatmap": "^1.3.1", + "array.prototype.tosorted": "^1.1.1", + "doctrine": "^2.1.0", + "estraverse": "^5.3.0", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.6", + "object.fromentries": "^2.0.6", + "object.hasown": "^1.1.2", + "object.values": "^1.1.6", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.4", + "semver": "^6.3.0", + "string.prototype.matchall": "^4.0.8" + }, + "dependencies": { + "doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "resolve": { + "version": "2.0.0-next.4", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.4.tgz", + "integrity": "sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==", + "dev": true, + "requires": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + } + } + }, + "eslint-rule-composer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/eslint-rule-composer/-/eslint-rule-composer-0.3.0.tgz", + "integrity": "sha512-bt+Sh8CtDmn2OajxvNO+BX7Wn4CIWMpTRm3MaiKPCQcnnlm0CS2mhui6QaoeQugs+3Kj2ESKEEGJUdVafwhiCg==", + "dev": true + }, + "eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "dependencies": { + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + } + } + }, + "eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true + } + } + }, + "eslint-visitor-keys": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "dev": true + }, "esm": { "version": "3.2.25", "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz", "integrity": "sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==", "dev": true }, + "espree": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", + "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", + "dev": true, + "requires": { + "acorn": "^7.4.0", + "acorn-jsx": "^5.3.1", + "eslint-visitor-keys": "^1.3.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true + } + } + }, "esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", "dev": true, - "peer": true + "requires": { + "estraverse": "^5.1.0" + } + }, + "esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "requires": { + "estraverse": "^5.2.0" + } + }, + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true }, "esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "peer": true + "dev": true }, "etag": { "version": "1.8.1", @@ -19424,6 +23941,46 @@ "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", "dev": true }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "fast-glob": { + "version": "3.2.12", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", + "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + } + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dev": true, + "requires": { + "reusify": "^1.0.4" + } + }, "fb-watchman": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz", @@ -19452,6 +24009,15 @@ "escape-string-regexp": "^1.0.5" } }, + "file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "requires": { + "flat-cache": "^3.0.4" + } + }, "fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -19507,6 +24073,12 @@ "pkg-dir": "^3.0.0" } }, + "find-root": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==", + "dev": true + }, "find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", @@ -19531,6 +24103,33 @@ "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", "dev": true }, + "flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "requires": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + }, + "dependencies": { + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } + } + }, + "flatted": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", + "dev": true + }, "flow-parser": { "version": "0.121.0", "resolved": "https://registry.npmjs.org/flow-parser/-/flow-parser-0.121.0.tgz", @@ -19634,6 +24233,30 @@ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", "dev": true }, + "function.prototype.name": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", + "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0", + "functions-have-names": "^1.2.2" + } + }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", + "dev": true + }, + "functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true + }, "gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -19654,9 +24277,9 @@ "dev": true }, "get-intrinsic": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", - "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", + "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", "dev": true, "requires": { "function-bind": "^1.1.1", @@ -19685,6 +24308,16 @@ "pump": "^3.0.0" } }, + "get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + } + }, "get-value": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", @@ -19747,6 +24380,13 @@ "is-glob": "^4.0.1" } }, + "glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true, + "peer": true + }, "global-dirs": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.0.tgz", @@ -19760,8 +24400,30 @@ "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + }, + "globalthis": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", "dev": true, - "peer": true + "requires": { + "define-properties": "^1.1.3" + } + }, + "globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "requires": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + } }, "gopd": { "version": "1.0.1", @@ -19777,6 +24439,12 @@ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" }, + "grapheme-splitter": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", + "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", + "dev": true + }, "has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -19786,6 +24454,12 @@ "function-bind": "^1.1.1" } }, + "has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true + }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -19796,11 +24470,16 @@ "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", "dev": true, - "peer": true, "requires": { "get-intrinsic": "^1.1.1" } }, + "has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "dev": true + }, "has-symbols": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", @@ -19966,6 +24645,12 @@ "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", "dev": true }, + "ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "dev": true + }, "image-size": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.6.3.tgz", @@ -20022,6 +24707,17 @@ "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", "dev": true }, + "internal-slot": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", + "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", + "dev": true, + "requires": { + "get-intrinsic": "^1.2.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + } + }, "interpret": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", @@ -20077,6 +24773,17 @@ "has-tostringtag": "^1.0.0" } }, + "is-array-buffer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", + "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "is-typed-array": "^1.1.10" + } + }, "is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", @@ -20084,6 +24791,15 @@ "dev": true, "peer": true }, + "is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "requires": { + "has-bigints": "^1.0.1" + } + }, "is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", @@ -20093,6 +24809,16 @@ "binary-extensions": "^2.0.0" } }, + "is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, "is-buffer": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", @@ -20115,9 +24841,9 @@ } }, "is-core-module": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.5.0.tgz", - "integrity": "sha512-TXCMSDsEHMEEZ6eCA8rwRDbLu55MRGmrctljsBX/2v1d9/GzqHOxW5c5oPSgrUt2vBFXebu9rGqckXGPWOlYpg==", + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", + "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", "dev": true, "requires": { "has": "^1.0.3" @@ -20133,6 +24859,15 @@ "kind-of": "^6.0.0" } }, + "is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, "is-descriptor": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", @@ -20214,11 +24949,32 @@ "dev": true, "peer": true }, + "is-map": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", + "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", + "dev": true + }, + "is-negative-zero": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "dev": true + }, "is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" }, + "is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, "is-path-inside": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", @@ -20241,18 +24997,61 @@ "isobject": "^3.0.1" } }, + "is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, "is-retry-allowed": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-2.2.0.tgz", "integrity": "sha512-XVm7LOeLpTW4jV19QSH38vkswxoLud8sQ57YwJVTPWdiaI9I8keEhGFpBlslyVsgdQy4Opg8QOLb8YRgsyZiQg==", "dev": true }, + "is-set": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", + "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", + "dev": true + }, + "is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2" + } + }, "is-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", "dev": true }, + "is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "requires": { + "has-symbols": "^1.0.2" + } + }, "is-typed-array": { "version": "1.1.10", "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", @@ -20278,6 +25077,31 @@ "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", "dev": true }, + "is-weakmap": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", + "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==", + "dev": true + }, + "is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2" + } + }, + "is-weakset": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz", + "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + } + }, "is-windows": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", @@ -20686,12 +25510,31 @@ "dev": true, "peer": true }, + "json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true, + "peer": true + }, "json-schema": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", "dev": true }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, "json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", @@ -20699,9 +25542,9 @@ "dev": true }, "json5": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", - "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true, "peer": true }, @@ -20726,6 +25569,16 @@ "verror": "1.10.0" } }, + "jsx-ast-utils": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz", + "integrity": "sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw==", + "dev": true, + "requires": { + "array-includes": "^3.1.5", + "object.assign": "^4.1.3" + } + }, "kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", @@ -20809,6 +25662,21 @@ } } }, + "language-subtag-registry": { + "version": "0.3.22", + "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz", + "integrity": "sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==", + "dev": true + }, + "language-tags": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.5.tgz", + "integrity": "sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ==", + "dev": true, + "requires": { + "language-subtag-registry": "~0.3.2" + } + }, "lazy-ass": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/lazy-ass/-/lazy-ass-1.6.0.tgz", @@ -20822,6 +25690,16 @@ "dev": true, "peer": true }, + "levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + } + }, "lie": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/lie/-/lie-3.1.1.tgz", @@ -20852,6 +25730,13 @@ "wrap-ansi": "^7.0.0" } }, + "loader-runner": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "dev": true, + "peer": true + }, "localforage": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/localforage/-/localforage-1.10.0.tgz", @@ -20925,6 +25810,12 @@ "integrity": "sha1-3yz6Ix18V8eorQA6va1dc9PqUZU=", "dev": true }, + "lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, "lodash.once": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", @@ -20938,6 +25829,12 @@ "dev": true, "peer": true }, + "lodash.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", + "dev": true + }, "lodash.without": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/lodash.without/-/lodash.without-4.4.0.tgz", @@ -21317,6 +26214,12 @@ "dev": true, "peer": true }, + "memory-fs": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.2.0.tgz", + "integrity": "sha512-+y4mDxU4rvXXu5UDSGCGNiesFmwCHuefGMoPCO1WYucNYj7DsLqrFaa2fXVI0H+NNiPTwwzKwspn9yTZqUGqng==", + "dev": true + }, "merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", @@ -21329,6 +26232,12 @@ "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", "dev": true }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true + }, "methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", @@ -22487,6 +27396,18 @@ "to-regex": "^3.0.1" } }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "natural-compare-lite": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", + "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", + "dev": true + }, "negotiator": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", @@ -22568,9 +27489,9 @@ } }, "node-releases": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", - "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==", + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz", + "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==", "dev": true, "peer": true }, @@ -22698,17 +27619,26 @@ } }, "object-inspect": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", - "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", "dev": true }, + "object-is": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", + "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, "object-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true, - "peer": true + "dev": true }, "object-visit": { "version": "1.0.1", @@ -22721,18 +27651,49 @@ } }, "object.assign": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", - "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", "dev": true, - "peer": true, "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "has-symbols": "^1.0.1", + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", "object-keys": "^1.1.1" } }, + "object.entries": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.6.tgz", + "integrity": "sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, + "object.fromentries": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.6.tgz", + "integrity": "sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, + "object.hasown": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.2.tgz", + "integrity": "sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw==", + "dev": true, + "requires": { + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, "object.pick": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", @@ -22743,6 +27704,17 @@ "isobject": "^3.0.1" } }, + "object.values": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", + "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, "on-finished": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", @@ -22793,6 +27765,20 @@ "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", "dev": true }, + "optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, + "requires": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + } + }, "ora": { "version": "5.4.1", "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", @@ -22880,6 +27866,23 @@ "integrity": "sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ==", "dev": true }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "requires": { + "callsites": "^3.0.0" + }, + "dependencies": { + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + } + } + }, "parse-json": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", @@ -23052,6 +28055,12 @@ "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", "dev": true }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true + }, "pathval": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", @@ -23374,6 +28383,12 @@ "xtend": "^4.0.0" } }, + "prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true + }, "pretty-bytes": { "version": "5.6.0", "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", @@ -23431,6 +28446,12 @@ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", "dev": true }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true + }, "promise": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/promise/-/promise-8.1.0.tgz", @@ -23453,14 +28474,14 @@ } }, "prop-types": { - "version": "15.7.2", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", - "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", "dev": true, "requires": { "loose-envify": "^1.4.0", "object-assign": "^4.1.1", - "react-is": "^16.8.1" + "react-is": "^16.13.1" }, "dependencies": { "react-is": { @@ -23530,6 +28551,12 @@ "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", "dev": true }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true + }, "randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", @@ -23844,9 +28871,9 @@ "peer": true }, "regenerate-unicode-properties": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.0.1.tgz", - "integrity": "sha512-vn5DU6yg6h8hP/2OkQo3K7uVILvY4iu0oI4t3HFa81UPkhGJwkRwM10JEc3upjdhHjs/k8GJY1sRBhk5sr69Bw==", + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz", + "integrity": "sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==", "dev": true, "peer": true, "requires": { @@ -23854,9 +28881,9 @@ } }, "regenerator-runtime": { - "version": "0.13.7", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", - "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==", + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", "dev": true }, "regenerator-transform": { @@ -23880,32 +28907,42 @@ "safe-regex": "^1.1.0" } }, + "regexp.prototype.flags": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", + "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "functions-have-names": "^1.2.2" + } + }, + "regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "dev": true + }, "regexpu-core": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.1.0.tgz", - "integrity": "sha512-bb6hk+xWd2PEOkj5It46A16zFMs2mv86Iwpdu94la4S3sJ7C973h2dHpYKwIBGaWSO7cIRJ+UX0IeMaWcO4qwA==", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", + "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", "dev": true, "peer": true, "requires": { + "@babel/regjsgen": "^0.8.0", "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.0.1", - "regjsgen": "^0.6.0", - "regjsparser": "^0.8.2", + "regenerate-unicode-properties": "^10.1.0", + "regjsparser": "^0.9.1", "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.0.0" + "unicode-match-property-value-ecmascript": "^2.1.0" } }, - "regjsgen": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.6.0.tgz", - "integrity": "sha512-ozE883Uigtqj3bx7OhL1KNbCzGyW2NQZPl6Hs09WTvCuZD5sTI4JY58bkbQWa/Y9hxIsvJ3M8Nbf7j54IqeZbA==", - "dev": true, - "peer": true - }, "regjsparser": { - "version": "0.8.4", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.8.4.tgz", - "integrity": "sha512-J3LABycON/VNEu3abOviqGHuB/LOtOQj8SKmfP9anY5GfAVw/SPjwzSjxGjbZXIxbGfqTHtJw58C2Li/WkStmA==", + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", + "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", "dev": true, "peer": true, "requires": { @@ -23973,6 +29010,12 @@ "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", "dev": true }, + "require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true + }, "require-main-filename": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", @@ -24026,6 +29069,12 @@ "dev": true, "peer": true }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true + }, "rimraf": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", @@ -24046,6 +29095,15 @@ "integrity": "sha512-q86qmF6VUXjTUCv1YRFc2V1pt408D641nD2ymKFaLtGZTLjkZCzotQ7cW8c48vPKlSWwekkBlA3kghy/NKGwOw==", "dev": true }, + "run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "requires": { + "queue-microtask": "^1.2.2" + } + }, "rxjs": { "version": "6.6.7", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", @@ -24079,6 +29137,17 @@ "ret": "~0.1.10" } }, + "safe-regex-test": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", + "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-regex": "^1.1.4" + } + }, "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", @@ -24122,12 +29191,23 @@ "loose-envify": "^1.1.0" } }, + "schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dev": true, + "peer": true, + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + }, "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "peer": true + "dev": true }, "send": { "version": "0.18.0", @@ -24374,8 +29454,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "peer": true + "dev": true }, "slice-ansi": { "version": "3.0.0", @@ -24684,8 +29763,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true, - "peer": true + "dev": true }, "sqlstring": { "version": "2.3.1", @@ -24829,6 +29907,15 @@ "dev": true, "peer": true }, + "stop-iteration-iterator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz", + "integrity": "sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==", + "dev": true, + "requires": { + "internal-slot": "^1.0.4" + } + }, "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -24868,6 +29955,55 @@ } } }, + "string.prototype.matchall": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz", + "integrity": "sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "get-intrinsic": "^1.1.3", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.3", + "regexp.prototype.flags": "^1.4.3", + "side-channel": "^1.0.4" + } + }, + "string.prototype.trim": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", + "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, + "string.prototype.trimend": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", + "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, + "string.prototype.trimstart": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", + "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, "strip-ansi": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", @@ -24887,6 +30023,12 @@ } } }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true + }, "strip-eof": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", @@ -24921,12 +30063,77 @@ "has-flag": "^4.0.0" } }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true + }, "symbol-observable": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==", "dev": true }, + "table": { + "version": "6.8.1", + "resolved": "https://registry.npmjs.org/table/-/table-6.8.1.tgz", + "integrity": "sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==", + "dev": true, + "requires": { + "ajv": "^8.0.1", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" + }, + "dependencies": { + "ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, + "tapable": { + "version": "0.1.10", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-0.1.10.tgz", + "integrity": "sha512-jX8Et4hHg57mug1/079yitEKWGB3LCwoxByLsNim89LABq8NqgiX+6iYVOsq0vX8uJHkU+DZ5fnq95f800bEsQ==", + "dev": true + }, "tarn": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/tarn/-/tarn-3.0.2.tgz", @@ -24968,6 +30175,67 @@ } } }, + "terser": { + "version": "5.16.6", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.16.6.tgz", + "integrity": "sha512-IBZ+ZQIA9sMaXmRZCUMDjNH0D5AQQfdn4WUjHL0+1lF4TP1IHRJbrhb6fNaXWikrYQTSkb7SLxkeXAiy1p7mbg==", + "dev": true, + "peer": true, + "requires": { + "@jridgewell/source-map": "^0.3.2", + "acorn": "^8.5.0", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "dependencies": { + "acorn": { + "version": "8.8.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", + "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", + "dev": true, + "peer": true + }, + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true, + "peer": true + } + } + }, + "terser-webpack-plugin": { + "version": "5.3.7", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.7.tgz", + "integrity": "sha512-AfKwIktyP7Cu50xNjXF/6Qb5lBNzYaWpU6YfoX3uZicTx0zTy0stDDCsvjDapKsSDvOeWo5MEq4TmdBy2cNoHw==", + "dev": true, + "peer": true, + "requires": { + "@jridgewell/trace-mapping": "^0.3.17", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.1", + "terser": "^5.16.5" + }, + "dependencies": { + "serialize-javascript": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", + "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", + "dev": true, + "peer": true, + "requires": { + "randombytes": "^2.1.0" + } + } + } + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, "thirty-two": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/thirty-two/-/thirty-two-0.0.2.tgz", @@ -25128,6 +30396,29 @@ "integrity": "sha512-e4g0EJtAjk64xgnFPD6kTBUtpnMVzDrMb12N1YZV0VvSlhnVT3SGxiYTLdGy8Q5cYHOIC/FAHmZ10eGrAguicQ==", "dev": true }, + "tsconfig-paths": { + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", + "integrity": "sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==", + "dev": true, + "requires": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + }, + "dependencies": { + "json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + } + } + }, "tslib": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", @@ -25135,6 +30426,23 @@ "dev": true, "peer": true }, + "tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, + "requires": { + "tslib": "^1.8.1" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + } + } + }, "tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", @@ -25150,6 +30458,15 @@ "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", "dev": true }, + "type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1" + } + }, "type-detect": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", @@ -25172,6 +30489,17 @@ "mime-types": "~2.1.24" } }, + "typed-array-length": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", + "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "is-typed-array": "^1.1.9" + } + }, "typescript": { "version": "4.9.4", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.4.tgz", @@ -25205,6 +30533,18 @@ } } }, + "unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + } + }, "unicode-canonical-property-names-ecmascript": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", @@ -25224,16 +30564,16 @@ } }, "unicode-match-property-value-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz", - "integrity": "sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", + "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", "dev": true, "peer": true }, "unicode-property-aliases-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz", - "integrity": "sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", + "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", "dev": true, "peer": true }, @@ -25321,9 +30661,9 @@ "dev": true }, "update-browserslist-db": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.4.tgz", - "integrity": "sha512-jnmO2BEGUjsMOe/Fg9u0oczOe/ppIDZPebzccl1yDWGLFP16Pa1/RM5wEoKYPG2zstNcDuAStejyxsOuKINdGA==", + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", + "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", "dev": true, "peer": true, "requires": { @@ -25331,6 +30671,15 @@ "picocolors": "^1.0.0" } }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, "urix": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", @@ -25406,6 +30755,12 @@ "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==", "dev": true }, + "v8-compile-cache": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", + "dev": true + }, "validator": { "version": "13.7.0", "resolved": "https://registry.npmjs.org/validator/-/validator-13.7.0.tgz", @@ -25446,6 +30801,17 @@ "makeerror": "1.0.12" } }, + "watchpack": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", + "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "dev": true, + "peer": true, + "requires": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + } + }, "wcwidth": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", @@ -25463,6 +30829,95 @@ "dev": true, "peer": true }, + "webpack": { + "version": "5.76.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.76.1.tgz", + "integrity": "sha512-4+YIK4Abzv8172/SGqObnUjaIHjLEuUasz9EwQj/9xmPPkYJy2Mh03Q/lJfSD3YLzbxy5FeTq5Uw0323Oh6SJQ==", + "dev": true, + "peer": true, + "requires": { + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^0.0.51", + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/wasm-edit": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "acorn": "^8.7.1", + "acorn-import-assertions": "^1.7.6", + "browserslist": "^4.14.5", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.10.0", + "es-module-lexer": "^0.9.0", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.9", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.1.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.1.3", + "watchpack": "^2.4.0", + "webpack-sources": "^3.2.3" + }, + "dependencies": { + "@types/estree": { + "version": "0.0.51", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", + "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==", + "dev": true, + "peer": true + }, + "acorn": { + "version": "8.8.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", + "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", + "dev": true, + "peer": true + }, + "acorn-import-assertions": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", + "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", + "dev": true, + "peer": true, + "requires": {} + }, + "enhanced-resolve": { + "version": "5.12.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz", + "integrity": "sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ==", + "dev": true, + "peer": true, + "requires": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + } + }, + "events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, + "peer": true + }, + "tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "dev": true, + "peer": true + } + } + }, + "webpack-sources": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "dev": true, + "peer": true + }, "whatwg-fetch": { "version": "3.6.2", "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.2.tgz", @@ -25490,6 +30945,31 @@ "isexe": "^2.0.0" } }, + "which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "requires": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + } + }, + "which-collection": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", + "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", + "dev": true, + "requires": { + "is-map": "^2.0.1", + "is-set": "^2.0.1", + "is-weakmap": "^2.0.1", + "is-weakset": "^2.0.1" + } + }, "which-module": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", @@ -25510,6 +30990,12 @@ "is-typed-array": "^1.1.10" } }, + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true + }, "workerpool": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", diff --git a/webapp/channels/e2e/cypress/package.json b/e2e/cypress/package.json similarity index 72% rename from webapp/channels/e2e/cypress/package.json rename to e2e/cypress/package.json index 3bfc81ae8f..ada4a1ffec 100644 --- a/webapp/channels/e2e/cypress/package.json +++ b/e2e/cypress/package.json @@ -1,6 +1,9 @@ { "devDependencies": { + "@babel/eslint-parser": "7.19.1", + "@babel/eslint-plugin": "7.19.1", "@cypress/request": "2.88.11", + "@cypress/skip-test": "2.6.1", "@mattermost/types": "7.4.0", "@testing-library/cypress": "9.0.0", "@types/async": "3.2.16", @@ -17,6 +20,8 @@ "@types/recursive-readdir": "2.2.1", "@types/shelljs": "0.8.11", "@types/uuid": "9.0.0", + "@typescript-eslint/eslint-plugin": "5.55.0", + "@typescript-eslint/parser": "5.55.0", "async": "3.2.4", "authenticator": "1.1.5", "aws-sdk": "2.1295.0", @@ -34,6 +39,14 @@ "dayjs": "1.11.7", "deepmerge": "4.2.2", "dotenv": "16.0.3", + "eslint": "7.32.0", + "eslint-import-resolver-webpack": "0.13.2", + "eslint-plugin-cypress": "2.12.1", + "eslint-plugin-header": "3.1.1", + "eslint-plugin-import": "2.27.5", + "eslint-plugin-mattermost": "github:mattermost/eslint-plugin-mattermost#5b0c972eacf19286e4c66221b39113bf8728a99e", + "eslint-plugin-no-only-tests": "3.1.0", + "eslint-plugin-react": "7.32.2", "express": "4.18.2", "extract-zip": "2.0.1", "knex": "2.4.0", @@ -67,19 +80,19 @@ "postinstall": "patch-package", "check-types": "tsc -b", "cypress:open": "cross-env TZ=Etc/UTC cypress open", - "cypress:run": "cross-env TZ=Etc/UTC cypress run --browser chrome --config excludeSpecPattern='**/enterprise/**/*.{js,ts}'", - "cypress:run:enterprise": "cross-env TZ=Etc/UTC cypress run --browser chrome --spec='tests/integration/enterprise/**/*_spec.{js,ts}'", - "cypress:run:firefox": "cross-env TZ=Etc/UTC cypress run --browser firefox --config ignoreTestFiles='**/enterprise/**/*.{js,ts}'", - "cypress:run:firefox:enterprise": "cross-env TZ=Etc/UTC cypress run --browser firefox --spec='tests/integration/enterprise/**/*_spec.{js,ts}'", - "cypress:run:edge": "cross-env TZ=Etc/UTC cypress run --browser edge --config ignoreTestFiles='**/enterprise/**/*.{js,ts}'", - "cypress:run:edge:enterprise": "cross-env TZ=Etc/UTC cypress run --browser edge --spec='tests/integration/enterprise/**/*_spec.{js,ts}'", - "cypress:run:electron": "cross-env TZ=Etc/UTC cypress run --browser electron --config ignoreTestFiles='**/enterprise/**/*.{js,ts}'", - "cypress:run:electron:enterprise": "cross-env TZ=Etc/UTC cypress run --browser electron --spec='tests/integration/enterprise/**/*_spec.{js,ts}'", + "cypress:run": "cross-env TZ=Etc/UTC cypress run", + "cypress:run:chrome": "cross-env TZ=Etc/UTC cypress run --browser chrome", + "cypress:run:firefox": "cross-env TZ=Etc/UTC cypress run --browser firefox", + "cypress:run:edge": "cross-env TZ=Etc/UTC cypress run --browser edge", + "cypress:run:electron": "cross-env TZ=Etc/UTC cypress run --browser electron", "benchmarks:run-server": "cd mattermost && bin/mattermost", "start:webhook": "node webhook_serve.js", - "test": "start-test start:webhook 3000 test:ci", + "pretest": "npm run clean", + "test": "cross-env TZ=Etc/UTC cypress run", "test:ci": "node run_tests.js", - "uniq-meta": "grep -r \"^// $META:\" cypress | grep -ow '@\\w*' | sort | uniq" + "uniq-meta": "grep -r \"^// $META:\" cypress | grep -ow '@\\w*' | sort | uniq", + "check": "eslint --ext .js,.ts . --quiet --cache", + "fix": "eslint --ext .js,.ts . --quiet --fix --cache" }, "dependencies": { "patch-package": "6.5.1" diff --git a/webapp/channels/e2e/cypress/patches/@testing-library+cypress+9.0.0.patch b/e2e/cypress/patches/@testing-library+cypress+9.0.0.patch similarity index 100% rename from webapp/channels/e2e/cypress/patches/@testing-library+cypress+9.0.0.patch rename to e2e/cypress/patches/@testing-library+cypress+9.0.0.patch diff --git a/webapp/channels/e2e/cypress/run_test_cycle.js b/e2e/cypress/run_test_cycle.js similarity index 100% rename from webapp/channels/e2e/cypress/run_test_cycle.js rename to e2e/cypress/run_test_cycle.js diff --git a/webapp/channels/e2e/cypress/run_tests.js b/e2e/cypress/run_tests.js similarity index 100% rename from webapp/channels/e2e/cypress/run_tests.js rename to e2e/cypress/run_tests.js diff --git a/webapp/channels/e2e/cypress/save_report.js b/e2e/cypress/save_report.js similarity index 100% rename from webapp/channels/e2e/cypress/save_report.js rename to e2e/cypress/save_report.js diff --git a/webapp/channels/e2e/cypress/tests/extensions/Ignore-X-Frame-headers/background.js b/e2e/cypress/tests/extensions/Ignore-X-Frame-headers/background.js similarity index 100% rename from webapp/channels/e2e/cypress/tests/extensions/Ignore-X-Frame-headers/background.js rename to e2e/cypress/tests/extensions/Ignore-X-Frame-headers/background.js diff --git a/webapp/channels/e2e/cypress/tests/extensions/Ignore-X-Frame-headers/manifest.json b/e2e/cypress/tests/extensions/Ignore-X-Frame-headers/manifest.json similarity index 100% rename from webapp/channels/e2e/cypress/tests/extensions/Ignore-X-Frame-headers/manifest.json rename to e2e/cypress/tests/extensions/Ignore-X-Frame-headers/manifest.json diff --git a/webapp/channels/e2e/cypress/tests/fixtures/MM-logo-horizontal.png b/e2e/cypress/tests/fixtures/MM-logo-horizontal.png similarity index 100% rename from webapp/channels/e2e/cypress/tests/fixtures/MM-logo-horizontal.png rename to e2e/cypress/tests/fixtures/MM-logo-horizontal.png diff --git a/webapp/channels/e2e/cypress/tests/fixtures/animated-gif-image-file.gif b/e2e/cypress/tests/fixtures/animated-gif-image-file.gif similarity index 100% rename from webapp/channels/e2e/cypress/tests/fixtures/animated-gif-image-file.gif rename to e2e/cypress/tests/fixtures/animated-gif-image-file.gif diff --git a/webapp/channels/e2e/cypress/tests/fixtures/bmp-image-file.bmp b/e2e/cypress/tests/fixtures/bmp-image-file.bmp similarity index 100% rename from webapp/channels/e2e/cypress/tests/fixtures/bmp-image-file.bmp rename to e2e/cypress/tests/fixtures/bmp-image-file.bmp diff --git a/webapp/channels/e2e/cypress/tests/fixtures/bot-default-avatar.png b/e2e/cypress/tests/fixtures/bot-default-avatar.png similarity index 100% rename from webapp/channels/e2e/cypress/tests/fixtures/bot-default-avatar.png rename to e2e/cypress/tests/fixtures/bot-default-avatar.png diff --git a/webapp/channels/e2e/cypress/tests/fixtures/client_billing.json b/e2e/cypress/tests/fixtures/client_billing.json similarity index 100% rename from webapp/channels/e2e/cypress/tests/fixtures/client_billing.json rename to e2e/cypress/tests/fixtures/client_billing.json diff --git a/webapp/channels/e2e/cypress/tests/fixtures/console-example-inputs.json b/e2e/cypress/tests/fixtures/console-example-inputs.json similarity index 100% rename from webapp/channels/e2e/cypress/tests/fixtures/console-example-inputs.json rename to e2e/cypress/tests/fixtures/console-example-inputs.json diff --git a/webapp/channels/e2e/cypress/tests/fixtures/date_time_format.js b/e2e/cypress/tests/fixtures/date_time_format.js similarity index 100% rename from webapp/channels/e2e/cypress/tests/fixtures/date_time_format.js rename to e2e/cypress/tests/fixtures/date_time_format.js diff --git a/webapp/channels/e2e/cypress/tests/fixtures/favicon-16x16.png b/e2e/cypress/tests/fixtures/favicon-16x16.png similarity index 100% rename from webapp/channels/e2e/cypress/tests/fixtures/favicon-16x16.png rename to e2e/cypress/tests/fixtures/favicon-16x16.png diff --git a/webapp/channels/e2e/cypress/tests/fixtures/favicon-default-16x16.png b/e2e/cypress/tests/fixtures/favicon-default-16x16.png similarity index 100% rename from webapp/channels/e2e/cypress/tests/fixtures/favicon-default-16x16.png rename to e2e/cypress/tests/fixtures/favicon-default-16x16.png diff --git a/webapp/channels/e2e/cypress/tests/fixtures/favicon-mentions-16x16.png b/e2e/cypress/tests/fixtures/favicon-mentions-16x16.png similarity index 100% rename from webapp/channels/e2e/cypress/tests/fixtures/favicon-mentions-16x16.png rename to e2e/cypress/tests/fixtures/favicon-mentions-16x16.png diff --git a/webapp/channels/e2e/cypress/tests/fixtures/favicon-unread-16x16.png b/e2e/cypress/tests/fixtures/favicon-unread-16x16.png similarity index 100% rename from webapp/channels/e2e/cypress/tests/fixtures/favicon-unread-16x16.png rename to e2e/cypress/tests/fixtures/favicon-unread-16x16.png diff --git a/webapp/channels/e2e/cypress/tests/fixtures/gif-image-file-resized.gif b/e2e/cypress/tests/fixtures/gif-image-file-resized.gif similarity index 100% rename from webapp/channels/e2e/cypress/tests/fixtures/gif-image-file-resized.gif rename to e2e/cypress/tests/fixtures/gif-image-file-resized.gif diff --git a/webapp/channels/e2e/cypress/tests/fixtures/gif-image-file.gif b/e2e/cypress/tests/fixtures/gif-image-file.gif similarity index 100% rename from webapp/channels/e2e/cypress/tests/fixtures/gif-image-file.gif rename to e2e/cypress/tests/fixtures/gif-image-file.gif diff --git a/webapp/channels/e2e/cypress/tests/fixtures/hooks/message_menus.json b/e2e/cypress/tests/fixtures/hooks/message_menus.json similarity index 100% rename from webapp/channels/e2e/cypress/tests/fixtures/hooks/message_menus.json rename to e2e/cypress/tests/fixtures/hooks/message_menus.json diff --git a/webapp/channels/e2e/cypress/tests/fixtures/hooks/message_menus_with_datasource.json b/e2e/cypress/tests/fixtures/hooks/message_menus_with_datasource.json similarity index 100% rename from webapp/channels/e2e/cypress/tests/fixtures/hooks/message_menus_with_datasource.json rename to e2e/cypress/tests/fixtures/hooks/message_menus_with_datasource.json diff --git a/webapp/channels/e2e/cypress/tests/fixtures/huge-image.jpg b/e2e/cypress/tests/fixtures/huge-image.jpg similarity index 100% rename from webapp/channels/e2e/cypress/tests/fixtures/huge-image.jpg rename to e2e/cypress/tests/fixtures/huge-image.jpg diff --git a/webapp/channels/e2e/cypress/tests/fixtures/image-1000x40.jpg b/e2e/cypress/tests/fixtures/image-1000x40.jpg similarity index 100% rename from webapp/channels/e2e/cypress/tests/fixtures/image-1000x40.jpg rename to e2e/cypress/tests/fixtures/image-1000x40.jpg diff --git a/webapp/channels/e2e/cypress/tests/fixtures/image-1600x40.jpg b/e2e/cypress/tests/fixtures/image-1600x40.jpg similarity index 100% rename from webapp/channels/e2e/cypress/tests/fixtures/image-1600x40.jpg rename to e2e/cypress/tests/fixtures/image-1600x40.jpg diff --git a/webapp/channels/e2e/cypress/tests/fixtures/image-20x20.jpg b/e2e/cypress/tests/fixtures/image-20x20.jpg similarity index 100% rename from webapp/channels/e2e/cypress/tests/fixtures/image-20x20.jpg rename to e2e/cypress/tests/fixtures/image-20x20.jpg diff --git a/webapp/channels/e2e/cypress/tests/fixtures/image-400x40.jpg b/e2e/cypress/tests/fixtures/image-400x40.jpg similarity index 100% rename from webapp/channels/e2e/cypress/tests/fixtures/image-400x40.jpg rename to e2e/cypress/tests/fixtures/image-400x40.jpg diff --git a/webapp/channels/e2e/cypress/tests/fixtures/image-400x400.jpg b/e2e/cypress/tests/fixtures/image-400x400.jpg similarity index 100% rename from webapp/channels/e2e/cypress/tests/fixtures/image-400x400.jpg rename to e2e/cypress/tests/fixtures/image-400x400.jpg diff --git a/webapp/channels/e2e/cypress/tests/fixtures/image-40x400.jpg b/e2e/cypress/tests/fixtures/image-40x400.jpg similarity index 100% rename from webapp/channels/e2e/cypress/tests/fixtures/image-40x400.jpg rename to e2e/cypress/tests/fixtures/image-40x400.jpg diff --git a/webapp/channels/e2e/cypress/tests/fixtures/image-50x50.jpg b/e2e/cypress/tests/fixtures/image-50x50.jpg similarity index 100% rename from webapp/channels/e2e/cypress/tests/fixtures/image-50x50.jpg rename to e2e/cypress/tests/fixtures/image-50x50.jpg diff --git a/webapp/channels/e2e/cypress/tests/fixtures/image-60x60.jpg b/e2e/cypress/tests/fixtures/image-60x60.jpg similarity index 100% rename from webapp/channels/e2e/cypress/tests/fixtures/image-60x60.jpg rename to e2e/cypress/tests/fixtures/image-60x60.jpg diff --git a/webapp/channels/e2e/cypress/tests/fixtures/image-small-height.png b/e2e/cypress/tests/fixtures/image-small-height.png similarity index 100% rename from webapp/channels/e2e/cypress/tests/fixtures/image-small-height.png rename to e2e/cypress/tests/fixtures/image-small-height.png diff --git a/webapp/channels/e2e/cypress/tests/fixtures/image-small-width.png b/e2e/cypress/tests/fixtures/image-small-width.png similarity index 100% rename from webapp/channels/e2e/cypress/tests/fixtures/image-small-width.png rename to e2e/cypress/tests/fixtures/image-small-width.png diff --git a/webapp/channels/e2e/cypress/tests/fixtures/interactive_message_menus_options.json b/e2e/cypress/tests/fixtures/interactive_message_menus_options.json similarity index 100% rename from webapp/channels/e2e/cypress/tests/fixtures/interactive_message_menus_options.json rename to e2e/cypress/tests/fixtures/interactive_message_menus_options.json diff --git a/webapp/channels/e2e/cypress/tests/fixtures/jpg-image-file.jpg b/e2e/cypress/tests/fixtures/jpg-image-file.jpg similarity index 100% rename from webapp/channels/e2e/cypress/tests/fixtures/jpg-image-file.jpg rename to e2e/cypress/tests/fixtures/jpg-image-file.jpg diff --git a/webapp/channels/e2e/cypress/tests/fixtures/ldap-add-user.ldif b/e2e/cypress/tests/fixtures/ldap-add-user.ldif similarity index 100% rename from webapp/channels/e2e/cypress/tests/fixtures/ldap-add-user.ldif rename to e2e/cypress/tests/fixtures/ldap-add-user.ldif diff --git a/webapp/channels/e2e/cypress/tests/fixtures/ldap-reset-data.ldif b/e2e/cypress/tests/fixtures/ldap-reset-data.ldif similarity index 100% rename from webapp/channels/e2e/cypress/tests/fixtures/ldap-reset-data.ldif rename to e2e/cypress/tests/fixtures/ldap-reset-data.ldif diff --git a/webapp/channels/e2e/cypress/tests/fixtures/ldap_users.json b/e2e/cypress/tests/fixtures/ldap_users.json similarity index 100% rename from webapp/channels/e2e/cypress/tests/fixtures/ldap_users.json rename to e2e/cypress/tests/fixtures/ldap_users.json diff --git a/webapp/channels/e2e/cypress/tests/fixtures/long_text_post.txt b/e2e/cypress/tests/fixtures/long_text_post.txt similarity index 100% rename from webapp/channels/e2e/cypress/tests/fixtures/long_text_post.txt rename to e2e/cypress/tests/fixtures/long_text_post.txt diff --git a/webapp/channels/e2e/cypress/tests/fixtures/m4a-audio-file.m4a b/e2e/cypress/tests/fixtures/m4a-audio-file.m4a similarity index 100% rename from webapp/channels/e2e/cypress/tests/fixtures/m4a-audio-file.m4a rename to e2e/cypress/tests/fixtures/m4a-audio-file.m4a diff --git a/webapp/channels/e2e/cypress/tests/fixtures/markdown/markdown_basic.html b/e2e/cypress/tests/fixtures/markdown/markdown_basic.html similarity index 100% rename from webapp/channels/e2e/cypress/tests/fixtures/markdown/markdown_basic.html rename to e2e/cypress/tests/fixtures/markdown/markdown_basic.html diff --git a/webapp/channels/e2e/cypress/tests/fixtures/markdown/markdown_basic.md b/e2e/cypress/tests/fixtures/markdown/markdown_basic.md similarity index 100% rename from webapp/channels/e2e/cypress/tests/fixtures/markdown/markdown_basic.md rename to e2e/cypress/tests/fixtures/markdown/markdown_basic.md diff --git a/webapp/channels/e2e/cypress/tests/fixtures/markdown/markdown_block_quotes_1.html b/e2e/cypress/tests/fixtures/markdown/markdown_block_quotes_1.html similarity index 100% rename from webapp/channels/e2e/cypress/tests/fixtures/markdown/markdown_block_quotes_1.html rename to e2e/cypress/tests/fixtures/markdown/markdown_block_quotes_1.html diff --git a/webapp/channels/e2e/cypress/tests/fixtures/markdown/markdown_block_quotes_1.md b/e2e/cypress/tests/fixtures/markdown/markdown_block_quotes_1.md similarity index 100% rename from webapp/channels/e2e/cypress/tests/fixtures/markdown/markdown_block_quotes_1.md rename to e2e/cypress/tests/fixtures/markdown/markdown_block_quotes_1.md diff --git a/webapp/channels/e2e/cypress/tests/fixtures/markdown/markdown_block_quotes_2.md b/e2e/cypress/tests/fixtures/markdown/markdown_block_quotes_2.md similarity index 100% rename from webapp/channels/e2e/cypress/tests/fixtures/markdown/markdown_block_quotes_2.md rename to e2e/cypress/tests/fixtures/markdown/markdown_block_quotes_2.md diff --git a/webapp/channels/e2e/cypress/tests/fixtures/markdown/markdown_carriage_return.html b/e2e/cypress/tests/fixtures/markdown/markdown_carriage_return.html similarity index 100% rename from webapp/channels/e2e/cypress/tests/fixtures/markdown/markdown_carriage_return.html rename to e2e/cypress/tests/fixtures/markdown/markdown_carriage_return.html diff --git a/webapp/channels/e2e/cypress/tests/fixtures/markdown/markdown_carriage_return.md b/e2e/cypress/tests/fixtures/markdown/markdown_carriage_return.md similarity index 100% rename from webapp/channels/e2e/cypress/tests/fixtures/markdown/markdown_carriage_return.md rename to e2e/cypress/tests/fixtures/markdown/markdown_carriage_return.md diff --git a/webapp/channels/e2e/cypress/tests/fixtures/markdown/markdown_carriage_return_two_lines.html b/e2e/cypress/tests/fixtures/markdown/markdown_carriage_return_two_lines.html similarity index 100% rename from webapp/channels/e2e/cypress/tests/fixtures/markdown/markdown_carriage_return_two_lines.html rename to e2e/cypress/tests/fixtures/markdown/markdown_carriage_return_two_lines.html diff --git a/webapp/channels/e2e/cypress/tests/fixtures/markdown/markdown_carriage_return_two_lines.md b/e2e/cypress/tests/fixtures/markdown/markdown_carriage_return_two_lines.md similarity index 100% rename from webapp/channels/e2e/cypress/tests/fixtures/markdown/markdown_carriage_return_two_lines.md rename to e2e/cypress/tests/fixtures/markdown/markdown_carriage_return_two_lines.md diff --git a/webapp/channels/e2e/cypress/tests/fixtures/markdown/markdown_code_block.html b/e2e/cypress/tests/fixtures/markdown/markdown_code_block.html similarity index 100% rename from webapp/channels/e2e/cypress/tests/fixtures/markdown/markdown_code_block.html rename to e2e/cypress/tests/fixtures/markdown/markdown_code_block.html diff --git a/webapp/channels/e2e/cypress/tests/fixtures/markdown/markdown_code_block.md b/e2e/cypress/tests/fixtures/markdown/markdown_code_block.md similarity index 100% rename from webapp/channels/e2e/cypress/tests/fixtures/markdown/markdown_code_block.md rename to e2e/cypress/tests/fixtures/markdown/markdown_code_block.md diff --git a/webapp/channels/e2e/cypress/tests/fixtures/markdown/markdown_code_syntax.html b/e2e/cypress/tests/fixtures/markdown/markdown_code_syntax.html similarity index 100% rename from webapp/channels/e2e/cypress/tests/fixtures/markdown/markdown_code_syntax.html rename to e2e/cypress/tests/fixtures/markdown/markdown_code_syntax.html diff --git a/webapp/channels/e2e/cypress/tests/fixtures/markdown/markdown_escape_characters.html b/e2e/cypress/tests/fixtures/markdown/markdown_escape_characters.html similarity index 100% rename from webapp/channels/e2e/cypress/tests/fixtures/markdown/markdown_escape_characters.html rename to e2e/cypress/tests/fixtures/markdown/markdown_escape_characters.html diff --git a/webapp/channels/e2e/cypress/tests/fixtures/markdown/markdown_escape_characters.md b/e2e/cypress/tests/fixtures/markdown/markdown_escape_characters.md similarity index 100% rename from webapp/channels/e2e/cypress/tests/fixtures/markdown/markdown_escape_characters.md rename to e2e/cypress/tests/fixtures/markdown/markdown_escape_characters.md diff --git a/webapp/channels/e2e/cypress/tests/fixtures/markdown/markdown_headings.html b/e2e/cypress/tests/fixtures/markdown/markdown_headings.html similarity index 100% rename from webapp/channels/e2e/cypress/tests/fixtures/markdown/markdown_headings.html rename to e2e/cypress/tests/fixtures/markdown/markdown_headings.html diff --git a/webapp/channels/e2e/cypress/tests/fixtures/markdown/markdown_headings.md b/e2e/cypress/tests/fixtures/markdown/markdown_headings.md similarity index 100% rename from webapp/channels/e2e/cypress/tests/fixtures/markdown/markdown_headings.md rename to e2e/cypress/tests/fixtures/markdown/markdown_headings.md diff --git a/webapp/channels/e2e/cypress/tests/fixtures/markdown/markdown_inline_code.html b/e2e/cypress/tests/fixtures/markdown/markdown_inline_code.html similarity index 100% rename from webapp/channels/e2e/cypress/tests/fixtures/markdown/markdown_inline_code.html rename to e2e/cypress/tests/fixtures/markdown/markdown_inline_code.html diff --git a/webapp/channels/e2e/cypress/tests/fixtures/markdown/markdown_inline_code.md b/e2e/cypress/tests/fixtures/markdown/markdown_inline_code.md similarity index 100% rename from webapp/channels/e2e/cypress/tests/fixtures/markdown/markdown_inline_code.md rename to e2e/cypress/tests/fixtures/markdown/markdown_inline_code.md diff --git a/webapp/channels/e2e/cypress/tests/fixtures/markdown/markdown_inline_images_1.md b/e2e/cypress/tests/fixtures/markdown/markdown_inline_images_1.md similarity index 100% rename from webapp/channels/e2e/cypress/tests/fixtures/markdown/markdown_inline_images_1.md rename to e2e/cypress/tests/fixtures/markdown/markdown_inline_images_1.md diff --git a/webapp/channels/e2e/cypress/tests/fixtures/markdown/markdown_inline_images_2.md b/e2e/cypress/tests/fixtures/markdown/markdown_inline_images_2.md similarity index 100% rename from webapp/channels/e2e/cypress/tests/fixtures/markdown/markdown_inline_images_2.md rename to e2e/cypress/tests/fixtures/markdown/markdown_inline_images_2.md diff --git a/webapp/channels/e2e/cypress/tests/fixtures/markdown/markdown_inline_images_3.md b/e2e/cypress/tests/fixtures/markdown/markdown_inline_images_3.md similarity index 100% rename from webapp/channels/e2e/cypress/tests/fixtures/markdown/markdown_inline_images_3.md rename to e2e/cypress/tests/fixtures/markdown/markdown_inline_images_3.md diff --git a/webapp/channels/e2e/cypress/tests/fixtures/markdown/markdown_inline_images_4.md b/e2e/cypress/tests/fixtures/markdown/markdown_inline_images_4.md similarity index 100% rename from webapp/channels/e2e/cypress/tests/fixtures/markdown/markdown_inline_images_4.md rename to e2e/cypress/tests/fixtures/markdown/markdown_inline_images_4.md diff --git a/webapp/channels/e2e/cypress/tests/fixtures/markdown/markdown_inline_images_5.md b/e2e/cypress/tests/fixtures/markdown/markdown_inline_images_5.md similarity index 100% rename from webapp/channels/e2e/cypress/tests/fixtures/markdown/markdown_inline_images_5.md rename to e2e/cypress/tests/fixtures/markdown/markdown_inline_images_5.md diff --git a/webapp/channels/e2e/cypress/tests/fixtures/markdown/markdown_inline_images_6.md b/e2e/cypress/tests/fixtures/markdown/markdown_inline_images_6.md similarity index 100% rename from webapp/channels/e2e/cypress/tests/fixtures/markdown/markdown_inline_images_6.md rename to e2e/cypress/tests/fixtures/markdown/markdown_inline_images_6.md diff --git a/webapp/channels/e2e/cypress/tests/fixtures/markdown/markdown_latex.html b/e2e/cypress/tests/fixtures/markdown/markdown_latex.html similarity index 100% rename from webapp/channels/e2e/cypress/tests/fixtures/markdown/markdown_latex.html rename to e2e/cypress/tests/fixtures/markdown/markdown_latex.html diff --git a/webapp/channels/e2e/cypress/tests/fixtures/markdown/markdown_latex.md b/e2e/cypress/tests/fixtures/markdown/markdown_latex.md similarity index 100% rename from webapp/channels/e2e/cypress/tests/fixtures/markdown/markdown_latex.md rename to e2e/cypress/tests/fixtures/markdown/markdown_latex.md diff --git a/webapp/channels/e2e/cypress/tests/fixtures/markdown/markdown_lines.html b/e2e/cypress/tests/fixtures/markdown/markdown_lines.html similarity index 100% rename from webapp/channels/e2e/cypress/tests/fixtures/markdown/markdown_lines.html rename to e2e/cypress/tests/fixtures/markdown/markdown_lines.html diff --git a/webapp/channels/e2e/cypress/tests/fixtures/markdown/markdown_lines.md b/e2e/cypress/tests/fixtures/markdown/markdown_lines.md similarity index 100% rename from webapp/channels/e2e/cypress/tests/fixtures/markdown/markdown_lines.md rename to e2e/cypress/tests/fixtures/markdown/markdown_lines.md diff --git a/webapp/channels/e2e/cypress/tests/fixtures/markdown/markdown_list.html b/e2e/cypress/tests/fixtures/markdown/markdown_list.html similarity index 100% rename from webapp/channels/e2e/cypress/tests/fixtures/markdown/markdown_list.html rename to e2e/cypress/tests/fixtures/markdown/markdown_list.html diff --git a/webapp/channels/e2e/cypress/tests/fixtures/markdown/markdown_not_autolink.html b/e2e/cypress/tests/fixtures/markdown/markdown_not_autolink.html similarity index 100% rename from webapp/channels/e2e/cypress/tests/fixtures/markdown/markdown_not_autolink.html rename to e2e/cypress/tests/fixtures/markdown/markdown_not_autolink.html diff --git a/webapp/channels/e2e/cypress/tests/fixtures/markdown/markdown_not_autolink.md b/e2e/cypress/tests/fixtures/markdown/markdown_not_autolink.md similarity index 100% rename from webapp/channels/e2e/cypress/tests/fixtures/markdown/markdown_not_autolink.md rename to e2e/cypress/tests/fixtures/markdown/markdown_not_autolink.md diff --git a/webapp/channels/e2e/cypress/tests/fixtures/markdown/markdown_not_in_code_block.html b/e2e/cypress/tests/fixtures/markdown/markdown_not_in_code_block.html similarity index 100% rename from webapp/channels/e2e/cypress/tests/fixtures/markdown/markdown_not_in_code_block.html rename to e2e/cypress/tests/fixtures/markdown/markdown_not_in_code_block.html diff --git a/webapp/channels/e2e/cypress/tests/fixtures/markdown/markdown_not_in_code_block.md b/e2e/cypress/tests/fixtures/markdown/markdown_not_in_code_block.md similarity index 100% rename from webapp/channels/e2e/cypress/tests/fixtures/markdown/markdown_not_in_code_block.md rename to e2e/cypress/tests/fixtures/markdown/markdown_not_in_code_block.md diff --git a/webapp/channels/e2e/cypress/tests/fixtures/markdown/markdown_postgres.html b/e2e/cypress/tests/fixtures/markdown/markdown_postgres.html similarity index 100% rename from webapp/channels/e2e/cypress/tests/fixtures/markdown/markdown_postgres.html rename to e2e/cypress/tests/fixtures/markdown/markdown_postgres.html diff --git a/webapp/channels/e2e/cypress/tests/fixtures/markdown/markdown_postgres.md b/e2e/cypress/tests/fixtures/markdown/markdown_postgres.md similarity index 100% rename from webapp/channels/e2e/cypress/tests/fixtures/markdown/markdown_postgres.md rename to e2e/cypress/tests/fixtures/markdown/markdown_postgres.md diff --git a/webapp/channels/e2e/cypress/tests/fixtures/markdown/markdown_python.html b/e2e/cypress/tests/fixtures/markdown/markdown_python.html similarity index 100% rename from webapp/channels/e2e/cypress/tests/fixtures/markdown/markdown_python.html rename to e2e/cypress/tests/fixtures/markdown/markdown_python.html diff --git a/webapp/channels/e2e/cypress/tests/fixtures/markdown/markdown_python.md b/e2e/cypress/tests/fixtures/markdown/markdown_python.md similarity index 100% rename from webapp/channels/e2e/cypress/tests/fixtures/markdown/markdown_python.md rename to e2e/cypress/tests/fixtures/markdown/markdown_python.md diff --git a/webapp/channels/e2e/cypress/tests/fixtures/markdown/markdown_shell.html b/e2e/cypress/tests/fixtures/markdown/markdown_shell.html similarity index 100% rename from webapp/channels/e2e/cypress/tests/fixtures/markdown/markdown_shell.html rename to e2e/cypress/tests/fixtures/markdown/markdown_shell.html diff --git a/webapp/channels/e2e/cypress/tests/fixtures/markdown/markdown_shell.md b/e2e/cypress/tests/fixtures/markdown/markdown_shell.md similarity index 100% rename from webapp/channels/e2e/cypress/tests/fixtures/markdown/markdown_shell.md rename to e2e/cypress/tests/fixtures/markdown/markdown_shell.md diff --git a/webapp/channels/e2e/cypress/tests/fixtures/markdown/markdown_tables.html b/e2e/cypress/tests/fixtures/markdown/markdown_tables.html similarity index 100% rename from webapp/channels/e2e/cypress/tests/fixtures/markdown/markdown_tables.html rename to e2e/cypress/tests/fixtures/markdown/markdown_tables.html diff --git a/webapp/channels/e2e/cypress/tests/fixtures/markdown/markdown_test_basic.html b/e2e/cypress/tests/fixtures/markdown/markdown_test_basic.html similarity index 100% rename from webapp/channels/e2e/cypress/tests/fixtures/markdown/markdown_test_basic.html rename to e2e/cypress/tests/fixtures/markdown/markdown_test_basic.html diff --git a/webapp/channels/e2e/cypress/tests/fixtures/markdown/markdown_text_style.html b/e2e/cypress/tests/fixtures/markdown/markdown_text_style.html similarity index 100% rename from webapp/channels/e2e/cypress/tests/fixtures/markdown/markdown_text_style.html rename to e2e/cypress/tests/fixtures/markdown/markdown_text_style.html diff --git a/webapp/channels/e2e/cypress/tests/fixtures/markdown/markdown_text_style.md b/e2e/cypress/tests/fixtures/markdown/markdown_text_style.md similarity index 100% rename from webapp/channels/e2e/cypress/tests/fixtures/markdown/markdown_text_style.md rename to e2e/cypress/tests/fixtures/markdown/markdown_text_style.md diff --git a/webapp/channels/e2e/cypress/tests/fixtures/markdown/markdown_typescript.html b/e2e/cypress/tests/fixtures/markdown/markdown_typescript.html similarity index 100% rename from webapp/channels/e2e/cypress/tests/fixtures/markdown/markdown_typescript.html rename to e2e/cypress/tests/fixtures/markdown/markdown_typescript.html diff --git a/webapp/channels/e2e/cypress/tests/fixtures/markdown/markdown_typescript.md b/e2e/cypress/tests/fixtures/markdown/markdown_typescript.md similarity index 100% rename from webapp/channels/e2e/cypress/tests/fixtures/markdown/markdown_typescript.md rename to e2e/cypress/tests/fixtures/markdown/markdown_typescript.md diff --git a/webapp/channels/e2e/cypress/tests/fixtures/mattermost-icon.png b/e2e/cypress/tests/fixtures/mattermost-icon.png similarity index 100% rename from webapp/channels/e2e/cypress/tests/fixtures/mattermost-icon.png rename to e2e/cypress/tests/fixtures/mattermost-icon.png diff --git a/webapp/channels/e2e/cypress/tests/fixtures/mattermost-icon_128x128.png b/e2e/cypress/tests/fixtures/mattermost-icon_128x128.png similarity index 100% rename from webapp/channels/e2e/cypress/tests/fixtures/mattermost-icon_128x128.png rename to e2e/cypress/tests/fixtures/mattermost-icon_128x128.png diff --git a/webapp/channels/e2e/cypress/tests/fixtures/messages.js b/e2e/cypress/tests/fixtures/messages.js similarity index 100% rename from webapp/channels/e2e/cypress/tests/fixtures/messages.js rename to e2e/cypress/tests/fixtures/messages.js diff --git a/webapp/channels/e2e/cypress/tests/fixtures/mm_file_testing/Audio/AAC.aac b/e2e/cypress/tests/fixtures/mm_file_testing/Audio/AAC.aac similarity index 100% rename from webapp/channels/e2e/cypress/tests/fixtures/mm_file_testing/Audio/AAC.aac rename to e2e/cypress/tests/fixtures/mm_file_testing/Audio/AAC.aac diff --git a/webapp/channels/e2e/cypress/tests/fixtures/mm_file_testing/Audio/FLAC.flac b/e2e/cypress/tests/fixtures/mm_file_testing/Audio/FLAC.flac similarity index 100% rename from webapp/channels/e2e/cypress/tests/fixtures/mm_file_testing/Audio/FLAC.flac rename to e2e/cypress/tests/fixtures/mm_file_testing/Audio/FLAC.flac diff --git a/webapp/channels/e2e/cypress/tests/fixtures/mm_file_testing/Audio/M4A.m4a b/e2e/cypress/tests/fixtures/mm_file_testing/Audio/M4A.m4a similarity index 100% rename from webapp/channels/e2e/cypress/tests/fixtures/mm_file_testing/Audio/M4A.m4a rename to e2e/cypress/tests/fixtures/mm_file_testing/Audio/M4A.m4a diff --git a/webapp/channels/e2e/cypress/tests/fixtures/mm_file_testing/Audio/M4R.m4r b/e2e/cypress/tests/fixtures/mm_file_testing/Audio/M4R.m4r similarity index 100% rename from webapp/channels/e2e/cypress/tests/fixtures/mm_file_testing/Audio/M4R.m4r rename to e2e/cypress/tests/fixtures/mm_file_testing/Audio/M4R.m4r diff --git a/webapp/channels/e2e/cypress/tests/fixtures/mm_file_testing/Audio/MP3.mp3 b/e2e/cypress/tests/fixtures/mm_file_testing/Audio/MP3.mp3 similarity index 100% rename from webapp/channels/e2e/cypress/tests/fixtures/mm_file_testing/Audio/MP3.mp3 rename to e2e/cypress/tests/fixtures/mm_file_testing/Audio/MP3.mp3 diff --git a/webapp/channels/e2e/cypress/tests/fixtures/mm_file_testing/Audio/OGG.ogg b/e2e/cypress/tests/fixtures/mm_file_testing/Audio/OGG.ogg similarity index 100% rename from webapp/channels/e2e/cypress/tests/fixtures/mm_file_testing/Audio/OGG.ogg rename to e2e/cypress/tests/fixtures/mm_file_testing/Audio/OGG.ogg diff --git a/webapp/channels/e2e/cypress/tests/fixtures/mm_file_testing/Audio/WAV.wav b/e2e/cypress/tests/fixtures/mm_file_testing/Audio/WAV.wav similarity index 100% rename from webapp/channels/e2e/cypress/tests/fixtures/mm_file_testing/Audio/WAV.wav rename to e2e/cypress/tests/fixtures/mm_file_testing/Audio/WAV.wav diff --git a/webapp/channels/e2e/cypress/tests/fixtures/mm_file_testing/Audio/WMA.wma b/e2e/cypress/tests/fixtures/mm_file_testing/Audio/WMA.wma similarity index 100% rename from webapp/channels/e2e/cypress/tests/fixtures/mm_file_testing/Audio/WMA.wma rename to e2e/cypress/tests/fixtures/mm_file_testing/Audio/WMA.wma diff --git a/webapp/channels/e2e/cypress/tests/fixtures/mm_file_testing/Code/JSON b/e2e/cypress/tests/fixtures/mm_file_testing/Code/JSON similarity index 100% rename from webapp/channels/e2e/cypress/tests/fixtures/mm_file_testing/Code/JSON rename to e2e/cypress/tests/fixtures/mm_file_testing/Code/JSON diff --git a/webapp/channels/e2e/cypress/tests/fixtures/mm_file_testing/Code/Patch.diff b/e2e/cypress/tests/fixtures/mm_file_testing/Code/Patch.diff similarity index 100% rename from webapp/channels/e2e/cypress/tests/fixtures/mm_file_testing/Code/Patch.diff rename to e2e/cypress/tests/fixtures/mm_file_testing/Code/Patch.diff diff --git a/webapp/channels/e2e/cypress/tests/fixtures/mm_file_testing/Code/Python b/e2e/cypress/tests/fixtures/mm_file_testing/Code/Python similarity index 100% rename from webapp/channels/e2e/cypress/tests/fixtures/mm_file_testing/Code/Python rename to e2e/cypress/tests/fixtures/mm_file_testing/Code/Python diff --git a/webapp/channels/e2e/cypress/tests/fixtures/mm_file_testing/Documents/Excel.xlsx b/e2e/cypress/tests/fixtures/mm_file_testing/Documents/Excel.xlsx similarity index 100% rename from webapp/channels/e2e/cypress/tests/fixtures/mm_file_testing/Documents/Excel.xlsx rename to e2e/cypress/tests/fixtures/mm_file_testing/Documents/Excel.xlsx diff --git a/webapp/channels/e2e/cypress/tests/fixtures/mm_file_testing/Documents/PDF.pdf b/e2e/cypress/tests/fixtures/mm_file_testing/Documents/PDF.pdf similarity index 100% rename from webapp/channels/e2e/cypress/tests/fixtures/mm_file_testing/Documents/PDF.pdf rename to e2e/cypress/tests/fixtures/mm_file_testing/Documents/PDF.pdf diff --git a/webapp/channels/e2e/cypress/tests/fixtures/mm_file_testing/Documents/PPT.pptx b/e2e/cypress/tests/fixtures/mm_file_testing/Documents/PPT.pptx similarity index 100% rename from webapp/channels/e2e/cypress/tests/fixtures/mm_file_testing/Documents/PPT.pptx rename to e2e/cypress/tests/fixtures/mm_file_testing/Documents/PPT.pptx diff --git a/webapp/channels/e2e/cypress/tests/fixtures/mm_file_testing/Documents/Text.txt b/e2e/cypress/tests/fixtures/mm_file_testing/Documents/Text.txt similarity index 100% rename from webapp/channels/e2e/cypress/tests/fixtures/mm_file_testing/Documents/Text.txt rename to e2e/cypress/tests/fixtures/mm_file_testing/Documents/Text.txt diff --git a/webapp/channels/e2e/cypress/tests/fixtures/mm_file_testing/Documents/Word.docx b/e2e/cypress/tests/fixtures/mm_file_testing/Documents/Word.docx similarity index 100% rename from webapp/channels/e2e/cypress/tests/fixtures/mm_file_testing/Documents/Word.docx rename to e2e/cypress/tests/fixtures/mm_file_testing/Documents/Word.docx diff --git a/webapp/channels/e2e/cypress/tests/fixtures/mm_file_testing/Images/BMP.bmp b/e2e/cypress/tests/fixtures/mm_file_testing/Images/BMP.bmp similarity index 100% rename from webapp/channels/e2e/cypress/tests/fixtures/mm_file_testing/Images/BMP.bmp rename to e2e/cypress/tests/fixtures/mm_file_testing/Images/BMP.bmp diff --git a/webapp/channels/e2e/cypress/tests/fixtures/mm_file_testing/Images/GIF.gif b/e2e/cypress/tests/fixtures/mm_file_testing/Images/GIF.gif similarity index 100% rename from webapp/channels/e2e/cypress/tests/fixtures/mm_file_testing/Images/GIF.gif rename to e2e/cypress/tests/fixtures/mm_file_testing/Images/GIF.gif diff --git a/webapp/channels/e2e/cypress/tests/fixtures/mm_file_testing/Images/JPG.jpg b/e2e/cypress/tests/fixtures/mm_file_testing/Images/JPG.jpg similarity index 100% rename from webapp/channels/e2e/cypress/tests/fixtures/mm_file_testing/Images/JPG.jpg rename to e2e/cypress/tests/fixtures/mm_file_testing/Images/JPG.jpg diff --git a/webapp/channels/e2e/cypress/tests/fixtures/mm_file_testing/Images/PNG.png b/e2e/cypress/tests/fixtures/mm_file_testing/Images/PNG.png similarity index 100% rename from webapp/channels/e2e/cypress/tests/fixtures/mm_file_testing/Images/PNG.png rename to e2e/cypress/tests/fixtures/mm_file_testing/Images/PNG.png diff --git a/webapp/channels/e2e/cypress/tests/fixtures/mm_file_testing/Images/PSD.psd b/e2e/cypress/tests/fixtures/mm_file_testing/Images/PSD.psd similarity index 100% rename from webapp/channels/e2e/cypress/tests/fixtures/mm_file_testing/Images/PSD.psd rename to e2e/cypress/tests/fixtures/mm_file_testing/Images/PSD.psd diff --git a/webapp/channels/e2e/cypress/tests/fixtures/mm_file_testing/Images/TIFF.tif b/e2e/cypress/tests/fixtures/mm_file_testing/Images/TIFF.tif similarity index 100% rename from webapp/channels/e2e/cypress/tests/fixtures/mm_file_testing/Images/TIFF.tif rename to e2e/cypress/tests/fixtures/mm_file_testing/Images/TIFF.tif diff --git a/webapp/channels/e2e/cypress/tests/fixtures/mm_file_testing/Video/AVI.avi b/e2e/cypress/tests/fixtures/mm_file_testing/Video/AVI.avi similarity index 100% rename from webapp/channels/e2e/cypress/tests/fixtures/mm_file_testing/Video/AVI.avi rename to e2e/cypress/tests/fixtures/mm_file_testing/Video/AVI.avi diff --git a/webapp/channels/e2e/cypress/tests/fixtures/mm_file_testing/Video/MKV.mkv b/e2e/cypress/tests/fixtures/mm_file_testing/Video/MKV.mkv similarity index 100% rename from webapp/channels/e2e/cypress/tests/fixtures/mm_file_testing/Video/MKV.mkv rename to e2e/cypress/tests/fixtures/mm_file_testing/Video/MKV.mkv diff --git a/webapp/channels/e2e/cypress/tests/fixtures/mm_file_testing/Video/MOV.mov b/e2e/cypress/tests/fixtures/mm_file_testing/Video/MOV.mov similarity index 100% rename from webapp/channels/e2e/cypress/tests/fixtures/mm_file_testing/Video/MOV.mov rename to e2e/cypress/tests/fixtures/mm_file_testing/Video/MOV.mov diff --git a/webapp/channels/e2e/cypress/tests/fixtures/mm_file_testing/Video/MP4.mp4 b/e2e/cypress/tests/fixtures/mm_file_testing/Video/MP4.mp4 similarity index 100% rename from webapp/channels/e2e/cypress/tests/fixtures/mm_file_testing/Video/MP4.mp4 rename to e2e/cypress/tests/fixtures/mm_file_testing/Video/MP4.mp4 diff --git a/webapp/channels/e2e/cypress/tests/fixtures/mm_file_testing/Video/MPG.mpg b/e2e/cypress/tests/fixtures/mm_file_testing/Video/MPG.mpg similarity index 100% rename from webapp/channels/e2e/cypress/tests/fixtures/mm_file_testing/Video/MPG.mpg rename to e2e/cypress/tests/fixtures/mm_file_testing/Video/MPG.mpg diff --git a/webapp/channels/e2e/cypress/tests/fixtures/mm_file_testing/Video/WEBM.webm b/e2e/cypress/tests/fixtures/mm_file_testing/Video/WEBM.webm similarity index 100% rename from webapp/channels/e2e/cypress/tests/fixtures/mm_file_testing/Video/WEBM.webm rename to e2e/cypress/tests/fixtures/mm_file_testing/Video/WEBM.webm diff --git a/webapp/channels/e2e/cypress/tests/fixtures/mm_file_testing/Video/WMV.wmv b/e2e/cypress/tests/fixtures/mm_file_testing/Video/WMV.wmv similarity index 100% rename from webapp/channels/e2e/cypress/tests/fixtures/mm_file_testing/Video/WMV.wmv rename to e2e/cypress/tests/fixtures/mm_file_testing/Video/WMV.wmv diff --git a/webapp/channels/e2e/cypress/tests/fixtures/mp3-audio-file.mp3 b/e2e/cypress/tests/fixtures/mp3-audio-file.mp3 similarity index 100% rename from webapp/channels/e2e/cypress/tests/fixtures/mp3-audio-file.mp3 rename to e2e/cypress/tests/fixtures/mp3-audio-file.mp3 diff --git a/webapp/channels/e2e/cypress/tests/fixtures/mp4-video-file.mp4 b/e2e/cypress/tests/fixtures/mp4-video-file.mp4 similarity index 100% rename from webapp/channels/e2e/cypress/tests/fixtures/mp4-video-file.mp4 rename to e2e/cypress/tests/fixtures/mp4-video-file.mp4 diff --git a/webapp/channels/e2e/cypress/tests/fixtures/mpeg-video-file.mpg b/e2e/cypress/tests/fixtures/mpeg-video-file.mpg similarity index 100% rename from webapp/channels/e2e/cypress/tests/fixtures/mpeg-video-file.mpg rename to e2e/cypress/tests/fixtures/mpeg-video-file.mpg diff --git a/webapp/channels/e2e/cypress/tests/fixtures/png-image-file.png b/e2e/cypress/tests/fixtures/png-image-file.png similarity index 100% rename from webapp/channels/e2e/cypress/tests/fixtures/png-image-file.png rename to e2e/cypress/tests/fixtures/png-image-file.png diff --git a/webapp/channels/e2e/cypress/tests/fixtures/powerpoint-file.ppt b/e2e/cypress/tests/fixtures/powerpoint-file.ppt similarity index 100% rename from webapp/channels/e2e/cypress/tests/fixtures/powerpoint-file.ppt rename to e2e/cypress/tests/fixtures/powerpoint-file.ppt diff --git a/webapp/channels/e2e/cypress/tests/fixtures/powerpointx-file.pptx b/e2e/cypress/tests/fixtures/powerpointx-file.pptx similarity index 100% rename from webapp/channels/e2e/cypress/tests/fixtures/powerpointx-file.pptx rename to e2e/cypress/tests/fixtures/powerpointx-file.pptx diff --git a/webapp/channels/e2e/cypress/tests/fixtures/saml_ldap_users.json b/e2e/cypress/tests/fixtures/saml_ldap_users.json similarity index 100% rename from webapp/channels/e2e/cypress/tests/fixtures/saml_ldap_users.json rename to e2e/cypress/tests/fixtures/saml_ldap_users.json diff --git a/webapp/channels/e2e/cypress/tests/fixtures/saml_users.json b/e2e/cypress/tests/fixtures/saml_users.json similarity index 100% rename from webapp/channels/e2e/cypress/tests/fixtures/saml_users.json rename to e2e/cypress/tests/fixtures/saml_users.json diff --git a/webapp/channels/e2e/cypress/tests/fixtures/small-image.png b/e2e/cypress/tests/fixtures/small-image.png similarity index 100% rename from webapp/channels/e2e/cypress/tests/fixtures/small-image.png rename to e2e/cypress/tests/fixtures/small-image.png diff --git a/webapp/channels/e2e/cypress/tests/fixtures/svg.svg b/e2e/cypress/tests/fixtures/svg.svg similarity index 100% rename from webapp/channels/e2e/cypress/tests/fixtures/svg.svg rename to e2e/cypress/tests/fixtures/svg.svg diff --git a/webapp/channels/e2e/cypress/tests/fixtures/system-roles-console-access.json b/e2e/cypress/tests/fixtures/system-roles-console-access.json similarity index 100% rename from webapp/channels/e2e/cypress/tests/fixtures/system-roles-console-access.json rename to e2e/cypress/tests/fixtures/system-roles-console-access.json diff --git a/webapp/channels/e2e/cypress/tests/fixtures/theme.json b/e2e/cypress/tests/fixtures/theme.json similarity index 100% rename from webapp/channels/e2e/cypress/tests/fixtures/theme.json rename to e2e/cypress/tests/fixtures/theme.json diff --git a/webapp/channels/e2e/cypress/tests/fixtures/tiff-image-file.tif b/e2e/cypress/tests/fixtures/tiff-image-file.tif similarity index 100% rename from webapp/channels/e2e/cypress/tests/fixtures/tiff-image-file.tif rename to e2e/cypress/tests/fixtures/tiff-image-file.tif diff --git a/webapp/channels/e2e/cypress/tests/fixtures/timeouts.js b/e2e/cypress/tests/fixtures/timeouts.js similarity index 100% rename from webapp/channels/e2e/cypress/tests/fixtures/timeouts.js rename to e2e/cypress/tests/fixtures/timeouts.js diff --git a/webapp/channels/e2e/cypress/tests/fixtures/txt-changed-as-png.png b/e2e/cypress/tests/fixtures/txt-changed-as-png.png similarity index 100% rename from webapp/channels/e2e/cypress/tests/fixtures/txt-changed-as-png.png rename to e2e/cypress/tests/fixtures/txt-changed-as-png.png diff --git a/webapp/channels/e2e/cypress/tests/fixtures/webhook_icon.jpg b/e2e/cypress/tests/fixtures/webhook_icon.jpg similarity index 100% rename from webapp/channels/e2e/cypress/tests/fixtures/webhook_icon.jpg rename to e2e/cypress/tests/fixtures/webhook_icon.jpg diff --git a/webapp/channels/e2e/cypress/tests/fixtures/webhook_override_icon.png b/e2e/cypress/tests/fixtures/webhook_override_icon.png similarity index 100% rename from webapp/channels/e2e/cypress/tests/fixtures/webhook_override_icon.png rename to e2e/cypress/tests/fixtures/webhook_override_icon.png diff --git a/webapp/channels/e2e/cypress/tests/fixtures/word-file.doc b/e2e/cypress/tests/fixtures/word-file.doc similarity index 100% rename from webapp/channels/e2e/cypress/tests/fixtures/word-file.doc rename to e2e/cypress/tests/fixtures/word-file.doc diff --git a/webapp/channels/e2e/cypress/tests/fixtures/wordx-file.docx b/e2e/cypress/tests/fixtures/wordx-file.docx similarity index 100% rename from webapp/channels/e2e/cypress/tests/fixtures/wordx-file.docx rename to e2e/cypress/tests/fixtures/wordx-file.docx diff --git a/webapp/channels/e2e/cypress/tests/integration/boards/card_badges_spec.ts b/e2e/cypress/tests/integration/boards/card_badges_spec.ts similarity index 100% rename from webapp/channels/e2e/cypress/tests/integration/boards/card_badges_spec.ts rename to e2e/cypress/tests/integration/boards/card_badges_spec.ts diff --git a/webapp/channels/e2e/cypress/tests/integration/boards/card_urlproperty_spec.ts b/e2e/cypress/tests/integration/boards/card_urlproperty_spec.ts similarity index 100% rename from webapp/channels/e2e/cypress/tests/integration/boards/card_urlproperty_spec.ts rename to e2e/cypress/tests/integration/boards/card_urlproperty_spec.ts diff --git a/webapp/channels/e2e/cypress/tests/integration/boards/create_board_spec.ts b/e2e/cypress/tests/integration/boards/create_board_spec.ts similarity index 100% rename from webapp/channels/e2e/cypress/tests/integration/boards/create_board_spec.ts rename to e2e/cypress/tests/integration/boards/create_board_spec.ts diff --git a/webapp/channels/e2e/cypress/tests/integration/boards/group_by_property_spec.ts b/e2e/cypress/tests/integration/boards/group_by_property_spec.ts similarity index 100% rename from webapp/channels/e2e/cypress/tests/integration/boards/group_by_property_spec.ts rename to e2e/cypress/tests/integration/boards/group_by_property_spec.ts diff --git a/webapp/channels/e2e/cypress/tests/integration/boards/manage_groups_spec.ts b/e2e/cypress/tests/integration/boards/manage_groups_spec.ts similarity index 100% rename from webapp/channels/e2e/cypress/tests/integration/boards/manage_groups_spec.ts rename to e2e/cypress/tests/integration/boards/manage_groups_spec.ts diff --git a/webapp/channels/e2e/cypress/tests/integration/accessibility/accessibility_account_settings_spec.js b/e2e/cypress/tests/integration/channels/accessibility/accessibility_account_settings_spec.js similarity index 99% rename from webapp/channels/e2e/cypress/tests/integration/accessibility/accessibility_account_settings_spec.js rename to e2e/cypress/tests/integration/channels/accessibility/accessibility_account_settings_spec.js index e7357820f5..db9270ab68 100644 --- a/webapp/channels/e2e/cypress/tests/integration/accessibility/accessibility_account_settings_spec.js +++ b/e2e/cypress/tests/integration/channels/accessibility/accessibility_account_settings_spec.js @@ -8,10 +8,10 @@ // *************************************************************** // Stage: @prod -// Group: @accessibility @mfa +// Group: @channels @accessibility @mfa -import * as TIMEOUTS from '../../fixtures/timeouts'; -import {isMac} from '../../utils'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; +import {isMac} from '../../../utils'; describe('Verify Accessibility Support in different sections in Settings and Profile Dialog', () => { const accountSettings = { diff --git a/webapp/channels/e2e/cypress/tests/integration/accessibility/accessibility_buttons_spec.js b/e2e/cypress/tests/integration/channels/accessibility/accessibility_buttons_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/accessibility/accessibility_buttons_spec.js rename to e2e/cypress/tests/integration/channels/accessibility/accessibility_buttons_spec.js index 88ec07d796..1729249f08 100644 --- a/webapp/channels/e2e/cypress/tests/integration/accessibility/accessibility_buttons_spec.js +++ b/e2e/cypress/tests/integration/channels/accessibility/accessibility_buttons_spec.js @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @accessibility +// Group: @channels @accessibility describe('Verify Accessibility Support in different Buttons', () => { before(() => { diff --git a/webapp/channels/e2e/cypress/tests/integration/accessibility/accessibility_dropdowns_spec.js b/e2e/cypress/tests/integration/channels/accessibility/accessibility_dropdowns_spec.js similarity index 99% rename from webapp/channels/e2e/cypress/tests/integration/accessibility/accessibility_dropdowns_spec.js rename to e2e/cypress/tests/integration/channels/accessibility/accessibility_dropdowns_spec.js index 31b18a7c5e..a1fd352f58 100644 --- a/webapp/channels/e2e/cypress/tests/integration/accessibility/accessibility_dropdowns_spec.js +++ b/e2e/cypress/tests/integration/channels/accessibility/accessibility_dropdowns_spec.js @@ -7,7 +7,7 @@ // - Use element ID when selecting an element. Create one if none. // *************************************************************** -// Group: @accessibility +// Group: @channels @accessibility describe('Verify Accessibility Support in Dropdown Menus', () => { let offTopicUrl; diff --git a/webapp/channels/e2e/cypress/tests/integration/accessibility/accessibility_image_spec.js b/e2e/cypress/tests/integration/channels/accessibility/accessibility_image_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/accessibility/accessibility_image_spec.js rename to e2e/cypress/tests/integration/channels/accessibility/accessibility_image_spec.js index c68e46f63a..070d806477 100644 --- a/webapp/channels/e2e/cypress/tests/integration/accessibility/accessibility_image_spec.js +++ b/e2e/cypress/tests/integration/channels/accessibility/accessibility_image_spec.js @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @accessibility +// Group: @channels @accessibility // * Verify the accessibility support in the different images diff --git a/webapp/channels/e2e/cypress/tests/integration/accessibility/accessibility_keyboard_usability_spec.js b/e2e/cypress/tests/integration/channels/accessibility/accessibility_keyboard_usability_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/accessibility/accessibility_keyboard_usability_spec.js rename to e2e/cypress/tests/integration/channels/accessibility/accessibility_keyboard_usability_spec.js index b39a13585a..1c3052edf4 100644 --- a/webapp/channels/e2e/cypress/tests/integration/accessibility/accessibility_keyboard_usability_spec.js +++ b/e2e/cypress/tests/integration/channels/accessibility/accessibility_keyboard_usability_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @accessibility +// Group: @channels @accessibility -import {getRandomId} from '../../utils'; +import {getRandomId} from '../../../utils'; function postMessages(testChannel, otherUser, count) { for (let index = 0; index < count; index++) { diff --git a/webapp/channels/e2e/cypress/tests/integration/accessibility/accessibility_nav_diff_regions_spec.js b/e2e/cypress/tests/integration/channels/accessibility/accessibility_nav_diff_regions_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/accessibility/accessibility_nav_diff_regions_spec.js rename to e2e/cypress/tests/integration/channels/accessibility/accessibility_nav_diff_regions_spec.js index dadc36a6b6..0a0e78a920 100644 --- a/webapp/channels/e2e/cypress/tests/integration/accessibility/accessibility_nav_diff_regions_spec.js +++ b/e2e/cypress/tests/integration/channels/accessibility/accessibility_nav_diff_regions_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @accessibility +// Group: @channels @accessibility -import {getRandomId} from '../../utils'; +import {getRandomId} from '../../../utils'; function postMessages(testChannel, otherUser, count) { for (let index = 0; index < count; index++) { diff --git a/webapp/channels/e2e/cypress/tests/integration/accessibility/accessibility_popovers_spec.js b/e2e/cypress/tests/integration/channels/accessibility/accessibility_popovers_spec.js similarity index 99% rename from webapp/channels/e2e/cypress/tests/integration/accessibility/accessibility_popovers_spec.js rename to e2e/cypress/tests/integration/channels/accessibility/accessibility_popovers_spec.js index d9b851b469..25b88f9a30 100644 --- a/webapp/channels/e2e/cypress/tests/integration/accessibility/accessibility_popovers_spec.js +++ b/e2e/cypress/tests/integration/channels/accessibility/accessibility_popovers_spec.js @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @accessibility +// Group: @channels @accessibility let previousEmoji = 'grinning'; diff --git a/webapp/channels/e2e/cypress/tests/integration/accessibility/accessibility_post_spec.js b/e2e/cypress/tests/integration/channels/accessibility/accessibility_post_spec.js similarity index 99% rename from webapp/channels/e2e/cypress/tests/integration/accessibility/accessibility_post_spec.js rename to e2e/cypress/tests/integration/channels/accessibility/accessibility_post_spec.js index 188e105435..4496aa9ff8 100644 --- a/webapp/channels/e2e/cypress/tests/integration/accessibility/accessibility_post_spec.js +++ b/e2e/cypress/tests/integration/channels/accessibility/accessibility_post_spec.js @@ -8,10 +8,10 @@ // *************************************************************** // Stage: @prod -// Group: @accessibility +// Group: @channels @accessibility -import * as TIMEOUTS from '../../fixtures/timeouts'; -import {getRandomId} from '../../utils'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; +import {getRandomId} from '../../../utils'; describe('Verify Accessibility Support in Post', () => { let testUser; diff --git a/webapp/channels/e2e/cypress/tests/integration/accessibility/accessibility_sidebar_dm_spec.js b/e2e/cypress/tests/integration/channels/accessibility/accessibility_sidebar_dm_spec.js similarity index 97% rename from webapp/channels/e2e/cypress/tests/integration/accessibility/accessibility_sidebar_dm_spec.js rename to e2e/cypress/tests/integration/channels/accessibility/accessibility_sidebar_dm_spec.js index cbfa4081c2..b4c027b943 100644 --- a/webapp/channels/e2e/cypress/tests/integration/accessibility/accessibility_sidebar_dm_spec.js +++ b/e2e/cypress/tests/integration/channels/accessibility/accessibility_sidebar_dm_spec.js @@ -7,9 +7,9 @@ // - Use element ID when selecting an element. Create one if none. // *************************************************************** -// Group: @accessibility @smoke +// Group: @channels @accessibility @smoke -import * as TIMEOUTS from '../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; describe('Verify Accessibility Support in Channel Sidebar Navigation', () => { let testUser; diff --git a/webapp/channels/e2e/cypress/tests/integration/accessibility/accessibility_sidebar_spec.ts b/e2e/cypress/tests/integration/channels/accessibility/accessibility_sidebar_spec.ts similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/accessibility/accessibility_sidebar_spec.ts rename to e2e/cypress/tests/integration/channels/accessibility/accessibility_sidebar_spec.ts index f344182310..9c67b1250b 100644 --- a/webapp/channels/e2e/cypress/tests/integration/accessibility/accessibility_sidebar_spec.ts +++ b/e2e/cypress/tests/integration/channels/accessibility/accessibility_sidebar_spec.ts @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @accessibility @smoke +// Group: @channels @accessibility @smoke -import * as TIMEOUTS from '../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; describe('Verify Accessibility Support in Channel Sidebar Navigation', () => { let testUser; diff --git a/webapp/channels/e2e/cypress/tests/integration/account_settings/account_settings_spec.ts b/e2e/cypress/tests/integration/channels/account_settings/account_settings_spec.ts similarity index 99% rename from webapp/channels/e2e/cypress/tests/integration/account_settings/account_settings_spec.ts rename to e2e/cypress/tests/integration/channels/account_settings/account_settings_spec.ts index d4e65a0372..8bebdc5ff9 100644 --- a/webapp/channels/e2e/cypress/tests/integration/account_settings/account_settings_spec.ts +++ b/e2e/cypress/tests/integration/channels/account_settings/account_settings_spec.ts @@ -7,7 +7,7 @@ // - Use element ID when selecting an element. Create one if none. // *************************************************************** -// Group: @account_settings +// Group: @channels @account_settings describe('Account Settings', () => { let testUser: Cypress.UserProfile; diff --git a/webapp/channels/e2e/cypress/tests/integration/account_settings/main_menu_stays_open_spec.ts b/e2e/cypress/tests/integration/channels/account_settings/main_menu_stays_open_spec.ts similarity index 94% rename from webapp/channels/e2e/cypress/tests/integration/account_settings/main_menu_stays_open_spec.ts rename to e2e/cypress/tests/integration/channels/account_settings/main_menu_stays_open_spec.ts index 539768575c..2002f3b3a4 100644 --- a/webapp/channels/e2e/cypress/tests/integration/account_settings/main_menu_stays_open_spec.ts +++ b/e2e/cypress/tests/integration/channels/account_settings/main_menu_stays_open_spec.ts @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @account_setting +// Group: @channels @account_setting -import * as TIMEOUTS from '../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; describe('Profile > Profile Settings', () => { let otherUser: Cypress.UserProfile; diff --git a/webapp/channels/e2e/cypress/tests/integration/account_settings/profile/account_settings_position_spec.ts b/e2e/cypress/tests/integration/channels/account_settings/profile/account_settings_position_spec.ts similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/account_settings/profile/account_settings_position_spec.ts rename to e2e/cypress/tests/integration/channels/account_settings/profile/account_settings_position_spec.ts index 8004f31240..31bc03f147 100644 --- a/webapp/channels/e2e/cypress/tests/integration/account_settings/profile/account_settings_position_spec.ts +++ b/e2e/cypress/tests/integration/channels/account_settings/profile/account_settings_position_spec.ts @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @account_setting +// Group: @channels @account_setting describe('Profile > Profile Settings > Position', () => { beforeEach(() => { diff --git a/webapp/channels/e2e/cypress/tests/integration/account_settings/profile/email_spec.ts b/e2e/cypress/tests/integration/channels/account_settings/profile/email_spec.ts similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/account_settings/profile/email_spec.ts rename to e2e/cypress/tests/integration/channels/account_settings/profile/email_spec.ts index e7c0e8b8cf..c0ce921498 100644 --- a/webapp/channels/e2e/cypress/tests/integration/account_settings/profile/email_spec.ts +++ b/e2e/cypress/tests/integration/channels/account_settings/profile/email_spec.ts @@ -8,10 +8,10 @@ // *************************************************************** // Stage: @prod -// Group: @account_setting +// Group: @channels @account_setting -import * as TIMEOUTS from '../../../fixtures/timeouts'; -import {reUrl, getRandomId} from '../../../utils'; +import * as TIMEOUTS from '../../../../fixtures/timeouts'; +import {reUrl, getRandomId} from '../../../../utils'; describe('Profile > Profile Settings > Email', () => { let siteName; diff --git a/webapp/channels/e2e/cypress/tests/integration/account_settings/profile/fullname_edit_spec.ts b/e2e/cypress/tests/integration/channels/account_settings/profile/fullname_edit_spec.ts similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/account_settings/profile/fullname_edit_spec.ts rename to e2e/cypress/tests/integration/channels/account_settings/profile/fullname_edit_spec.ts index db34a5f811..52e5ae2291 100644 --- a/webapp/channels/e2e/cypress/tests/integration/account_settings/profile/fullname_edit_spec.ts +++ b/e2e/cypress/tests/integration/channels/account_settings/profile/fullname_edit_spec.ts @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @account_setting +// Group: @channels @account_setting describe('Profile > Profile Settings > Full Name', () => { let testUser; diff --git a/webapp/channels/e2e/cypress/tests/integration/account_settings/profile/fullname_truncate_spec.ts b/e2e/cypress/tests/integration/channels/account_settings/profile/fullname_truncate_spec.ts similarity index 97% rename from webapp/channels/e2e/cypress/tests/integration/account_settings/profile/fullname_truncate_spec.ts rename to e2e/cypress/tests/integration/channels/account_settings/profile/fullname_truncate_spec.ts index 4e22a57204..eb493a3bbe 100644 --- a/webapp/channels/e2e/cypress/tests/integration/account_settings/profile/fullname_truncate_spec.ts +++ b/e2e/cypress/tests/integration/channels/account_settings/profile/fullname_truncate_spec.ts @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @account_setting +// Group: @channels @account_setting -import {getRandomId} from '../../../utils'; +import {getRandomId} from '../../../../utils'; describe('Profile > Profile Settings> Full Name', () => { let firstUser; diff --git a/webapp/channels/e2e/cypress/tests/integration/account_settings/profile/help_text_link_spec.ts b/e2e/cypress/tests/integration/channels/account_settings/profile/help_text_link_spec.ts similarity index 97% rename from webapp/channels/e2e/cypress/tests/integration/account_settings/profile/help_text_link_spec.ts rename to e2e/cypress/tests/integration/channels/account_settings/profile/help_text_link_spec.ts index 4eb838cd9e..8a1f825e17 100644 --- a/webapp/channels/e2e/cypress/tests/integration/account_settings/profile/help_text_link_spec.ts +++ b/e2e/cypress/tests/integration/channels/account_settings/profile/help_text_link_spec.ts @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @account_setting +// Group: @channels @account_setting describe('Account Settings', () => { before(() => { diff --git a/webapp/channels/e2e/cypress/tests/integration/account_settings/profile/nickname_spec.ts b/e2e/cypress/tests/integration/channels/account_settings/profile/nickname_spec.ts similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/account_settings/profile/nickname_spec.ts rename to e2e/cypress/tests/integration/channels/account_settings/profile/nickname_spec.ts index 75a735c1d5..b90905468e 100644 --- a/webapp/channels/e2e/cypress/tests/integration/account_settings/profile/nickname_spec.ts +++ b/e2e/cypress/tests/integration/channels/account_settings/profile/nickname_spec.ts @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @account_setting +// Group: @channels @account_setting -import * as TIMEOUTS from '../../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../../fixtures/timeouts'; describe('Settings > Sidebar > General', () => { let testUser; diff --git a/webapp/channels/e2e/cypress/tests/integration/account_settings/profile/profile_picture_change_spec.ts b/e2e/cypress/tests/integration/channels/account_settings/profile/profile_picture_change_spec.ts similarity index 96% rename from webapp/channels/e2e/cypress/tests/integration/account_settings/profile/profile_picture_change_spec.ts rename to e2e/cypress/tests/integration/channels/account_settings/profile/profile_picture_change_spec.ts index 6391926987..0e38ad7f93 100644 --- a/webapp/channels/e2e/cypress/tests/integration/account_settings/profile/profile_picture_change_spec.ts +++ b/e2e/cypress/tests/integration/channels/account_settings/profile/profile_picture_change_spec.ts @@ -2,9 +2,9 @@ // See LICENSE.txt for license information. // Stage: @prod -// Group: @account_setting +// Group: @channels @account_setting -import * as TIMEOUTS from '../../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../../fixtures/timeouts'; describe('Account Settings', () => { beforeEach(() => { diff --git a/webapp/channels/e2e/cypress/tests/integration/account_settings/profile/profile_picture_spec.ts b/e2e/cypress/tests/integration/channels/account_settings/profile/profile_picture_spec.ts similarity index 96% rename from webapp/channels/e2e/cypress/tests/integration/account_settings/profile/profile_picture_spec.ts rename to e2e/cypress/tests/integration/channels/account_settings/profile/profile_picture_spec.ts index 3ca614171c..3682bb4e83 100644 --- a/webapp/channels/e2e/cypress/tests/integration/account_settings/profile/profile_picture_spec.ts +++ b/e2e/cypress/tests/integration/channels/account_settings/profile/profile_picture_spec.ts @@ -8,12 +8,12 @@ // *************************************************************** // Stage: @prod -// Group: @account_setting +// Group: @channels @account_setting // TODO: Remove import once e2e/cypress/tests/support/index.ts is converted to Typescript. import 'cypress-file-upload'; -import * as TIMEOUTS from '../../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../../fixtures/timeouts'; describe('Profile > Profile Settings > Profile Picture', () => { before(() => { diff --git a/webapp/channels/e2e/cypress/tests/integration/account_settings/profile/username_spec.ts b/e2e/cypress/tests/integration/channels/account_settings/profile/username_spec.ts similarity index 99% rename from webapp/channels/e2e/cypress/tests/integration/account_settings/profile/username_spec.ts rename to e2e/cypress/tests/integration/channels/account_settings/profile/username_spec.ts index 5dea2b06f5..5ab66c198a 100644 --- a/webapp/channels/e2e/cypress/tests/integration/account_settings/profile/username_spec.ts +++ b/e2e/cypress/tests/integration/channels/account_settings/profile/username_spec.ts @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @account_setting +// Group: @channels @account_setting -import {getRandomId} from '../../../utils'; +import {getRandomId} from '../../../../utils'; describe('Settings > Sidebar > General > Edit', () => { let testTeam; diff --git a/webapp/channels/e2e/cypress/tests/integration/account_settings/security/access_history_spec.ts b/e2e/cypress/tests/integration/channels/account_settings/security/access_history_spec.ts similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/account_settings/security/access_history_spec.ts rename to e2e/cypress/tests/integration/channels/account_settings/security/access_history_spec.ts index a75a17c0c6..423573e13c 100644 --- a/webapp/channels/e2e/cypress/tests/integration/account_settings/security/access_history_spec.ts +++ b/e2e/cypress/tests/integration/channels/account_settings/security/access_history_spec.ts @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @account_setting +// Group: @channels @account_setting describe('Profile > Security > View Access History', () => { before(() => { diff --git a/webapp/channels/e2e/cypress/tests/integration/account_settings/security/active_sessions_spec.ts b/e2e/cypress/tests/integration/channels/account_settings/security/active_sessions_spec.ts similarity index 96% rename from webapp/channels/e2e/cypress/tests/integration/account_settings/security/active_sessions_spec.ts rename to e2e/cypress/tests/integration/channels/account_settings/security/active_sessions_spec.ts index 08aaf14ac5..9cf45264e0 100644 --- a/webapp/channels/e2e/cypress/tests/integration/account_settings/security/active_sessions_spec.ts +++ b/e2e/cypress/tests/integration/channels/account_settings/security/active_sessions_spec.ts @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @account_setting +// Group: @channels @account_setting -import * as TIMEOUTS from '../../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../../fixtures/timeouts'; describe('Profile > Security > View and Log Out of Active Sessions', () => { const platforms = [ diff --git a/webapp/channels/e2e/cypress/tests/integration/account_settings/security/password_spec.ts b/e2e/cypress/tests/integration/channels/account_settings/security/password_spec.ts similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/account_settings/security/password_spec.ts rename to e2e/cypress/tests/integration/channels/account_settings/security/password_spec.ts index 186a7f03c5..df4ff2a4f0 100644 --- a/webapp/channels/e2e/cypress/tests/integration/account_settings/security/password_spec.ts +++ b/e2e/cypress/tests/integration/channels/account_settings/security/password_spec.ts @@ -8,11 +8,11 @@ // *************************************************************** // Stage: @prod -// Group: @account_setting +// Group: @channels @account_setting import moment from 'moment-timezone'; -import * as TIMEOUTS from '../../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../../fixtures/timeouts'; describe('Profile', () => { let siteName: string; diff --git a/webapp/channels/e2e/cypress/tests/integration/ad_ldap/saml_ldap_sync_id_attrib_spec.js b/e2e/cypress/tests/integration/channels/ad_ldap/saml_ldap_sync_id_attrib_spec.js similarity index 93% rename from webapp/channels/e2e/cypress/tests/integration/ad_ldap/saml_ldap_sync_id_attrib_spec.js rename to e2e/cypress/tests/integration/channels/ad_ldap/saml_ldap_sync_id_attrib_spec.js index 47a6bf698a..e5285e1a9f 100644 --- a/webapp/channels/e2e/cypress/tests/integration/ad_ldap/saml_ldap_sync_id_attrib_spec.js +++ b/e2e/cypress/tests/integration/channels/ad_ldap/saml_ldap_sync_id_attrib_spec.js @@ -12,11 +12,11 @@ // -> copy ./mattermost-server/build/docker/keycloak/keycloak.crt to ./mattermost-webapp/e2e/cypress/tests/fixtures/keycloak.crt // - Requires Cypress' chromeWebSecurity to be false -// Group: @enterprise @ldap @saml @keycloak +// Group: @channels @enterprise @ldap @saml @keycloak -import {getAdminAccount} from '../../support/env'; -import {getRandomId} from '../../utils'; -import {getKeycloakServerSettings} from '../../utils/config'; +import {getAdminAccount} from '../../../support/env'; +import {getRandomId} from '../../../utils'; +import {getKeycloakServerSettings} from '../../../utils/config'; describe('AD / LDAP', () => { let samlLdapUser; diff --git a/webapp/channels/e2e/cypress/tests/integration/ad_ldap/saml_ldap_sync_remove_spec.js b/e2e/cypress/tests/integration/channels/ad_ldap/saml_ldap_sync_remove_spec.js similarity index 94% rename from webapp/channels/e2e/cypress/tests/integration/ad_ldap/saml_ldap_sync_remove_spec.js rename to e2e/cypress/tests/integration/channels/ad_ldap/saml_ldap_sync_remove_spec.js index efcc89c4f8..4775a4bd66 100644 --- a/webapp/channels/e2e/cypress/tests/integration/ad_ldap/saml_ldap_sync_remove_spec.js +++ b/e2e/cypress/tests/integration/channels/ad_ldap/saml_ldap_sync_remove_spec.js @@ -12,11 +12,11 @@ // -> copy ./mattermost-server/build/docker/keycloak/keycloak.crt to ./mattermost-webapp/e2e/cypress/tests/fixtures/keycloak.crt // - Requires Cypress' chromeWebSecurity to be false -// Group: @enterprise @ldap @saml @keycloak +// Group: @channels @enterprise @ldap @saml @keycloak -import {getAdminAccount} from '../../support/env'; -import {generateLDAPUser} from '../../support/ldap_server_commands'; -import {getKeycloakServerSettings} from '../../utils/config'; +import {getAdminAccount} from '../../../support/env'; +import {generateLDAPUser} from '../../../support/ldap_server_commands'; +import {getKeycloakServerSettings} from '../../../utils/config'; describe('AD / LDAP', () => { const nonLDAPUser = generateLDAPUser(); diff --git a/webapp/channels/e2e/cypress/tests/integration/ad_ldap/saml_ldap_sync_spec.js b/e2e/cypress/tests/integration/channels/ad_ldap/saml_ldap_sync_spec.js similarity index 94% rename from webapp/channels/e2e/cypress/tests/integration/ad_ldap/saml_ldap_sync_spec.js rename to e2e/cypress/tests/integration/channels/ad_ldap/saml_ldap_sync_spec.js index 54411d48e3..6cadebb704 100644 --- a/webapp/channels/e2e/cypress/tests/integration/ad_ldap/saml_ldap_sync_spec.js +++ b/e2e/cypress/tests/integration/channels/ad_ldap/saml_ldap_sync_spec.js @@ -12,11 +12,11 @@ // -> copy ./mattermost-server/build/docker/keycloak/keycloak.crt to ./mattermost-webapp/e2e/cypress/tests/fixtures/keycloak.crt // - Requires Cypress' chromeWebSecurity to be false -// Group: @enterprise @ldap @saml @keycloak +// Group: @channels @enterprise @ldap @saml @keycloak -import {getAdminAccount} from '../../support/env'; -import {getRandomId} from '../../utils'; -import {getKeycloakServerSettings} from '../../utils/config'; +import {getAdminAccount} from '../../../support/env'; +import {getRandomId} from '../../../utils'; +import {getKeycloakServerSettings} from '../../../utils/config'; describe('AD / LDAP', () => { const admin = getAdminAccount(); diff --git a/webapp/channels/e2e/cypress/tests/integration/archived_channel/archive_channel_add_reaction_spec.ts b/e2e/cypress/tests/integration/channels/archived_channel/archive_channel_add_reaction_spec.ts similarity index 97% rename from webapp/channels/e2e/cypress/tests/integration/archived_channel/archive_channel_add_reaction_spec.ts rename to e2e/cypress/tests/integration/channels/archived_channel/archive_channel_add_reaction_spec.ts index d3a7e1f9de..885b9bb17b 100644 --- a/webapp/channels/e2e/cypress/tests/integration/archived_channel/archive_channel_add_reaction_spec.ts +++ b/e2e/cypress/tests/integration/channels/archived_channel/archive_channel_add_reaction_spec.ts @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @channel +// Group: @channels @channel -import * as TIMEOUTS from '../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; describe('Archived channels', () => { before(() => { diff --git a/webapp/channels/e2e/cypress/tests/integration/archived_channel/archive_channel_header_spec.ts b/e2e/cypress/tests/integration/channels/archived_channel/archive_channel_header_spec.ts similarity index 99% rename from webapp/channels/e2e/cypress/tests/integration/archived_channel/archive_channel_header_spec.ts rename to e2e/cypress/tests/integration/channels/archived_channel/archive_channel_header_spec.ts index eb1c73a920..15522e858f 100644 --- a/webapp/channels/e2e/cypress/tests/integration/archived_channel/archive_channel_header_spec.ts +++ b/e2e/cypress/tests/integration/channels/archived_channel/archive_channel_header_spec.ts @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @channel +// Group: @channels @channel describe('Archive channel header spec', () => { before(() => { diff --git a/webapp/channels/e2e/cypress/tests/integration/archived_channel/archive_channel_member_spec.ts b/e2e/cypress/tests/integration/channels/archived_channel/archive_channel_member_spec.ts similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/archived_channel/archive_channel_member_spec.ts rename to e2e/cypress/tests/integration/channels/archived_channel/archive_channel_member_spec.ts index edb0aa32d6..c91a3754c3 100644 --- a/webapp/channels/e2e/cypress/tests/integration/archived_channel/archive_channel_member_spec.ts +++ b/e2e/cypress/tests/integration/channels/archived_channel/archive_channel_member_spec.ts @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @channel +// Group: @channels @channel describe('Archive channel members spec', () => { before(() => { diff --git a/webapp/channels/e2e/cypress/tests/integration/archived_channel/archive_channel_operations_spec.ts b/e2e/cypress/tests/integration/channels/archived_channel/archive_channel_operations_spec.ts similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/archived_channel/archive_channel_operations_spec.ts rename to e2e/cypress/tests/integration/channels/archived_channel/archive_channel_operations_spec.ts index 4d4fb9ce80..8b794e590b 100644 --- a/webapp/channels/e2e/cypress/tests/integration/archived_channel/archive_channel_operations_spec.ts +++ b/e2e/cypress/tests/integration/channels/archived_channel/archive_channel_operations_spec.ts @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @channel +// Group: @channels @channel -import {getRandomId} from '../../utils'; +import {getRandomId} from '../../../utils'; import {createArchivedChannel} from './helpers'; diff --git a/webapp/channels/e2e/cypress/tests/integration/archived_channel/archive_channel_post_spec.ts b/e2e/cypress/tests/integration/channels/archived_channel/archive_channel_post_spec.ts similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/archived_channel/archive_channel_post_spec.ts rename to e2e/cypress/tests/integration/channels/archived_channel/archive_channel_post_spec.ts index e9534088db..cdd2a16c41 100644 --- a/webapp/channels/e2e/cypress/tests/integration/archived_channel/archive_channel_post_spec.ts +++ b/e2e/cypress/tests/integration/channels/archived_channel/archive_channel_post_spec.ts @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @channel +// Group: @channels @channel -import * as TIMEOUTS from '../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; describe('Archived channels', () => { let testTeam; diff --git a/webapp/channels/e2e/cypress/tests/integration/archived_channel/archive_channel_reaction_spec.ts b/e2e/cypress/tests/integration/channels/archived_channel/archive_channel_reaction_spec.ts similarity index 97% rename from webapp/channels/e2e/cypress/tests/integration/archived_channel/archive_channel_reaction_spec.ts rename to e2e/cypress/tests/integration/channels/archived_channel/archive_channel_reaction_spec.ts index 7fb6a3eba4..6130219d53 100644 --- a/webapp/channels/e2e/cypress/tests/integration/archived_channel/archive_channel_reaction_spec.ts +++ b/e2e/cypress/tests/integration/channels/archived_channel/archive_channel_reaction_spec.ts @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @channel +// Group: @channels @channel -import * as TIMEOUTS from '../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; describe('Archived channels', () => { before(() => { diff --git a/webapp/channels/e2e/cypress/tests/integration/archived_channel/archive_channel_search_spec.ts b/e2e/cypress/tests/integration/channels/archived_channel/archive_channel_search_spec.ts similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/archived_channel/archive_channel_search_spec.ts rename to e2e/cypress/tests/integration/channels/archived_channel/archive_channel_search_spec.ts index f60559e387..8db985d456 100644 --- a/webapp/channels/e2e/cypress/tests/integration/archived_channel/archive_channel_search_spec.ts +++ b/e2e/cypress/tests/integration/channels/archived_channel/archive_channel_search_spec.ts @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @channel +// Group: @channels @channel -import {getRandomId} from '../../utils'; +import {getRandomId} from '../../../utils'; import {createArchivedChannel} from './helpers'; diff --git a/webapp/channels/e2e/cypress/tests/integration/archived_channel/archived_channel_spec.ts b/e2e/cypress/tests/integration/channels/archived_channel/archived_channel_spec.ts similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/archived_channel/archived_channel_spec.ts rename to e2e/cypress/tests/integration/channels/archived_channel/archived_channel_spec.ts index d91bf6ce05..09fbaf74ce 100644 --- a/webapp/channels/e2e/cypress/tests/integration/archived_channel/archived_channel_spec.ts +++ b/e2e/cypress/tests/integration/channels/archived_channel/archived_channel_spec.ts @@ -7,9 +7,9 @@ // - Use element ID when selecting an element. Create one if none. // *************************************************************** -// Group: @channel +// Group: @channels @channel -import {getRandomId} from '../../utils'; +import {getRandomId} from '../../../utils'; import {createArchivedChannel} from './helpers'; diff --git a/webapp/channels/e2e/cypress/tests/integration/archived_channel/archived_leave_channel_spec.ts b/e2e/cypress/tests/integration/channels/archived_channel/archived_leave_channel_spec.ts similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/archived_channel/archived_leave_channel_spec.ts rename to e2e/cypress/tests/integration/channels/archived_channel/archived_leave_channel_spec.ts index ce8a449ef0..c56bb79fed 100644 --- a/webapp/channels/e2e/cypress/tests/integration/archived_channel/archived_leave_channel_spec.ts +++ b/e2e/cypress/tests/integration/channels/archived_channel/archived_leave_channel_spec.ts @@ -7,10 +7,10 @@ // - Use element ID when selecting an element. Create one if none. // *************************************************************** -// Group: @channel +// Group: @channels @channel -import * as TIMEOUTS from '../../fixtures/timeouts'; -import {getRandomId} from '../../utils'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; +import {getRandomId} from '../../../utils'; describe('Leave an archived channel', () => { let testTeam; diff --git a/webapp/channels/e2e/cypress/tests/integration/archived_channel/helpers.ts b/e2e/cypress/tests/integration/channels/archived_channel/helpers.ts similarity index 94% rename from webapp/channels/e2e/cypress/tests/integration/archived_channel/helpers.ts rename to e2e/cypress/tests/integration/channels/archived_channel/helpers.ts index fd70866776..93b5c255c6 100644 --- a/webapp/channels/e2e/cypress/tests/integration/archived_channel/helpers.ts +++ b/e2e/cypress/tests/integration/channels/archived_channel/helpers.ts @@ -1,7 +1,7 @@ // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. // See LICENSE.txt for license information. -import * as TIMEOUTS from '../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; export function createArchivedChannel(channelOptions, messages, memberUsernames?) { return cy.uiCreateChannel(channelOptions).then((newChannel) => { diff --git a/webapp/channels/e2e/cypress/tests/integration/archived_channel/join_archived_channel_spec.ts b/e2e/cypress/tests/integration/channels/archived_channel/join_archived_channel_spec.ts similarity index 97% rename from webapp/channels/e2e/cypress/tests/integration/archived_channel/join_archived_channel_spec.ts rename to e2e/cypress/tests/integration/channels/archived_channel/join_archived_channel_spec.ts index 81fcecaa02..231d8579ff 100644 --- a/webapp/channels/e2e/cypress/tests/integration/archived_channel/join_archived_channel_spec.ts +++ b/e2e/cypress/tests/integration/channels/archived_channel/join_archived_channel_spec.ts @@ -8,10 +8,10 @@ // *************************************************************** // Stage: @prod -// Group: @channel +// Group: @channels @channel -import {getAdminAccount} from '../../support/env'; -import {getRandomId} from '../../utils'; +import {getAdminAccount} from '../../../support/env'; +import {getRandomId} from '../../../utils'; describe('Archived channels', () => { let testTeam; diff --git a/webapp/channels/e2e/cypress/tests/integration/archived_channel/leave_archived_channel_spec.ts b/e2e/cypress/tests/integration/channels/archived_channel/leave_archived_channel_spec.ts similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/archived_channel/leave_archived_channel_spec.ts rename to e2e/cypress/tests/integration/channels/archived_channel/leave_archived_channel_spec.ts index 32a9a84206..5ee2a5b5de 100644 --- a/webapp/channels/e2e/cypress/tests/integration/archived_channel/leave_archived_channel_spec.ts +++ b/e2e/cypress/tests/integration/channels/archived_channel/leave_archived_channel_spec.ts @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @channel +// Group: @channels @channel describe('Leaving archived channels', () => { let testTeam; diff --git a/webapp/channels/e2e/cypress/tests/integration/archived_channel/post_menu_spec.ts b/e2e/cypress/tests/integration/channels/archived_channel/post_menu_spec.ts similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/archived_channel/post_menu_spec.ts rename to e2e/cypress/tests/integration/channels/archived_channel/post_menu_spec.ts index 47b92df072..9de08904a7 100644 --- a/webapp/channels/e2e/cypress/tests/integration/archived_channel/post_menu_spec.ts +++ b/e2e/cypress/tests/integration/channels/archived_channel/post_menu_spec.ts @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @channel +// Group: @channels @channel describe('Archived channels', () => { before(() => { diff --git a/webapp/channels/e2e/cypress/tests/integration/auth_sso/authentication_1_spec.ts b/e2e/cypress/tests/integration/channels/auth_sso/authentication_1_spec.ts similarity index 97% rename from webapp/channels/e2e/cypress/tests/integration/auth_sso/authentication_1_spec.ts rename to e2e/cypress/tests/integration/channels/auth_sso/authentication_1_spec.ts index a62c45be60..9ac545ed7d 100644 --- a/webapp/channels/e2e/cypress/tests/integration/auth_sso/authentication_1_spec.ts +++ b/e2e/cypress/tests/integration/channels/auth_sso/authentication_1_spec.ts @@ -8,11 +8,11 @@ // *************************************************************** // Stage: @prod -// Group: @system_console @authentication +// Group: @channels @system_console @authentication -import * as TIMEOUTS from '../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; -import {getRandomId} from '../../utils'; +import {getRandomId} from '../../../utils'; describe('Authentication', () => { let testUser; diff --git a/webapp/channels/e2e/cypress/tests/integration/auth_sso/authentication_2_spec.ts b/e2e/cypress/tests/integration/channels/auth_sso/authentication_2_spec.ts similarity index 97% rename from webapp/channels/e2e/cypress/tests/integration/auth_sso/authentication_2_spec.ts rename to e2e/cypress/tests/integration/channels/auth_sso/authentication_2_spec.ts index 30314a2096..4303404122 100644 --- a/webapp/channels/e2e/cypress/tests/integration/auth_sso/authentication_2_spec.ts +++ b/e2e/cypress/tests/integration/channels/auth_sso/authentication_2_spec.ts @@ -8,11 +8,11 @@ // *************************************************************** // Stage: @prod -// Group: @system_console @authentication @mfa +// Group: @channels @system_console @authentication @mfa -import * as TIMEOUTS from '../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; -import {getRandomId} from '../../utils'; +import {getRandomId} from '../../../utils'; describe('Authentication', () => { beforeEach(() => { diff --git a/webapp/channels/e2e/cypress/tests/integration/auth_sso/authentication_3_spec.ts b/e2e/cypress/tests/integration/channels/auth_sso/authentication_3_spec.ts similarity index 97% rename from webapp/channels/e2e/cypress/tests/integration/auth_sso/authentication_3_spec.ts rename to e2e/cypress/tests/integration/channels/auth_sso/authentication_3_spec.ts index 8eaff98571..6d4ee9c841 100644 --- a/webapp/channels/e2e/cypress/tests/integration/auth_sso/authentication_3_spec.ts +++ b/e2e/cypress/tests/integration/channels/auth_sso/authentication_3_spec.ts @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @system_console @authentication +// Group: @channels @system_console @authentication describe('Authentication', () => { beforeEach(() => { diff --git a/webapp/channels/e2e/cypress/tests/integration/auth_sso/authentication_4_spec.ts b/e2e/cypress/tests/integration/channels/auth_sso/authentication_4_spec.ts similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/auth_sso/authentication_4_spec.ts rename to e2e/cypress/tests/integration/channels/auth_sso/authentication_4_spec.ts index b6de8bb665..b369178af9 100644 --- a/webapp/channels/e2e/cypress/tests/integration/auth_sso/authentication_4_spec.ts +++ b/e2e/cypress/tests/integration/channels/auth_sso/authentication_4_spec.ts @@ -8,10 +8,10 @@ // *************************************************************** // Stage: @prod -// Group: @system_console @authentication +// Group: @channels @system_console @authentication -import * as TIMEOUTS from '../../fixtures/timeouts'; -import {reUrl, getRandomId} from '../../utils'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; +import {reUrl, getRandomId} from '../../../utils'; describe('Authentication', () => { let testUser; diff --git a/webapp/channels/e2e/cypress/tests/integration/auth_sso/authentication_not_cloud_spec.ts b/e2e/cypress/tests/integration/channels/auth_sso/authentication_not_cloud_spec.ts similarity index 95% rename from webapp/channels/e2e/cypress/tests/integration/auth_sso/authentication_not_cloud_spec.ts rename to e2e/cypress/tests/integration/channels/auth_sso/authentication_not_cloud_spec.ts index 86a6bd159f..0c1297b502 100644 --- a/webapp/channels/e2e/cypress/tests/integration/auth_sso/authentication_not_cloud_spec.ts +++ b/e2e/cypress/tests/integration/channels/auth_sso/authentication_not_cloud_spec.ts @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @system_console @authentication @not_cloud +// Group: @channels @system_console @authentication @not_cloud -import * as TIMEOUTS from '../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; describe('Authentication', () => { before(() => { diff --git a/webapp/channels/e2e/cypress/tests/integration/auth_sso/hide_create_account_spec.ts b/e2e/cypress/tests/integration/channels/auth_sso/hide_create_account_spec.ts similarity index 90% rename from webapp/channels/e2e/cypress/tests/integration/auth_sso/hide_create_account_spec.ts rename to e2e/cypress/tests/integration/channels/auth_sso/hide_create_account_spec.ts index 4e8fe0dd54..b4ed882077 100644 --- a/webapp/channels/e2e/cypress/tests/integration/auth_sso/hide_create_account_spec.ts +++ b/e2e/cypress/tests/integration/channels/auth_sso/hide_create_account_spec.ts @@ -7,9 +7,9 @@ // - Use element ID when selecting an element. Create one if none. // *************************************************************** -// Group: @system_console @authentication +// Group: @channels @system_console @authentication -import * as TIMEOUTS from '../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; describe('Authentication', () => { before(() => { diff --git a/webapp/channels/e2e/cypress/tests/integration/autocomplete/common_test.ts b/e2e/cypress/tests/integration/channels/autocomplete/common_test.ts similarity index 100% rename from webapp/channels/e2e/cypress/tests/integration/autocomplete/common_test.ts rename to e2e/cypress/tests/integration/channels/autocomplete/common_test.ts diff --git a/webapp/channels/e2e/cypress/tests/integration/autocomplete/database/users_in_channel_switcher_spec.js b/e2e/cypress/tests/integration/channels/autocomplete/database/users_in_channel_switcher_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/autocomplete/database/users_in_channel_switcher_spec.js rename to e2e/cypress/tests/integration/channels/autocomplete/database/users_in_channel_switcher_spec.js index 6a827add34..9173a72184 100644 --- a/webapp/channels/e2e/cypress/tests/integration/autocomplete/database/users_in_channel_switcher_spec.js +++ b/e2e/cypress/tests/integration/channels/autocomplete/database/users_in_channel_switcher_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @autocomplete +// Group: @channels @autocomplete -import {getRandomLetter} from '../../../utils'; +import {getRandomLetter} from '../../../../utils'; import {doTestQuickChannelSwitcher} from '../common_test'; import {createSearchData} from '../helpers'; diff --git a/webapp/channels/e2e/cypress/tests/integration/autocomplete/database/users_in_message_input_box_spec.js b/e2e/cypress/tests/integration/channels/autocomplete/database/users_in_message_input_box_spec.js similarity index 97% rename from webapp/channels/e2e/cypress/tests/integration/autocomplete/database/users_in_message_input_box_spec.js rename to e2e/cypress/tests/integration/channels/autocomplete/database/users_in_message_input_box_spec.js index e098f1f105..35efe333f3 100644 --- a/webapp/channels/e2e/cypress/tests/integration/autocomplete/database/users_in_message_input_box_spec.js +++ b/e2e/cypress/tests/integration/channels/autocomplete/database/users_in_message_input_box_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @autocomplete +// Group: @channels @autocomplete -import {getRandomLetter} from '../../../utils'; +import {getRandomLetter} from '../../../../utils'; import {doTestPostextbox} from '../common_test'; import {createSearchData} from '../helpers'; diff --git a/webapp/channels/e2e/cypress/tests/integration/autocomplete/database/users_spec.js b/e2e/cypress/tests/integration/channels/autocomplete/database/users_spec.js similarity index 94% rename from webapp/channels/e2e/cypress/tests/integration/autocomplete/database/users_spec.js rename to e2e/cypress/tests/integration/channels/autocomplete/database/users_spec.js index 612745faae..93bc2d4ff0 100644 --- a/webapp/channels/e2e/cypress/tests/integration/autocomplete/database/users_spec.js +++ b/e2e/cypress/tests/integration/channels/autocomplete/database/users_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @autocomplete +// Group: @channels @autocomplete -import {getRandomLetter} from '../../../utils'; +import {getRandomLetter} from '../../../../utils'; import {doTestDMChannelSidebar, doTestUserChannelSection} from '../common_test'; import {createSearchData} from '../helpers'; diff --git a/webapp/channels/e2e/cypress/tests/integration/autocomplete/helpers.ts b/e2e/cypress/tests/integration/channels/autocomplete/helpers.ts similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/autocomplete/helpers.ts rename to e2e/cypress/tests/integration/channels/autocomplete/helpers.ts index ccce18d973..ed81c77973 100644 --- a/webapp/channels/e2e/cypress/tests/integration/autocomplete/helpers.ts +++ b/e2e/cypress/tests/integration/channels/autocomplete/helpers.ts @@ -1,8 +1,8 @@ // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. // See LICENSE.txt for license information. -import * as TIMEOUTS from '../../fixtures/timeouts'; -import {getAdminAccount} from '../../support/env'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; +import {getAdminAccount} from '../../../support/env'; export type SimpleUser = Pick; diff --git a/webapp/channels/e2e/cypress/tests/integration/benchmark/message_spec.ts b/e2e/cypress/tests/integration/channels/benchmark/message_spec.ts similarity index 94% rename from webapp/channels/e2e/cypress/tests/integration/benchmark/message_spec.ts rename to e2e/cypress/tests/integration/channels/benchmark/message_spec.ts index ff22d343c1..86ae4ec711 100644 --- a/webapp/channels/e2e/cypress/tests/integration/benchmark/message_spec.ts +++ b/e2e/cypress/tests/integration/channels/benchmark/message_spec.ts @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @messaging @benchmark +// Group: @channels @messaging @benchmark -import {reportBenchmarkResults} from '../../utils/benchmark'; +import {reportBenchmarkResults} from '../../../utils/benchmark'; describe('Message', () => { before(() => { diff --git a/webapp/channels/e2e/cypress/tests/integration/bot_accounts/bot_api_1_spec.js b/e2e/cypress/tests/integration/channels/bot_accounts/bot_api_1_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/bot_accounts/bot_api_1_spec.js rename to e2e/cypress/tests/integration/channels/bot_accounts/bot_api_1_spec.js index 445cce9421..7f683d1968 100644 --- a/webapp/channels/e2e/cypress/tests/integration/bot_accounts/bot_api_1_spec.js +++ b/e2e/cypress/tests/integration/channels/bot_accounts/bot_api_1_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @bot_accounts @mfa +// Group: @channels @bot_accounts @mfa -import * as TIMEOUTS from '../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; describe('Bot accounts ownership and API', () => { let newTeam; diff --git a/webapp/channels/e2e/cypress/tests/integration/bot_accounts/bot_api_2_spec.js b/e2e/cypress/tests/integration/channels/bot_accounts/bot_api_2_spec.js similarity index 99% rename from webapp/channels/e2e/cypress/tests/integration/bot_accounts/bot_api_2_spec.js rename to e2e/cypress/tests/integration/channels/bot_accounts/bot_api_2_spec.js index 914ffab19f..857157f010 100644 --- a/webapp/channels/e2e/cypress/tests/integration/bot_accounts/bot_api_2_spec.js +++ b/e2e/cypress/tests/integration/channels/bot_accounts/bot_api_2_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @bot_accounts @mfa +// Group: @channels @bot_accounts @mfa -import * as TIMEOUTS from '../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; describe('Bot accounts ownership and API', () => { let newTeam; diff --git a/webapp/channels/e2e/cypress/tests/integration/bot_accounts/bot_api_not_cloud_spec.js b/e2e/cypress/tests/integration/channels/bot_accounts/bot_api_not_cloud_spec.js similarity index 96% rename from webapp/channels/e2e/cypress/tests/integration/bot_accounts/bot_api_not_cloud_spec.js rename to e2e/cypress/tests/integration/channels/bot_accounts/bot_api_not_cloud_spec.js index 4e3d1894f1..2ffe42033e 100644 --- a/webapp/channels/e2e/cypress/tests/integration/bot_accounts/bot_api_not_cloud_spec.js +++ b/e2e/cypress/tests/integration/channels/bot_accounts/bot_api_not_cloud_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @not_cloud @bot_accounts +// Group: @channels @not_cloud @bot_accounts -import * as TIMEOUTS from '../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; describe('Bot accounts ownership and API', () => { let newTeam; diff --git a/webapp/channels/e2e/cypress/tests/integration/bot_accounts/bot_channel_intro_spec.js b/e2e/cypress/tests/integration/channels/bot_accounts/bot_channel_intro_spec.js similarity index 95% rename from webapp/channels/e2e/cypress/tests/integration/bot_accounts/bot_channel_intro_spec.js rename to e2e/cypress/tests/integration/channels/bot_accounts/bot_channel_intro_spec.js index 91b4797f6f..cf315bc8fc 100644 --- a/webapp/channels/e2e/cypress/tests/integration/bot_accounts/bot_channel_intro_spec.js +++ b/e2e/cypress/tests/integration/channels/bot_accounts/bot_channel_intro_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @bot_accounts +// Group: @channels @bot_accounts -import {createBotPatch} from '../../support/api/bots'; +import {createBotPatch} from '../../../support/api/bots'; describe('Bot channel intro and avatar', () => { let team; diff --git a/webapp/channels/e2e/cypress/tests/integration/bot_accounts/create_bot_spec.js b/e2e/cypress/tests/integration/channels/bot_accounts/create_bot_spec.js similarity index 96% rename from webapp/channels/e2e/cypress/tests/integration/bot_accounts/create_bot_spec.js rename to e2e/cypress/tests/integration/channels/bot_accounts/create_bot_spec.js index 31ba89e5c9..d2c103a8e9 100644 --- a/webapp/channels/e2e/cypress/tests/integration/bot_accounts/create_bot_spec.js +++ b/e2e/cypress/tests/integration/channels/bot_accounts/create_bot_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @bot_accounts +// Group: @channels @bot_accounts -import {getRandomId} from '../../utils'; +import {getRandomId} from '../../../utils'; describe('Create bot', () => { it('MM-T1810 Create a Bot via the UI', () => { diff --git a/webapp/channels/e2e/cypress/tests/integration/bot_accounts/crud_not_cloud_spec.js b/e2e/cypress/tests/integration/channels/bot_accounts/crud_not_cloud_spec.js similarity index 96% rename from webapp/channels/e2e/cypress/tests/integration/bot_accounts/crud_not_cloud_spec.js rename to e2e/cypress/tests/integration/channels/bot_accounts/crud_not_cloud_spec.js index a4fb2f8d61..281c07fd83 100644 --- a/webapp/channels/e2e/cypress/tests/integration/bot_accounts/crud_not_cloud_spec.js +++ b/e2e/cypress/tests/integration/channels/bot_accounts/crud_not_cloud_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @not_cloud @bot_accounts +// Group: @channels @not_cloud @bot_accounts -import {getRandomId} from '../../utils'; +import {getRandomId} from '../../../utils'; import {createBotInteractive} from './helpers'; diff --git a/webapp/channels/e2e/cypress/tests/integration/bot_accounts/crud_spec.js b/e2e/cypress/tests/integration/channels/bot_accounts/crud_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/bot_accounts/crud_spec.js rename to e2e/cypress/tests/integration/channels/bot_accounts/crud_spec.js index be68e0b54e..44328a4c17 100644 --- a/webapp/channels/e2e/cypress/tests/integration/bot_accounts/crud_spec.js +++ b/e2e/cypress/tests/integration/channels/bot_accounts/crud_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @bot_accounts +// Group: @channels @bot_accounts -import {getRandomId} from '../../utils'; +import {getRandomId} from '../../../utils'; import {createBotInteractive} from './helpers'; diff --git a/webapp/channels/e2e/cypress/tests/integration/bot_accounts/display_name_spec.js b/e2e/cypress/tests/integration/channels/bot_accounts/display_name_spec.js similarity index 99% rename from webapp/channels/e2e/cypress/tests/integration/bot_accounts/display_name_spec.js rename to e2e/cypress/tests/integration/channels/bot_accounts/display_name_spec.js index e8968ec941..93bb855787 100644 --- a/webapp/channels/e2e/cypress/tests/integration/bot_accounts/display_name_spec.js +++ b/e2e/cypress/tests/integration/channels/bot_accounts/display_name_spec.js @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @bot_accounts +// Group: @channels @bot_accounts describe('Bot display name', () => { let offTopicChannel; diff --git a/webapp/channels/e2e/cypress/tests/integration/bot_accounts/edit_bot_spec.js b/e2e/cypress/tests/integration/channels/bot_accounts/edit_bot_spec.js similarity index 95% rename from webapp/channels/e2e/cypress/tests/integration/bot_accounts/edit_bot_spec.js rename to e2e/cypress/tests/integration/channels/bot_accounts/edit_bot_spec.js index fef435b41c..b18a8a9da8 100644 --- a/webapp/channels/e2e/cypress/tests/integration/bot_accounts/edit_bot_spec.js +++ b/e2e/cypress/tests/integration/channels/bot_accounts/edit_bot_spec.js @@ -8,10 +8,10 @@ // *************************************************************** // Stage: @prod -// Group: @bot_accounts +// Group: @channels @bot_accounts -import * as MESSAGES from '../../fixtures/messages'; -import {getRandomId} from '../../utils'; +import * as MESSAGES from '../../../fixtures/messages'; +import {getRandomId} from '../../../utils'; describe('Edit bot', () => { let testTeam; diff --git a/webapp/channels/e2e/cypress/tests/integration/bot_accounts/edit_bot_username_spec.js b/e2e/cypress/tests/integration/channels/bot_accounts/edit_bot_username_spec.js similarity index 97% rename from webapp/channels/e2e/cypress/tests/integration/bot_accounts/edit_bot_username_spec.js rename to e2e/cypress/tests/integration/channels/bot_accounts/edit_bot_username_spec.js index 55f6256325..5876284c1c 100644 --- a/webapp/channels/e2e/cypress/tests/integration/bot_accounts/edit_bot_username_spec.js +++ b/e2e/cypress/tests/integration/channels/bot_accounts/edit_bot_username_spec.js @@ -8,10 +8,10 @@ // *************************************************************** // Stage: @prod -// Group: @bot_accounts +// Group: @channels @bot_accounts -import * as TIMEOUTS from '../../fixtures/timeouts'; -import {getRandomId} from '../../utils'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; +import {getRandomId} from '../../../utils'; describe('Edit bot username', () => { let team; diff --git a/webapp/channels/e2e/cypress/tests/integration/bot_accounts/helpers.js b/e2e/cypress/tests/integration/channels/bot_accounts/helpers.js similarity index 90% rename from webapp/channels/e2e/cypress/tests/integration/bot_accounts/helpers.js rename to e2e/cypress/tests/integration/channels/bot_accounts/helpers.js index 61fd9efb15..e46a8df897 100644 --- a/webapp/channels/e2e/cypress/tests/integration/bot_accounts/helpers.js +++ b/e2e/cypress/tests/integration/channels/bot_accounts/helpers.js @@ -1,8 +1,8 @@ // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. // See LICENSE.txt for license information. -import {getRandomId} from '../../utils'; -import * as TIMEOUTS from '../../fixtures/timeouts'; +import {getRandomId} from '../../../utils'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; export function createBotInteractive(team, username = `bot-${getRandomId()}`) { // # Visit the Integrations > Bot Accounts page diff --git a/webapp/channels/e2e/cypress/tests/integration/bot_accounts/in_lists_1_spec.js b/e2e/cypress/tests/integration/channels/bot_accounts/in_lists_1_spec.js similarity index 93% rename from webapp/channels/e2e/cypress/tests/integration/bot_accounts/in_lists_1_spec.js rename to e2e/cypress/tests/integration/channels/bot_accounts/in_lists_1_spec.js index 98881d005d..5de4c85bd9 100644 --- a/webapp/channels/e2e/cypress/tests/integration/bot_accounts/in_lists_1_spec.js +++ b/e2e/cypress/tests/integration/channels/bot_accounts/in_lists_1_spec.js @@ -8,10 +8,10 @@ // *************************************************************** // Stage: @prod -// Group: @bot_accounts +// Group: @channels @bot_accounts -import {createBotPatch} from '../../support/api/bots'; -import {generateRandomUser} from '../../support/api/user'; +import {createBotPatch} from '../../../support/api/bots'; +import {generateRandomUser} from '../../../support/api/user'; describe('Bots in lists', () => { let team; diff --git a/webapp/channels/e2e/cypress/tests/integration/bot_accounts/in_lists_2_spec.js b/e2e/cypress/tests/integration/channels/bot_accounts/in_lists_2_spec.js similarity index 96% rename from webapp/channels/e2e/cypress/tests/integration/bot_accounts/in_lists_2_spec.js rename to e2e/cypress/tests/integration/channels/bot_accounts/in_lists_2_spec.js index 05285fe5fd..98bfee2ec4 100644 --- a/webapp/channels/e2e/cypress/tests/integration/bot_accounts/in_lists_2_spec.js +++ b/e2e/cypress/tests/integration/channels/bot_accounts/in_lists_2_spec.js @@ -7,10 +7,10 @@ // - Use element ID when selecting an element. Create one if none. // *************************************************************** -// Group: @bot_accounts +// Group: @channels @bot_accounts -import {createBotPatch} from '../../support/api/bots'; -import {generateRandomUser} from '../../support/api/user'; +import {createBotPatch} from '../../../support/api/bots'; +import {generateRandomUser} from '../../../support/api/user'; describe('Bots in lists', () => { let team; diff --git a/webapp/channels/e2e/cypress/tests/integration/bot_accounts/in_teams_and_channels_spec.js b/e2e/cypress/tests/integration/channels/bot_accounts/in_teams_and_channels_spec.js similarity index 95% rename from webapp/channels/e2e/cypress/tests/integration/bot_accounts/in_teams_and_channels_spec.js rename to e2e/cypress/tests/integration/channels/bot_accounts/in_teams_and_channels_spec.js index bb879d343d..ec12c7f73e 100644 --- a/webapp/channels/e2e/cypress/tests/integration/bot_accounts/in_teams_and_channels_spec.js +++ b/e2e/cypress/tests/integration/channels/bot_accounts/in_teams_and_channels_spec.js @@ -8,10 +8,10 @@ // *************************************************************** // Stage: @prod -// Group: @bot_accounts +// Group: @channels @bot_accounts -import {createBotPatch} from '../../support/api/bots'; -import {createChannelPatch} from '../../support/api/channel'; +import {createBotPatch} from '../../../support/api/bots'; +import {createChannelPatch} from '../../../support/api/channel'; describe('Managing bots in Teams and Channels', () => { let team; diff --git a/webapp/channels/e2e/cypress/tests/integration/bot_accounts/managing_bot_accounts_not_cloud_spec.js b/e2e/cypress/tests/integration/channels/bot_accounts/managing_bot_accounts_not_cloud_spec.js similarity index 95% rename from webapp/channels/e2e/cypress/tests/integration/bot_accounts/managing_bot_accounts_not_cloud_spec.js rename to e2e/cypress/tests/integration/channels/bot_accounts/managing_bot_accounts_not_cloud_spec.js index bbf3807d9b..873e8caf60 100644 --- a/webapp/channels/e2e/cypress/tests/integration/bot_accounts/managing_bot_accounts_not_cloud_spec.js +++ b/e2e/cypress/tests/integration/channels/bot_accounts/managing_bot_accounts_not_cloud_spec.js @@ -8,10 +8,10 @@ // *************************************************************** // Stage: @prod -// Group: @bot_accounts @plugin @not_cloud +// Group: @channels @bot_accounts @plugin @not_cloud -import * as TIMEOUTS from '../../fixtures/timeouts'; -import {matterpollPlugin} from '../../utils/plugins'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; +import {matterpollPlugin} from '../../../utils/plugins'; describe('Managing bot accounts', () => { let newTeam; diff --git a/webapp/channels/e2e/cypress/tests/integration/bot_accounts/managing_bot_accounts_spec.js b/e2e/cypress/tests/integration/channels/bot_accounts/managing_bot_accounts_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/bot_accounts/managing_bot_accounts_spec.js rename to e2e/cypress/tests/integration/channels/bot_accounts/managing_bot_accounts_spec.js index 8208edde9d..71861d1353 100644 --- a/webapp/channels/e2e/cypress/tests/integration/bot_accounts/managing_bot_accounts_spec.js +++ b/e2e/cypress/tests/integration/channels/bot_accounts/managing_bot_accounts_spec.js @@ -8,10 +8,10 @@ // *************************************************************** // Stage: @prod -// Group: @bot_accounts +// Group: @channels @bot_accounts -import * as TIMEOUTS from '../../fixtures/timeouts'; -import {getRandomId} from '../../utils'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; +import {getRandomId} from '../../../utils'; describe('Managing bot accounts', () => { let newTeam; diff --git a/webapp/channels/e2e/cypress/tests/integration/bot_accounts/post_message_spec.js b/e2e/cypress/tests/integration/channels/bot_accounts/post_message_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/bot_accounts/post_message_spec.js rename to e2e/cypress/tests/integration/channels/bot_accounts/post_message_spec.js index 596148d1b4..66546829c5 100644 --- a/webapp/channels/e2e/cypress/tests/integration/bot_accounts/post_message_spec.js +++ b/e2e/cypress/tests/integration/channels/bot_accounts/post_message_spec.js @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @bot_accounts +// Group: @channels @bot_accounts describe('Bot post message', () => { let offTopicChannel; diff --git a/webapp/channels/e2e/cypress/tests/integration/bot_accounts/promote_demote_spec.js b/e2e/cypress/tests/integration/channels/bot_accounts/promote_demote_spec.js similarity index 95% rename from webapp/channels/e2e/cypress/tests/integration/bot_accounts/promote_demote_spec.js rename to e2e/cypress/tests/integration/channels/bot_accounts/promote_demote_spec.js index 61d8072c1d..52d6ada67e 100644 --- a/webapp/channels/e2e/cypress/tests/integration/bot_accounts/promote_demote_spec.js +++ b/e2e/cypress/tests/integration/channels/bot_accounts/promote_demote_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @bot_accounts +// Group: @channels @bot_accounts -import {createBotPatch} from '../../support/api/bots'; +import {createBotPatch} from '../../../support/api/bots'; describe('Managing bots in Teams and Channels', () => { let team; diff --git a/webapp/channels/e2e/cypress/tests/integration/bot_accounts/sidebar_display_spec.js b/e2e/cypress/tests/integration/channels/bot_accounts/sidebar_display_spec.js similarity index 95% rename from webapp/channels/e2e/cypress/tests/integration/bot_accounts/sidebar_display_spec.js rename to e2e/cypress/tests/integration/channels/bot_accounts/sidebar_display_spec.js index e34f25302f..c9fda340c6 100644 --- a/webapp/channels/e2e/cypress/tests/integration/bot_accounts/sidebar_display_spec.js +++ b/e2e/cypress/tests/integration/channels/bot_accounts/sidebar_display_spec.js @@ -8,10 +8,10 @@ // *************************************************************** // Stage: @prod -// Group: @bot_accounts @not_cloud +// Group: @channels @bot_accounts @not_cloud -import {createBotPatch} from '../../support/api/bots'; -import {generateRandomUser} from '../../support/api/user'; +import {createBotPatch} from '../../../support/api/bots'; +import {generateRandomUser} from '../../../support/api/user'; describe('Bot accounts', () => { let team; diff --git a/webapp/channels/e2e/cypress/tests/integration/bot_accounts/tags_spec.js b/e2e/cypress/tests/integration/channels/bot_accounts/tags_spec.js similarity index 97% rename from webapp/channels/e2e/cypress/tests/integration/bot_accounts/tags_spec.js rename to e2e/cypress/tests/integration/channels/bot_accounts/tags_spec.js index abcaa7ed4b..efc7b5d2d4 100644 --- a/webapp/channels/e2e/cypress/tests/integration/bot_accounts/tags_spec.js +++ b/e2e/cypress/tests/integration/channels/bot_accounts/tags_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @bot_accounts +// Group: @channels @bot_accounts -import {createBotPatch} from '../../support/api/bots'; +import {createBotPatch} from '../../../support/api/bots'; describe('Bot tags', () => { let me; diff --git a/webapp/channels/e2e/cypress/tests/integration/channel/archived_channels_1_spec.js b/e2e/cypress/tests/integration/channels/channel/archived_channels_1_spec.js similarity index 99% rename from webapp/channels/e2e/cypress/tests/integration/channel/archived_channels_1_spec.js rename to e2e/cypress/tests/integration/channels/channel/archived_channels_1_spec.js index 8a126209f1..f6f6a3e186 100644 --- a/webapp/channels/e2e/cypress/tests/integration/channel/archived_channels_1_spec.js +++ b/e2e/cypress/tests/integration/channels/channel/archived_channels_1_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @channel +// Group: @channels @channel -import {getRandomId} from '../../utils'; +import {getRandomId} from '../../../utils'; describe('Leave an archived channel', () => { let testTeam; diff --git a/webapp/channels/e2e/cypress/tests/integration/channel/archived_channels_2_spec.js b/e2e/cypress/tests/integration/channels/channel/archived_channels_2_spec.js similarity index 97% rename from webapp/channels/e2e/cypress/tests/integration/channel/archived_channels_2_spec.js rename to e2e/cypress/tests/integration/channels/channel/archived_channels_2_spec.js index 5ded8da2a7..cda79d0115 100644 --- a/webapp/channels/e2e/cypress/tests/integration/channel/archived_channels_2_spec.js +++ b/e2e/cypress/tests/integration/channels/channel/archived_channels_2_spec.js @@ -8,10 +8,10 @@ // *************************************************************** // Stage: @prod -// Group: @channel +// Group: @channels @channel -import {getAdminAccount} from '../../support/env'; -import {getRandomId} from '../../utils'; +import {getAdminAccount} from '../../../support/env'; +import {getRandomId} from '../../../utils'; describe('Leave an archived channel', () => { let testTeam; diff --git a/webapp/channels/e2e/cypress/tests/integration/channel/channel_info_rhs_spec.js b/e2e/cypress/tests/integration/channels/channel/channel_info_rhs_spec.js similarity index 99% rename from webapp/channels/e2e/cypress/tests/integration/channel/channel_info_rhs_spec.js rename to e2e/cypress/tests/integration/channels/channel/channel_info_rhs_spec.js index 0e37eb0d03..c95695a866 100644 --- a/webapp/channels/e2e/cypress/tests/integration/channel/channel_info_rhs_spec.js +++ b/e2e/cypress/tests/integration/channels/channel/channel_info_rhs_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @channel @rhs @channel_info +// Group: @channels @channel @rhs @channel_info -import {stubClipboard} from '../../utils'; +import {stubClipboard} from '../../../utils'; describe('Channel Info RHS', () => { let testTeam; diff --git a/webapp/channels/e2e/cypress/tests/integration/channel/channel_members_rhs_spec.js b/e2e/cypress/tests/integration/channels/channel/channel_members_rhs_spec.js similarity index 99% rename from webapp/channels/e2e/cypress/tests/integration/channel/channel_members_rhs_spec.js rename to e2e/cypress/tests/integration/channels/channel/channel_members_rhs_spec.js index 0ab4a66693..0b89b9f3f8 100644 --- a/webapp/channels/e2e/cypress/tests/integration/channel/channel_members_rhs_spec.js +++ b/e2e/cypress/tests/integration/channels/channel/channel_members_rhs_spec.js @@ -1,7 +1,7 @@ // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. // See LICENSE.txt for license information. -const {generateRandomUser} = require('../../support/api/user'); +const {generateRandomUser} = require('../../../support/api/user'); // *************************************************************** // - [#] indicates a test step (e.g. # Go to a page) @@ -10,7 +10,7 @@ const {generateRandomUser} = require('../../support/api/user'); // *************************************************************** // Stage: @prod -// Group: @channel @rhs @channel_members +// Group: @channels @channel @rhs @channel_members function openChannelMembersRhs(testTeam, testChannel) { // # Go to test channel diff --git a/webapp/channels/e2e/cypress/tests/integration/channel/channel_mention_autocomplete_spec.js b/e2e/cypress/tests/integration/channels/channel/channel_mention_autocomplete_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/channel/channel_mention_autocomplete_spec.js rename to e2e/cypress/tests/integration/channels/channel/channel_mention_autocomplete_spec.js index 11136faeaa..6b6a8810d7 100644 --- a/webapp/channels/e2e/cypress/tests/integration/channel/channel_mention_autocomplete_spec.js +++ b/e2e/cypress/tests/integration/channels/channel/channel_mention_autocomplete_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @channel +// Group: @channels @channel -import * as TIMEOUTS from '../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; describe('Channel', () => { let testTeam; diff --git a/webapp/channels/e2e/cypress/tests/integration/channel/channel_name_tooltips_spec.js b/e2e/cypress/tests/integration/channels/channel/channel_name_tooltips_spec.js similarity index 97% rename from webapp/channels/e2e/cypress/tests/integration/channel/channel_name_tooltips_spec.js rename to e2e/cypress/tests/integration/channels/channel/channel_name_tooltips_spec.js index c7241cadea..e0327ec6d2 100644 --- a/webapp/channels/e2e/cypress/tests/integration/channel/channel_name_tooltips_spec.js +++ b/e2e/cypress/tests/integration/channels/channel/channel_name_tooltips_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @channel @not_cloud +// Group: @channels @channel @not_cloud -import * as TIMEOUTS from '../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; const timestamp = Date.now(); diff --git a/webapp/channels/e2e/cypress/tests/integration/channel/channel_routing_spec.js b/e2e/cypress/tests/integration/channels/channel/channel_routing_spec.js similarity index 99% rename from webapp/channels/e2e/cypress/tests/integration/channel/channel_routing_spec.js rename to e2e/cypress/tests/integration/channels/channel/channel_routing_spec.js index c561e7ad02..8349d0491c 100644 --- a/webapp/channels/e2e/cypress/tests/integration/channel/channel_routing_spec.js +++ b/e2e/cypress/tests/integration/channels/channel/channel_routing_spec.js @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @channel +// Group: @channels @channel describe('Channel routing', () => { let testUser; diff --git a/webapp/channels/e2e/cypress/tests/integration/channel/channel_settings_spec.js b/e2e/cypress/tests/integration/channels/channel/channel_settings_spec.js similarity index 97% rename from webapp/channels/e2e/cypress/tests/integration/channel/channel_settings_spec.js rename to e2e/cypress/tests/integration/channels/channel/channel_settings_spec.js index 50040dcf0a..f08d637e65 100644 --- a/webapp/channels/e2e/cypress/tests/integration/channel/channel_settings_spec.js +++ b/e2e/cypress/tests/integration/channels/channel/channel_settings_spec.js @@ -8,12 +8,12 @@ // *************************************************************** // Stage: @prod -// Group: @channel @channel_settings +// Group: @channels @channel @channel_settings import { beMuted, beUnmuted, -} from '../../support/assertions'; +} from '../../../support/assertions'; describe('Channel Settings', () => { let testTeam; diff --git a/webapp/channels/e2e/cypress/tests/integration/channel/channel_switcher_spec.js b/e2e/cypress/tests/integration/channels/channel/channel_switcher_spec.js similarity index 99% rename from webapp/channels/e2e/cypress/tests/integration/channel/channel_switcher_spec.js rename to e2e/cypress/tests/integration/channels/channel/channel_switcher_spec.js index a6126aab19..eb4e12255a 100644 --- a/webapp/channels/e2e/cypress/tests/integration/channel/channel_switcher_spec.js +++ b/e2e/cypress/tests/integration/channels/channel/channel_switcher_spec.js @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @channel @smoke +// Group: @channels @channel @smoke describe('Channel Switcher', () => { let testTeam; diff --git a/webapp/channels/e2e/cypress/tests/integration/channel/close_direct_group_spec.js b/e2e/cypress/tests/integration/channels/channel/close_direct_group_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/channel/close_direct_group_spec.js rename to e2e/cypress/tests/integration/channels/channel/close_direct_group_spec.js index 6c6d02471b..6afddf0cbe 100644 --- a/webapp/channels/e2e/cypress/tests/integration/channel/close_direct_group_spec.js +++ b/e2e/cypress/tests/integration/channels/channel/close_direct_group_spec.js @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @channel @channel_settings @not_cloud +// Group: @channels @channel @channel_settings @not_cloud // Make sure that the current channel is Town Square and that the // channel identified by the passed name is no longer in the channel diff --git a/webapp/channels/e2e/cypress/tests/integration/channel/convert_channel_to_private_spec.js b/e2e/cypress/tests/integration/channels/channel/convert_channel_to_private_spec.js similarity index 99% rename from webapp/channels/e2e/cypress/tests/integration/channel/convert_channel_to_private_spec.js rename to e2e/cypress/tests/integration/channels/channel/convert_channel_to_private_spec.js index 045dabe6c5..93d92c30da 100644 --- a/webapp/channels/e2e/cypress/tests/integration/channel/convert_channel_to_private_spec.js +++ b/e2e/cypress/tests/integration/channels/channel/convert_channel_to_private_spec.js @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @channel +// Group: @channels @channel describe('Channels', () => { let testUser; diff --git a/webapp/channels/e2e/cypress/tests/integration/channel/leave_and_archive_channel_destructive_spec.ts b/e2e/cypress/tests/integration/channels/channel/leave_and_archive_channel_destructive_spec.ts similarity index 99% rename from webapp/channels/e2e/cypress/tests/integration/channel/leave_and_archive_channel_destructive_spec.ts rename to e2e/cypress/tests/integration/channels/channel/leave_and_archive_channel_destructive_spec.ts index 904d06c09e..2a84722131 100644 --- a/webapp/channels/e2e/cypress/tests/integration/channel/leave_and_archive_channel_destructive_spec.ts +++ b/e2e/cypress/tests/integration/channels/channel/leave_and_archive_channel_destructive_spec.ts @@ -10,7 +10,7 @@ import {UserProfile} from 'mattermost-redux/types/users'; // *************************************************************** // Stage: @prod -// Group: @channel +// Group: @channels @channel describe('Leave and Archive channel actions display as destructive', () => { let testUser: UserProfile; diff --git a/webapp/channels/e2e/cypress/tests/integration/channel/leave_channel_spec.js b/e2e/cypress/tests/integration/channels/channel/leave_channel_spec.js similarity index 97% rename from webapp/channels/e2e/cypress/tests/integration/channel/leave_channel_spec.js rename to e2e/cypress/tests/integration/channels/channel/leave_channel_spec.js index 3a0e93c908..154d3308fc 100644 --- a/webapp/channels/e2e/cypress/tests/integration/channel/leave_channel_spec.js +++ b/e2e/cypress/tests/integration/channels/channel/leave_channel_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @channel +// Group: @channels @channel -import * as TIMEOUTS from '../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; describe('Leave channel', () => { let testTeam; diff --git a/webapp/channels/e2e/cypress/tests/integration/channel/more_channels_spec.js b/e2e/cypress/tests/integration/channels/channel/more_channels_spec.js similarity index 99% rename from webapp/channels/e2e/cypress/tests/integration/channel/more_channels_spec.js rename to e2e/cypress/tests/integration/channels/channel/more_channels_spec.js index 91f339646a..7848ae787c 100644 --- a/webapp/channels/e2e/cypress/tests/integration/channel/more_channels_spec.js +++ b/e2e/cypress/tests/integration/channels/channel/more_channels_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @channel +// Group: @channels @channel -import * as TIMEOUTS from '../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; import {createPrivateChannel} from '../enterprise/elasticsearch_autocomplete/helpers'; diff --git a/webapp/channels/e2e/cypress/tests/integration/channel/more_public_channels_spec.js b/e2e/cypress/tests/integration/channels/channel/more_public_channels_spec.js similarity index 99% rename from webapp/channels/e2e/cypress/tests/integration/channel/more_public_channels_spec.js rename to e2e/cypress/tests/integration/channels/channel/more_public_channels_spec.js index 2441061623..0d38de9467 100644 --- a/webapp/channels/e2e/cypress/tests/integration/channel/more_public_channels_spec.js +++ b/e2e/cypress/tests/integration/channels/channel/more_public_channels_spec.js @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @channel +// Group: @channels @channel function verifyNoChannelToJoinMessage(isVisible) { cy.findByText('No public channels').should(isVisible ? 'be.visible' : 'not.exist'); diff --git a/webapp/channels/e2e/cypress/tests/integration/channel/new_channel_with_board_spec.js b/e2e/cypress/tests/integration/channels/channel/new_channel_with_board_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/channel/new_channel_with_board_spec.js rename to e2e/cypress/tests/integration/channels/channel/new_channel_with_board_spec.js index c8b340df2e..32c3591dd3 100644 --- a/webapp/channels/e2e/cypress/tests/integration/channel/new_channel_with_board_spec.js +++ b/e2e/cypress/tests/integration/channels/channel/new_channel_with_board_spec.js @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @channel +// Group: @channels @channel describe('New Channel modal with Boards enabled', () => { let testTeam; diff --git a/webapp/channels/e2e/cypress/tests/integration/channel/open_rhs_coming_from_system_console_spec.ts b/e2e/cypress/tests/integration/channels/channel/open_rhs_coming_from_system_console_spec.ts similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/channel/open_rhs_coming_from_system_console_spec.ts rename to e2e/cypress/tests/integration/channels/channel/open_rhs_coming_from_system_console_spec.ts index 7e58476665..d07746ecf8 100644 --- a/webapp/channels/e2e/cypress/tests/integration/channel/open_rhs_coming_from_system_console_spec.ts +++ b/e2e/cypress/tests/integration/channels/channel/open_rhs_coming_from_system_console_spec.ts @@ -8,10 +8,10 @@ // *************************************************************** // Stage: @prod -// Group: @channel @rhs +// Group: @channels @channel @rhs -import * as TIMEOUTS from '../../fixtures/timeouts'; -import * as MESSAGES from '../../fixtures/messages'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; +import * as MESSAGES from '../../../fixtures/messages'; describe('Channel RHS', () => { let testAdmin: Cypress.UserProfile; diff --git a/webapp/channels/e2e/cypress/tests/integration/channel/user_to_admin_updates_manage_channel_members_rhs_spec.js b/e2e/cypress/tests/integration/channels/channel/user_to_admin_updates_manage_channel_members_rhs_spec.js similarity index 96% rename from webapp/channels/e2e/cypress/tests/integration/channel/user_to_admin_updates_manage_channel_members_rhs_spec.js rename to e2e/cypress/tests/integration/channels/channel/user_to_admin_updates_manage_channel_members_rhs_spec.js index d3991992c1..09d3c8db24 100644 --- a/webapp/channels/e2e/cypress/tests/integration/channel/user_to_admin_updates_manage_channel_members_rhs_spec.js +++ b/e2e/cypress/tests/integration/channels/channel/user_to_admin_updates_manage_channel_members_rhs_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @channel +// Group: @channels @channel -import {getAdminAccount} from '../../support/env'; +import {getAdminAccount} from '../../../support/env'; describe('View Members modal', () => { const sysadmin = getAdminAccount(); diff --git a/webapp/channels/e2e/cypress/tests/integration/channel/user_to_channel_admin_member_updates_manage_channel_members_rhs_spec.js b/e2e/cypress/tests/integration/channels/channel/user_to_channel_admin_member_updates_manage_channel_members_rhs_spec.js similarity index 97% rename from webapp/channels/e2e/cypress/tests/integration/channel/user_to_channel_admin_member_updates_manage_channel_members_rhs_spec.js rename to e2e/cypress/tests/integration/channels/channel/user_to_channel_admin_member_updates_manage_channel_members_rhs_spec.js index 383832f563..d53bc4c443 100644 --- a/webapp/channels/e2e/cypress/tests/integration/channel/user_to_channel_admin_member_updates_manage_channel_members_rhs_spec.js +++ b/e2e/cypress/tests/integration/channels/channel/user_to_channel_admin_member_updates_manage_channel_members_rhs_spec.js @@ -7,9 +7,9 @@ // - Use element ID when selecting an element. Create one if none. // *************************************************************** -// Group: @channel +// Group: @channels @channel -import {getAdminAccount} from '../../support/env'; +import {getAdminAccount} from '../../../support/env'; const demoteToMember = (user, admin) => { cy.externalRequest({user: admin, method: 'put', path: `users/${user.id}/roles`, data: {roles: 'system_user'}}); diff --git a/webapp/channels/e2e/cypress/tests/integration/channel_settings/add_users_to_channel_spec.ts b/e2e/cypress/tests/integration/channels/channel_settings/add_users_to_channel_spec.ts similarity index 99% rename from webapp/channels/e2e/cypress/tests/integration/channel_settings/add_users_to_channel_spec.ts rename to e2e/cypress/tests/integration/channels/channel_settings/add_users_to_channel_spec.ts index b2a4a80193..13001c8d9f 100644 --- a/webapp/channels/e2e/cypress/tests/integration/channel_settings/add_users_to_channel_spec.ts +++ b/e2e/cypress/tests/integration/channels/channel_settings/add_users_to_channel_spec.ts @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @channel @channel_settings @smoke +// Group: @channels @channel @channel_settings @smoke describe('Channel Settings', () => { let testTeam: Cypress.Team; diff --git a/webapp/channels/e2e/cypress/tests/integration/channel_settings/channel_header_spec.ts b/e2e/cypress/tests/integration/channels/channel_settings/channel_header_spec.ts similarity index 96% rename from webapp/channels/e2e/cypress/tests/integration/channel_settings/channel_header_spec.ts rename to e2e/cypress/tests/integration/channels/channel_settings/channel_header_spec.ts index 9ac6f731e7..4fb91d9c3e 100644 --- a/webapp/channels/e2e/cypress/tests/integration/channel_settings/channel_header_spec.ts +++ b/e2e/cypress/tests/integration/channels/channel_settings/channel_header_spec.ts @@ -8,11 +8,11 @@ // *************************************************************** // Stage: @prod -// Group: @channel_settings +// Group: @channels @channel_settings // node run_tests.js --group='@channel_settings' -import {getRandomId} from '../../utils'; -import * as TIMEOUTS from '../../fixtures/timeouts'; +import {getRandomId} from '../../../utils'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; describe('Channel Settings', () => { let testTeam: Cypress.Team; diff --git a/webapp/channels/e2e/cypress/tests/integration/channel_settings/channel_name_validations_spec.ts b/e2e/cypress/tests/integration/channels/channel_settings/channel_name_validations_spec.ts similarity index 97% rename from webapp/channels/e2e/cypress/tests/integration/channel_settings/channel_name_validations_spec.ts rename to e2e/cypress/tests/integration/channels/channel_settings/channel_name_validations_spec.ts index edd359c0e7..1c2c415969 100644 --- a/webapp/channels/e2e/cypress/tests/integration/channel_settings/channel_name_validations_spec.ts +++ b/e2e/cypress/tests/integration/channels/channel_settings/channel_name_validations_spec.ts @@ -8,11 +8,11 @@ // *************************************************************** // Stage: @prod -// Group: @channel -// Group: @channel_settings +// Group: @channels @channel +// Group: @channels @channel_settings -import * as TIMEOUTS from '../../fixtures/timeouts'; -import {getRandomId} from '../../utils'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; +import {getRandomId} from '../../../utils'; describe('Channel routing', () => { let testTeam: Cypress.Team; diff --git a/webapp/channels/e2e/cypress/tests/integration/channel_settings/more_unreads_position_with_scroll_spec.ts b/e2e/cypress/tests/integration/channels/channel_settings/more_unreads_position_with_scroll_spec.ts similarity index 97% rename from webapp/channels/e2e/cypress/tests/integration/channel_settings/more_unreads_position_with_scroll_spec.ts rename to e2e/cypress/tests/integration/channels/channel_settings/more_unreads_position_with_scroll_spec.ts index db7519b0f7..2e5ecc7c82 100644 --- a/webapp/channels/e2e/cypress/tests/integration/channel_settings/more_unreads_position_with_scroll_spec.ts +++ b/e2e/cypress/tests/integration/channels/channel_settings/more_unreads_position_with_scroll_spec.ts @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @channel_settings +// Group: @channels @channel_settings -import * as TIMEOUTS from '../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; describe('Channel settings', () => { let mainUser: Cypress.UserProfile; diff --git a/webapp/channels/e2e/cypress/tests/integration/channel_sidebar/category.d.ts b/e2e/cypress/tests/integration/channels/channel_sidebar/category.d.ts similarity index 100% rename from webapp/channels/e2e/cypress/tests/integration/channel_sidebar/category.d.ts rename to e2e/cypress/tests/integration/channels/channel_sidebar/category.d.ts diff --git a/webapp/channels/e2e/cypress/tests/integration/channel_sidebar/category_collapsing_spec.ts b/e2e/cypress/tests/integration/channels/channel_sidebar/category_collapsing_spec.ts similarity index 97% rename from webapp/channels/e2e/cypress/tests/integration/channel_sidebar/category_collapsing_spec.ts rename to e2e/cypress/tests/integration/channels/channel_sidebar/category_collapsing_spec.ts index be0907cf38..2738a8650b 100644 --- a/webapp/channels/e2e/cypress/tests/integration/channel_sidebar/category_collapsing_spec.ts +++ b/e2e/cypress/tests/integration/channels/channel_sidebar/category_collapsing_spec.ts @@ -8,11 +8,11 @@ // *************************************************************** // Stage: @prod -// Group: @channel_sidebar +// Group: @channels @channel_sidebar -import * as TIMEOUTS from '../../fixtures/timeouts'; -import * as MESSAGES from '../../fixtures/messages'; -import {getAdminAccount} from '../../support/env'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; +import * as MESSAGES from '../../../fixtures/messages'; +import {getAdminAccount} from '../../../support/env'; describe('Channel sidebar', () => { const sysadmin = getAdminAccount(); diff --git a/webapp/channels/e2e/cypress/tests/integration/channel_sidebar/category_muting_spec.ts b/e2e/cypress/tests/integration/channels/channel_sidebar/category_muting_spec.ts similarity index 97% rename from webapp/channels/e2e/cypress/tests/integration/channel_sidebar/category_muting_spec.ts rename to e2e/cypress/tests/integration/channels/channel_sidebar/category_muting_spec.ts index 1b5b237935..a4b3d60a96 100644 --- a/webapp/channels/e2e/cypress/tests/integration/channel_sidebar/category_muting_spec.ts +++ b/e2e/cypress/tests/integration/channels/channel_sidebar/category_muting_spec.ts @@ -8,10 +8,10 @@ // *************************************************************** // Stage: @prod -// Group: @channel_sidebar +// Group: @channels @channel_sidebar -import {getAdminAccount} from '../../support/env'; -import {getRandomId} from '../../utils'; +import {getAdminAccount} from '../../../support/env'; +import {getRandomId} from '../../../utils'; import {clickCategoryMenuItem} from './helpers'; diff --git a/webapp/channels/e2e/cypress/tests/integration/channel_sidebar/category_sorting_1_spec.ts b/e2e/cypress/tests/integration/channels/channel_sidebar/category_sorting_1_spec.ts similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/channel_sidebar/category_sorting_1_spec.ts rename to e2e/cypress/tests/integration/channels/channel_sidebar/category_sorting_1_spec.ts index 2026dc9dbb..bf2f6e9011 100644 --- a/webapp/channels/e2e/cypress/tests/integration/channel_sidebar/category_sorting_1_spec.ts +++ b/e2e/cypress/tests/integration/channels/channel_sidebar/category_sorting_1_spec.ts @@ -8,10 +8,10 @@ // *************************************************************** // Stage: @prod -// Group: @channel_sidebar +// Group: @channels @channel_sidebar -import * as TIMEOUTS from '../../fixtures/timeouts'; -import {getRandomId} from '../../utils'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; +import {getRandomId} from '../../../utils'; import {clickSortCategoryMenuItem} from './helpers'; diff --git a/webapp/channels/e2e/cypress/tests/integration/channel_sidebar/category_sorting_spec.ts b/e2e/cypress/tests/integration/channels/channel_sidebar/category_sorting_spec.ts similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/channel_sidebar/category_sorting_spec.ts rename to e2e/cypress/tests/integration/channels/channel_sidebar/category_sorting_spec.ts index a46e1d922c..69086ce680 100644 --- a/webapp/channels/e2e/cypress/tests/integration/channel_sidebar/category_sorting_spec.ts +++ b/e2e/cypress/tests/integration/channels/channel_sidebar/category_sorting_spec.ts @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @channel_sidebar +// Group: @channels @channel_sidebar -import * as TIMEOUTS from '../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; describe('Category sorting', () => { beforeEach(() => { diff --git a/webapp/channels/e2e/cypress/tests/integration/channel_sidebar/channel_sidebar_spec.ts b/e2e/cypress/tests/integration/channels/channel_sidebar/channel_sidebar_spec.ts similarity index 96% rename from webapp/channels/e2e/cypress/tests/integration/channel_sidebar/channel_sidebar_spec.ts rename to e2e/cypress/tests/integration/channels/channel_sidebar/channel_sidebar_spec.ts index 1e92a81b64..ff207aa535 100644 --- a/webapp/channels/e2e/cypress/tests/integration/channel_sidebar/channel_sidebar_spec.ts +++ b/e2e/cypress/tests/integration/channels/channel_sidebar/channel_sidebar_spec.ts @@ -8,11 +8,11 @@ // *************************************************************** // Stage: @prod -// Group: @channel_sidebar +// Group: @channels @channel_sidebar -import * as TIMEOUTS from '../../fixtures/timeouts'; -import {getAdminAccount} from '../../support/env'; -import {getRandomId} from '../../utils'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; +import {getAdminAccount} from '../../../support/env'; +import {getRandomId} from '../../../utils'; function verifyChannelSwitch(displayName, url) { cy.get('#channelHeaderTitle', {timeout: TIMEOUTS.HALF_MIN}).should('be.visible').should('contain', displayName); diff --git a/webapp/channels/e2e/cypress/tests/integration/channel_sidebar/custom_categories_spec.ts b/e2e/cypress/tests/integration/channels/channel_sidebar/custom_categories_spec.ts similarity index 96% rename from webapp/channels/e2e/cypress/tests/integration/channel_sidebar/custom_categories_spec.ts rename to e2e/cypress/tests/integration/channels/channel_sidebar/custom_categories_spec.ts index 6030b7067d..30918ebbb3 100644 --- a/webapp/channels/e2e/cypress/tests/integration/channel_sidebar/custom_categories_spec.ts +++ b/e2e/cypress/tests/integration/channels/channel_sidebar/custom_categories_spec.ts @@ -8,10 +8,10 @@ // *************************************************************** // Stage: @prod -// Group: @channel_sidebar +// Group: @channels @channel_sidebar -import * as TIMEOUTS from '../../fixtures/timeouts'; -import {getRandomId} from '../../utils'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; +import {getRandomId} from '../../../utils'; import {clickCategoryMenuItem} from './helpers'; diff --git a/webapp/channels/e2e/cypress/tests/integration/channel_sidebar/dm_category_spec.ts b/e2e/cypress/tests/integration/channels/channel_sidebar/dm_category_spec.ts similarity index 97% rename from webapp/channels/e2e/cypress/tests/integration/channel_sidebar/dm_category_spec.ts rename to e2e/cypress/tests/integration/channels/channel_sidebar/dm_category_spec.ts index 99c3572c41..6b52fca362 100644 --- a/webapp/channels/e2e/cypress/tests/integration/channel_sidebar/dm_category_spec.ts +++ b/e2e/cypress/tests/integration/channels/channel_sidebar/dm_category_spec.ts @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @dm_category +// Group: @channels @dm_category -import * as TIMEOUTS from '../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; const SpaceKeyCode = 32; const DownArrowKeyCode = 40; diff --git a/webapp/channels/e2e/cypress/tests/integration/channel_sidebar/dm_gm_behaviour_spec.ts b/e2e/cypress/tests/integration/channels/channel_sidebar/dm_gm_behaviour_spec.ts similarity index 99% rename from webapp/channels/e2e/cypress/tests/integration/channel_sidebar/dm_gm_behaviour_spec.ts rename to e2e/cypress/tests/integration/channels/channel_sidebar/dm_gm_behaviour_spec.ts index 56755929de..280ed38765 100644 --- a/webapp/channels/e2e/cypress/tests/integration/channel_sidebar/dm_gm_behaviour_spec.ts +++ b/e2e/cypress/tests/integration/channels/channel_sidebar/dm_gm_behaviour_spec.ts @@ -7,9 +7,9 @@ // - Use element ID when selecting an element. Create one if none. // *************************************************************** -// Group: @dm_category +// Group: @channels @dm_category -import * as TIMEOUTS from '../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; describe('DM category', () => { let testUser; diff --git a/webapp/channels/e2e/cypress/tests/integration/channel_sidebar/dm_gm_filtering_sorting_spec.ts b/e2e/cypress/tests/integration/channels/channel_sidebar/dm_gm_filtering_sorting_spec.ts similarity index 97% rename from webapp/channels/e2e/cypress/tests/integration/channel_sidebar/dm_gm_filtering_sorting_spec.ts rename to e2e/cypress/tests/integration/channels/channel_sidebar/dm_gm_filtering_sorting_spec.ts index 74ad99f5d7..260845d950 100644 --- a/webapp/channels/e2e/cypress/tests/integration/channel_sidebar/dm_gm_filtering_sorting_spec.ts +++ b/e2e/cypress/tests/integration/channels/channel_sidebar/dm_gm_filtering_sorting_spec.ts @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @dm_category +// Group: @channels @dm_category -import * as MESSAGES from '../../fixtures/messages'; +import * as MESSAGES from '../../../fixtures/messages'; describe('DM/GM filtering and sorting', () => { let testUser; diff --git a/webapp/channels/e2e/cypress/tests/integration/channel_sidebar/dm_sidebar_not_remove_spec.ts b/e2e/cypress/tests/integration/channels/channel_sidebar/dm_sidebar_not_remove_spec.ts similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/channel_sidebar/dm_sidebar_not_remove_spec.ts rename to e2e/cypress/tests/integration/channels/channel_sidebar/dm_sidebar_not_remove_spec.ts index 598b7659d8..94e272bafc 100644 --- a/webapp/channels/e2e/cypress/tests/integration/channel_sidebar/dm_sidebar_not_remove_spec.ts +++ b/e2e/cypress/tests/integration/channels/channel_sidebar/dm_sidebar_not_remove_spec.ts @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @dm_category +// Group: @channels @dm_category describe('DM on sidebar', () => { let testUser; diff --git a/webapp/channels/e2e/cypress/tests/integration/channel_sidebar/drag_and_drop_spec.ts b/e2e/cypress/tests/integration/channels/channel_sidebar/drag_and_drop_spec.ts similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/channel_sidebar/drag_and_drop_spec.ts rename to e2e/cypress/tests/integration/channels/channel_sidebar/drag_and_drop_spec.ts index d0f738d08a..2ea82e8510 100644 --- a/webapp/channels/e2e/cypress/tests/integration/channel_sidebar/drag_and_drop_spec.ts +++ b/e2e/cypress/tests/integration/channels/channel_sidebar/drag_and_drop_spec.ts @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod @smoke -// Group: @channel_sidebar +// Group: @channels @channel_sidebar -import * as TIMEOUTS from '../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; describe('Channel sidebar', () => { const SpaceKeyCode = 32; diff --git a/webapp/channels/e2e/cypress/tests/integration/channel_sidebar/group_unreads_separately_spec.ts b/e2e/cypress/tests/integration/channels/channel_sidebar/group_unreads_separately_spec.ts similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/channel_sidebar/group_unreads_separately_spec.ts rename to e2e/cypress/tests/integration/channels/channel_sidebar/group_unreads_separately_spec.ts index 369f784003..3343b64d42 100644 --- a/webapp/channels/e2e/cypress/tests/integration/channel_sidebar/group_unreads_separately_spec.ts +++ b/e2e/cypress/tests/integration/channels/channel_sidebar/group_unreads_separately_spec.ts @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @channel_sidebar +// Group: @channels @channel_sidebar -import {getAdminAccount} from '../../support/env'; +import {getAdminAccount} from '../../../support/env'; describe('Channel sidebar - group unreads separately', () => { let testTeam; diff --git a/webapp/channels/e2e/cypress/tests/integration/channel_sidebar/helpers.ts b/e2e/cypress/tests/integration/channels/channel_sidebar/helpers.ts similarity index 95% rename from webapp/channels/e2e/cypress/tests/integration/channel_sidebar/helpers.ts rename to e2e/cypress/tests/integration/channels/channel_sidebar/helpers.ts index 7e7c455e88..7da3d34ed1 100644 --- a/webapp/channels/e2e/cypress/tests/integration/channel_sidebar/helpers.ts +++ b/e2e/cypress/tests/integration/channels/channel_sidebar/helpers.ts @@ -1,7 +1,7 @@ // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. // See LICENSE.txt for license information. -import * as TIMEOUTS from '../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; export function clickCategoryMenuItem(categoryDisplayName, menuItemText, isSubMenu = false) { cy.get('#SidebarContainer').should('be.visible').within(() => { diff --git a/webapp/channels/e2e/cypress/tests/integration/channel_sidebar/history_channel_switcher_spec.ts b/e2e/cypress/tests/integration/channels/channel_sidebar/history_channel_switcher_spec.ts similarity index 94% rename from webapp/channels/e2e/cypress/tests/integration/channel_sidebar/history_channel_switcher_spec.ts rename to e2e/cypress/tests/integration/channels/channel_sidebar/history_channel_switcher_spec.ts index 669d07d2db..dd4af5b96a 100644 --- a/webapp/channels/e2e/cypress/tests/integration/channel_sidebar/history_channel_switcher_spec.ts +++ b/e2e/cypress/tests/integration/channels/channel_sidebar/history_channel_switcher_spec.ts @@ -8,10 +8,10 @@ // *************************************************************** // Stage: @prod -// Group: @channel_sidebar +// Group: @channels @channel_sidebar -import * as TIMEOUTS from '../../fixtures/timeouts'; -import {getRandomId} from '../../utils'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; +import {getRandomId} from '../../../utils'; describe('Channel sidebar', () => { before(() => { diff --git a/webapp/channels/e2e/cypress/tests/integration/channel_sidebar/hotkeys_spec.ts b/e2e/cypress/tests/integration/channels/channel_sidebar/hotkeys_spec.ts similarity index 97% rename from webapp/channels/e2e/cypress/tests/integration/channel_sidebar/hotkeys_spec.ts rename to e2e/cypress/tests/integration/channels/channel_sidebar/hotkeys_spec.ts index 7621545c2e..61e1b5b48a 100644 --- a/webapp/channels/e2e/cypress/tests/integration/channel_sidebar/hotkeys_spec.ts +++ b/e2e/cypress/tests/integration/channels/channel_sidebar/hotkeys_spec.ts @@ -7,9 +7,9 @@ // - Use element ID when selecting an element. Create one if none. // *************************************************************** -// Group: @channel_sidebar +// Group: @channels @channel_sidebar -import {getAdminAccount} from '../../support/env'; +import {getAdminAccount} from '../../../support/env'; describe('Channel switching', () => { const sysadmin = getAdminAccount(); diff --git a/webapp/channels/e2e/cypress/tests/integration/channel_sidebar/new_category_badge_spec.ts b/e2e/cypress/tests/integration/channels/channel_sidebar/new_category_badge_spec.ts similarity index 96% rename from webapp/channels/e2e/cypress/tests/integration/channel_sidebar/new_category_badge_spec.ts rename to e2e/cypress/tests/integration/channels/channel_sidebar/new_category_badge_spec.ts index de7599b4aa..23ee8c47e6 100644 --- a/webapp/channels/e2e/cypress/tests/integration/channel_sidebar/new_category_badge_spec.ts +++ b/e2e/cypress/tests/integration/channels/channel_sidebar/new_category_badge_spec.ts @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @channel_sidebar +// Group: @channels @channel_sidebar -import {getRandomId} from '../../utils'; +import {getRandomId} from '../../../utils'; describe('New category badge', () => { before(() => { diff --git a/webapp/channels/e2e/cypress/tests/integration/channel_sidebar/new_channel_dropdown_spec.ts b/e2e/cypress/tests/integration/channels/channel_sidebar/new_channel_dropdown_spec.ts similarity index 96% rename from webapp/channels/e2e/cypress/tests/integration/channel_sidebar/new_channel_dropdown_spec.ts rename to e2e/cypress/tests/integration/channels/channel_sidebar/new_channel_dropdown_spec.ts index 0088b409fd..b94d16acfa 100644 --- a/webapp/channels/e2e/cypress/tests/integration/channel_sidebar/new_channel_dropdown_spec.ts +++ b/e2e/cypress/tests/integration/channels/channel_sidebar/new_channel_dropdown_spec.ts @@ -8,10 +8,10 @@ // *************************************************************** // Stage: @prod -// Group: @channel_sidebar +// Group: @channels @channel_sidebar -import * as TIMEOUTS from '../../fixtures/timeouts'; -import {getRandomId} from '../../utils'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; +import {getRandomId} from '../../../utils'; describe('Channel sidebar', () => { before(() => { diff --git a/webapp/channels/e2e/cypress/tests/integration/channel_sidebar/sidebar_category_menu_spec.ts b/e2e/cypress/tests/integration/channels/channel_sidebar/sidebar_category_menu_spec.ts similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/channel_sidebar/sidebar_category_menu_spec.ts rename to e2e/cypress/tests/integration/channels/channel_sidebar/sidebar_category_menu_spec.ts index 901d6428e2..16f3e9cf1a 100644 --- a/webapp/channels/e2e/cypress/tests/integration/channel_sidebar/sidebar_category_menu_spec.ts +++ b/e2e/cypress/tests/integration/channels/channel_sidebar/sidebar_category_menu_spec.ts @@ -10,7 +10,7 @@ import {clickCategoryMenuItem} from './helpers'; // *************************************************************** // Stage: @prod -// Group: @channel_sidebar +// Group: @channels @channel_sidebar describe('Sidebar category menu', () => { before(() => { diff --git a/webapp/channels/e2e/cypress/tests/integration/channel_sidebar/sidebar_channel_menu_spec.ts b/e2e/cypress/tests/integration/channels/channel_sidebar/sidebar_channel_menu_spec.ts similarity index 97% rename from webapp/channels/e2e/cypress/tests/integration/channel_sidebar/sidebar_channel_menu_spec.ts rename to e2e/cypress/tests/integration/channels/channel_sidebar/sidebar_channel_menu_spec.ts index 965b5f7492..28d076eb39 100644 --- a/webapp/channels/e2e/cypress/tests/integration/channel_sidebar/sidebar_channel_menu_spec.ts +++ b/e2e/cypress/tests/integration/channels/channel_sidebar/sidebar_channel_menu_spec.ts @@ -7,17 +7,17 @@ // - Use element ID when selecting an element. Create one if none. // *************************************************************** -// Group: @channel_sidebar +// Group: @channels @channel_sidebar import { beMuted, beRead, beUnmuted, beUnread, -} from '../../support/assertions'; -import {getAdminAccount} from '../../support/env'; +} from '../../../support/assertions'; +import {getAdminAccount} from '../../../support/env'; -import {getRandomId, stubClipboard} from '../../utils'; +import {getRandomId, stubClipboard} from '../../../utils'; describe('Sidebar channel menu', () => { const sysadmin = getAdminAccount(); diff --git a/webapp/channels/e2e/cypress/tests/integration/channel_sidebar/unread_filter_spec.ts b/e2e/cypress/tests/integration/channels/channel_sidebar/unread_filter_spec.ts similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/channel_sidebar/unread_filter_spec.ts rename to e2e/cypress/tests/integration/channels/channel_sidebar/unread_filter_spec.ts index 7caac86386..01cd8ef71a 100644 --- a/webapp/channels/e2e/cypress/tests/integration/channel_sidebar/unread_filter_spec.ts +++ b/e2e/cypress/tests/integration/channels/channel_sidebar/unread_filter_spec.ts @@ -8,17 +8,17 @@ // *************************************************************** // Stage: @prod -// Group: @channel_sidebar +// Group: @channels @channel_sidebar import { beMuted, beRead, beUnread, -} from '../../support/assertions'; -import {getAdminAccount} from '../../support/env'; +} from '../../../support/assertions'; +import {getAdminAccount} from '../../../support/env'; -import * as TIMEOUTS from '../../fixtures/timeouts'; -import {getRandomId} from '../../utils'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; +import {getRandomId} from '../../../utils'; describe('Channel sidebar unread filter', () => { const randomId = getRandomId(); diff --git a/webapp/channels/e2e/cypress/tests/integration/collapsed_reply_threads/channel_notifications_spec.js b/e2e/cypress/tests/integration/channels/collapsed_reply_threads/channel_notifications_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/collapsed_reply_threads/channel_notifications_spec.js rename to e2e/cypress/tests/integration/channels/collapsed_reply_threads/channel_notifications_spec.js index b7ab39572a..231ca2eea1 100644 --- a/webapp/channels/e2e/cypress/tests/integration/collapsed_reply_threads/channel_notifications_spec.js +++ b/e2e/cypress/tests/integration/channels/collapsed_reply_threads/channel_notifications_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @collapsed_reply_threads +// Group: @channels @collapsed_reply_threads -import {spyNotificationAs} from '../../support/notification'; +import {spyNotificationAs} from '../../../support/notification'; describe('CRT Desktop notifications', () => { let testTeam; diff --git a/webapp/channels/e2e/cypress/tests/integration/collapsed_reply_threads/crt_settings_spec.js b/e2e/cypress/tests/integration/channels/collapsed_reply_threads/crt_settings_spec.js similarity index 97% rename from webapp/channels/e2e/cypress/tests/integration/collapsed_reply_threads/crt_settings_spec.js rename to e2e/cypress/tests/integration/channels/collapsed_reply_threads/crt_settings_spec.js index adeba861ca..c448e3d288 100644 --- a/webapp/channels/e2e/cypress/tests/integration/collapsed_reply_threads/crt_settings_spec.js +++ b/e2e/cypress/tests/integration/channels/collapsed_reply_threads/crt_settings_spec.js @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @collapsed_reply_threads +// Group: @channels @collapsed_reply_threads describe('Collapsed Reply Threads', () => { let testTeam; diff --git a/webapp/channels/e2e/cypress/tests/integration/collapsed_reply_threads/crt_tour_spec.js b/e2e/cypress/tests/integration/channels/collapsed_reply_threads/crt_tour_spec.js similarity index 99% rename from webapp/channels/e2e/cypress/tests/integration/collapsed_reply_threads/crt_tour_spec.js rename to e2e/cypress/tests/integration/channels/collapsed_reply_threads/crt_tour_spec.js index 8ad7f06050..ea99a56466 100644 --- a/webapp/channels/e2e/cypress/tests/integration/collapsed_reply_threads/crt_tour_spec.js +++ b/e2e/cypress/tests/integration/channels/collapsed_reply_threads/crt_tour_spec.js @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @collapsed_reply_threads +// Group: @channels @collapsed_reply_threads describe('Collapsed Reply Threads', () => { let testTeam; diff --git a/webapp/channels/e2e/cypress/tests/integration/collapsed_reply_threads/files_1_spec.js b/e2e/cypress/tests/integration/channels/collapsed_reply_threads/files_1_spec.js similarity index 95% rename from webapp/channels/e2e/cypress/tests/integration/collapsed_reply_threads/files_1_spec.js rename to e2e/cypress/tests/integration/channels/collapsed_reply_threads/files_1_spec.js index 3a26211bf4..f180da77ee 100644 --- a/webapp/channels/e2e/cypress/tests/integration/collapsed_reply_threads/files_1_spec.js +++ b/e2e/cypress/tests/integration/channels/collapsed_reply_threads/files_1_spec.js @@ -8,10 +8,10 @@ // *************************************************************** // Stage: @prod -// Group: @collapsed_reply_threads @not_cloud +// Group: @channels @collapsed_reply_threads @not_cloud -import * as MESSAGES from '../../fixtures/messages'; -import {matterpollPlugin} from '../../utils/plugins'; +import * as MESSAGES from '../../../fixtures/messages'; +import {matterpollPlugin} from '../../../utils/plugins'; import {interceptFileUpload} from '../files_and_attachments/helpers'; describe('Collapsed Reply Threads', () => { diff --git a/webapp/channels/e2e/cypress/tests/integration/collapsed_reply_threads/files_spec.js b/e2e/cypress/tests/integration/channels/collapsed_reply_threads/files_spec.js similarity index 97% rename from webapp/channels/e2e/cypress/tests/integration/collapsed_reply_threads/files_spec.js rename to e2e/cypress/tests/integration/channels/collapsed_reply_threads/files_spec.js index 95564f2536..3bbbcd5e67 100644 --- a/webapp/channels/e2e/cypress/tests/integration/collapsed_reply_threads/files_spec.js +++ b/e2e/cypress/tests/integration/channels/collapsed_reply_threads/files_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @collapsed_reply_threads +// Group: @channels @collapsed_reply_threads -import * as MESSAGES from '../../fixtures/messages'; +import * as MESSAGES from '../../../fixtures/messages'; import {waitUntilUploadComplete, interceptFileUpload} from '../files_and_attachments/helpers'; describe('Collapsed Reply Threads', () => { diff --git a/webapp/channels/e2e/cypress/tests/integration/collapsed_reply_threads/following_spec.js b/e2e/cypress/tests/integration/channels/collapsed_reply_threads/following_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/collapsed_reply_threads/following_spec.js rename to e2e/cypress/tests/integration/channels/collapsed_reply_threads/following_spec.js index c20c51b1e8..b6987e40d8 100644 --- a/webapp/channels/e2e/cypress/tests/integration/collapsed_reply_threads/following_spec.js +++ b/e2e/cypress/tests/integration/channels/collapsed_reply_threads/following_spec.js @@ -7,10 +7,10 @@ // - Use element ID when selecting an element. Create one if none. // *************************************************************** -// Group: @collapsed_reply_threads +// Group: @channels @collapsed_reply_threads -import * as TIMEOUTS from '../../fixtures/timeouts'; -import {isMac} from '../../utils'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; +import {isMac} from '../../../utils'; describe('Collapsed Reply Threads', () => { let testTeam; diff --git a/webapp/channels/e2e/cypress/tests/integration/collapsed_reply_threads/global_threads_spec.js b/e2e/cypress/tests/integration/channels/collapsed_reply_threads/global_threads_spec.js similarity index 99% rename from webapp/channels/e2e/cypress/tests/integration/collapsed_reply_threads/global_threads_spec.js rename to e2e/cypress/tests/integration/channels/collapsed_reply_threads/global_threads_spec.js index 39317079cb..2e644db706 100644 --- a/webapp/channels/e2e/cypress/tests/integration/collapsed_reply_threads/global_threads_spec.js +++ b/e2e/cypress/tests/integration/channels/collapsed_reply_threads/global_threads_spec.js @@ -7,7 +7,7 @@ // - Use element ID when selecting an element. Create one if none. // *************************************************************** -// Group: @collapsed_reply_threads +// Group: @channels @collapsed_reply_threads describe('Collapsed Reply Threads', () => { let testTeam; diff --git a/webapp/channels/e2e/cypress/tests/integration/collapsed_reply_threads/last_viewed_spec.js b/e2e/cypress/tests/integration/channels/collapsed_reply_threads/last_viewed_spec.js similarity index 97% rename from webapp/channels/e2e/cypress/tests/integration/collapsed_reply_threads/last_viewed_spec.js rename to e2e/cypress/tests/integration/channels/collapsed_reply_threads/last_viewed_spec.js index 39ae47f400..bbb66c79ca 100644 --- a/webapp/channels/e2e/cypress/tests/integration/collapsed_reply_threads/last_viewed_spec.js +++ b/e2e/cypress/tests/integration/channels/collapsed_reply_threads/last_viewed_spec.js @@ -1,7 +1,7 @@ // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. // See LICENSE.txt for license information. -import * as TIMEOUTS from '../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; // *************************************************************** // - [#] indicates a test step (e.g. # Go to a page) @@ -10,7 +10,7 @@ import * as TIMEOUTS from '../../fixtures/timeouts'; // *************************************************************** // Stage: @prod -// Group: @collapsed_reply_threads +// Group: @channels @collapsed_reply_threads describe('Collapsed Reply Threads', () => { let userA; // Member of team A and B diff --git a/webapp/channels/e2e/cypress/tests/integration/collapsed_reply_threads/replies_spec.js b/e2e/cypress/tests/integration/channels/collapsed_reply_threads/replies_spec.js similarity index 99% rename from webapp/channels/e2e/cypress/tests/integration/collapsed_reply_threads/replies_spec.js rename to e2e/cypress/tests/integration/channels/collapsed_reply_threads/replies_spec.js index 929fe13543..16b30acf5b 100644 --- a/webapp/channels/e2e/cypress/tests/integration/collapsed_reply_threads/replies_spec.js +++ b/e2e/cypress/tests/integration/channels/collapsed_reply_threads/replies_spec.js @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @collapsed_reply_threads +// Group: @channels @collapsed_reply_threads describe('Collapsed Reply Threads', () => { let testTeam; diff --git a/webapp/channels/e2e/cypress/tests/integration/collapsed_reply_threads/unread_spec.js b/e2e/cypress/tests/integration/channels/collapsed_reply_threads/unread_spec.js similarity index 96% rename from webapp/channels/e2e/cypress/tests/integration/collapsed_reply_threads/unread_spec.js rename to e2e/cypress/tests/integration/channels/collapsed_reply_threads/unread_spec.js index 236652a151..d173ec921f 100644 --- a/webapp/channels/e2e/cypress/tests/integration/collapsed_reply_threads/unread_spec.js +++ b/e2e/cypress/tests/integration/channels/collapsed_reply_threads/unread_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @collapsed_reply_threads +// Group: @channels @collapsed_reply_threads -import * as TIMEOUTS from '../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; describe('Collapsed Reply Threads', () => { let testTeam; diff --git a/webapp/channels/e2e/cypress/tests/integration/commands/leave_channel_spec.ts b/e2e/cypress/tests/integration/channels/commands/leave_channel_spec.ts similarity index 94% rename from webapp/channels/e2e/cypress/tests/integration/commands/leave_channel_spec.ts rename to e2e/cypress/tests/integration/channels/commands/leave_channel_spec.ts index 937892502b..89b871bb29 100644 --- a/webapp/channels/e2e/cypress/tests/integration/commands/leave_channel_spec.ts +++ b/e2e/cypress/tests/integration/channels/commands/leave_channel_spec.ts @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @commands +// Group: @channels @commands -import * as TIMEOUTS from '../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; describe('Leave Channel Command', () => { let testChannel; diff --git a/webapp/channels/e2e/cypress/tests/integration/custom_status/custom_status_1_spec.ts b/e2e/cypress/tests/integration/channels/custom_status/custom_status_1_spec.ts similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/custom_status/custom_status_1_spec.ts rename to e2e/cypress/tests/integration/channels/custom_status/custom_status_1_spec.ts index 9e7b6606b5..0598a3479c 100644 --- a/webapp/channels/e2e/cypress/tests/integration/custom_status/custom_status_1_spec.ts +++ b/e2e/cypress/tests/integration/channels/custom_status/custom_status_1_spec.ts @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @custom_status +// Group: @channels @custom_status describe('Custom Status - CTAs for New Users', () => { before(() => { diff --git a/webapp/channels/e2e/cypress/tests/integration/custom_status/custom_status_2_spec.ts b/e2e/cypress/tests/integration/channels/custom_status/custom_status_2_spec.ts similarity index 99% rename from webapp/channels/e2e/cypress/tests/integration/custom_status/custom_status_2_spec.ts rename to e2e/cypress/tests/integration/channels/custom_status/custom_status_2_spec.ts index 10bd159db3..8fc58cc757 100644 --- a/webapp/channels/e2e/cypress/tests/integration/custom_status/custom_status_2_spec.ts +++ b/e2e/cypress/tests/integration/channels/custom_status/custom_status_2_spec.ts @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @custom_status +// Group: @channels @custom_status describe('Custom Status - Setting a Custom Status', () => { const defaultCustomStatuses = ['In a meeting', 'Out for lunch', 'Out sick', 'Working from home', 'On a vacation']; diff --git a/webapp/channels/e2e/cypress/tests/integration/custom_status/custom_status_3_spec.ts b/e2e/cypress/tests/integration/channels/custom_status/custom_status_3_spec.ts similarity index 99% rename from webapp/channels/e2e/cypress/tests/integration/custom_status/custom_status_3_spec.ts rename to e2e/cypress/tests/integration/channels/custom_status/custom_status_3_spec.ts index 04a081e7ad..fd22b913d7 100644 --- a/webapp/channels/e2e/cypress/tests/integration/custom_status/custom_status_3_spec.ts +++ b/e2e/cypress/tests/integration/channels/custom_status/custom_status_3_spec.ts @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @custom_status +// Group: @channels @custom_status describe('Custom Status - Setting Your Own Custom Status', () => { const customStatus = { diff --git a/webapp/channels/e2e/cypress/tests/integration/custom_status/custom_status_4_spec.ts b/e2e/cypress/tests/integration/channels/custom_status/custom_status_4_spec.ts similarity index 99% rename from webapp/channels/e2e/cypress/tests/integration/custom_status/custom_status_4_spec.ts rename to e2e/cypress/tests/integration/channels/custom_status/custom_status_4_spec.ts index 85265db57d..ee3b43395f 100644 --- a/webapp/channels/e2e/cypress/tests/integration/custom_status/custom_status_4_spec.ts +++ b/e2e/cypress/tests/integration/channels/custom_status/custom_status_4_spec.ts @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @custom_status +// Group: @channels @custom_status describe('Custom Status - Recent Statuses', () => { const customStatus = { diff --git a/webapp/channels/e2e/cypress/tests/integration/custom_status/custom_status_5_spec.ts b/e2e/cypress/tests/integration/channels/custom_status/custom_status_5_spec.ts similarity index 99% rename from webapp/channels/e2e/cypress/tests/integration/custom_status/custom_status_5_spec.ts rename to e2e/cypress/tests/integration/channels/custom_status/custom_status_5_spec.ts index 7d80856fa0..1cc20c8d76 100644 --- a/webapp/channels/e2e/cypress/tests/integration/custom_status/custom_status_5_spec.ts +++ b/e2e/cypress/tests/integration/channels/custom_status/custom_status_5_spec.ts @@ -7,7 +7,7 @@ // - Use element ID when selecting an element. Create one if none. // *************************************************************** -// Group: @custom_status +// Group: @channels @custom_status describe('Custom Status - Verifying Where Custom Status Appears', () => { const customStatus = { diff --git a/webapp/channels/e2e/cypress/tests/integration/custom_status/custom_status_6_spec.ts b/e2e/cypress/tests/integration/channels/custom_status/custom_status_6_spec.ts similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/custom_status/custom_status_6_spec.ts rename to e2e/cypress/tests/integration/channels/custom_status/custom_status_6_spec.ts index 8be0c00fbe..2d38b17671 100644 --- a/webapp/channels/e2e/cypress/tests/integration/custom_status/custom_status_6_spec.ts +++ b/e2e/cypress/tests/integration/channels/custom_status/custom_status_6_spec.ts @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @custom_status +// Group: @channels @custom_status describe('Custom Status - Slash Commands', () => { const customStatus = { diff --git a/webapp/channels/e2e/cypress/tests/integration/custom_status/custom_status_expiry/custom_status_expiry_1_spec.ts b/e2e/cypress/tests/integration/channels/custom_status/custom_status_expiry/custom_status_expiry_1_spec.ts similarity index 99% rename from webapp/channels/e2e/cypress/tests/integration/custom_status/custom_status_expiry/custom_status_expiry_1_spec.ts rename to e2e/cypress/tests/integration/channels/custom_status/custom_status_expiry/custom_status_expiry_1_spec.ts index 0bada28ce2..fac6b334e2 100644 --- a/webapp/channels/e2e/cypress/tests/integration/custom_status/custom_status_expiry/custom_status_expiry_1_spec.ts +++ b/e2e/cypress/tests/integration/channels/custom_status/custom_status_expiry/custom_status_expiry_1_spec.ts @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @custom_status +// Group: @channels @custom_status import dayjs from 'dayjs'; diff --git a/webapp/channels/e2e/cypress/tests/integration/custom_status/custom_status_expiry/custom_status_expiry_2_spec.ts b/e2e/cypress/tests/integration/channels/custom_status/custom_status_expiry/custom_status_expiry_2_spec.ts similarity index 99% rename from webapp/channels/e2e/cypress/tests/integration/custom_status/custom_status_expiry/custom_status_expiry_2_spec.ts rename to e2e/cypress/tests/integration/channels/custom_status/custom_status_expiry/custom_status_expiry_2_spec.ts index e6636e666b..66d21becc9 100644 --- a/webapp/channels/e2e/cypress/tests/integration/custom_status/custom_status_expiry/custom_status_expiry_2_spec.ts +++ b/e2e/cypress/tests/integration/channels/custom_status/custom_status_expiry/custom_status_expiry_2_spec.ts @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @custom_status +// Group: @channels @custom_status import dayjs from 'dayjs'; diff --git a/webapp/channels/e2e/cypress/tests/integration/custom_status/custom_status_expiry/custom_status_expiry_3_spec.ts b/e2e/cypress/tests/integration/channels/custom_status/custom_status_expiry/custom_status_expiry_3_spec.ts similarity index 99% rename from webapp/channels/e2e/cypress/tests/integration/custom_status/custom_status_expiry/custom_status_expiry_3_spec.ts rename to e2e/cypress/tests/integration/channels/custom_status/custom_status_expiry/custom_status_expiry_3_spec.ts index a283a3193c..fc57ee0390 100644 --- a/webapp/channels/e2e/cypress/tests/integration/custom_status/custom_status_expiry/custom_status_expiry_3_spec.ts +++ b/e2e/cypress/tests/integration/channels/custom_status/custom_status_expiry/custom_status_expiry_3_spec.ts @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @custom_status +// Group: @channels @custom_status import dayjs from 'dayjs'; import advancedFormat from 'dayjs/plugin/advancedFormat'; diff --git a/webapp/channels/e2e/cypress/tests/integration/custom_status/custom_status_expiry/custom_status_expiry_4_spec.ts b/e2e/cypress/tests/integration/channels/custom_status/custom_status_expiry/custom_status_expiry_4_spec.ts similarity index 99% rename from webapp/channels/e2e/cypress/tests/integration/custom_status/custom_status_expiry/custom_status_expiry_4_spec.ts rename to e2e/cypress/tests/integration/channels/custom_status/custom_status_expiry/custom_status_expiry_4_spec.ts index 24cab04dc2..4ae44b6478 100644 --- a/webapp/channels/e2e/cypress/tests/integration/custom_status/custom_status_expiry/custom_status_expiry_4_spec.ts +++ b/e2e/cypress/tests/integration/channels/custom_status/custom_status_expiry/custom_status_expiry_4_spec.ts @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @custom_status +// Group: @channels @custom_status import dayjs from 'dayjs'; import advancedFormat from 'dayjs/plugin/advancedFormat'; diff --git a/webapp/channels/e2e/cypress/tests/integration/emoji/custom_emoji_1_1_spec.ts b/e2e/cypress/tests/integration/channels/emoji/custom_emoji_1_1_spec.ts similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/emoji/custom_emoji_1_1_spec.ts rename to e2e/cypress/tests/integration/channels/emoji/custom_emoji_1_1_spec.ts index 714da4235c..9d99bf6f8e 100644 --- a/webapp/channels/e2e/cypress/tests/integration/emoji/custom_emoji_1_1_spec.ts +++ b/e2e/cypress/tests/integration/channels/emoji/custom_emoji_1_1_spec.ts @@ -7,9 +7,9 @@ // - Use element ID when selecting an element. Create one if none. // *************************************************************** -// Group: @emoji +// Group: @channels @emoji -import * as TIMEOUTS from '../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; import {getCustomEmoji, verifyLastPostedEmoji} from './helpers'; diff --git a/webapp/channels/e2e/cypress/tests/integration/emoji/custom_emoji_1_spec.ts b/e2e/cypress/tests/integration/channels/emoji/custom_emoji_1_spec.ts similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/emoji/custom_emoji_1_spec.ts rename to e2e/cypress/tests/integration/channels/emoji/custom_emoji_1_spec.ts index 974f5bd891..e484e156bb 100644 --- a/webapp/channels/e2e/cypress/tests/integration/emoji/custom_emoji_1_spec.ts +++ b/e2e/cypress/tests/integration/channels/emoji/custom_emoji_1_spec.ts @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @emoji +// Group: @channels @emoji -import * as TIMEOUTS from '../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; import {getCustomEmoji} from './helpers'; diff --git a/webapp/channels/e2e/cypress/tests/integration/emoji/custom_emoji_2_1_spec.ts b/e2e/cypress/tests/integration/channels/emoji/custom_emoji_2_1_spec.ts similarity index 97% rename from webapp/channels/e2e/cypress/tests/integration/emoji/custom_emoji_2_1_spec.ts rename to e2e/cypress/tests/integration/channels/emoji/custom_emoji_2_1_spec.ts index 7f43744c6f..ac181e660f 100644 --- a/webapp/channels/e2e/cypress/tests/integration/emoji/custom_emoji_2_1_spec.ts +++ b/e2e/cypress/tests/integration/channels/emoji/custom_emoji_2_1_spec.ts @@ -7,9 +7,9 @@ // - Use element ID when selecting an element. Create one if none. // *************************************************************** -// Group: @emoji +// Group: @channels @emoji -import * as TIMEOUTS from '../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; import {getCustomEmoji, verifyLastPostedEmoji} from './helpers'; diff --git a/webapp/channels/e2e/cypress/tests/integration/emoji/custom_emoji_2_spec.ts b/e2e/cypress/tests/integration/channels/emoji/custom_emoji_2_spec.ts similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/emoji/custom_emoji_2_spec.ts rename to e2e/cypress/tests/integration/channels/emoji/custom_emoji_2_spec.ts index 1b0a12cd53..c2c177de50 100644 --- a/webapp/channels/e2e/cypress/tests/integration/emoji/custom_emoji_2_spec.ts +++ b/e2e/cypress/tests/integration/channels/emoji/custom_emoji_2_spec.ts @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @emoji +// Group: @channels @emoji -import * as TIMEOUTS from '../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; import {getCustomEmoji} from './helpers'; diff --git a/webapp/channels/e2e/cypress/tests/integration/emoji/custom_emoji_3_spec.ts b/e2e/cypress/tests/integration/channels/emoji/custom_emoji_3_spec.ts similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/emoji/custom_emoji_3_spec.ts rename to e2e/cypress/tests/integration/channels/emoji/custom_emoji_3_spec.ts index 1f0e56c499..6f0c6c2b2d 100644 --- a/webapp/channels/e2e/cypress/tests/integration/emoji/custom_emoji_3_spec.ts +++ b/e2e/cypress/tests/integration/channels/emoji/custom_emoji_3_spec.ts @@ -8,10 +8,10 @@ // *************************************************************** // Stage: @prod -// Group: @emoji +// Group: @channels @emoji -import * as TIMEOUTS from '../../fixtures/timeouts'; -import * as MESSAGES from '../../fixtures/messages'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; +import * as MESSAGES from '../../../fixtures/messages'; import {doReactToLastMessageShortcut, checkReactionFromPost} from '../keyboard_shortcuts/ctrl_cmd_shift_slash/helpers'; import {getCustomEmoji} from './helpers'; diff --git a/webapp/channels/e2e/cypress/tests/integration/emoji/helpers.js b/e2e/cypress/tests/integration/channels/emoji/helpers.js similarity index 95% rename from webapp/channels/e2e/cypress/tests/integration/emoji/helpers.js rename to e2e/cypress/tests/integration/channels/emoji/helpers.js index 29285fcb49..b4cc582eaf 100644 --- a/webapp/channels/e2e/cypress/tests/integration/emoji/helpers.js +++ b/e2e/cypress/tests/integration/channels/emoji/helpers.js @@ -1,7 +1,7 @@ // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. // See LICENSE.txt for license information. -import {getRandomId} from '../../utils'; +import {getRandomId} from '../../../utils'; export function getCustomEmoji() { const customEmoji = `emoji${getRandomId()}`; diff --git a/webapp/channels/e2e/cypress/tests/integration/emoji/recently_used_emoji_1_spec.ts b/e2e/cypress/tests/integration/channels/emoji/recently_used_emoji_1_spec.ts similarity index 97% rename from webapp/channels/e2e/cypress/tests/integration/emoji/recently_used_emoji_1_spec.ts rename to e2e/cypress/tests/integration/channels/emoji/recently_used_emoji_1_spec.ts index e104e98eea..0d016ea33d 100644 --- a/webapp/channels/e2e/cypress/tests/integration/emoji/recently_used_emoji_1_spec.ts +++ b/e2e/cypress/tests/integration/channels/emoji/recently_used_emoji_1_spec.ts @@ -8,10 +8,10 @@ // *************************************************************** // Stage: @prod -// Group: @emoji @timeout_error +// Group: @channels @emoji @timeout_error -import * as TIMEOUTS from '../../fixtures/timeouts'; -import * as MESSAGES from '../../fixtures/messages'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; +import * as MESSAGES from '../../../fixtures/messages'; import {getCustomEmoji} from './helpers'; diff --git a/webapp/channels/e2e/cypress/tests/integration/emoji/recently_used_emoji_2_spec.ts b/e2e/cypress/tests/integration/channels/emoji/recently_used_emoji_2_spec.ts similarity index 94% rename from webapp/channels/e2e/cypress/tests/integration/emoji/recently_used_emoji_2_spec.ts rename to e2e/cypress/tests/integration/channels/emoji/recently_used_emoji_2_spec.ts index 03ef7d6536..18bdf6227d 100644 --- a/webapp/channels/e2e/cypress/tests/integration/emoji/recently_used_emoji_2_spec.ts +++ b/e2e/cypress/tests/integration/channels/emoji/recently_used_emoji_2_spec.ts @@ -8,10 +8,10 @@ // *************************************************************** // Stage: @prod -// Group: @emoji @timeout_error +// Group: @channels @emoji @timeout_error -import * as TIMEOUTS from '../../fixtures/timeouts'; -import * as MESSAGES from '../../fixtures/messages'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; +import * as MESSAGES from '../../../fixtures/messages'; describe('Recent Emoji', () => { before(() => { diff --git a/webapp/channels/e2e/cypress/tests/integration/emoji/sorted_emojis_spec.ts b/e2e/cypress/tests/integration/channels/emoji/sorted_emojis_spec.ts similarity index 97% rename from webapp/channels/e2e/cypress/tests/integration/emoji/sorted_emojis_spec.ts rename to e2e/cypress/tests/integration/channels/emoji/sorted_emojis_spec.ts index 3145bc5a01..8a3720bac8 100644 --- a/webapp/channels/e2e/cypress/tests/integration/emoji/sorted_emojis_spec.ts +++ b/e2e/cypress/tests/integration/channels/emoji/sorted_emojis_spec.ts @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @emoji +// Group: @channels @emoji -import * as TIMEOUTS from '../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; describe('Emoji sorting', () => { before(() => { diff --git a/webapp/channels/e2e/cypress/tests/integration/enterprise/accessibility/accessibility_input_fields_spec.js b/e2e/cypress/tests/integration/channels/enterprise/accessibility/accessibility_input_fields_spec.js similarity index 99% rename from webapp/channels/e2e/cypress/tests/integration/enterprise/accessibility/accessibility_input_fields_spec.js rename to e2e/cypress/tests/integration/channels/enterprise/accessibility/accessibility_input_fields_spec.js index 07211ddde7..8626033949 100644 --- a/webapp/channels/e2e/cypress/tests/integration/enterprise/accessibility/accessibility_input_fields_spec.js +++ b/e2e/cypress/tests/integration/channels/enterprise/accessibility/accessibility_input_fields_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @enterprise @accessibility +// Group: @channels @enterprise @accessibility -import * as TIMEOUTS from '../../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../../fixtures/timeouts'; describe('Verify Accessibility Support in different input fields', () => { let testTeam; diff --git a/webapp/channels/e2e/cypress/tests/integration/enterprise/accessibility/accessibility_modals_dialogs_1_spec.js b/e2e/cypress/tests/integration/channels/enterprise/accessibility/accessibility_modals_dialogs_1_spec.js similarity index 97% rename from webapp/channels/e2e/cypress/tests/integration/enterprise/accessibility/accessibility_modals_dialogs_1_spec.js rename to e2e/cypress/tests/integration/channels/enterprise/accessibility/accessibility_modals_dialogs_1_spec.js index ab45f5bf1a..b7cad800a8 100644 --- a/webapp/channels/e2e/cypress/tests/integration/enterprise/accessibility/accessibility_modals_dialogs_1_spec.js +++ b/e2e/cypress/tests/integration/channels/enterprise/accessibility/accessibility_modals_dialogs_1_spec.js @@ -7,9 +7,9 @@ // - Use element ID when selecting an element. Create one if none. // *************************************************************** -// Group: @enterprise @accessibility +// Group: @channels @enterprise @accessibility -import * as TIMEOUTS from '../../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../../fixtures/timeouts'; describe('Verify Accessibility Support in Modals & Dialogs', () => { let testTeam; diff --git a/webapp/channels/e2e/cypress/tests/integration/enterprise/accessibility/accessibility_modals_dialogs_spec.js b/e2e/cypress/tests/integration/channels/enterprise/accessibility/accessibility_modals_dialogs_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/enterprise/accessibility/accessibility_modals_dialogs_spec.js rename to e2e/cypress/tests/integration/channels/enterprise/accessibility/accessibility_modals_dialogs_spec.js index 9d6deade6a..adf5478b55 100644 --- a/webapp/channels/e2e/cypress/tests/integration/enterprise/accessibility/accessibility_modals_dialogs_spec.js +++ b/e2e/cypress/tests/integration/channels/enterprise/accessibility/accessibility_modals_dialogs_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @enterprise @accessibility +// Group: @channels @enterprise @accessibility -import * as TIMEOUTS from '../../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../../fixtures/timeouts'; describe('Verify Accessibility Support in Modals & Dialogs', () => { let testTeam; diff --git a/webapp/channels/e2e/cypress/tests/integration/enterprise/auth_sso/authentication_spec.js b/e2e/cypress/tests/integration/channels/enterprise/auth_sso/authentication_spec.js similarity index 95% rename from webapp/channels/e2e/cypress/tests/integration/enterprise/auth_sso/authentication_spec.js rename to e2e/cypress/tests/integration/channels/enterprise/auth_sso/authentication_spec.js index ed67ca1af1..82b37e5b67 100644 --- a/webapp/channels/e2e/cypress/tests/integration/enterprise/auth_sso/authentication_spec.js +++ b/e2e/cypress/tests/integration/channels/enterprise/auth_sso/authentication_spec.js @@ -8,11 +8,11 @@ // *************************************************************** // Stage: @prod -// Group: @enterprise @system_console @authentication +// Group: @channels @enterprise @system_console @authentication -import * as TIMEOUTS from '../../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../../fixtures/timeouts'; -import {getRandomId} from '../../../utils'; +import {getRandomId} from '../../../../utils'; describe('Authentication', () => { let testTeam; diff --git a/webapp/channels/e2e/cypress/tests/integration/enterprise/auth_sso/mfa_authentication_spec.js b/e2e/cypress/tests/integration/channels/enterprise/auth_sso/mfa_authentication_spec.js similarity index 97% rename from webapp/channels/e2e/cypress/tests/integration/enterprise/auth_sso/mfa_authentication_spec.js rename to e2e/cypress/tests/integration/channels/enterprise/auth_sso/mfa_authentication_spec.js index 7d4fa2bc6c..98b7443832 100644 --- a/webapp/channels/e2e/cypress/tests/integration/enterprise/auth_sso/mfa_authentication_spec.js +++ b/e2e/cypress/tests/integration/channels/enterprise/auth_sso/mfa_authentication_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @enterprise @system_console @authentication @mfa +// Group: @channels @enterprise @system_console @authentication @mfa -import * as TIMEOUTS from '../../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../../fixtures/timeouts'; const authenticator = require('authenticator'); diff --git a/webapp/channels/e2e/cypress/tests/integration/enterprise/bot_accounts/managing_bot_accounts_spec.js b/e2e/cypress/tests/integration/channels/enterprise/bot_accounts/managing_bot_accounts_spec.js similarity index 93% rename from webapp/channels/e2e/cypress/tests/integration/enterprise/bot_accounts/managing_bot_accounts_spec.js rename to e2e/cypress/tests/integration/channels/enterprise/bot_accounts/managing_bot_accounts_spec.js index 2d1d884e72..0c4456586c 100644 --- a/webapp/channels/e2e/cypress/tests/integration/enterprise/bot_accounts/managing_bot_accounts_spec.js +++ b/e2e/cypress/tests/integration/channels/enterprise/bot_accounts/managing_bot_accounts_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @enterprise @bot_accounts +// Group: @channels @enterprise @bot_accounts -import * as TIMEOUTS from '../../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../../fixtures/timeouts'; describe('Managing bot accounts', () => { let botName; diff --git a/webapp/channels/e2e/cypress/tests/integration/enterprise/channel/channel_groups_spec.ts b/e2e/cypress/tests/integration/channels/enterprise/channel/channel_groups_spec.ts similarity index 96% rename from webapp/channels/e2e/cypress/tests/integration/enterprise/channel/channel_groups_spec.ts rename to e2e/cypress/tests/integration/channels/enterprise/channel/channel_groups_spec.ts index ce5cb913c5..9941351eb3 100644 --- a/webapp/channels/e2e/cypress/tests/integration/enterprise/channel/channel_groups_spec.ts +++ b/e2e/cypress/tests/integration/channels/enterprise/channel/channel_groups_spec.ts @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @enterprise @ldap_group +// Group: @channels @enterprise @ldap_group -import * as TIMEOUTS from '../../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../../fixtures/timeouts'; describe('channel groups', () => { const groups = []; diff --git a/webapp/channels/e2e/cypress/tests/integration/enterprise/cloud/billing/after_subscription_spec.js b/e2e/cypress/tests/integration/channels/enterprise/cloud/billing/after_subscription_spec.js similarity index 99% rename from webapp/channels/e2e/cypress/tests/integration/enterprise/cloud/billing/after_subscription_spec.js rename to e2e/cypress/tests/integration/channels/enterprise/cloud/billing/after_subscription_spec.js index 1c495bcb88..59adf96b98 100644 --- a/webapp/channels/e2e/cypress/tests/integration/enterprise/cloud/billing/after_subscription_spec.js +++ b/e2e/cypress/tests/integration/channels/enterprise/cloud/billing/after_subscription_spec.js @@ -7,10 +7,10 @@ // - Use element ID when selecting an element. Create one if none. // *************************************************************** -// Group: @cloud_only @cloud_trial +// Group: @channels @cloud_only @cloud_trial -import * as TIMEOUTS from '../../../../fixtures/timeouts'; -import billing from '../../../../fixtures/client_billing.json'; +import * as TIMEOUTS from '../../../../../fixtures/timeouts'; +import billing from '../../../../../fixtures/client_billing.json'; describe('System Console - after subscription scenarios', () => { before(() => { diff --git a/webapp/channels/e2e/cypress/tests/integration/enterprise/cloud/billing/billing_history_free_trial_spec.ts b/e2e/cypress/tests/integration/channels/enterprise/cloud/billing/billing_history_free_trial_spec.ts similarity index 99% rename from webapp/channels/e2e/cypress/tests/integration/enterprise/cloud/billing/billing_history_free_trial_spec.ts rename to e2e/cypress/tests/integration/channels/enterprise/cloud/billing/billing_history_free_trial_spec.ts index d96929af59..f5509d7cd3 100644 --- a/webapp/channels/e2e/cypress/tests/integration/enterprise/cloud/billing/billing_history_free_trial_spec.ts +++ b/e2e/cypress/tests/integration/channels/enterprise/cloud/billing/billing_history_free_trial_spec.ts @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @cloud_only @cloud_trial +// Group: @channels @cloud_only @cloud_trial function simulateSubscription() { cy.intercept('GET', '**/api/v4/cloud/subscription/invoices', { diff --git a/webapp/channels/e2e/cypress/tests/integration/enterprise/cloud/billing/cloud_pricing_modal_spec.ts b/e2e/cypress/tests/integration/channels/enterprise/cloud/billing/cloud_pricing_modal_spec.ts similarity index 99% rename from webapp/channels/e2e/cypress/tests/integration/enterprise/cloud/billing/cloud_pricing_modal_spec.ts rename to e2e/cypress/tests/integration/channels/enterprise/cloud/billing/cloud_pricing_modal_spec.ts index 65975078b6..70b026d72d 100644 --- a/webapp/channels/e2e/cypress/tests/integration/enterprise/cloud/billing/cloud_pricing_modal_spec.ts +++ b/e2e/cypress/tests/integration/channels/enterprise/cloud/billing/cloud_pricing_modal_spec.ts @@ -1,7 +1,7 @@ // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. // See LICENSE.txt for license information. -import * as TIMEOUTS from '../../../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../../../fixtures/timeouts'; // *************************************************************** // - [#] indicates a test step (e.g. # Go to a page) @@ -10,7 +10,7 @@ import * as TIMEOUTS from '../../../../fixtures/timeouts'; // *************************************************************** // Stage: @prod -// Group: @cloud_only @cloud_trial +// Group: @channels @cloud_only @cloud_trial function simulateSubscriptionWithLimitsUsage(subscription, withLimits = {}, postsUsed) { cy.intercept('GET', '**/api/v4/cloud/subscription', { diff --git a/webapp/channels/e2e/cypress/tests/integration/enterprise/cloud/billing/company_information_free_trial_spec.ts b/e2e/cypress/tests/integration/channels/enterprise/cloud/billing/company_information_free_trial_spec.ts similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/enterprise/cloud/billing/company_information_free_trial_spec.ts rename to e2e/cypress/tests/integration/channels/enterprise/cloud/billing/company_information_free_trial_spec.ts index f993cdd05f..ef511fce5a 100644 --- a/webapp/channels/e2e/cypress/tests/integration/enterprise/cloud/billing/company_information_free_trial_spec.ts +++ b/e2e/cypress/tests/integration/channels/enterprise/cloud/billing/company_information_free_trial_spec.ts @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @cloud_only @cloud_trial +// Group: @channels @cloud_only @cloud_trial -import {getRandomLetter} from '../../../../utils/index'; +import {getRandomLetter} from '../../../../../utils/index'; describe('System Console - Company Information section', () => { before(() => { diff --git a/webapp/channels/e2e/cypress/tests/integration/enterprise/cloud/billing/downgrade_feedback_modal_spec.ts b/e2e/cypress/tests/integration/channels/enterprise/cloud/billing/downgrade_feedback_modal_spec.ts similarity index 99% rename from webapp/channels/e2e/cypress/tests/integration/enterprise/cloud/billing/downgrade_feedback_modal_spec.ts rename to e2e/cypress/tests/integration/channels/enterprise/cloud/billing/downgrade_feedback_modal_spec.ts index ca79cf2bbb..dae163fdf8 100644 --- a/webapp/channels/e2e/cypress/tests/integration/enterprise/cloud/billing/downgrade_feedback_modal_spec.ts +++ b/e2e/cypress/tests/integration/channels/enterprise/cloud/billing/downgrade_feedback_modal_spec.ts @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @cloud_only @cloud_trial +// Group: @channels @cloud_only @cloud_trial describe('Feedback modal', () => { beforeEach(() => { cy.apiLogout(); diff --git a/webapp/channels/e2e/cypress/tests/integration/enterprise/cloud/billing/notify_admin_spec.ts b/e2e/cypress/tests/integration/channels/enterprise/cloud/billing/notify_admin_spec.ts similarity index 99% rename from webapp/channels/e2e/cypress/tests/integration/enterprise/cloud/billing/notify_admin_spec.ts rename to e2e/cypress/tests/integration/channels/enterprise/cloud/billing/notify_admin_spec.ts index ad41b41967..4e7f24bf34 100644 --- a/webapp/channels/e2e/cypress/tests/integration/enterprise/cloud/billing/notify_admin_spec.ts +++ b/e2e/cypress/tests/integration/channels/enterprise/cloud/billing/notify_admin_spec.ts @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @cloud_only @cloud_trial +// Group: @channels @cloud_only @cloud_trial -import {getAdminAccount} from '../../../../support/env'; +import {getAdminAccount} from '../../../../../support/env'; const admin = getAdminAccount(); diff --git a/webapp/channels/e2e/cypress/tests/integration/enterprise/cloud/billing/payment_free_trial_spec.ts b/e2e/cypress/tests/integration/channels/enterprise/cloud/billing/payment_free_trial_spec.ts similarity index 99% rename from webapp/channels/e2e/cypress/tests/integration/enterprise/cloud/billing/payment_free_trial_spec.ts rename to e2e/cypress/tests/integration/channels/enterprise/cloud/billing/payment_free_trial_spec.ts index cd0061a188..3ba4337e27 100644 --- a/webapp/channels/e2e/cypress/tests/integration/enterprise/cloud/billing/payment_free_trial_spec.ts +++ b/e2e/cypress/tests/integration/channels/enterprise/cloud/billing/payment_free_trial_spec.ts @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @cloud_only @cloud_trial +// Group: @channels @cloud_only @cloud_trial function simulateSubscription() { cy.intercept('GET', '**/api/v4/cloud/subscription', { diff --git a/webapp/channels/e2e/cypress/tests/integration/enterprise/cloud/billing/subscriptions_free_trial_spec.ts b/e2e/cypress/tests/integration/channels/enterprise/cloud/billing/subscriptions_free_trial_spec.ts similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/enterprise/cloud/billing/subscriptions_free_trial_spec.ts rename to e2e/cypress/tests/integration/channels/enterprise/cloud/billing/subscriptions_free_trial_spec.ts index 3c5762ec12..fed02e6de9 100644 --- a/webapp/channels/e2e/cypress/tests/integration/enterprise/cloud/billing/subscriptions_free_trial_spec.ts +++ b/e2e/cypress/tests/integration/channels/enterprise/cloud/billing/subscriptions_free_trial_spec.ts @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @cloud_only @cloud_trial +// Group: @channels @cloud_only @cloud_trial -import billing from '../../../../fixtures/client_billing.json'; +import billing from '../../../../../fixtures/client_billing.json'; function simulateSubscription() { cy.intercept('GET', '**/api/v4/cloud/subscription', { diff --git a/webapp/channels/e2e/cypress/tests/integration/enterprise/cloud/billing/yearly_subscription_spec.js b/e2e/cypress/tests/integration/channels/enterprise/cloud/billing/yearly_subscription_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/enterprise/cloud/billing/yearly_subscription_spec.js rename to e2e/cypress/tests/integration/channels/enterprise/cloud/billing/yearly_subscription_spec.js index d4cdcfae40..0eacc1350c 100644 --- a/webapp/channels/e2e/cypress/tests/integration/enterprise/cloud/billing/yearly_subscription_spec.js +++ b/e2e/cypress/tests/integration/channels/enterprise/cloud/billing/yearly_subscription_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @cloud_only @cloud_trial +// Group: @channels @cloud_only @cloud_trial -import billing from '../../../../fixtures/client_billing.json'; +import billing from '../../../../../fixtures/client_billing.json'; function simulateSubscription() { cy.intercept('GET', '**/api/v4/cloud/subscription', { diff --git a/webapp/channels/e2e/cypress/tests/integration/enterprise/elasticsearch_autocomplete/channels_spec.js b/e2e/cypress/tests/integration/channels/enterprise/elasticsearch_autocomplete/channels_spec.js similarity index 97% rename from webapp/channels/e2e/cypress/tests/integration/enterprise/elasticsearch_autocomplete/channels_spec.js rename to e2e/cypress/tests/integration/channels/enterprise/elasticsearch_autocomplete/channels_spec.js index 17d648fbae..21082a5fc1 100644 --- a/webapp/channels/e2e/cypress/tests/integration/enterprise/elasticsearch_autocomplete/channels_spec.js +++ b/e2e/cypress/tests/integration/channels/enterprise/elasticsearch_autocomplete/channels_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @enterprise @elasticsearch @autocomplete @not_cloud +// Group: @channels @enterprise @elasticsearch @autocomplete @not_cloud -import {getAdminAccount} from '../../../support/env'; +import {getAdminAccount} from '../../../../support/env'; import { createPrivateChannel, diff --git a/webapp/channels/e2e/cypress/tests/integration/enterprise/elasticsearch_autocomplete/channels_with_special_characters_spec.js b/e2e/cypress/tests/integration/channels/enterprise/elasticsearch_autocomplete/channels_with_special_characters_spec.js similarity index 97% rename from webapp/channels/e2e/cypress/tests/integration/enterprise/elasticsearch_autocomplete/channels_with_special_characters_spec.js rename to e2e/cypress/tests/integration/channels/enterprise/elasticsearch_autocomplete/channels_with_special_characters_spec.js index abab2c02f7..36246b8b77 100644 --- a/webapp/channels/e2e/cypress/tests/integration/enterprise/elasticsearch_autocomplete/channels_with_special_characters_spec.js +++ b/e2e/cypress/tests/integration/channels/enterprise/elasticsearch_autocomplete/channels_with_special_characters_spec.js @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @enterprise @elasticsearch @autocomplete @not_cloud +// Group: @channels @enterprise @elasticsearch @autocomplete @not_cloud import { enableElasticSearch, diff --git a/webapp/channels/e2e/cypress/tests/integration/enterprise/elasticsearch_autocomplete/helpers/index.js b/e2e/cypress/tests/integration/channels/enterprise/elasticsearch_autocomplete/helpers/index.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/enterprise/elasticsearch_autocomplete/helpers/index.js rename to e2e/cypress/tests/integration/channels/enterprise/elasticsearch_autocomplete/helpers/index.js index 5376bd57e5..b3569b201d 100644 --- a/webapp/channels/e2e/cypress/tests/integration/enterprise/elasticsearch_autocomplete/helpers/index.js +++ b/e2e/cypress/tests/integration/channels/enterprise/elasticsearch_autocomplete/helpers/index.js @@ -1,8 +1,8 @@ // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. // See LICENSE.txt for license information. -import * as TIMEOUTS from '../../../../fixtures/timeouts'; -import {getAdminAccount} from '../../../../support/env'; +import * as TIMEOUTS from '../../../../../fixtures/timeouts'; +import {getAdminAccount} from '../../../../../support/env'; const admin = getAdminAccount(); diff --git a/webapp/channels/e2e/cypress/tests/integration/enterprise/elasticsearch_autocomplete/renaming_spec.js b/e2e/cypress/tests/integration/channels/enterprise/elasticsearch_autocomplete/renaming_spec.js similarity index 94% rename from webapp/channels/e2e/cypress/tests/integration/enterprise/elasticsearch_autocomplete/renaming_spec.js rename to e2e/cypress/tests/integration/channels/enterprise/elasticsearch_autocomplete/renaming_spec.js index 23bbdd0622..f43a14e772 100644 --- a/webapp/channels/e2e/cypress/tests/integration/enterprise/elasticsearch_autocomplete/renaming_spec.js +++ b/e2e/cypress/tests/integration/channels/enterprise/elasticsearch_autocomplete/renaming_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @enterprise @elasticsearch @autocomplete @not_cloud +// Group: @channels @enterprise @elasticsearch @autocomplete @not_cloud -import {getRandomId} from '../../../utils'; +import {getRandomId} from '../../../../utils'; import { enableElasticSearch, diff --git a/webapp/channels/e2e/cypress/tests/integration/enterprise/elasticsearch_autocomplete/renaming_team_spec.js b/e2e/cypress/tests/integration/channels/enterprise/elasticsearch_autocomplete/renaming_team_spec.js similarity index 93% rename from webapp/channels/e2e/cypress/tests/integration/enterprise/elasticsearch_autocomplete/renaming_team_spec.js rename to e2e/cypress/tests/integration/channels/enterprise/elasticsearch_autocomplete/renaming_team_spec.js index 40f5090dc0..44f7c5e4ba 100644 --- a/webapp/channels/e2e/cypress/tests/integration/enterprise/elasticsearch_autocomplete/renaming_team_spec.js +++ b/e2e/cypress/tests/integration/channels/enterprise/elasticsearch_autocomplete/renaming_team_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @enterprise @elasticsearch @autocomplete @not_cloud +// Group: @channels @enterprise @elasticsearch @autocomplete @not_cloud -import {getRandomId} from '../../../utils'; +import {getRandomId} from '../../../../utils'; import { enableElasticSearch, diff --git a/webapp/channels/e2e/cypress/tests/integration/enterprise/elasticsearch_autocomplete/system_console_spec.js b/e2e/cypress/tests/integration/channels/enterprise/elasticsearch_autocomplete/system_console_spec.js similarity index 96% rename from webapp/channels/e2e/cypress/tests/integration/enterprise/elasticsearch_autocomplete/system_console_spec.js rename to e2e/cypress/tests/integration/channels/enterprise/elasticsearch_autocomplete/system_console_spec.js index cbf76000fc..30ec20db1a 100644 --- a/webapp/channels/e2e/cypress/tests/integration/enterprise/elasticsearch_autocomplete/system_console_spec.js +++ b/e2e/cypress/tests/integration/channels/enterprise/elasticsearch_autocomplete/system_console_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @enterprise @elasticsearch @autocomplete @not_cloud +// Group: @channels @enterprise @elasticsearch @autocomplete @not_cloud -import * as TIMEOUTS from '../../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../../fixtures/timeouts'; describe('Elasticsearch system console', () => { before(() => { diff --git a/webapp/channels/e2e/cypress/tests/integration/enterprise/elasticsearch_autocomplete/users_in_channel_switcher_spec.js b/e2e/cypress/tests/integration/channels/enterprise/elasticsearch_autocomplete/users_in_channel_switcher_spec.js similarity index 97% rename from webapp/channels/e2e/cypress/tests/integration/enterprise/elasticsearch_autocomplete/users_in_channel_switcher_spec.js rename to e2e/cypress/tests/integration/channels/enterprise/elasticsearch_autocomplete/users_in_channel_switcher_spec.js index efc6398d74..2af2287a59 100644 --- a/webapp/channels/e2e/cypress/tests/integration/enterprise/elasticsearch_autocomplete/users_in_channel_switcher_spec.js +++ b/e2e/cypress/tests/integration/channels/enterprise/elasticsearch_autocomplete/users_in_channel_switcher_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @enterprise @elasticsearch @autocomplete @not_cloud +// Group: @channels @enterprise @elasticsearch @autocomplete @not_cloud -import {getRandomLetter} from '../../../utils'; +import {getRandomLetter} from '../../../../utils'; import {doTestQuickChannelSwitcher} from '../../autocomplete/common_test'; import {createSearchData, enableElasticSearch} from '../../autocomplete/helpers'; diff --git a/webapp/channels/e2e/cypress/tests/integration/enterprise/elasticsearch_autocomplete/users_in_message_input_box_spec.js b/e2e/cypress/tests/integration/channels/enterprise/elasticsearch_autocomplete/users_in_message_input_box_spec.js similarity index 97% rename from webapp/channels/e2e/cypress/tests/integration/enterprise/elasticsearch_autocomplete/users_in_message_input_box_spec.js rename to e2e/cypress/tests/integration/channels/enterprise/elasticsearch_autocomplete/users_in_message_input_box_spec.js index 4258caa0c3..5d9ae145b2 100644 --- a/webapp/channels/e2e/cypress/tests/integration/enterprise/elasticsearch_autocomplete/users_in_message_input_box_spec.js +++ b/e2e/cypress/tests/integration/channels/enterprise/elasticsearch_autocomplete/users_in_message_input_box_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @enterprise @elasticsearch @autocomplete @not_cloud +// Group: @channels @enterprise @elasticsearch @autocomplete @not_cloud -import {getRandomLetter} from '../../../utils'; +import {getRandomLetter} from '../../../../utils'; import {doTestPostextbox} from '../../autocomplete/common_test'; import {createSearchData, enableElasticSearch} from '../../autocomplete/helpers'; diff --git a/webapp/channels/e2e/cypress/tests/integration/enterprise/elasticsearch_autocomplete/users_spec.js b/e2e/cypress/tests/integration/channels/enterprise/elasticsearch_autocomplete/users_spec.js similarity index 92% rename from webapp/channels/e2e/cypress/tests/integration/enterprise/elasticsearch_autocomplete/users_spec.js rename to e2e/cypress/tests/integration/channels/enterprise/elasticsearch_autocomplete/users_spec.js index 854662e5f3..b4940d966b 100644 --- a/webapp/channels/e2e/cypress/tests/integration/enterprise/elasticsearch_autocomplete/users_spec.js +++ b/e2e/cypress/tests/integration/channels/enterprise/elasticsearch_autocomplete/users_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @enterprise @elasticsearch @autocomplete @not_cloud +// Group: @channels @enterprise @elasticsearch @autocomplete @not_cloud -import {getRandomLetter} from '../../../utils'; +import {getRandomLetter} from '../../../../utils'; import {doTestDMChannelSidebar, doTestUserChannelSection} from '../../autocomplete/common_test'; import {createSearchData, enableElasticSearch} from '../../autocomplete/helpers'; diff --git a/webapp/channels/e2e/cypress/tests/integration/enterprise/extend_session/email_login_activity_spec.ts b/e2e/cypress/tests/integration/channels/enterprise/extend_session/email_login_activity_spec.ts similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/enterprise/extend_session/email_login_activity_spec.ts rename to e2e/cypress/tests/integration/channels/enterprise/extend_session/email_login_activity_spec.ts index 00e9ebc795..875d472acf 100644 --- a/webapp/channels/e2e/cypress/tests/integration/enterprise/extend_session/email_login_activity_spec.ts +++ b/e2e/cypress/tests/integration/channels/enterprise/extend_session/email_login_activity_spec.ts @@ -1,7 +1,7 @@ // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. // See LICENSE.txt for license information. -import {getAdminAccount} from '../../../support/env'; +import {getAdminAccount} from '../../../../support/env'; // *************************************************************** // - [#] indicates a test step (e.g. # Go to a page) @@ -10,7 +10,7 @@ import {getAdminAccount} from '../../../support/env'; // *************************************************************** // Stage: @prod -// Group: @enterprise @not_cloud @extend_session +// Group: @channels @enterprise @not_cloud @extend_session describe('MM-T2575 Extend Session - Email Login', () => { let offTopicUrl; diff --git a/webapp/channels/e2e/cypress/tests/integration/enterprise/extend_session/not_extended_when_disabled/helpers.js b/e2e/cypress/tests/integration/channels/enterprise/extend_session/not_extended_when_disabled/helpers.js similarity index 97% rename from webapp/channels/e2e/cypress/tests/integration/enterprise/extend_session/not_extended_when_disabled/helpers.js rename to e2e/cypress/tests/integration/channels/enterprise/extend_session/not_extended_when_disabled/helpers.js index f252ef8c1b..7b129bd988 100644 --- a/webapp/channels/e2e/cypress/tests/integration/enterprise/extend_session/not_extended_when_disabled/helpers.js +++ b/e2e/cypress/tests/integration/channels/enterprise/extend_session/not_extended_when_disabled/helpers.js @@ -1,8 +1,8 @@ // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. // See LICENSE.txt for license information. -import {getAdminAccount} from '../../../../support/env'; -import * as TIMEOUTS from '../../../../fixtures/timeouts'; +import {getAdminAccount} from '../../../../../support/env'; +import * as TIMEOUTS from '../../../../../fixtures/timeouts'; const admin = getAdminAccount(); const oneDay = 24 * 60 * 60 * 1000; diff --git a/webapp/channels/e2e/cypress/tests/integration/enterprise/extend_session/not_extended_when_disabled/with_email_login_spec.js b/e2e/cypress/tests/integration/channels/enterprise/extend_session/not_extended_when_disabled/with_email_login_spec.js similarity index 97% rename from webapp/channels/e2e/cypress/tests/integration/enterprise/extend_session/not_extended_when_disabled/with_email_login_spec.js rename to e2e/cypress/tests/integration/channels/enterprise/extend_session/not_extended_when_disabled/with_email_login_spec.js index 21cf36e2cb..de6ab96f37 100644 --- a/webapp/channels/e2e/cypress/tests/integration/enterprise/extend_session/not_extended_when_disabled/with_email_login_spec.js +++ b/e2e/cypress/tests/integration/channels/enterprise/extend_session/not_extended_when_disabled/with_email_login_spec.js @@ -7,7 +7,7 @@ // - Use element ID when selecting an element. Create one if none. // *************************************************************** -// Group: @enterprise @not_cloud @extend_session +// Group: @channels @enterprise @not_cloud @extend_session import {verifyExtendedSession, verifyNotExtendedSession} from './helpers'; diff --git a/webapp/channels/e2e/cypress/tests/integration/enterprise/extend_session/not_extended_when_disabled/with_ldap_login_spec.js b/e2e/cypress/tests/integration/channels/enterprise/extend_session/not_extended_when_disabled/with_ldap_login_spec.js similarity index 94% rename from webapp/channels/e2e/cypress/tests/integration/enterprise/extend_session/not_extended_when_disabled/with_ldap_login_spec.js rename to e2e/cypress/tests/integration/channels/enterprise/extend_session/not_extended_when_disabled/with_ldap_login_spec.js index 03c0ea41dc..2da8057e94 100644 --- a/webapp/channels/e2e/cypress/tests/integration/enterprise/extend_session/not_extended_when_disabled/with_ldap_login_spec.js +++ b/e2e/cypress/tests/integration/channels/enterprise/extend_session/not_extended_when_disabled/with_ldap_login_spec.js @@ -7,9 +7,9 @@ // - Use element ID when selecting an element. Create one if none. // *************************************************************** -// Group: @enterprise @not_cloud @extend_session @ldap +// Group: @channels @enterprise @not_cloud @extend_session @ldap -import ldapUsers from '../../../../fixtures/ldap_users.json'; +import ldapUsers from '../../../../../fixtures/ldap_users.json'; import {verifyExtendedSession, verifyNotExtendedSession} from './helpers'; diff --git a/webapp/channels/e2e/cypress/tests/integration/enterprise/extend_session/not_extended_when_disabled/with_saml_login_spec.js b/e2e/cypress/tests/integration/channels/enterprise/extend_session/not_extended_when_disabled/with_saml_login_spec.js similarity index 95% rename from webapp/channels/e2e/cypress/tests/integration/enterprise/extend_session/not_extended_when_disabled/with_saml_login_spec.js rename to e2e/cypress/tests/integration/channels/enterprise/extend_session/not_extended_when_disabled/with_saml_login_spec.js index 88a70cfc26..ce90e7af47 100644 --- a/webapp/channels/e2e/cypress/tests/integration/enterprise/extend_session/not_extended_when_disabled/with_saml_login_spec.js +++ b/e2e/cypress/tests/integration/channels/enterprise/extend_session/not_extended_when_disabled/with_saml_login_spec.js @@ -12,9 +12,9 @@ // -> copy ./mattermost-server/build/docker/keycloak/keycloak.crt to ./mattermost-webapp/e2e/cypress/tests/fixtures/keycloak.crt // - Requires Cypress' chromeWebSecurity to be false -// Group: @enterprise @not_cloud @extend_session @ldap @saml @keycloak +// Group: @channels @enterprise @not_cloud @extend_session @ldap @saml @keycloak -import {getKeycloakServerSettings} from '../../../../utils/config'; +import {getKeycloakServerSettings} from '../../../../../utils/config'; import {verifyExtendedSession, verifyNotExtendedSession} from './helpers'; diff --git a/webapp/channels/e2e/cypress/tests/integration/enterprise/extend_session/session_length_spec.ts b/e2e/cypress/tests/integration/channels/enterprise/extend_session/session_length_spec.ts similarity index 99% rename from webapp/channels/e2e/cypress/tests/integration/enterprise/extend_session/session_length_spec.ts rename to e2e/cypress/tests/integration/channels/enterprise/extend_session/session_length_spec.ts index 1002f37cf6..cad52cbb1f 100644 --- a/webapp/channels/e2e/cypress/tests/integration/enterprise/extend_session/session_length_spec.ts +++ b/e2e/cypress/tests/integration/channels/enterprise/extend_session/session_length_spec.ts @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @enterprise @not_cloud @system_console +// Group: @channels @enterprise @not_cloud @system_console // # Goes to the System Scheme page as System Admin const goToSessionLengths = () => { diff --git a/webapp/channels/e2e/cypress/tests/integration/enterprise/group_mentions/group_mentions_permissions_spec.js b/e2e/cypress/tests/integration/channels/enterprise/group_mentions/group_mentions_permissions_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/enterprise/group_mentions/group_mentions_permissions_spec.js rename to e2e/cypress/tests/integration/channels/enterprise/group_mentions/group_mentions_permissions_spec.js index 67245d0385..f52d25e85e 100644 --- a/webapp/channels/e2e/cypress/tests/integration/enterprise/group_mentions/group_mentions_permissions_spec.js +++ b/e2e/cypress/tests/integration/channels/enterprise/group_mentions/group_mentions_permissions_spec.js @@ -7,10 +7,10 @@ // - Use element ID when selecting an element. Create one if none. // *************************************************************** -// Group: @enterprise @system_console @group_mentions +// Group: @channels @enterprise @system_console @group_mentions -import ldapUsers from '../../../fixtures/ldap_users.json'; -import * as TIMEOUTS from '../../../fixtures/timeouts'; +import ldapUsers from '../../../../fixtures/ldap_users.json'; +import * as TIMEOUTS from '../../../../fixtures/timeouts'; import { disablePermission, diff --git a/webapp/channels/e2e/cypress/tests/integration/enterprise/group_mentions/group_mentions_posts_spec.js b/e2e/cypress/tests/integration/channels/enterprise/group_mentions/group_mentions_posts_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/enterprise/group_mentions/group_mentions_posts_spec.js rename to e2e/cypress/tests/integration/channels/enterprise/group_mentions/group_mentions_posts_spec.js index 2615c264bb..9e1ca26eec 100644 --- a/webapp/channels/e2e/cypress/tests/integration/enterprise/group_mentions/group_mentions_posts_spec.js +++ b/e2e/cypress/tests/integration/channels/enterprise/group_mentions/group_mentions_posts_spec.js @@ -7,10 +7,10 @@ // - Use element ID when selecting an element. Create one if none. // *************************************************************** -// Group: @enterprise @system_console @group_mentions +// Group: @channels @enterprise @system_console @group_mentions -import ldapUsers from '../../../fixtures/ldap_users.json'; -import * as TIMEOUTS from '../../../fixtures/timeouts'; +import ldapUsers from '../../../../fixtures/ldap_users.json'; +import * as TIMEOUTS from '../../../../fixtures/timeouts'; import {enableGroupMention} from './helpers'; diff --git a/webapp/channels/e2e/cypress/tests/integration/enterprise/group_mentions/group_mentions_system_messages_spec.js b/e2e/cypress/tests/integration/channels/enterprise/group_mentions/group_mentions_system_messages_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/enterprise/group_mentions/group_mentions_system_messages_spec.js rename to e2e/cypress/tests/integration/channels/enterprise/group_mentions/group_mentions_system_messages_spec.js index 58f24c13ac..7ffefdbb3e 100644 --- a/webapp/channels/e2e/cypress/tests/integration/enterprise/group_mentions/group_mentions_system_messages_spec.js +++ b/e2e/cypress/tests/integration/channels/enterprise/group_mentions/group_mentions_system_messages_spec.js @@ -7,10 +7,10 @@ // - Use element ID when selecting an element. Create one if none. // *************************************************************** -// Group: @enterprise @system_console @group_mentions +// Group: @channels @enterprise @system_console @group_mentions -import ldapUsers from '../../../fixtures/ldap_users.json'; -import * as TIMEOUTS from '../../../fixtures/timeouts'; +import ldapUsers from '../../../../fixtures/ldap_users.json'; +import * as TIMEOUTS from '../../../../fixtures/timeouts'; import { disablePermission, diff --git a/webapp/channels/e2e/cypress/tests/integration/enterprise/group_mentions/helpers.js b/e2e/cypress/tests/integration/channels/enterprise/group_mentions/helpers.js similarity index 95% rename from webapp/channels/e2e/cypress/tests/integration/enterprise/group_mentions/helpers.js rename to e2e/cypress/tests/integration/channels/enterprise/group_mentions/helpers.js index f7ed9f2054..73c17c61b1 100644 --- a/webapp/channels/e2e/cypress/tests/integration/enterprise/group_mentions/helpers.js +++ b/e2e/cypress/tests/integration/channels/enterprise/group_mentions/helpers.js @@ -1,7 +1,7 @@ // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. // See LICENSE.txt for license information. -import * as TIMEOUTS from '../../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../../fixtures/timeouts'; export function enableGroupMention(groupName, groupID, userEmail) { // # Visit Group Configurations page diff --git a/webapp/channels/e2e/cypress/tests/integration/enterprise/guest_accounts/guest_add_spec.ts b/e2e/cypress/tests/integration/channels/enterprise/guest_accounts/guest_add_spec.ts similarity index 96% rename from webapp/channels/e2e/cypress/tests/integration/enterprise/guest_accounts/guest_add_spec.ts rename to e2e/cypress/tests/integration/channels/enterprise/guest_accounts/guest_add_spec.ts index 16820a225d..37e1f89141 100644 --- a/webapp/channels/e2e/cypress/tests/integration/enterprise/guest_accounts/guest_add_spec.ts +++ b/e2e/cypress/tests/integration/channels/enterprise/guest_accounts/guest_add_spec.ts @@ -8,14 +8,14 @@ // *************************************************************** // Stage: @prod -// Group: @enterprise @guest_account +// Group: @channels @enterprise @guest_account /** * Note: This test requires Enterprise license to be uploaded */ import {createPrivateChannel} from '../elasticsearch_autocomplete/helpers'; -import * as TIMEOUTS from '../../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../../fixtures/timeouts'; describe('Guest Account - Guest User Experience', () => { let guestUser: Cypress.UserProfile; diff --git a/webapp/channels/e2e/cypress/tests/integration/enterprise/guest_accounts/guest_experience_ui_spec.ts b/e2e/cypress/tests/integration/channels/enterprise/guest_accounts/guest_experience_ui_spec.ts similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/enterprise/guest_accounts/guest_experience_ui_spec.ts rename to e2e/cypress/tests/integration/channels/enterprise/guest_accounts/guest_experience_ui_spec.ts index 203e52fd9f..ef1af7471a 100644 --- a/webapp/channels/e2e/cypress/tests/integration/enterprise/guest_accounts/guest_experience_ui_spec.ts +++ b/e2e/cypress/tests/integration/channels/enterprise/guest_accounts/guest_experience_ui_spec.ts @@ -8,13 +8,13 @@ // *************************************************************** // Stage: @prod -// Group: @enterprise @guest_account +// Group: @channels @enterprise @guest_account /** * Note: This test requires Enterprise license to be uploaded */ -import * as TIMEOUTS from '../../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../../fixtures/timeouts'; function demoteGuestUser(guestUser) { // # Demote user as guest user before each test diff --git a/webapp/channels/e2e/cypress/tests/integration/enterprise/guest_accounts/guest_feature_spec.ts b/e2e/cypress/tests/integration/channels/enterprise/guest_accounts/guest_feature_spec.ts similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/enterprise/guest_accounts/guest_feature_spec.ts rename to e2e/cypress/tests/integration/channels/enterprise/guest_accounts/guest_feature_spec.ts index 082b2b896f..78124b9b9b 100644 --- a/webapp/channels/e2e/cypress/tests/integration/enterprise/guest_accounts/guest_feature_spec.ts +++ b/e2e/cypress/tests/integration/channels/enterprise/guest_accounts/guest_feature_spec.ts @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @enterprise @guest_account +// Group: @channels @enterprise @guest_account /** * Note: This test requires Enterprise license to be uploaded diff --git a/webapp/channels/e2e/cypress/tests/integration/enterprise/guest_accounts/guest_identification_spec.ts b/e2e/cypress/tests/integration/channels/enterprise/guest_accounts/guest_identification_spec.ts similarity index 97% rename from webapp/channels/e2e/cypress/tests/integration/enterprise/guest_accounts/guest_identification_spec.ts rename to e2e/cypress/tests/integration/channels/enterprise/guest_accounts/guest_identification_spec.ts index 8805ebc816..ed4cf9dd24 100644 --- a/webapp/channels/e2e/cypress/tests/integration/enterprise/guest_accounts/guest_identification_spec.ts +++ b/e2e/cypress/tests/integration/channels/enterprise/guest_accounts/guest_identification_spec.ts @@ -7,7 +7,7 @@ // - Use element ID when selecting an element. Create one if none. // *************************************************************** -// Group: @not_cloud @enterprise @guest_account @mfa +// Group: @channels @not_cloud @enterprise @guest_account @mfa /** * Note: This test requires Enterprise license to be uploaded @@ -15,13 +15,13 @@ import authenticator from 'authenticator'; -import * as TIMEOUTS from '../../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../../fixtures/timeouts'; import { getJoinEmailTemplate, getRandomId, reUrl, verifyEmailBody, -} from '../../../utils'; +} from '../../../../utils'; describe('Guest Accounts', () => { let sysadmin: Cypress.UserProfile; diff --git a/webapp/channels/e2e/cypress/tests/integration/enterprise/guest_accounts/guest_identification_ui_not_cloud_spec.ts b/e2e/cypress/tests/integration/channels/enterprise/guest_accounts/guest_identification_ui_not_cloud_spec.ts similarity index 95% rename from webapp/channels/e2e/cypress/tests/integration/enterprise/guest_accounts/guest_identification_ui_not_cloud_spec.ts rename to e2e/cypress/tests/integration/channels/enterprise/guest_accounts/guest_identification_ui_not_cloud_spec.ts index 878a6c0794..199a8aceb7 100644 --- a/webapp/channels/e2e/cypress/tests/integration/enterprise/guest_accounts/guest_identification_ui_not_cloud_spec.ts +++ b/e2e/cypress/tests/integration/channels/enterprise/guest_accounts/guest_identification_ui_not_cloud_spec.ts @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @enterprise @guest_account @not_cloud +// Group: @channels @enterprise @guest_account @not_cloud -import * as TIMEOUTS from '../../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../../fixtures/timeouts'; describe('Verify Guest User Identification in different screens', () => { let guestUser: Cypress.UserProfile; diff --git a/webapp/channels/e2e/cypress/tests/integration/enterprise/guest_accounts/guest_identification_ui_spec.ts b/e2e/cypress/tests/integration/channels/enterprise/guest_accounts/guest_identification_ui_spec.ts similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/enterprise/guest_accounts/guest_identification_ui_spec.ts rename to e2e/cypress/tests/integration/channels/enterprise/guest_accounts/guest_identification_ui_spec.ts index 269af38022..f9169a1a68 100644 --- a/webapp/channels/e2e/cypress/tests/integration/enterprise/guest_accounts/guest_identification_ui_spec.ts +++ b/e2e/cypress/tests/integration/channels/enterprise/guest_accounts/guest_identification_ui_spec.ts @@ -8,15 +8,15 @@ // *************************************************************** // Stage: @prod -// Group: @enterprise @guest_account +// Group: @channels @enterprise @guest_account /** * Note: This test requires Enterprise license to be uploaded */ import dayjs from 'dayjs'; -import * as TIMEOUTS from '../../../fixtures/timeouts'; -import {getAdminAccount} from '../../../support/env'; +import * as TIMEOUTS from '../../../../fixtures/timeouts'; +import {getAdminAccount} from '../../../../support/env'; describe('Verify Guest User Identification in different screens', () => { const admin = getAdminAccount(); diff --git a/webapp/channels/e2e/cypress/tests/integration/enterprise/guest_accounts/guest_invitation_ui_more_spec.ts b/e2e/cypress/tests/integration/channels/enterprise/guest_accounts/guest_invitation_ui_more_spec.ts similarity index 97% rename from webapp/channels/e2e/cypress/tests/integration/enterprise/guest_accounts/guest_invitation_ui_more_spec.ts rename to e2e/cypress/tests/integration/channels/enterprise/guest_accounts/guest_invitation_ui_more_spec.ts index 1aa79a74aa..d09655bcb8 100644 --- a/webapp/channels/e2e/cypress/tests/integration/enterprise/guest_accounts/guest_invitation_ui_more_spec.ts +++ b/e2e/cypress/tests/integration/channels/enterprise/guest_accounts/guest_invitation_ui_more_spec.ts @@ -8,14 +8,14 @@ // *************************************************************** // Stage: @prod -// Group: @enterprise @guest_account +// Group: @channels @enterprise @guest_account /** * Note: This test requires Enterprise license to be uploaded */ -import {getRandomId} from '../../../utils'; -import * as TIMEOUTS from '../../../fixtures/timeouts'; +import {getRandomId} from '../../../../utils'; +import * as TIMEOUTS from '../../../../fixtures/timeouts'; import { changeGuestFeatureSettings, diff --git a/webapp/channels/e2e/cypress/tests/integration/enterprise/guest_accounts/guest_invitation_ui_spec.ts b/e2e/cypress/tests/integration/channels/enterprise/guest_accounts/guest_invitation_ui_spec.ts similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/enterprise/guest_accounts/guest_invitation_ui_spec.ts rename to e2e/cypress/tests/integration/channels/enterprise/guest_accounts/guest_invitation_ui_spec.ts index 82e74b9127..aa12dae759 100644 --- a/webapp/channels/e2e/cypress/tests/integration/enterprise/guest_accounts/guest_invitation_ui_spec.ts +++ b/e2e/cypress/tests/integration/channels/enterprise/guest_accounts/guest_invitation_ui_spec.ts @@ -8,13 +8,13 @@ // *************************************************************** // Stage: @prod -// Group: @enterprise @guest_account +// Group: @channels @enterprise @guest_account /** * Note: This test requires Enterprise license to be uploaded */ -import {getRandomId} from '../../../utils'; +import {getRandomId} from '../../../../utils'; import { changeGuestFeatureSettings, diff --git a/webapp/channels/e2e/cypress/tests/integration/enterprise/guest_accounts/guest_popover_ui_spec.ts b/e2e/cypress/tests/integration/channels/enterprise/guest_accounts/guest_popover_ui_spec.ts similarity index 96% rename from webapp/channels/e2e/cypress/tests/integration/enterprise/guest_accounts/guest_popover_ui_spec.ts rename to e2e/cypress/tests/integration/channels/enterprise/guest_accounts/guest_popover_ui_spec.ts index c16006cfc9..22dea4984e 100644 --- a/webapp/channels/e2e/cypress/tests/integration/enterprise/guest_accounts/guest_popover_ui_spec.ts +++ b/e2e/cypress/tests/integration/channels/enterprise/guest_accounts/guest_popover_ui_spec.ts @@ -7,13 +7,13 @@ // - Use element ID when selecting an element. Create one if none. // *************************************************************** -// Group: @enterprise @guest_account +// Group: @channels @enterprise @guest_account /** * Note: This test requires Enterprise license to be uploaded */ -import * as TIMEOUTS from '../../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../../fixtures/timeouts'; describe('Guest Account - Guest User Badge and Popover', () => { let regularUser: Cypress.UserProfile; diff --git a/webapp/channels/e2e/cypress/tests/integration/enterprise/guest_accounts/guest_removal_ui_spec.ts b/e2e/cypress/tests/integration/channels/enterprise/guest_accounts/guest_removal_ui_spec.ts similarity index 97% rename from webapp/channels/e2e/cypress/tests/integration/enterprise/guest_accounts/guest_removal_ui_spec.ts rename to e2e/cypress/tests/integration/channels/enterprise/guest_accounts/guest_removal_ui_spec.ts index 715072b313..d2833eb5b6 100644 --- a/webapp/channels/e2e/cypress/tests/integration/enterprise/guest_accounts/guest_removal_ui_spec.ts +++ b/e2e/cypress/tests/integration/channels/enterprise/guest_accounts/guest_removal_ui_spec.ts @@ -8,13 +8,13 @@ // *************************************************************** // Stage: @prod -// Group: @enterprise @guest_account +// Group: @channels @enterprise @guest_account /** * Note: This test requires Enterprise license to be uploaded */ -import * as TIMEOUTS from '../../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../../fixtures/timeouts'; function removeUserFromAllChannels(verifyAlert, user) { // # Remove the Guest user from all channels of a team as a sysadmin diff --git a/webapp/channels/e2e/cypress/tests/integration/enterprise/guest_accounts/helpers.ts b/e2e/cypress/tests/integration/channels/enterprise/guest_accounts/helpers.ts similarity index 100% rename from webapp/channels/e2e/cypress/tests/integration/enterprise/guest_accounts/helpers.ts rename to e2e/cypress/tests/integration/channels/enterprise/guest_accounts/helpers.ts diff --git a/webapp/channels/e2e/cypress/tests/integration/enterprise/guest_accounts/member_invitation_ui_spec.ts b/e2e/cypress/tests/integration/channels/enterprise/guest_accounts/member_invitation_ui_spec.ts similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/enterprise/guest_accounts/member_invitation_ui_spec.ts rename to e2e/cypress/tests/integration/channels/enterprise/guest_accounts/member_invitation_ui_spec.ts index 988eb8f59b..5c21131d04 100644 --- a/webapp/channels/e2e/cypress/tests/integration/enterprise/guest_accounts/member_invitation_ui_spec.ts +++ b/e2e/cypress/tests/integration/channels/enterprise/guest_accounts/member_invitation_ui_spec.ts @@ -7,15 +7,15 @@ // - Use element ID when selecting an element. Create one if none. // *************************************************************** -// Group: @enterprise @guest_account +// Group: @channels @enterprise @guest_account /** * Note: This test requires Enterprise license to be uploaded */ -import {getRandomId, stubClipboard} from '../../../utils'; -import {getAdminAccount} from '../../../support/env'; -import * as TIMEOUTS from '../../../fixtures/timeouts'; +import {getRandomId, stubClipboard} from '../../../../utils'; +import {getAdminAccount} from '../../../../support/env'; +import * as TIMEOUTS from '../../../../fixtures/timeouts'; describe('Guest Account - Member Invitation Flow', () => { const sysadmin = getAdminAccount(); diff --git a/webapp/channels/e2e/cypress/tests/integration/enterprise/guest_accounts/system_console_guest_access_ui_spec.ts b/e2e/cypress/tests/integration/channels/enterprise/guest_accounts/system_console_guest_access_ui_spec.ts similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/enterprise/guest_accounts/system_console_guest_access_ui_spec.ts rename to e2e/cypress/tests/integration/channels/enterprise/guest_accounts/system_console_guest_access_ui_spec.ts index 3cdccd0d7d..6445bb4f0e 100644 --- a/webapp/channels/e2e/cypress/tests/integration/enterprise/guest_accounts/system_console_guest_access_ui_spec.ts +++ b/e2e/cypress/tests/integration/channels/enterprise/guest_accounts/system_console_guest_access_ui_spec.ts @@ -8,13 +8,13 @@ // *************************************************************** // Stage: @prod -// Group: @enterprise @guest_account @mfa +// Group: @channels @enterprise @guest_account @mfa /** * Note: This test requires Enterprise license to be uploaded */ -import * as TIMEOUTS from '../../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../../fixtures/timeouts'; describe('Guest Account - Verify Guest Access UI', () => { beforeEach(() => { diff --git a/webapp/channels/e2e/cypress/tests/integration/enterprise/guest_accounts/system_console_manage_guest_not_cloud_spec.ts b/e2e/cypress/tests/integration/channels/enterprise/guest_accounts/system_console_manage_guest_not_cloud_spec.ts similarity index 97% rename from webapp/channels/e2e/cypress/tests/integration/enterprise/guest_accounts/system_console_manage_guest_not_cloud_spec.ts rename to e2e/cypress/tests/integration/channels/enterprise/guest_accounts/system_console_manage_guest_not_cloud_spec.ts index 8b94cd49d2..efa179f7b8 100644 --- a/webapp/channels/e2e/cypress/tests/integration/enterprise/guest_accounts/system_console_manage_guest_not_cloud_spec.ts +++ b/e2e/cypress/tests/integration/channels/enterprise/guest_accounts/system_console_manage_guest_not_cloud_spec.ts @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @enterprise @guest_account @not_cloud +// Group: @channels @enterprise @guest_account @not_cloud -import * as TIMEOUTS from '../../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../../fixtures/timeouts'; import {verifyGuest} from './helpers'; diff --git a/webapp/channels/e2e/cypress/tests/integration/enterprise/guest_accounts/system_console_manage_guest_spec.ts b/e2e/cypress/tests/integration/channels/enterprise/guest_accounts/system_console_manage_guest_spec.ts similarity index 96% rename from webapp/channels/e2e/cypress/tests/integration/enterprise/guest_accounts/system_console_manage_guest_spec.ts rename to e2e/cypress/tests/integration/channels/enterprise/guest_accounts/system_console_manage_guest_spec.ts index 4a1361e0d7..0e6e7c8aa5 100644 --- a/webapp/channels/e2e/cypress/tests/integration/enterprise/guest_accounts/system_console_manage_guest_spec.ts +++ b/e2e/cypress/tests/integration/channels/enterprise/guest_accounts/system_console_manage_guest_spec.ts @@ -8,15 +8,15 @@ // *************************************************************** // Stage: @prod -// Group: @enterprise @guest_account +// Group: @channels @enterprise @guest_account /** * Note: This test requires Enterprise license to be uploaded */ -import * as TIMEOUTS from '../../../fixtures/timeouts'; -import {getRandomId} from '../../../utils'; -import {getAdminAccount} from '../../../support/env'; +import * as TIMEOUTS from '../../../../fixtures/timeouts'; +import {getRandomId} from '../../../../utils'; +import {getAdminAccount} from '../../../../support/env'; import {verifyGuest} from './helpers'; diff --git a/webapp/channels/e2e/cypress/tests/integration/enterprise/integrations/incoming_webhook_spec.js b/e2e/cypress/tests/integration/channels/enterprise/integrations/incoming_webhook_spec.js similarity index 94% rename from webapp/channels/e2e/cypress/tests/integration/enterprise/integrations/incoming_webhook_spec.js rename to e2e/cypress/tests/integration/channels/enterprise/integrations/incoming_webhook_spec.js index 00460e8e35..53e846991c 100644 --- a/webapp/channels/e2e/cypress/tests/integration/enterprise/integrations/incoming_webhook_spec.js +++ b/e2e/cypress/tests/integration/channels/enterprise/integrations/incoming_webhook_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @enterprise @elasticsearch @incoming_webhook @not_cloud +// Group: @channels @enterprise @elasticsearch @incoming_webhook @not_cloud -import * as TIMEOUTS from '../../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../../fixtures/timeouts'; import { enableElasticSearch, } from '../elasticsearch_autocomplete/helpers'; diff --git a/webapp/channels/e2e/cypress/tests/integration/enterprise/ldap/ldap_group_sync_spec.js b/e2e/cypress/tests/integration/channels/enterprise/ldap/ldap_group_sync_spec.js similarity index 99% rename from webapp/channels/e2e/cypress/tests/integration/enterprise/ldap/ldap_group_sync_spec.js rename to e2e/cypress/tests/integration/channels/enterprise/ldap/ldap_group_sync_spec.js index 0c086a80cb..75264a2aea 100644 --- a/webapp/channels/e2e/cypress/tests/integration/enterprise/ldap/ldap_group_sync_spec.js +++ b/e2e/cypress/tests/integration/channels/enterprise/ldap/ldap_group_sync_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @enterprise @ldap +// Group: @channels @enterprise @ldap -import * as TIMEOUTS from '../../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../../fixtures/timeouts'; function setLDAPTestSettings(config) { return { diff --git a/webapp/channels/e2e/cypress/tests/integration/enterprise/ldap/ldap_guest_spec.js b/e2e/cypress/tests/integration/channels/enterprise/ldap/ldap_guest_spec.js similarity index 97% rename from webapp/channels/e2e/cypress/tests/integration/enterprise/ldap/ldap_guest_spec.js rename to e2e/cypress/tests/integration/channels/enterprise/ldap/ldap_guest_spec.js index 05dffd22c8..fda7dca517 100644 --- a/webapp/channels/e2e/cypress/tests/integration/enterprise/ldap/ldap_guest_spec.js +++ b/e2e/cypress/tests/integration/channels/enterprise/ldap/ldap_guest_spec.js @@ -8,12 +8,12 @@ // *************************************************************** // Stage: @prod -// Group: @enterprise @ldap +// Group: @channels @enterprise @ldap -import ldapUsers from '../../../fixtures/ldap_users.json'; -import * as TIMEOUTS from '../../../fixtures/timeouts'; -import {getAdminAccount} from '../../../support/env'; -import {getRandomId} from '../../../utils'; +import ldapUsers from '../../../../fixtures/ldap_users.json'; +import * as TIMEOUTS from '../../../../fixtures/timeouts'; +import {getAdminAccount} from '../../../../support/env'; +import {getRandomId} from '../../../../utils'; // assumes that E20 license is uploaded // for setup with AWS: Follow the instructions mentioned in the mattermost/platform-private/config/ldap-test-setup.txt file diff --git a/webapp/channels/e2e/cypress/tests/integration/enterprise/ldap/ldap_login_spec.js b/e2e/cypress/tests/integration/channels/enterprise/ldap/ldap_login_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/enterprise/ldap/ldap_login_spec.js rename to e2e/cypress/tests/integration/channels/enterprise/ldap/ldap_login_spec.js index 236f360c9c..791c16c0b7 100644 --- a/webapp/channels/e2e/cypress/tests/integration/enterprise/ldap/ldap_login_spec.js +++ b/e2e/cypress/tests/integration/channels/enterprise/ldap/ldap_login_spec.js @@ -8,10 +8,10 @@ // *************************************************************** // Stage: @prod -// Group: @enterprise @ldap +// Group: @channels @enterprise @ldap -import ldapUsers from '../../../fixtures/ldap_users.json'; -import {getRandomId} from '../../../utils'; +import ldapUsers from '../../../../fixtures/ldap_users.json'; +import {getRandomId} from '../../../../utils'; // assumes the CYPRESS_* variables are set // assumes that E20 license is uploaded diff --git a/webapp/channels/e2e/cypress/tests/integration/enterprise/ldap/ldap_setting_spec.js b/e2e/cypress/tests/integration/channels/enterprise/ldap/ldap_setting_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/enterprise/ldap/ldap_setting_spec.js rename to e2e/cypress/tests/integration/channels/enterprise/ldap/ldap_setting_spec.js index 3dbe969732..72eefcd28c 100644 --- a/webapp/channels/e2e/cypress/tests/integration/enterprise/ldap/ldap_setting_spec.js +++ b/e2e/cypress/tests/integration/channels/enterprise/ldap/ldap_setting_spec.js @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @enterprise @ldap +// Group: @channels @enterprise @ldap // assumes the CYPRESS_* variables are set // assumes that E20 license is uploaded diff --git a/webapp/channels/e2e/cypress/tests/integration/enterprise/ldap_group/channel_modes_spec.ts b/e2e/cypress/tests/integration/channels/enterprise/ldap_group/channel_modes_spec.ts similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/enterprise/ldap_group/channel_modes_spec.ts rename to e2e/cypress/tests/integration/channels/enterprise/ldap_group/channel_modes_spec.ts index f27fda790e..2b89402eb2 100644 --- a/webapp/channels/e2e/cypress/tests/integration/enterprise/ldap_group/channel_modes_spec.ts +++ b/e2e/cypress/tests/integration/channels/enterprise/ldap_group/channel_modes_spec.ts @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @enterprise @ldap_group +// Group: @channels @enterprise @ldap_group describe('LDAP Group Sync - Test channel public/private toggle', () => { let testTeam; diff --git a/webapp/channels/e2e/cypress/tests/integration/enterprise/ldap_group/group_mentions_spec.ts b/e2e/cypress/tests/integration/channels/enterprise/ldap_group/group_mentions_spec.ts similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/enterprise/ldap_group/group_mentions_spec.ts rename to e2e/cypress/tests/integration/channels/enterprise/ldap_group/group_mentions_spec.ts index 309803fc2a..08ec49d23e 100644 --- a/webapp/channels/e2e/cypress/tests/integration/enterprise/ldap_group/group_mentions_spec.ts +++ b/e2e/cypress/tests/integration/channels/enterprise/ldap_group/group_mentions_spec.ts @@ -7,10 +7,10 @@ // - Use element ID when selecting an element. Create one if none. // *************************************************************** -// Group: @enterprise @ldap_group +// Group: @channels @enterprise @ldap_group -import * as TIMEOUTS from '../../../fixtures/timeouts'; -import users from '../../../fixtures/ldap_users.json'; +import * as TIMEOUTS from '../../../../fixtures/timeouts'; +import users from '../../../../fixtures/ldap_users.json'; let groupID; let boardUser; diff --git a/webapp/channels/e2e/cypress/tests/integration/enterprise/ldap_group/groups_assign_roles_spec.ts b/e2e/cypress/tests/integration/channels/enterprise/ldap_group/groups_assign_roles_spec.ts similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/enterprise/ldap_group/groups_assign_roles_spec.ts rename to e2e/cypress/tests/integration/channels/enterprise/ldap_group/groups_assign_roles_spec.ts index 249ef58ffe..56b517ce86 100644 --- a/webapp/channels/e2e/cypress/tests/integration/enterprise/ldap_group/groups_assign_roles_spec.ts +++ b/e2e/cypress/tests/integration/channels/enterprise/ldap_group/groups_assign_roles_spec.ts @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @enterprise @ldap_group +// Group: @channels @enterprise @ldap_group -import * as TIMEOUTS from '../../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../../fixtures/timeouts'; // # Function to get all the teams associated to group and unlink them const getTeamsAssociatedToGroupAndUnlink = (groupId) => { diff --git a/webapp/channels/e2e/cypress/tests/integration/enterprise/ldap_group/invite_bot_spec.ts b/e2e/cypress/tests/integration/channels/enterprise/ldap_group/invite_bot_spec.ts similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/enterprise/ldap_group/invite_bot_spec.ts rename to e2e/cypress/tests/integration/channels/enterprise/ldap_group/invite_bot_spec.ts index 763539c3e3..ab11433cfd 100644 --- a/webapp/channels/e2e/cypress/tests/integration/enterprise/ldap_group/invite_bot_spec.ts +++ b/e2e/cypress/tests/integration/channels/enterprise/ldap_group/invite_bot_spec.ts @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @enterprise @ldap_group +// Group: @channels @enterprise @ldap_group describe('Group Synced Team - Bot invitation flow', () => { let groupConstrainedTeam; diff --git a/webapp/channels/e2e/cypress/tests/integration/enterprise/ldap_group/search_channels_spec.ts b/e2e/cypress/tests/integration/channels/enterprise/ldap_group/search_channels_spec.ts similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/enterprise/ldap_group/search_channels_spec.ts rename to e2e/cypress/tests/integration/channels/enterprise/ldap_group/search_channels_spec.ts index 3ede76f414..c5efb54b18 100644 --- a/webapp/channels/e2e/cypress/tests/integration/enterprise/ldap_group/search_channels_spec.ts +++ b/e2e/cypress/tests/integration/channels/enterprise/ldap_group/search_channels_spec.ts @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @enterprise @ldap_group +// Group: @channels @enterprise @ldap_group -import {getRandomId} from '../../../utils'; +import {getRandomId} from '../../../../utils'; describe('Search channels', () => { const PAGE_SIZE = 10; diff --git a/webapp/channels/e2e/cypress/tests/integration/enterprise/ldap_group/team_and_channel_assign_roles_spec.ts b/e2e/cypress/tests/integration/channels/enterprise/ldap_group/team_and_channel_assign_roles_spec.ts similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/enterprise/ldap_group/team_and_channel_assign_roles_spec.ts rename to e2e/cypress/tests/integration/channels/enterprise/ldap_group/team_and_channel_assign_roles_spec.ts index 09392e2427..a52819e232 100644 --- a/webapp/channels/e2e/cypress/tests/integration/enterprise/ldap_group/team_and_channel_assign_roles_spec.ts +++ b/e2e/cypress/tests/integration/channels/enterprise/ldap_group/team_and_channel_assign_roles_spec.ts @@ -7,9 +7,9 @@ // - Use element ID when selecting an element. Create one if none. // *************************************************************** -// Group: @enterprise @ldap_group +// Group: @channels @enterprise @ldap_group -import * as TIMEOUTS from '../../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../../fixtures/timeouts'; // # Save setting and get back to the resource page const saveAndNavigateBackTo = (name, displayName, page) => { diff --git a/webapp/channels/e2e/cypress/tests/integration/enterprise/oauth/oauth_spec.ts b/e2e/cypress/tests/integration/channels/enterprise/oauth/oauth_spec.ts similarity index 99% rename from webapp/channels/e2e/cypress/tests/integration/enterprise/oauth/oauth_spec.ts rename to e2e/cypress/tests/integration/channels/enterprise/oauth/oauth_spec.ts index efb03eab46..3ea722512b 100644 --- a/webapp/channels/e2e/cypress/tests/integration/enterprise/oauth/oauth_spec.ts +++ b/e2e/cypress/tests/integration/channels/enterprise/oauth/oauth_spec.ts @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @enterprise @integrations +// Group: @channels @enterprise @integrations -import {getRandomId} from '../../../utils'; +import {getRandomId} from '../../../../utils'; import {checkboxesTitleToIdMap} from '../system_console/channel_moderation/constants'; import {enablePermission, goToSystemScheme, saveConfigForScheme} from '../system_console/channel_moderation/helpers'; diff --git a/webapp/channels/e2e/cypress/tests/integration/enterprise/permissions/team_permissions_spec.ts b/e2e/cypress/tests/integration/channels/enterprise/permissions/team_permissions_spec.ts similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/enterprise/permissions/team_permissions_spec.ts rename to e2e/cypress/tests/integration/channels/enterprise/permissions/team_permissions_spec.ts index fd63e95247..98cb658c67 100644 --- a/webapp/channels/e2e/cypress/tests/integration/enterprise/permissions/team_permissions_spec.ts +++ b/e2e/cypress/tests/integration/channels/enterprise/permissions/team_permissions_spec.ts @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @enterprise @permissions +// Group: @channels @enterprise @permissions -import * as TIMEOUTS from '../../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../../fixtures/timeouts'; const deleteExistingTeamOverrideSchemes = () => { cy.apiGetSchemes('team').then(({schemes}) => { diff --git a/webapp/channels/e2e/cypress/tests/integration/enterprise/profile_popover/profile_popover_spec.ts b/e2e/cypress/tests/integration/channels/enterprise/profile_popover/profile_popover_spec.ts similarity index 99% rename from webapp/channels/e2e/cypress/tests/integration/enterprise/profile_popover/profile_popover_spec.ts rename to e2e/cypress/tests/integration/channels/enterprise/profile_popover/profile_popover_spec.ts index 8870102bfe..50c2cbd69b 100644 --- a/webapp/channels/e2e/cypress/tests/integration/enterprise/profile_popover/profile_popover_spec.ts +++ b/e2e/cypress/tests/integration/channels/enterprise/profile_popover/profile_popover_spec.ts @@ -8,11 +8,11 @@ // *************************************************************** // Stage: @prod -// Group: @enterprise @profile_popover +// Group: @channels @enterprise @profile_popover -import * as TIMEOUTS from '../../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../../fixtures/timeouts'; import {createPrivateChannel} from '../elasticsearch_autocomplete/helpers'; -import {getAdminAccount} from '../../../support/env'; +import {getAdminAccount} from '../../../../support/env'; describe('Profile popover', () => { let testTeam: Cypress.Team; diff --git a/webapp/channels/e2e/cypress/tests/integration/enterprise/profile_popover/profile_popover_spec_user_a_b_spec.ts b/e2e/cypress/tests/integration/channels/enterprise/profile_popover/profile_popover_spec_user_a_b_spec.ts similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/enterprise/profile_popover/profile_popover_spec_user_a_b_spec.ts rename to e2e/cypress/tests/integration/channels/enterprise/profile_popover/profile_popover_spec_user_a_b_spec.ts index 5065702a6a..949f20b5f1 100644 --- a/webapp/channels/e2e/cypress/tests/integration/enterprise/profile_popover/profile_popover_spec_user_a_b_spec.ts +++ b/e2e/cypress/tests/integration/channels/enterprise/profile_popover/profile_popover_spec_user_a_b_spec.ts @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @enterprise @profile_popover +// Group: @channels @enterprise @profile_popover describe('Profile popover User A & B', () => { let testTeam: Cypress.Team; diff --git a/webapp/channels/e2e/cypress/tests/integration/enterprise/saml/okta_login_spec.js b/e2e/cypress/tests/integration/channels/enterprise/saml/okta_login_spec.js similarity index 99% rename from webapp/channels/e2e/cypress/tests/integration/enterprise/saml/okta_login_spec.js rename to e2e/cypress/tests/integration/channels/enterprise/saml/okta_login_spec.js index 89867a0b64..98c1887d53 100644 --- a/webapp/channels/e2e/cypress/tests/integration/enterprise/saml/okta_login_spec.js +++ b/e2e/cypress/tests/integration/channels/enterprise/saml/okta_login_spec.js @@ -8,10 +8,10 @@ // *************************************************************** // Stage: @prod -// Group: @enterprise @saml +// Group: @channels @enterprise @saml // Skip: @headless @electron @firefox // run on Chrome (headed) only -import users from '../../../fixtures/saml_users.json'; +import users from '../../../../fixtures/saml_users.json'; //Manual Setup required: Follow the instructions mentioned in the mattermost/platform-private/config/saml-okta-setup.txt file context('Okta', () => { diff --git a/webapp/channels/e2e/cypress/tests/integration/enterprise/saml/saml_automated_spec.js b/e2e/cypress/tests/integration/channels/enterprise/saml/saml_automated_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/enterprise/saml/saml_automated_spec.js rename to e2e/cypress/tests/integration/channels/enterprise/saml/saml_automated_spec.js index 45d9a6feb1..27924c07a1 100644 --- a/webapp/channels/e2e/cypress/tests/integration/enterprise/saml/saml_automated_spec.js +++ b/e2e/cypress/tests/integration/channels/enterprise/saml/saml_automated_spec.js @@ -8,10 +8,10 @@ // *************************************************************** // Stage: @prod -// Group: @enterprise @saml +// Group: @channels @enterprise @saml // Skip: @headless @electron @firefox // run on Chrome (headed) only -import users from '../../../fixtures/saml_users.json'; +import users from '../../../../fixtures/saml_users.json'; //Manual Setup required: Follow the instructions mentioned in the mattermost/platform-private/config/saml-okta-setup.txt file context('LDAP SAML - Automated Tests (SAML TESTS)', () => { diff --git a/webapp/channels/e2e/cypress/tests/integration/enterprise/saml/saml_guest_member_spec.js b/e2e/cypress/tests/integration/channels/enterprise/saml/saml_guest_member_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/enterprise/saml/saml_guest_member_spec.js rename to e2e/cypress/tests/integration/channels/enterprise/saml/saml_guest_member_spec.js index 26e35403ed..05aaf967c1 100644 --- a/webapp/channels/e2e/cypress/tests/integration/enterprise/saml/saml_guest_member_spec.js +++ b/e2e/cypress/tests/integration/channels/enterprise/saml/saml_guest_member_spec.js @@ -7,10 +7,10 @@ // - Use element ID when selecting an element. Create one if none. // *************************************************************** -// Group: @enterprise @saml +// Group: @channels @enterprise @saml -import * as TIMEOUTS from '../../../fixtures/timeouts'; -import {getRandomId} from '../../../utils'; +import * as TIMEOUTS from '../../../../fixtures/timeouts'; +import {getRandomId} from '../../../../utils'; // assumes that E20 license is uploaded // Update config.mk to make sure docker images for openldap and keycloak diff --git a/webapp/channels/e2e/cypress/tests/integration/enterprise/saml/saml_metadata_spec.js b/e2e/cypress/tests/integration/channels/enterprise/saml/saml_metadata_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/enterprise/saml/saml_metadata_spec.js rename to e2e/cypress/tests/integration/channels/enterprise/saml/saml_metadata_spec.js index 0b1f1c9575..e0053d5309 100644 --- a/webapp/channels/e2e/cypress/tests/integration/enterprise/saml/saml_metadata_spec.js +++ b/e2e/cypress/tests/integration/channels/enterprise/saml/saml_metadata_spec.js @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @enterprise @saml +// Group: @channels @enterprise @saml /** * Note: This test requires Enterprise license to be uploaded diff --git a/webapp/channels/e2e/cypress/tests/integration/enterprise/self-hosted/self_hosted_pricing_modal_spec.ts b/e2e/cypress/tests/integration/channels/enterprise/self-hosted/self_hosted_pricing_modal_spec.ts similarity index 99% rename from webapp/channels/e2e/cypress/tests/integration/enterprise/self-hosted/self_hosted_pricing_modal_spec.ts rename to e2e/cypress/tests/integration/channels/enterprise/self-hosted/self_hosted_pricing_modal_spec.ts index 7efaef528d..37196627a9 100644 --- a/webapp/channels/e2e/cypress/tests/integration/enterprise/self-hosted/self_hosted_pricing_modal_spec.ts +++ b/e2e/cypress/tests/integration/channels/enterprise/self-hosted/self_hosted_pricing_modal_spec.ts @@ -7,7 +7,7 @@ // - Use element ID when selecting an element. Create one if none. // *************************************************************** -// Group: @enterprise @not_cloud +// Group: @channels @enterprise @not_cloud function withTrialBefore(trialed: string) { cy.intercept('GET', '**/api/v4/trial-license/prev', { diff --git a/webapp/channels/e2e/cypress/tests/integration/enterprise/self-hosted/self_hosted_purchase_spec.ts b/e2e/cypress/tests/integration/channels/enterprise/self-hosted/self_hosted_purchase_spec.ts similarity index 99% rename from webapp/channels/e2e/cypress/tests/integration/enterprise/self-hosted/self_hosted_purchase_spec.ts rename to e2e/cypress/tests/integration/channels/enterprise/self-hosted/self_hosted_purchase_spec.ts index 2c37295d6e..a21f5994b1 100644 --- a/webapp/channels/e2e/cypress/tests/integration/enterprise/self-hosted/self_hosted_purchase_spec.ts +++ b/e2e/cypress/tests/integration/channels/enterprise/self-hosted/self_hosted_purchase_spec.ts @@ -10,7 +10,7 @@ // e.g. not_cloud cloud because we always want to exclude running automatically // until we create the special self-hosted run setup // Stage: @dev -// Group: @enterprise @not_cloud @cloud @hosted_customer +// Group: @channels @enterprise @not_cloud @cloud @hosted_customer // To run this locally, the necessary test setup is: // * Ensure on latest mattermost-webapp, mattermost-server, enterprise @@ -20,7 +20,7 @@ // * Change mattermost-server utils/license.go to test public key // * e.g. see (https://github.com/mattermost/mattermost-server/pull/16778/files) -import * as TIMEOUTS from '../../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../../fixtures/timeouts'; function verifyPurchaseModal() { cy.contains('Provide your payment details'); diff --git a/webapp/channels/e2e/cypress/tests/integration/enterprise/system_console/about/edition_and_license_spec.js b/e2e/cypress/tests/integration/channels/enterprise/system_console/about/edition_and_license_spec.js similarity index 96% rename from webapp/channels/e2e/cypress/tests/integration/enterprise/system_console/about/edition_and_license_spec.js rename to e2e/cypress/tests/integration/channels/enterprise/system_console/about/edition_and_license_spec.js index 87f11f2e0b..27508d7a1d 100644 --- a/webapp/channels/e2e/cypress/tests/integration/enterprise/system_console/about/edition_and_license_spec.js +++ b/e2e/cypress/tests/integration/channels/enterprise/system_console/about/edition_and_license_spec.js @@ -8,10 +8,10 @@ // *************************************************************** // Stage: @prod -// Group: @enterprise @not_cloud @system_console @license_removal +// Group: @channels @enterprise @not_cloud @system_console @license_removal -import * as TIMEOUTS from '../../../../fixtures/timeouts'; -import {getAdminAccount} from '../../../../support/env'; +import * as TIMEOUTS from '../../../../../fixtures/timeouts'; +import {getAdminAccount} from '../../../../../support/env'; import {promoteToChannelOrTeamAdmin} from '../channel_moderation/helpers.js'; diff --git a/webapp/channels/e2e/cypress/tests/integration/enterprise/system_console/about/starter_edition_spec.js b/e2e/cypress/tests/integration/channels/enterprise/system_console/about/starter_edition_spec.js similarity index 93% rename from webapp/channels/e2e/cypress/tests/integration/enterprise/system_console/about/starter_edition_spec.js rename to e2e/cypress/tests/integration/channels/enterprise/system_console/about/starter_edition_spec.js index 8314596f32..c63f4aeb62 100644 --- a/webapp/channels/e2e/cypress/tests/integration/enterprise/system_console/about/starter_edition_spec.js +++ b/e2e/cypress/tests/integration/channels/enterprise/system_console/about/starter_edition_spec.js @@ -7,7 +7,7 @@ // - Use element ID when selecting an element. Create one if none. // *************************************************************** -// Group: @enterprise @not_cloud @system_console @license_removal +// Group: @channels @enterprise @not_cloud @system_console @license_removal describe('System console', () => { before(() => { diff --git a/webapp/channels/e2e/cypress/tests/integration/enterprise/system_console/archived_channels_spec.js b/e2e/cypress/tests/integration/channels/enterprise/system_console/archived_channels_spec.js similarity index 96% rename from webapp/channels/e2e/cypress/tests/integration/enterprise/system_console/archived_channels_spec.js rename to e2e/cypress/tests/integration/channels/enterprise/system_console/archived_channels_spec.js index 47257fdc2f..dae3f3c0e2 100644 --- a/webapp/channels/e2e/cypress/tests/integration/enterprise/system_console/archived_channels_spec.js +++ b/e2e/cypress/tests/integration/channels/enterprise/system_console/archived_channels_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @enterprise @system_console +// Group: @channels @enterprise @system_console -import * as TIMEOUTS from '../../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../../fixtures/timeouts'; describe('Archived channels', () => { let testChannel; diff --git a/webapp/channels/e2e/cypress/tests/integration/enterprise/system_console/authentication_method_spec.js b/e2e/cypress/tests/integration/channels/enterprise/system_console/authentication_method_spec.js similarity index 94% rename from webapp/channels/e2e/cypress/tests/integration/enterprise/system_console/authentication_method_spec.js rename to e2e/cypress/tests/integration/channels/enterprise/system_console/authentication_method_spec.js index c5077acd5b..c7ffc105d7 100644 --- a/webapp/channels/e2e/cypress/tests/integration/enterprise/system_console/authentication_method_spec.js +++ b/e2e/cypress/tests/integration/channels/enterprise/system_console/authentication_method_spec.js @@ -8,11 +8,11 @@ // *************************************************************** // Stage: @prod -// Group: @enterprise @system_console @mfa +// Group: @channels @enterprise @system_console @mfa -import ldapUsers from '../../../fixtures/ldap_users.json'; -import * as TIMEOUTS from '../../../fixtures/timeouts'; -import {getAdminAccount} from '../../../support/env'; +import ldapUsers from '../../../../fixtures/ldap_users.json'; +import * as TIMEOUTS from '../../../../fixtures/timeouts'; +import {getAdminAccount} from '../../../../support/env'; const authenticator = require('authenticator'); diff --git a/webapp/channels/e2e/cypress/tests/integration/enterprise/system_console/channel_members_spec.js b/e2e/cypress/tests/integration/channels/enterprise/system_console/channel_members_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/enterprise/system_console/channel_members_spec.js rename to e2e/cypress/tests/integration/channels/enterprise/system_console/channel_members_spec.js index e107438981..7b78ec869e 100644 --- a/webapp/channels/e2e/cypress/tests/integration/enterprise/system_console/channel_members_spec.js +++ b/e2e/cypress/tests/integration/channels/enterprise/system_console/channel_members_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @enterprise +// Group: @channels @enterprise -import * as TIMEOUTS from '../../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../../fixtures/timeouts'; describe('Channel members test', () => { let testChannel; diff --git a/webapp/channels/e2e/cypress/tests/integration/enterprise/system_console/channel_moderation/channel_mentions_spec.js b/e2e/cypress/tests/integration/channels/enterprise/system_console/channel_moderation/channel_mentions_spec.js similarity index 99% rename from webapp/channels/e2e/cypress/tests/integration/enterprise/system_console/channel_moderation/channel_mentions_spec.js rename to e2e/cypress/tests/integration/channels/enterprise/system_console/channel_moderation/channel_mentions_spec.js index ad3793443c..bbecb4d567 100644 --- a/webapp/channels/e2e/cypress/tests/integration/enterprise/system_console/channel_moderation/channel_mentions_spec.js +++ b/e2e/cypress/tests/integration/channels/enterprise/system_console/channel_moderation/channel_mentions_spec.js @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @enterprise @system_console @channel_moderation +// Group: @channels @enterprise @system_console @channel_moderation import {checkboxesTitleToIdMap} from './constants'; diff --git a/webapp/channels/e2e/cypress/tests/integration/enterprise/system_console/channel_moderation/constants.js b/e2e/cypress/tests/integration/channels/enterprise/system_console/channel_moderation/constants.js similarity index 100% rename from webapp/channels/e2e/cypress/tests/integration/enterprise/system_console/channel_moderation/constants.js rename to e2e/cypress/tests/integration/channels/enterprise/system_console/channel_moderation/constants.js diff --git a/webapp/channels/e2e/cypress/tests/integration/enterprise/system_console/channel_moderation/create_posts_spec.js b/e2e/cypress/tests/integration/channels/enterprise/system_console/channel_moderation/create_posts_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/enterprise/system_console/channel_moderation/create_posts_spec.js rename to e2e/cypress/tests/integration/channels/enterprise/system_console/channel_moderation/create_posts_spec.js index 20de377bdb..06fcfe16b3 100644 --- a/webapp/channels/e2e/cypress/tests/integration/enterprise/system_console/channel_moderation/create_posts_spec.js +++ b/e2e/cypress/tests/integration/channels/enterprise/system_console/channel_moderation/create_posts_spec.js @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @enterprise @system_console @channel_moderation +// Group: @channels @enterprise @system_console @channel_moderation import {checkboxesTitleToIdMap} from './constants'; diff --git a/webapp/channels/e2e/cypress/tests/integration/enterprise/system_console/channel_moderation/helpers.js b/e2e/cypress/tests/integration/channels/enterprise/system_console/channel_moderation/helpers.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/enterprise/system_console/channel_moderation/helpers.js rename to e2e/cypress/tests/integration/channels/enterprise/system_console/channel_moderation/helpers.js index 2636cdd7dd..f694dda25d 100644 --- a/webapp/channels/e2e/cypress/tests/integration/enterprise/system_console/channel_moderation/helpers.js +++ b/e2e/cypress/tests/integration/channels/enterprise/system_console/channel_moderation/helpers.js @@ -1,8 +1,8 @@ // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. // See LICENSE.txt for license information. -import * as TIMEOUTS from '../../../../fixtures/timeouts'; -import {getAdminAccount} from '../../../../support/env'; +import * as TIMEOUTS from '../../../../../fixtures/timeouts'; +import {getAdminAccount} from '../../../../../support/env'; import {checkBoxes} from './constants'; diff --git a/webapp/channels/e2e/cypress/tests/integration/enterprise/system_console/channel_moderation/higher_scoped_scheme_spec.js b/e2e/cypress/tests/integration/channels/enterprise/system_console/channel_moderation/higher_scoped_scheme_spec.js similarity index 99% rename from webapp/channels/e2e/cypress/tests/integration/enterprise/system_console/channel_moderation/higher_scoped_scheme_spec.js rename to e2e/cypress/tests/integration/channels/enterprise/system_console/channel_moderation/higher_scoped_scheme_spec.js index ad86c9cf9d..6ca9494a4c 100644 --- a/webapp/channels/e2e/cypress/tests/integration/enterprise/system_console/channel_moderation/higher_scoped_scheme_spec.js +++ b/e2e/cypress/tests/integration/channels/enterprise/system_console/channel_moderation/higher_scoped_scheme_spec.js @@ -7,9 +7,9 @@ // - Use element ID when selecting an element. Create one if none. // *************************************************************** -// Group: @enterprise @system_console @channel_moderation +// Group: @channels @enterprise @system_console @channel_moderation -import {getRandomId} from '../../../../utils'; +import {getRandomId} from '../../../../../utils'; import {checkboxesTitleToIdMap} from './constants'; diff --git a/webapp/channels/e2e/cypress/tests/integration/enterprise/system_console/channel_moderation/manage_members_spec.js b/e2e/cypress/tests/integration/channels/enterprise/system_console/channel_moderation/manage_members_spec.js similarity index 97% rename from webapp/channels/e2e/cypress/tests/integration/enterprise/system_console/channel_moderation/manage_members_spec.js rename to e2e/cypress/tests/integration/channels/enterprise/system_console/channel_moderation/manage_members_spec.js index 41fe7057ca..209ea46ca7 100644 --- a/webapp/channels/e2e/cypress/tests/integration/enterprise/system_console/channel_moderation/manage_members_spec.js +++ b/e2e/cypress/tests/integration/channels/enterprise/system_console/channel_moderation/manage_members_spec.js @@ -8,10 +8,10 @@ // *************************************************************** // Stage: @prod -// Group: @enterprise @system_console @channel_moderation +// Group: @channels @enterprise @system_console @channel_moderation -import * as TIMEOUTS from '../../../../fixtures/timeouts'; -import {getRandomId} from '../../../../utils'; +import * as TIMEOUTS from '../../../../../fixtures/timeouts'; +import {getRandomId} from '../../../../../utils'; import {checkboxesTitleToIdMap} from './constants'; diff --git a/webapp/channels/e2e/cypress/tests/integration/enterprise/system_console/channel_moderation/post_reactions_spec.js b/e2e/cypress/tests/integration/channels/enterprise/system_console/channel_moderation/post_reactions_spec.js similarity index 97% rename from webapp/channels/e2e/cypress/tests/integration/enterprise/system_console/channel_moderation/post_reactions_spec.js rename to e2e/cypress/tests/integration/channels/enterprise/system_console/channel_moderation/post_reactions_spec.js index 44af14c614..bf849ab1c9 100644 --- a/webapp/channels/e2e/cypress/tests/integration/enterprise/system_console/channel_moderation/post_reactions_spec.js +++ b/e2e/cypress/tests/integration/channels/enterprise/system_console/channel_moderation/post_reactions_spec.js @@ -7,11 +7,11 @@ // - Use element ID when selecting an element. Create one if none. // *************************************************************** -// Group: @enterprise @system_console @channel_moderation +// Group: @channels @enterprise @system_console @channel_moderation -import * as TIMEOUTS from '../../../../fixtures/timeouts'; -import {getRandomId} from '../../../../utils'; -import {getAdminAccount} from '../../../../support/env'; +import * as TIMEOUTS from '../../../../../fixtures/timeouts'; +import {getRandomId} from '../../../../../utils'; +import {getAdminAccount} from '../../../../../support/env'; import {checkboxesTitleToIdMap} from './constants'; diff --git a/webapp/channels/e2e/cypress/tests/integration/enterprise/system_console/channel_moderation/system_config_spec.js b/e2e/cypress/tests/integration/channels/enterprise/system_console/channel_moderation/system_config_spec.js similarity index 96% rename from webapp/channels/e2e/cypress/tests/integration/enterprise/system_console/channel_moderation/system_config_spec.js rename to e2e/cypress/tests/integration/channels/enterprise/system_console/channel_moderation/system_config_spec.js index 91c52c6046..76b127f73f 100644 --- a/webapp/channels/e2e/cypress/tests/integration/enterprise/system_console/channel_moderation/system_config_spec.js +++ b/e2e/cypress/tests/integration/channels/enterprise/system_console/channel_moderation/system_config_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @enterprise @system_console @channel_moderation +// Group: @channels @enterprise @system_console @channel_moderation -import * as TIMEOUTS from '../../../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../../../fixtures/timeouts'; import {checkBoxes} from './constants'; diff --git a/webapp/channels/e2e/cypress/tests/integration/enterprise/system_console/cluster_spec.js b/e2e/cypress/tests/integration/channels/enterprise/system_console/cluster_spec.js similarity index 97% rename from webapp/channels/e2e/cypress/tests/integration/enterprise/system_console/cluster_spec.js rename to e2e/cypress/tests/integration/channels/enterprise/system_console/cluster_spec.js index 28e8b9eb07..c61f3dfe3d 100644 --- a/webapp/channels/e2e/cypress/tests/integration/enterprise/system_console/cluster_spec.js +++ b/e2e/cypress/tests/integration/channels/enterprise/system_console/cluster_spec.js @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @enterprise @system_console @high_availability @not_cloud +// Group: @channels @enterprise @system_console @high_availability @not_cloud describe('Cluster', () => { before(() => { diff --git a/webapp/channels/e2e/cypress/tests/integration/enterprise/system_console/compliance/compliance_export_multiple_post_spec.js b/e2e/cypress/tests/integration/channels/enterprise/system_console/compliance/compliance_export_multiple_post_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/enterprise/system_console/compliance/compliance_export_multiple_post_spec.js rename to e2e/cypress/tests/integration/channels/enterprise/system_console/compliance/compliance_export_multiple_post_spec.js index b288293648..375e9d1b33 100644 --- a/webapp/channels/e2e/cypress/tests/integration/enterprise/system_console/compliance/compliance_export_multiple_post_spec.js +++ b/e2e/cypress/tests/integration/channels/enterprise/system_console/compliance/compliance_export_multiple_post_spec.js @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @enterprise @system_console @compliance_export +// Group: @channels @enterprise @system_console @compliance_export import {verifyExportedMessagesCount, editLastPost} from './helpers'; diff --git a/webapp/channels/e2e/cypress/tests/integration/enterprise/system_console/compliance/compliance_export_ui_spec.js b/e2e/cypress/tests/integration/channels/enterprise/system_console/compliance/compliance_export_ui_spec.js similarity index 97% rename from webapp/channels/e2e/cypress/tests/integration/enterprise/system_console/compliance/compliance_export_ui_spec.js rename to e2e/cypress/tests/integration/channels/enterprise/system_console/compliance/compliance_export_ui_spec.js index a564f6d989..d8e69a77fb 100644 --- a/webapp/channels/e2e/cypress/tests/integration/enterprise/system_console/compliance/compliance_export_ui_spec.js +++ b/e2e/cypress/tests/integration/channels/enterprise/system_console/compliance/compliance_export_ui_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @enterprise @system_console @compliance_export +// Group: @channels @enterprise @system_console @compliance_export -import * as TIMEOUTS from '../../../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../../../fixtures/timeouts'; import {verifyExportedMessagesCount, gotoTeamAndPostImage} from './helpers'; diff --git a/webapp/channels/e2e/cypress/tests/integration/enterprise/system_console/compliance/data_retention_policies_2_spec.js b/e2e/cypress/tests/integration/channels/enterprise/system_console/compliance/data_retention_policies_2_spec.js similarity index 99% rename from webapp/channels/e2e/cypress/tests/integration/enterprise/system_console/compliance/data_retention_policies_2_spec.js rename to e2e/cypress/tests/integration/channels/enterprise/system_console/compliance/data_retention_policies_2_spec.js index 3ed9474bd3..d3b2c7cc94 100644 --- a/webapp/channels/e2e/cypress/tests/integration/enterprise/system_console/compliance/data_retention_policies_2_spec.js +++ b/e2e/cypress/tests/integration/channels/enterprise/system_console/compliance/data_retention_policies_2_spec.js @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @enterprise @system_console +// Group: @channels @enterprise @system_console import { gotoGlobalPolicy, diff --git a/webapp/channels/e2e/cypress/tests/integration/enterprise/system_console/compliance/data_retention_policies_3_spec.js b/e2e/cypress/tests/integration/channels/enterprise/system_console/compliance/data_retention_policies_3_spec.js similarity index 99% rename from webapp/channels/e2e/cypress/tests/integration/enterprise/system_console/compliance/data_retention_policies_3_spec.js rename to e2e/cypress/tests/integration/channels/enterprise/system_console/compliance/data_retention_policies_3_spec.js index 063ee0eab6..a64b493c66 100644 --- a/webapp/channels/e2e/cypress/tests/integration/enterprise/system_console/compliance/data_retention_policies_3_spec.js +++ b/e2e/cypress/tests/integration/channels/enterprise/system_console/compliance/data_retention_policies_3_spec.js @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @enterprise @system_console +// Group: @channels @enterprise @system_console import { runDataRetentionAndVerifyPostDeleted, diff --git a/webapp/channels/e2e/cypress/tests/integration/enterprise/system_console/compliance/data_retention_policies_4_spec.js b/e2e/cypress/tests/integration/channels/enterprise/system_console/compliance/data_retention_policies_4_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/enterprise/system_console/compliance/data_retention_policies_4_spec.js rename to e2e/cypress/tests/integration/channels/enterprise/system_console/compliance/data_retention_policies_4_spec.js index 2619e9e761..970318afa4 100644 --- a/webapp/channels/e2e/cypress/tests/integration/enterprise/system_console/compliance/data_retention_policies_4_spec.js +++ b/e2e/cypress/tests/integration/channels/enterprise/system_console/compliance/data_retention_policies_4_spec.js @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @enterprise @system_console +// Group: @channels @enterprise @system_console import { runDataRetentionAndVerifyPostDeleted, diff --git a/webapp/channels/e2e/cypress/tests/integration/enterprise/system_console/compliance/data_retention_policies_spec.js b/e2e/cypress/tests/integration/channels/enterprise/system_console/compliance/data_retention_policies_spec.js similarity index 99% rename from webapp/channels/e2e/cypress/tests/integration/enterprise/system_console/compliance/data_retention_policies_spec.js rename to e2e/cypress/tests/integration/channels/enterprise/system_console/compliance/data_retention_policies_spec.js index 5ef56f650b..fbb1dbcfd4 100644 --- a/webapp/channels/e2e/cypress/tests/integration/enterprise/system_console/compliance/data_retention_policies_spec.js +++ b/e2e/cypress/tests/integration/channels/enterprise/system_console/compliance/data_retention_policies_spec.js @@ -7,9 +7,9 @@ // - Use element ID when selecting an element. Create one if none. // *************************************************************** -// Group: @enterprise @system_console @with_feature_flag +// Group: @channels @enterprise @system_console @with_feature_flag -import * as TIMEOUTS from '../../../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../../../fixtures/timeouts'; describe('Data Retention', () => { let testTeam; diff --git a/webapp/channels/e2e/cypress/tests/integration/enterprise/system_console/compliance/download_bot_compliance_export_file_spec.js b/e2e/cypress/tests/integration/channels/enterprise/system_console/compliance/download_bot_compliance_export_file_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/enterprise/system_console/compliance/download_bot_compliance_export_file_spec.js rename to e2e/cypress/tests/integration/channels/enterprise/system_console/compliance/download_bot_compliance_export_file_spec.js index 5e75052b30..fbb2a499a2 100644 --- a/webapp/channels/e2e/cypress/tests/integration/enterprise/system_console/compliance/download_bot_compliance_export_file_spec.js +++ b/e2e/cypress/tests/integration/channels/enterprise/system_console/compliance/download_bot_compliance_export_file_spec.js @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @enterprise @system_console @compliance_export +// Group: @channels @enterprise @system_console @compliance_export import { downloadAndUnzipExportFile, diff --git a/webapp/channels/e2e/cypress/tests/integration/enterprise/system_console/compliance/download_compliance_export_file_spec.js b/e2e/cypress/tests/integration/channels/enterprise/system_console/compliance/download_compliance_export_file_spec.js similarity index 99% rename from webapp/channels/e2e/cypress/tests/integration/enterprise/system_console/compliance/download_compliance_export_file_spec.js rename to e2e/cypress/tests/integration/channels/enterprise/system_console/compliance/download_compliance_export_file_spec.js index b7aaa73368..5418ff4c74 100644 --- a/webapp/channels/e2e/cypress/tests/integration/enterprise/system_console/compliance/download_compliance_export_file_spec.js +++ b/e2e/cypress/tests/integration/channels/enterprise/system_console/compliance/download_compliance_export_file_spec.js @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @enterprise @system_console @compliance_export +// Group: @channels @enterprise @system_console @compliance_export import { downloadAndUnzipExportFile, diff --git a/webapp/channels/e2e/cypress/tests/integration/enterprise/system_console/compliance/helpers.js b/e2e/cypress/tests/integration/channels/enterprise/system_console/compliance/helpers.js similarity index 99% rename from webapp/channels/e2e/cypress/tests/integration/enterprise/system_console/compliance/helpers.js rename to e2e/cypress/tests/integration/channels/enterprise/system_console/compliance/helpers.js index 3c06739f89..b41a129352 100644 --- a/webapp/channels/e2e/cypress/tests/integration/enterprise/system_console/compliance/helpers.js +++ b/e2e/cypress/tests/integration/channels/enterprise/system_console/compliance/helpers.js @@ -3,7 +3,7 @@ import path from 'path'; -import * as TIMEOUTS from '../../../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../../../fixtures/timeouts'; export function downloadAndUnzipExportFile(targetFolder = '') { // # Get the download link diff --git a/webapp/channels/e2e/cypress/tests/integration/enterprise/system_console/compliance/s3_bucket_storage_spec.js b/e2e/cypress/tests/integration/channels/enterprise/system_console/compliance/s3_bucket_storage_spec.js similarity index 96% rename from webapp/channels/e2e/cypress/tests/integration/enterprise/system_console/compliance/s3_bucket_storage_spec.js rename to e2e/cypress/tests/integration/channels/enterprise/system_console/compliance/s3_bucket_storage_spec.js index 1c50c849aa..1a8ae24e8c 100644 --- a/webapp/channels/e2e/cypress/tests/integration/enterprise/system_console/compliance/s3_bucket_storage_spec.js +++ b/e2e/cypress/tests/integration/channels/enterprise/system_console/compliance/s3_bucket_storage_spec.js @@ -7,13 +7,13 @@ // - Use element ID when selecting an element. Create one if none. // *************************************************************** -// Group: @enterprise @system_console @compliance_export @not_cloud +// Group: @channels @enterprise @system_console @compliance_export @not_cloud // Requires "mattermost-minio" docker instance to be accessible at http://localhost:9000 // and a bucket named "mattermost-test". Bucket can be created manually in the UI or by: // ``docker exec mattermost-minio sh -c 'mkdir -p /data/mattermost-test'`` -import * as TIMEOUTS from '../../../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../../../fixtures/timeouts'; import {gotoTeamAndPostImage} from './helpers'; diff --git a/webapp/channels/e2e/cypress/tests/integration/enterprise/system_console/edition_and_license_link_spec.js b/e2e/cypress/tests/integration/channels/enterprise/system_console/edition_and_license_link_spec.js similarity index 91% rename from webapp/channels/e2e/cypress/tests/integration/enterprise/system_console/edition_and_license_link_spec.js rename to e2e/cypress/tests/integration/channels/enterprise/system_console/edition_and_license_link_spec.js index f78cc460e1..85d0196ca0 100644 --- a/webapp/channels/e2e/cypress/tests/integration/enterprise/system_console/edition_and_license_link_spec.js +++ b/e2e/cypress/tests/integration/channels/enterprise/system_console/edition_and_license_link_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @system_console @enterprise @not_cloud +// Group: @channels @system_console @enterprise @not_cloud -import {FixedPublicLinks} from '../../../utils'; +import {FixedPublicLinks} from '../../../../utils'; describe('Edition and License', () => { before(() => { diff --git a/webapp/channels/e2e/cypress/tests/integration/enterprise/system_console/environment_spec.js b/e2e/cypress/tests/integration/channels/enterprise/system_console/environment_spec.js similarity index 96% rename from webapp/channels/e2e/cypress/tests/integration/enterprise/system_console/environment_spec.js rename to e2e/cypress/tests/integration/channels/enterprise/system_console/environment_spec.js index 9623793c34..23e25eb4e0 100644 --- a/webapp/channels/e2e/cypress/tests/integration/enterprise/system_console/environment_spec.js +++ b/e2e/cypress/tests/integration/channels/enterprise/system_console/environment_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @enterprise @not_cloud +// Group: @channels @enterprise @not_cloud -import * as TIMEOUTS from '../../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../../fixtures/timeouts'; describe('Environment', () => { before(() => { diff --git a/webapp/channels/e2e/cypress/tests/integration/enterprise/system_console/group_configuration_spec.js b/e2e/cypress/tests/integration/channels/enterprise/system_console/group_configuration_spec.js similarity index 99% rename from webapp/channels/e2e/cypress/tests/integration/enterprise/system_console/group_configuration_spec.js rename to e2e/cypress/tests/integration/channels/enterprise/system_console/group_configuration_spec.js index 70af4bd33f..d2912407b7 100644 --- a/webapp/channels/e2e/cypress/tests/integration/enterprise/system_console/group_configuration_spec.js +++ b/e2e/cypress/tests/integration/channels/enterprise/system_console/group_configuration_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @enterprise @system_console +// Group: @channels @enterprise @system_console -import * as TIMEOUTS from '../../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../../fixtures/timeouts'; describe('group configuration', () => { let groupID; diff --git a/webapp/channels/e2e/cypress/tests/integration/enterprise/system_console/helpers.js b/e2e/cypress/tests/integration/channels/enterprise/system_console/helpers.js similarity index 93% rename from webapp/channels/e2e/cypress/tests/integration/enterprise/system_console/helpers.js rename to e2e/cypress/tests/integration/channels/enterprise/system_console/helpers.js index e3e2a689b5..1cb2b8ab2e 100644 --- a/webapp/channels/e2e/cypress/tests/integration/enterprise/system_console/helpers.js +++ b/e2e/cypress/tests/integration/channels/enterprise/system_console/helpers.js @@ -1,9 +1,9 @@ // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. // See LICENSE.txt for license information. -import accessRules from '../../../fixtures/system-roles-console-access'; -import disabledTests from '../../../fixtures/console-example-inputs'; -import * as TIMEOUTS from '../../../fixtures/timeouts'; +import accessRules from '../../../../fixtures/system-roles-console-access'; +import disabledTests from '../../../../fixtures/console-example-inputs'; +import * as TIMEOUTS from '../../../../fixtures/timeouts'; function noAccessFunc(section) { // * If it's a no-access permission, we just need to check that the section doesn't exist in the side bar diff --git a/webapp/channels/e2e/cypress/tests/integration/enterprise/system_console/limited_console_access_not_cloud_spec.js b/e2e/cypress/tests/integration/channels/enterprise/system_console/limited_console_access_not_cloud_spec.js similarity index 96% rename from webapp/channels/e2e/cypress/tests/integration/enterprise/system_console/limited_console_access_not_cloud_spec.js rename to e2e/cypress/tests/integration/channels/enterprise/system_console/limited_console_access_not_cloud_spec.js index 79c6b2ed51..7be99541f8 100644 --- a/webapp/channels/e2e/cypress/tests/integration/enterprise/system_console/limited_console_access_not_cloud_spec.js +++ b/e2e/cypress/tests/integration/channels/enterprise/system_console/limited_console_access_not_cloud_spec.js @@ -7,7 +7,7 @@ // - Use element ID when selecting an element. Create one if none. // *************************************************************** -// Group: @enterprise @system_console @not_cloud +// Group: @channels @enterprise @system_console @not_cloud import {forEachConsoleSection, makeUserASystemRole} from './helpers'; diff --git a/webapp/channels/e2e/cypress/tests/integration/enterprise/system_console/limited_console_access_spec.js b/e2e/cypress/tests/integration/channels/enterprise/system_console/limited_console_access_spec.js similarity index 96% rename from webapp/channels/e2e/cypress/tests/integration/enterprise/system_console/limited_console_access_spec.js rename to e2e/cypress/tests/integration/channels/enterprise/system_console/limited_console_access_spec.js index 698e6bdf02..a988292806 100644 --- a/webapp/channels/e2e/cypress/tests/integration/enterprise/system_console/limited_console_access_spec.js +++ b/e2e/cypress/tests/integration/channels/enterprise/system_console/limited_console_access_spec.js @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @enterprise @system_console +// Group: @channels @enterprise @system_console import {forEachConsoleSection, makeUserASystemRole} from './helpers'; diff --git a/webapp/channels/e2e/cypress/tests/integration/enterprise/system_console/main_menu_spec.js b/e2e/cypress/tests/integration/channels/enterprise/system_console/main_menu_spec.js similarity index 97% rename from webapp/channels/e2e/cypress/tests/integration/enterprise/system_console/main_menu_spec.js rename to e2e/cypress/tests/integration/channels/enterprise/system_console/main_menu_spec.js index 00a515af66..b12b7edd79 100644 --- a/webapp/channels/e2e/cypress/tests/integration/enterprise/system_console/main_menu_spec.js +++ b/e2e/cypress/tests/integration/channels/enterprise/system_console/main_menu_spec.js @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @enterprise @system_console +// Group: @channels @enterprise @system_console describe('Main menu', () => { before(() => { diff --git a/webapp/channels/e2e/cypress/tests/integration/enterprise/system_console/openid/openid_spec.js b/e2e/cypress/tests/integration/channels/enterprise/system_console/openid/openid_spec.js similarity index 97% rename from webapp/channels/e2e/cypress/tests/integration/enterprise/system_console/openid/openid_spec.js rename to e2e/cypress/tests/integration/channels/enterprise/system_console/openid/openid_spec.js index c8ac6ec81d..e98f85d203 100644 --- a/webapp/channels/e2e/cypress/tests/integration/enterprise/system_console/openid/openid_spec.js +++ b/e2e/cypress/tests/integration/channels/enterprise/system_console/openid/openid_spec.js @@ -8,10 +8,10 @@ // *************************************************************** // Stage: @prod -// Group: @enterprise @system_console +// Group: @channels @enterprise @system_console -import * as TIMEOUTS from '../../../../fixtures/timeouts'; -import {hexToRgbArray, rgbArrayToString} from '../../../../utils'; +import * as TIMEOUTS from '../../../../../fixtures/timeouts'; +import {hexToRgbArray, rgbArrayToString} from '../../../../../utils'; describe('System Console OpenId Connect', () => { const FAKE_SETTING = '********************************'; diff --git a/webapp/channels/e2e/cypress/tests/integration/enterprise/system_console/reporting/site_statistics_spec.js b/e2e/cypress/tests/integration/channels/enterprise/system_console/reporting/site_statistics_spec.js similarity index 97% rename from webapp/channels/e2e/cypress/tests/integration/enterprise/system_console/reporting/site_statistics_spec.js rename to e2e/cypress/tests/integration/channels/enterprise/system_console/reporting/site_statistics_spec.js index aefb148fe4..1a545ea1ff 100644 --- a/webapp/channels/e2e/cypress/tests/integration/enterprise/system_console/reporting/site_statistics_spec.js +++ b/e2e/cypress/tests/integration/channels/enterprise/system_console/reporting/site_statistics_spec.js @@ -8,10 +8,10 @@ // *************************************************************** // Stage: @prod -// Group: @enterprise @system_console +// Group: @channels @enterprise @system_console -import * as TIMEOUTS from '../../../../fixtures/timeouts'; -import {getAdminAccount} from '../../../../support/env'; +import * as TIMEOUTS from '../../../../../fixtures/timeouts'; +import {getAdminAccount} from '../../../../../support/env'; describe('System Console > Site Statistics', () => { let testTeam; diff --git a/webapp/channels/e2e/cypress/tests/integration/enterprise/system_console/search_box_spec.js b/e2e/cypress/tests/integration/channels/enterprise/system_console/search_box_spec.js similarity index 95% rename from webapp/channels/e2e/cypress/tests/integration/enterprise/system_console/search_box_spec.js rename to e2e/cypress/tests/integration/channels/enterprise/system_console/search_box_spec.js index cb759be87f..8bb483aa2a 100644 --- a/webapp/channels/e2e/cypress/tests/integration/enterprise/system_console/search_box_spec.js +++ b/e2e/cypress/tests/integration/channels/enterprise/system_console/search_box_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @enterprise @not_cloud @system_console +// Group: @channels @enterprise @not_cloud @system_console -import * as TIMEOUTS from '../../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../../fixtures/timeouts'; describe('System console', () => { before(() => { diff --git a/webapp/channels/e2e/cypress/tests/integration/enterprise/system_console/settings_spec.js b/e2e/cypress/tests/integration/channels/enterprise/system_console/settings_spec.js similarity index 96% rename from webapp/channels/e2e/cypress/tests/integration/enterprise/system_console/settings_spec.js rename to e2e/cypress/tests/integration/channels/enterprise/system_console/settings_spec.js index c34dddf3e4..76fc529d28 100644 --- a/webapp/channels/e2e/cypress/tests/integration/enterprise/system_console/settings_spec.js +++ b/e2e/cypress/tests/integration/channels/enterprise/system_console/settings_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @system_console +// Group: @channels @system_console -import * as TIMEOUTS from '../../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../../fixtures/timeouts'; describe('Settings', () => { before(() => { diff --git a/webapp/channels/e2e/cypress/tests/integration/enterprise/system_console/sidebar_link_navigation_cloud_spec.js b/e2e/cypress/tests/integration/channels/enterprise/system_console/sidebar_link_navigation_cloud_spec.js similarity index 93% rename from webapp/channels/e2e/cypress/tests/integration/enterprise/system_console/sidebar_link_navigation_cloud_spec.js rename to e2e/cypress/tests/integration/channels/enterprise/system_console/sidebar_link_navigation_cloud_spec.js index 18062015ab..344970cbf6 100644 --- a/webapp/channels/e2e/cypress/tests/integration/enterprise/system_console/sidebar_link_navigation_cloud_spec.js +++ b/e2e/cypress/tests/integration/channels/enterprise/system_console/sidebar_link_navigation_cloud_spec.js @@ -8,10 +8,10 @@ // *************************************************************** // Stage: @prod -// Group: @system_console @enterprise @cloud_only +// Group: @channels @system_console @enterprise @cloud_only -import * as TIMEOUTS from '../../../fixtures/timeouts'; -import {adminConsoleNavigation} from '../../../utils/admin_console'; +import * as TIMEOUTS from '../../../../fixtures/timeouts'; +import {adminConsoleNavigation} from '../../../../utils/admin_console'; describe('System Console - Cloud', () => { before(() => { diff --git a/webapp/channels/e2e/cypress/tests/integration/enterprise/system_console/sidebar_link_navigation_e20_spec.js b/e2e/cypress/tests/integration/channels/enterprise/system_console/sidebar_link_navigation_e20_spec.js similarity index 92% rename from webapp/channels/e2e/cypress/tests/integration/enterprise/system_console/sidebar_link_navigation_e20_spec.js rename to e2e/cypress/tests/integration/channels/enterprise/system_console/sidebar_link_navigation_e20_spec.js index bfab3b2d47..9e2881df6f 100644 --- a/webapp/channels/e2e/cypress/tests/integration/enterprise/system_console/sidebar_link_navigation_e20_spec.js +++ b/e2e/cypress/tests/integration/channels/enterprise/system_console/sidebar_link_navigation_e20_spec.js @@ -8,10 +8,10 @@ // *************************************************************** // Stage: @prod -// Group: @enterprise @e20_only @not_cloud @system_console +// Group: @channels @enterprise @e20_only @not_cloud @system_console -import * as TIMEOUTS from '../../../fixtures/timeouts'; -import {adminConsoleNavigation} from '../../../utils/admin_console'; +import * as TIMEOUTS from '../../../../fixtures/timeouts'; +import {adminConsoleNavigation} from '../../../../utils/admin_console'; describe('System Console - Enterprise', () => { before(() => { diff --git a/webapp/channels/e2e/cypress/tests/integration/enterprise/system_console/support_packet_generation_spec.js b/e2e/cypress/tests/integration/channels/enterprise/system_console/support_packet_generation_spec.js similarity index 97% rename from webapp/channels/e2e/cypress/tests/integration/enterprise/system_console/support_packet_generation_spec.js rename to e2e/cypress/tests/integration/channels/enterprise/system_console/support_packet_generation_spec.js index e73e31fb0c..63f1e0b9c2 100644 --- a/webapp/channels/e2e/cypress/tests/integration/enterprise/system_console/support_packet_generation_spec.js +++ b/e2e/cypress/tests/integration/channels/enterprise/system_console/support_packet_generation_spec.js @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @not_cloud @enterprise @system_console +// Group: @channels @not_cloud @enterprise @system_console describe('Support Packet Generation', () => { before(() => { diff --git a/webapp/channels/e2e/cypress/tests/integration/enterprise/system_console/system_scheme_permission_part2_spec.js b/e2e/cypress/tests/integration/channels/enterprise/system_console/system_scheme_permission_part2_spec.js similarity index 97% rename from webapp/channels/e2e/cypress/tests/integration/enterprise/system_console/system_scheme_permission_part2_spec.js rename to e2e/cypress/tests/integration/channels/enterprise/system_console/system_scheme_permission_part2_spec.js index cb954e97bd..53e063aef9 100644 --- a/webapp/channels/e2e/cypress/tests/integration/enterprise/system_console/system_scheme_permission_part2_spec.js +++ b/e2e/cypress/tests/integration/channels/enterprise/system_console/system_scheme_permission_part2_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @enterprise @system_console +// Group: @channels @enterprise @system_console -import * as TIMEOUTS from '../../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../../fixtures/timeouts'; describe('System Scheme', () => { before(() => { diff --git a/webapp/channels/e2e/cypress/tests/integration/enterprise/system_console/system_scheme_permission_spec.js b/e2e/cypress/tests/integration/channels/enterprise/system_console/system_scheme_permission_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/enterprise/system_console/system_scheme_permission_spec.js rename to e2e/cypress/tests/integration/channels/enterprise/system_console/system_scheme_permission_spec.js index 6ea3f5d8f1..afbbed7ed6 100644 --- a/webapp/channels/e2e/cypress/tests/integration/enterprise/system_console/system_scheme_permission_spec.js +++ b/e2e/cypress/tests/integration/channels/enterprise/system_console/system_scheme_permission_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @enterprise @system_console +// Group: @channels @enterprise @system_console -import {getAdminAccount} from '../../../support/env'; +import {getAdminAccount} from '../../../../support/env'; describe('System Scheme Channel Mentions Permissions Test', () => { let testUser; diff --git a/webapp/channels/e2e/cypress/tests/integration/enterprise/system_console/team_guest_channel_spec.js b/e2e/cypress/tests/integration/channels/enterprise/system_console/team_guest_channel_spec.js similarity index 95% rename from webapp/channels/e2e/cypress/tests/integration/enterprise/system_console/team_guest_channel_spec.js rename to e2e/cypress/tests/integration/channels/enterprise/system_console/team_guest_channel_spec.js index e414f36be2..2c56e8bf65 100644 --- a/webapp/channels/e2e/cypress/tests/integration/enterprise/system_console/team_guest_channel_spec.js +++ b/e2e/cypress/tests/integration/channels/enterprise/system_console/team_guest_channel_spec.js @@ -8,10 +8,10 @@ // *************************************************************** // Stage: @prod -// Group: @enterprise @system_console +// Group: @channels @enterprise @system_console -import {getRandomId} from '../../../utils'; -import * as TIMEOUTS from '../../../fixtures/timeouts'; +import {getRandomId} from '../../../../utils'; +import * as TIMEOUTS from '../../../../fixtures/timeouts'; const permissions = ['create_private_channel', 'edit_post', 'delete_post', 'reactions', 'use_channel_mentions', 'use_group_mentions']; const getButtonId = (permission) => { diff --git a/webapp/channels/e2e/cypress/tests/integration/enterprise/system_console/team_members_spec.js b/e2e/cypress/tests/integration/channels/enterprise/system_console/team_members_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/enterprise/system_console/team_members_spec.js rename to e2e/cypress/tests/integration/channels/enterprise/system_console/team_members_spec.js index 9cfae2c94b..11db552b17 100644 --- a/webapp/channels/e2e/cypress/tests/integration/enterprise/system_console/team_members_spec.js +++ b/e2e/cypress/tests/integration/channels/enterprise/system_console/team_members_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @enterprise +// Group: @channels @enterprise -import * as TIMEOUTS from '../../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../../fixtures/timeouts'; describe('Team members test', () => { let testTeam; diff --git a/webapp/channels/e2e/cypress/tests/integration/enterprise/system_console/team_scheme_permission_part2_spec.js b/e2e/cypress/tests/integration/channels/enterprise/system_console/team_scheme_permission_part2_spec.js similarity index 97% rename from webapp/channels/e2e/cypress/tests/integration/enterprise/system_console/team_scheme_permission_part2_spec.js rename to e2e/cypress/tests/integration/channels/enterprise/system_console/team_scheme_permission_part2_spec.js index 8a2866032f..10aa63d7e9 100644 --- a/webapp/channels/e2e/cypress/tests/integration/enterprise/system_console/team_scheme_permission_part2_spec.js +++ b/e2e/cypress/tests/integration/channels/enterprise/system_console/team_scheme_permission_part2_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @enterprise @system_console +// Group: @channels @enterprise @system_console -import * as TIMEOUTS from '../../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../../fixtures/timeouts'; describe('Team Scheme', () => { let testTeam; diff --git a/webapp/channels/e2e/cypress/tests/integration/enterprise/system_console/team_scheme_permission_spec.js b/e2e/cypress/tests/integration/channels/enterprise/system_console/team_scheme_permission_spec.js similarity index 99% rename from webapp/channels/e2e/cypress/tests/integration/enterprise/system_console/team_scheme_permission_spec.js rename to e2e/cypress/tests/integration/channels/enterprise/system_console/team_scheme_permission_spec.js index ed637f24e5..2c4e44959c 100644 --- a/webapp/channels/e2e/cypress/tests/integration/enterprise/system_console/team_scheme_permission_spec.js +++ b/e2e/cypress/tests/integration/channels/enterprise/system_console/team_scheme_permission_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @enterprise @system_console +// Group: @channels @enterprise @system_console -import {getAdminAccount} from '../../../support/env'; +import {getAdminAccount} from '../../../../support/env'; describe('Team Scheme Channel Mentions Permissions Test', () => { let testUser; diff --git a/webapp/channels/e2e/cypress/tests/integration/enterprise/system_console/ui_and_api/notifications_spec.js b/e2e/cypress/tests/integration/channels/enterprise/system_console/ui_and_api/notifications_spec.js similarity index 99% rename from webapp/channels/e2e/cypress/tests/integration/enterprise/system_console/ui_and_api/notifications_spec.js rename to e2e/cypress/tests/integration/channels/enterprise/system_console/ui_and_api/notifications_spec.js index 5717ce888a..3a281c728c 100644 --- a/webapp/channels/e2e/cypress/tests/integration/enterprise/system_console/ui_and_api/notifications_spec.js +++ b/e2e/cypress/tests/integration/channels/enterprise/system_console/ui_and_api/notifications_spec.js @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @enterprise @system_console +// Group: @channels @enterprise @system_console describe('System Console', () => { before(() => { diff --git a/webapp/channels/e2e/cypress/tests/integration/enterprise/teams/search_teams_spec.js b/e2e/cypress/tests/integration/channels/enterprise/teams/search_teams_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/enterprise/teams/search_teams_spec.js rename to e2e/cypress/tests/integration/channels/enterprise/teams/search_teams_spec.js index 1d6cd6998f..29f0a3f105 100644 --- a/webapp/channels/e2e/cypress/tests/integration/enterprise/teams/search_teams_spec.js +++ b/e2e/cypress/tests/integration/channels/enterprise/teams/search_teams_spec.js @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @enterprise @system_console +// Group: @channels @enterprise @system_console import {v4 as uuidv4} from 'uuid'; const PAGE_SIZE = 10; diff --git a/webapp/channels/e2e/cypress/tests/integration/files_and_attachments/cancel_file_upload_spec.js b/e2e/cypress/tests/integration/channels/files_and_attachments/cancel_file_upload_spec.js similarity index 100% rename from webapp/channels/e2e/cypress/tests/integration/files_and_attachments/cancel_file_upload_spec.js rename to e2e/cypress/tests/integration/channels/files_and_attachments/cancel_file_upload_spec.js diff --git a/webapp/channels/e2e/cypress/tests/integration/files_and_attachments/channel_files_spec.js b/e2e/cypress/tests/integration/channels/files_and_attachments/channel_files_spec.js similarity index 97% rename from webapp/channels/e2e/cypress/tests/integration/files_and_attachments/channel_files_spec.js rename to e2e/cypress/tests/integration/channels/files_and_attachments/channel_files_spec.js index fa1f08337f..0f01d8c4f0 100644 --- a/webapp/channels/e2e/cypress/tests/integration/files_and_attachments/channel_files_spec.js +++ b/e2e/cypress/tests/integration/channels/files_and_attachments/channel_files_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @filesearch +// Group: @channels @filesearch -import * as TIMEOUTS from '../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; import {interceptFileUpload, waitUntilUploadComplete} from './helpers'; diff --git a/webapp/channels/e2e/cypress/tests/integration/files_and_attachments/cloud_upload_files_spec.js b/e2e/cypress/tests/integration/channels/files_and_attachments/cloud_upload_files_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/files_and_attachments/cloud_upload_files_spec.js rename to e2e/cypress/tests/integration/channels/files_and_attachments/cloud_upload_files_spec.js index 0f5a7a5f2e..3b2aa2b4d5 100644 --- a/webapp/channels/e2e/cypress/tests/integration/files_and_attachments/cloud_upload_files_spec.js +++ b/e2e/cypress/tests/integration/channels/files_and_attachments/cloud_upload_files_spec.js @@ -7,9 +7,9 @@ // - Use element ID when selecting an element. Create one if none. // *************************************************************** -// Group: @files_and_attachments +// Group: @channels @files_and_attachments -import * as TIMEOUTS from '../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; import {interceptFileUpload, waitUntilUploadComplete} from './helpers'; diff --git a/webapp/channels/e2e/cypress/tests/integration/files_and_attachments/disabled_file_upload_spec.js b/e2e/cypress/tests/integration/channels/files_and_attachments/disabled_file_upload_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/files_and_attachments/disabled_file_upload_spec.js rename to e2e/cypress/tests/integration/channels/files_and_attachments/disabled_file_upload_spec.js index 6a30611416..77574bc69a 100644 --- a/webapp/channels/e2e/cypress/tests/integration/files_and_attachments/disabled_file_upload_spec.js +++ b/e2e/cypress/tests/integration/channels/files_and_attachments/disabled_file_upload_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @not_cloud @files_and_attachments +// Group: @channels @not_cloud @files_and_attachments -import * as TIMEOUTS from '../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; describe('Upload Files - Settings', () => { let channelUrl; diff --git a/webapp/channels/e2e/cypress/tests/integration/files_and_attachments/edit_message_with_attachment_spec.js b/e2e/cypress/tests/integration/channels/files_and_attachments/edit_message_with_attachment_spec.js similarity index 95% rename from webapp/channels/e2e/cypress/tests/integration/files_and_attachments/edit_message_with_attachment_spec.js rename to e2e/cypress/tests/integration/channels/files_and_attachments/edit_message_with_attachment_spec.js index 0fad9fbf4a..c0cebbdb12 100644 --- a/webapp/channels/e2e/cypress/tests/integration/files_and_attachments/edit_message_with_attachment_spec.js +++ b/e2e/cypress/tests/integration/channels/files_and_attachments/edit_message_with_attachment_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @files_and_attachments +// Group: @channels @files_and_attachments -import * as TIMEOUTS from '../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; describe('Edit Message with Attachment', () => { before(() => { diff --git a/webapp/channels/e2e/cypress/tests/integration/files_and_attachments/file_preview_audio_spec.js b/e2e/cypress/tests/integration/channels/files_and_attachments/file_preview_audio_spec.js similarity index 97% rename from webapp/channels/e2e/cypress/tests/integration/files_and_attachments/file_preview_audio_spec.js rename to e2e/cypress/tests/integration/channels/files_and_attachments/file_preview_audio_spec.js index 0ddb69c542..4036f837a8 100644 --- a/webapp/channels/e2e/cypress/tests/integration/files_and_attachments/file_preview_audio_spec.js +++ b/e2e/cypress/tests/integration/channels/files_and_attachments/file_preview_audio_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @files_and_attachments +// Group: @channels @files_and_attachments -import * as TIMEOUTS from '../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; import { attachFile, diff --git a/webapp/channels/e2e/cypress/tests/integration/files_and_attachments/file_preview_generic_spec.js b/e2e/cypress/tests/integration/channels/files_and_attachments/file_preview_generic_spec.js similarity index 97% rename from webapp/channels/e2e/cypress/tests/integration/files_and_attachments/file_preview_generic_spec.js rename to e2e/cypress/tests/integration/channels/files_and_attachments/file_preview_generic_spec.js index a8be88a1b8..4062912d3b 100644 --- a/webapp/channels/e2e/cypress/tests/integration/files_and_attachments/file_preview_generic_spec.js +++ b/e2e/cypress/tests/integration/channels/files_and_attachments/file_preview_generic_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @files_and_attachments +// Group: @channels @files_and_attachments -import * as TIMEOUTS from '../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; import { attachFile, diff --git a/webapp/channels/e2e/cypress/tests/integration/files_and_attachments/file_preview_image_spec.js b/e2e/cypress/tests/integration/channels/files_and_attachments/file_preview_image_spec.js similarity index 97% rename from webapp/channels/e2e/cypress/tests/integration/files_and_attachments/file_preview_image_spec.js rename to e2e/cypress/tests/integration/channels/files_and_attachments/file_preview_image_spec.js index 469b345013..9638e1ed0f 100644 --- a/webapp/channels/e2e/cypress/tests/integration/files_and_attachments/file_preview_image_spec.js +++ b/e2e/cypress/tests/integration/channels/files_and_attachments/file_preview_image_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @files_and_attachments +// Group: @channels @files_and_attachments -import * as TIMEOUTS from '../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; import { attachFile, diff --git a/webapp/channels/e2e/cypress/tests/integration/files_and_attachments/file_preview_video_spec.js b/e2e/cypress/tests/integration/channels/files_and_attachments/file_preview_video_spec.js similarity index 97% rename from webapp/channels/e2e/cypress/tests/integration/files_and_attachments/file_preview_video_spec.js rename to e2e/cypress/tests/integration/channels/files_and_attachments/file_preview_video_spec.js index 4eed6bc372..8a756981a8 100644 --- a/webapp/channels/e2e/cypress/tests/integration/files_and_attachments/file_preview_video_spec.js +++ b/e2e/cypress/tests/integration/channels/files_and_attachments/file_preview_video_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @files_and_attachments +// Group: @channels @files_and_attachments -import * as TIMEOUTS from '../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; import { attachFile, diff --git a/webapp/channels/e2e/cypress/tests/integration/files_and_attachments/helpers.js b/e2e/cypress/tests/integration/channels/files_and_attachments/helpers.js similarity index 97% rename from webapp/channels/e2e/cypress/tests/integration/files_and_attachments/helpers.js rename to e2e/cypress/tests/integration/channels/files_and_attachments/helpers.js index 4e35586c37..ea2dba3092 100644 --- a/webapp/channels/e2e/cypress/tests/integration/files_and_attachments/helpers.js +++ b/e2e/cypress/tests/integration/channels/files_and_attachments/helpers.js @@ -1,7 +1,7 @@ // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. // See LICENSE.txt for license information. -import * as TIMEOUTS from '../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; export function downloadAttachmentAndVerifyItsProperties(fileURL, filename, httpContext) { // * Verify it has not empty download link diff --git a/webapp/channels/e2e/cypress/tests/integration/files_and_attachments/image_link_preview_1_spec.js b/e2e/cypress/tests/integration/channels/files_and_attachments/image_link_preview_1_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/files_and_attachments/image_link_preview_1_spec.js rename to e2e/cypress/tests/integration/channels/files_and_attachments/image_link_preview_1_spec.js index 60b907ce76..a4b272104c 100644 --- a/webapp/channels/e2e/cypress/tests/integration/files_and_attachments/image_link_preview_1_spec.js +++ b/e2e/cypress/tests/integration/channels/files_and_attachments/image_link_preview_1_spec.js @@ -7,7 +7,7 @@ // - Use element ID when selecting an element. Create one if none. // *************************************************************** -// Group: @files_and_attachments +// Group: @channels @files_and_attachments describe('Image Link Preview', () => { let offTopicUrl; diff --git a/webapp/channels/e2e/cypress/tests/integration/files_and_attachments/image_link_preview_new_window_spec.js b/e2e/cypress/tests/integration/channels/files_and_attachments/image_link_preview_new_window_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/files_and_attachments/image_link_preview_new_window_spec.js rename to e2e/cypress/tests/integration/channels/files_and_attachments/image_link_preview_new_window_spec.js index 32de83c135..44bb7f844d 100644 --- a/webapp/channels/e2e/cypress/tests/integration/files_and_attachments/image_link_preview_new_window_spec.js +++ b/e2e/cypress/tests/integration/channels/files_and_attachments/image_link_preview_new_window_spec.js @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @files_and_attachments +// Group: @channels @files_and_attachments describe('Image Link Preview', () => { before(() => { diff --git a/webapp/channels/e2e/cypress/tests/integration/files_and_attachments/image_link_preview_spec.js b/e2e/cypress/tests/integration/channels/files_and_attachments/image_link_preview_spec.js similarity index 99% rename from webapp/channels/e2e/cypress/tests/integration/files_and_attachments/image_link_preview_spec.js rename to e2e/cypress/tests/integration/channels/files_and_attachments/image_link_preview_spec.js index 11b8b95115..0d5a681eaf 100644 --- a/webapp/channels/e2e/cypress/tests/integration/files_and_attachments/image_link_preview_spec.js +++ b/e2e/cypress/tests/integration/channels/files_and_attachments/image_link_preview_spec.js @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @files_and_attachments +// Group: @channels @files_and_attachments describe('Image Link Preview', () => { let offTopicUrl; diff --git a/webapp/channels/e2e/cypress/tests/integration/files_and_attachments/paste_image_spec.js b/e2e/cypress/tests/integration/channels/files_and_attachments/paste_image_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/files_and_attachments/paste_image_spec.js rename to e2e/cypress/tests/integration/channels/files_and_attachments/paste_image_spec.js index 584e230873..bb2596f5de 100644 --- a/webapp/channels/e2e/cypress/tests/integration/files_and_attachments/paste_image_spec.js +++ b/e2e/cypress/tests/integration/channels/files_and_attachments/paste_image_spec.js @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @files_and_attachments +// Group: @channels @files_and_attachments describe('Paste Image', () => { before(() => { diff --git a/webapp/channels/e2e/cypress/tests/integration/files_and_attachments/upload_files_not_cloud_spec.js b/e2e/cypress/tests/integration/channels/files_and_attachments/upload_files_not_cloud_spec.js similarity index 97% rename from webapp/channels/e2e/cypress/tests/integration/files_and_attachments/upload_files_not_cloud_spec.js rename to e2e/cypress/tests/integration/channels/files_and_attachments/upload_files_not_cloud_spec.js index 810309aea7..36e60d9490 100644 --- a/webapp/channels/e2e/cypress/tests/integration/files_and_attachments/upload_files_not_cloud_spec.js +++ b/e2e/cypress/tests/integration/channels/files_and_attachments/upload_files_not_cloud_spec.js @@ -8,10 +8,10 @@ // *************************************************************** // Stage: @prod -// Group: @not_cloud @files_and_attachments +// Group: @channels @not_cloud @files_and_attachments -import * as TIMEOUTS from '../../fixtures/timeouts'; -import {stubClipboard} from '../../utils'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; +import {stubClipboard} from '../../../utils'; import {downloadAttachmentAndVerifyItsProperties} from './helpers'; diff --git a/webapp/channels/e2e/cypress/tests/integration/files_and_attachments/upload_files_spec.js b/e2e/cypress/tests/integration/channels/files_and_attachments/upload_files_spec.js similarity index 99% rename from webapp/channels/e2e/cypress/tests/integration/files_and_attachments/upload_files_spec.js rename to e2e/cypress/tests/integration/channels/files_and_attachments/upload_files_spec.js index 16163cd587..4ddcd4fb9a 100644 --- a/webapp/channels/e2e/cypress/tests/integration/files_and_attachments/upload_files_spec.js +++ b/e2e/cypress/tests/integration/channels/files_and_attachments/upload_files_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @files_and_attachments +// Group: @channels @files_and_attachments -import * as TIMEOUTS from '../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; import { downloadAttachmentAndVerifyItsProperties, diff --git a/webapp/channels/e2e/cypress/tests/integration/files_and_attachments/youtube_video_spec.js b/e2e/cypress/tests/integration/channels/files_and_attachments/youtube_video_spec.js similarity index 97% rename from webapp/channels/e2e/cypress/tests/integration/files_and_attachments/youtube_video_spec.js rename to e2e/cypress/tests/integration/channels/files_and_attachments/youtube_video_spec.js index 9f27ed3499..b0b745900e 100644 --- a/webapp/channels/e2e/cypress/tests/integration/files_and_attachments/youtube_video_spec.js +++ b/e2e/cypress/tests/integration/channels/files_and_attachments/youtube_video_spec.js @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @files_and_attachments +// Group: @channels @files_and_attachments describe('YouTube Video', () => { before(() => { diff --git a/webapp/channels/e2e/cypress/tests/integration/insights/last_viewed_spec.js b/e2e/cypress/tests/integration/channels/insights/last_viewed_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/insights/last_viewed_spec.js rename to e2e/cypress/tests/integration/channels/insights/last_viewed_spec.js index f392d44b00..3c2efa8efe 100644 --- a/webapp/channels/e2e/cypress/tests/integration/insights/last_viewed_spec.js +++ b/e2e/cypress/tests/integration/channels/insights/last_viewed_spec.js @@ -7,7 +7,7 @@ // - Use element ID when selecting an element. Create one if none. // *************************************************************** // Stage: @prod -import * as TIMEOUTS from '../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; describe('Insights as last viewed channel', () => { let userA; // Member of team A and B diff --git a/webapp/channels/e2e/cypress/tests/integration/integrations/builtin_commands/common_commands_1_spec.js b/e2e/cypress/tests/integration/channels/integrations/builtin_commands/common_commands_1_spec.js similarity index 97% rename from webapp/channels/e2e/cypress/tests/integration/integrations/builtin_commands/common_commands_1_spec.js rename to e2e/cypress/tests/integration/channels/integrations/builtin_commands/common_commands_1_spec.js index 344ebbba93..9619c38566 100644 --- a/webapp/channels/e2e/cypress/tests/integration/integrations/builtin_commands/common_commands_1_spec.js +++ b/e2e/cypress/tests/integration/channels/integrations/builtin_commands/common_commands_1_spec.js @@ -8,10 +8,10 @@ // *************************************************************** // Stage: @prod -// Group: @integrations +// Group: @channels @integrations -import * as TIMEOUTS from '../../../fixtures/timeouts'; -import {getRandomId} from '../../../utils'; +import * as TIMEOUTS from '../../../../fixtures/timeouts'; +import {getRandomId} from '../../../../utils'; import {verifyEphemeralMessage} from './helper'; diff --git a/webapp/channels/e2e/cypress/tests/integration/integrations/builtin_commands/common_commands_2_spec.js b/e2e/cypress/tests/integration/channels/integrations/builtin_commands/common_commands_2_spec.js similarity index 97% rename from webapp/channels/e2e/cypress/tests/integration/integrations/builtin_commands/common_commands_2_spec.js rename to e2e/cypress/tests/integration/channels/integrations/builtin_commands/common_commands_2_spec.js index 41266844e5..af49c5c8a3 100644 --- a/webapp/channels/e2e/cypress/tests/integration/integrations/builtin_commands/common_commands_2_spec.js +++ b/e2e/cypress/tests/integration/channels/integrations/builtin_commands/common_commands_2_spec.js @@ -8,10 +8,10 @@ // *************************************************************** // Stage: @prod -// Group: @integrations +// Group: @channels @integrations -import * as TIMEOUTS from '../../../fixtures/timeouts'; -import {getRandomId} from '../../../utils'; +import * as TIMEOUTS from '../../../../fixtures/timeouts'; +import {getRandomId} from '../../../../utils'; describe('Integrations', () => { let testUser; diff --git a/webapp/channels/e2e/cypress/tests/integration/integrations/builtin_commands/common_commands_3_spec.js b/e2e/cypress/tests/integration/channels/integrations/builtin_commands/common_commands_3_spec.js similarity index 92% rename from webapp/channels/e2e/cypress/tests/integration/integrations/builtin_commands/common_commands_3_spec.js rename to e2e/cypress/tests/integration/channels/integrations/builtin_commands/common_commands_3_spec.js index ed8572cdf5..5775dd3aa2 100644 --- a/webapp/channels/e2e/cypress/tests/integration/integrations/builtin_commands/common_commands_3_spec.js +++ b/e2e/cypress/tests/integration/channels/integrations/builtin_commands/common_commands_3_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @integrations +// Group: @channels @integrations -import * as TIMEOUTS from '../../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../../fixtures/timeouts'; describe('Integrations', () => { before(() => { diff --git a/webapp/channels/e2e/cypress/tests/integration/integrations/builtin_commands/groupmsg_command_spec.js b/e2e/cypress/tests/integration/channels/integrations/builtin_commands/groupmsg_command_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/integrations/builtin_commands/groupmsg_command_spec.js rename to e2e/cypress/tests/integration/channels/integrations/builtin_commands/groupmsg_command_spec.js index 57604b42d6..4f1f8c2eaa 100644 --- a/webapp/channels/e2e/cypress/tests/integration/integrations/builtin_commands/groupmsg_command_spec.js +++ b/e2e/cypress/tests/integration/channels/integrations/builtin_commands/groupmsg_command_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @integrations +// Group: @channels @integrations -import {getRandomId} from '../../../utils'; +import {getRandomId} from '../../../../utils'; import {loginAndVisitChannel} from './helper'; diff --git a/webapp/channels/e2e/cypress/tests/integration/integrations/builtin_commands/helper.js b/e2e/cypress/tests/integration/channels/integrations/builtin_commands/helper.js similarity index 93% rename from webapp/channels/e2e/cypress/tests/integration/integrations/builtin_commands/helper.js rename to e2e/cypress/tests/integration/channels/integrations/builtin_commands/helper.js index 415d001481..92c4e2d4b4 100644 --- a/webapp/channels/e2e/cypress/tests/integration/integrations/builtin_commands/helper.js +++ b/e2e/cypress/tests/integration/channels/integrations/builtin_commands/helper.js @@ -1,7 +1,7 @@ // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. // See LICENSE.txt for license information. -import * as TIMEOUTS from '../../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../../fixtures/timeouts'; export function loginAndVisitChannel(user, channelUrl) { cy.apiLogin(user); diff --git a/webapp/channels/e2e/cypress/tests/integration/integrations/builtin_commands/invalid_commands_spec.js b/e2e/cypress/tests/integration/channels/integrations/builtin_commands/invalid_commands_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/integrations/builtin_commands/invalid_commands_spec.js rename to e2e/cypress/tests/integration/channels/integrations/builtin_commands/invalid_commands_spec.js index c42617fc4d..100350dee5 100644 --- a/webapp/channels/e2e/cypress/tests/integration/integrations/builtin_commands/invalid_commands_spec.js +++ b/e2e/cypress/tests/integration/channels/integrations/builtin_commands/invalid_commands_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @integrations +// Group: @channels @integrations -import * as MESSAGES from '../../../fixtures/messages'; +import * as MESSAGES from '../../../../fixtures/messages'; describe('Invalid slash command', () => { const incorrectCommand1 = 'notacommand-1'; diff --git a/webapp/channels/e2e/cypress/tests/integration/integrations/builtin_commands/invite_command_spec.js b/e2e/cypress/tests/integration/channels/integrations/builtin_commands/invite_command_spec.js similarity index 99% rename from webapp/channels/e2e/cypress/tests/integration/integrations/builtin_commands/invite_command_spec.js rename to e2e/cypress/tests/integration/channels/integrations/builtin_commands/invite_command_spec.js index ee5d605608..327919839c 100644 --- a/webapp/channels/e2e/cypress/tests/integration/integrations/builtin_commands/invite_command_spec.js +++ b/e2e/cypress/tests/integration/channels/integrations/builtin_commands/invite_command_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @integrations +// Group: @channels @integrations -import * as TIMEOUTS from '../../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../../fixtures/timeouts'; import {loginAndVisitChannel} from './helper'; diff --git a/webapp/channels/e2e/cypress/tests/integration/integrations/builtin_commands/invite_people_command_spec.js b/e2e/cypress/tests/integration/channels/integrations/builtin_commands/invite_people_command_spec.js similarity index 95% rename from webapp/channels/e2e/cypress/tests/integration/integrations/builtin_commands/invite_people_command_spec.js rename to e2e/cypress/tests/integration/channels/integrations/builtin_commands/invite_people_command_spec.js index 15096d57d4..2d74f8ad86 100644 --- a/webapp/channels/e2e/cypress/tests/integration/integrations/builtin_commands/invite_people_command_spec.js +++ b/e2e/cypress/tests/integration/channels/integrations/builtin_commands/invite_people_command_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @integrations +// Group: @channels @integrations -import {getJoinEmailTemplate, verifyEmailBody} from '../../../utils'; +import {getJoinEmailTemplate, verifyEmailBody} from '../../../../utils'; import {loginAndVisitChannel} from './helper'; diff --git a/webapp/channels/e2e/cypress/tests/integration/integrations/builtin_commands/user_status_commands_spec.js b/e2e/cypress/tests/integration/channels/integrations/builtin_commands/user_status_commands_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/integrations/builtin_commands/user_status_commands_spec.js rename to e2e/cypress/tests/integration/channels/integrations/builtin_commands/user_status_commands_spec.js index 3d0ee4c056..330b86c820 100644 --- a/webapp/channels/e2e/cypress/tests/integration/integrations/builtin_commands/user_status_commands_spec.js +++ b/e2e/cypress/tests/integration/channels/integrations/builtin_commands/user_status_commands_spec.js @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @integrations +// Group: @channels @integrations describe('Integrations', () => { const testCases = [ diff --git a/webapp/channels/e2e/cypress/tests/integration/integrations/builtin_commands/user_status_spec.js b/e2e/cypress/tests/integration/channels/integrations/builtin_commands/user_status_spec.js similarity index 97% rename from webapp/channels/e2e/cypress/tests/integration/integrations/builtin_commands/user_status_spec.js rename to e2e/cypress/tests/integration/channels/integrations/builtin_commands/user_status_spec.js index 87999a7d2c..aadb723205 100644 --- a/webapp/channels/e2e/cypress/tests/integration/integrations/builtin_commands/user_status_spec.js +++ b/e2e/cypress/tests/integration/channels/integrations/builtin_commands/user_status_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @integrations +// Group: @channels @integrations -import * as TIMEOUTS from '../../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../../fixtures/timeouts'; describe('Integrations', () => { const away = {name: 'away', ariaLabel: 'Away Icon', message: 'You are now away', className: 'icon-clock'}; diff --git a/webapp/channels/e2e/cypress/tests/integration/integrations/custom_slash_commands/custom_slash_commands_spec.js b/e2e/cypress/tests/integration/channels/integrations/custom_slash_commands/custom_slash_commands_spec.js similarity index 99% rename from webapp/channels/e2e/cypress/tests/integration/integrations/custom_slash_commands/custom_slash_commands_spec.js rename to e2e/cypress/tests/integration/channels/integrations/custom_slash_commands/custom_slash_commands_spec.js index d0ed05f58c..159cc73a36 100644 --- a/webapp/channels/e2e/cypress/tests/integration/integrations/custom_slash_commands/custom_slash_commands_spec.js +++ b/e2e/cypress/tests/integration/channels/integrations/custom_slash_commands/custom_slash_commands_spec.js @@ -8,13 +8,13 @@ // *************************************************************** // Stage: @prod -// Group: @integrations +// Group: @channels @integrations /** * Note: This test requires webhook server running. Initiate `npm run start:webhook` to start. */ -import * as TIMEOUTS from '../../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../../fixtures/timeouts'; import { enablePermission, diff --git a/webapp/channels/e2e/cypress/tests/integration/integrations/custom_slash_commands/helpers.js b/e2e/cypress/tests/integration/channels/integrations/custom_slash_commands/helpers.js similarity index 96% rename from webapp/channels/e2e/cypress/tests/integration/integrations/custom_slash_commands/helpers.js rename to e2e/cypress/tests/integration/channels/integrations/custom_slash_commands/helpers.js index 317b2ed974..b35eeb5e48 100644 --- a/webapp/channels/e2e/cypress/tests/integration/integrations/custom_slash_commands/helpers.js +++ b/e2e/cypress/tests/integration/channels/integrations/custom_slash_commands/helpers.js @@ -1,7 +1,7 @@ // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. // See LICENSE.txt for license information. -import * as TIMEOUTS from '../../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../../fixtures/timeouts'; export function addNewCommand(team, trigger, url) { // # Open slash command page diff --git a/webapp/channels/e2e/cypress/tests/integration/integrations/custom_slash_commands/slash_commands_spec.js b/e2e/cypress/tests/integration/channels/integrations/custom_slash_commands/slash_commands_spec.js similarity index 99% rename from webapp/channels/e2e/cypress/tests/integration/integrations/custom_slash_commands/slash_commands_spec.js rename to e2e/cypress/tests/integration/channels/integrations/custom_slash_commands/slash_commands_spec.js index 8ae7440638..e73d5e317c 100644 --- a/webapp/channels/e2e/cypress/tests/integration/integrations/custom_slash_commands/slash_commands_spec.js +++ b/e2e/cypress/tests/integration/channels/integrations/custom_slash_commands/slash_commands_spec.js @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @integrations +// Group: @channels @integrations /** * Note: This test requires webhook server running. Initiate `npm run start:webhook` to start. diff --git a/webapp/channels/e2e/cypress/tests/integration/integrations/incoming_webhook/attachment_does_not_collapse_spec.ts b/e2e/cypress/tests/integration/channels/integrations/incoming_webhook/attachment_does_not_collapse_spec.ts similarity index 99% rename from webapp/channels/e2e/cypress/tests/integration/integrations/incoming_webhook/attachment_does_not_collapse_spec.ts rename to e2e/cypress/tests/integration/channels/integrations/incoming_webhook/attachment_does_not_collapse_spec.ts index b1a0c8ae35..72b427e147 100644 --- a/webapp/channels/e2e/cypress/tests/integration/integrations/incoming_webhook/attachment_does_not_collapse_spec.ts +++ b/e2e/cypress/tests/integration/channels/integrations/incoming_webhook/attachment_does_not_collapse_spec.ts @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @incoming_webhook +// Group: @channels @incoming_webhook describe('Integrations/Incoming Webhook', () => { let incomingWebhook; diff --git a/webapp/channels/e2e/cypress/tests/integration/integrations/incoming_webhook/basic_formatting_spec.js b/e2e/cypress/tests/integration/channels/integrations/incoming_webhook/basic_formatting_spec.js similarity index 99% rename from webapp/channels/e2e/cypress/tests/integration/integrations/incoming_webhook/basic_formatting_spec.js rename to e2e/cypress/tests/integration/channels/integrations/incoming_webhook/basic_formatting_spec.js index 95b6b77aea..c0a1245e09 100644 --- a/webapp/channels/e2e/cypress/tests/integration/integrations/incoming_webhook/basic_formatting_spec.js +++ b/e2e/cypress/tests/integration/channels/integrations/incoming_webhook/basic_formatting_spec.js @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @incoming_webhook +// Group: @channels @incoming_webhook describe('Incoming webhook', () => { let testChannel; diff --git a/webapp/channels/e2e/cypress/tests/integration/integrations/incoming_webhook/cancel_out_of_edit_spec.js b/e2e/cypress/tests/integration/channels/integrations/incoming_webhook/cancel_out_of_edit_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/integrations/incoming_webhook/cancel_out_of_edit_spec.js rename to e2e/cypress/tests/integration/channels/integrations/incoming_webhook/cancel_out_of_edit_spec.js index 5e80be2730..12cad7193f 100644 --- a/webapp/channels/e2e/cypress/tests/integration/integrations/incoming_webhook/cancel_out_of_edit_spec.js +++ b/e2e/cypress/tests/integration/channels/integrations/incoming_webhook/cancel_out_of_edit_spec.js @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @integrations +// Group: @channels @integrations describe('Integrations', () => { let newIncomingHook; diff --git a/webapp/channels/e2e/cypress/tests/integration/integrations/incoming_webhook/copy_icon_spec.js b/e2e/cypress/tests/integration/channels/integrations/incoming_webhook/copy_icon_spec.js similarity index 100% rename from webapp/channels/e2e/cypress/tests/integration/integrations/incoming_webhook/copy_icon_spec.js rename to e2e/cypress/tests/integration/channels/integrations/incoming_webhook/copy_icon_spec.js diff --git a/webapp/channels/e2e/cypress/tests/integration/integrations/incoming_webhook/delete_incoming_webhook_spec.js b/e2e/cypress/tests/integration/channels/integrations/incoming_webhook/delete_incoming_webhook_spec.js similarity index 99% rename from webapp/channels/e2e/cypress/tests/integration/integrations/incoming_webhook/delete_incoming_webhook_spec.js rename to e2e/cypress/tests/integration/channels/integrations/incoming_webhook/delete_incoming_webhook_spec.js index 8a73764ef2..618aa88879 100644 --- a/webapp/channels/e2e/cypress/tests/integration/integrations/incoming_webhook/delete_incoming_webhook_spec.js +++ b/e2e/cypress/tests/integration/channels/integrations/incoming_webhook/delete_incoming_webhook_spec.js @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @incoming_webhook +// Group: @channels @incoming_webhook import {enableUsernameAndIconOverride} from './helpers'; diff --git a/webapp/channels/e2e/cypress/tests/integration/integrations/incoming_webhook/description_length_check_spec.js b/e2e/cypress/tests/integration/channels/integrations/incoming_webhook/description_length_check_spec.js similarity index 97% rename from webapp/channels/e2e/cypress/tests/integration/integrations/incoming_webhook/description_length_check_spec.js rename to e2e/cypress/tests/integration/channels/integrations/incoming_webhook/description_length_check_spec.js index fdd0adc07d..ecd9e6c680 100644 --- a/webapp/channels/e2e/cypress/tests/integration/integrations/incoming_webhook/description_length_check_spec.js +++ b/e2e/cypress/tests/integration/channels/integrations/incoming_webhook/description_length_check_spec.js @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @integrations +// Group: @channels @integrations describe('Integrations', () => { const maxDescription = '1234567890'.repeat(50); diff --git a/webapp/channels/e2e/cypress/tests/integration/integrations/incoming_webhook/disallow_username_profile_override_spec.js b/e2e/cypress/tests/integration/channels/integrations/incoming_webhook/disallow_username_profile_override_spec.js similarity index 97% rename from webapp/channels/e2e/cypress/tests/integration/integrations/incoming_webhook/disallow_username_profile_override_spec.js rename to e2e/cypress/tests/integration/channels/integrations/incoming_webhook/disallow_username_profile_override_spec.js index abd802b406..25e9b629b4 100644 --- a/webapp/channels/e2e/cypress/tests/integration/integrations/incoming_webhook/disallow_username_profile_override_spec.js +++ b/e2e/cypress/tests/integration/channels/integrations/incoming_webhook/disallow_username_profile_override_spec.js @@ -8,10 +8,10 @@ // *************************************************************** // Stage: @prod -// Group: @incoming_webhook +// Group: @channels @incoming_webhook -import {getRandomId} from '../../../utils'; -import * as TIMEOUTS from '../../../fixtures/timeouts'; +import {getRandomId} from '../../../../utils'; +import * as TIMEOUTS from '../../../../fixtures/timeouts'; import {enableUsernameAndIconOverride} from './helpers'; diff --git a/webapp/channels/e2e/cypress/tests/integration/integrations/incoming_webhook/edit_incoming_webhook_spec.js b/e2e/cypress/tests/integration/channels/integrations/incoming_webhook/edit_incoming_webhook_spec.js similarity index 99% rename from webapp/channels/e2e/cypress/tests/integration/integrations/incoming_webhook/edit_incoming_webhook_spec.js rename to e2e/cypress/tests/integration/channels/integrations/incoming_webhook/edit_incoming_webhook_spec.js index b13a540d19..0da9132a9c 100644 --- a/webapp/channels/e2e/cypress/tests/integration/integrations/incoming_webhook/edit_incoming_webhook_spec.js +++ b/e2e/cypress/tests/integration/channels/integrations/incoming_webhook/edit_incoming_webhook_spec.js @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @incoming_webhook +// Group: @channels @incoming_webhook describe('Incoming webhook', () => { let incomingWebhook; diff --git a/webapp/channels/e2e/cypress/tests/integration/integrations/incoming_webhook/helpers.js b/e2e/cypress/tests/integration/channels/integrations/incoming_webhook/helpers.js similarity index 100% rename from webapp/channels/e2e/cypress/tests/integration/integrations/incoming_webhook/helpers.js rename to e2e/cypress/tests/integration/channels/integrations/incoming_webhook/helpers.js diff --git a/webapp/channels/e2e/cypress/tests/integration/integrations/incoming_webhook/inapp_username_profile_override_spec.js b/e2e/cypress/tests/integration/channels/integrations/incoming_webhook/inapp_username_profile_override_spec.js similarity index 97% rename from webapp/channels/e2e/cypress/tests/integration/integrations/incoming_webhook/inapp_username_profile_override_spec.js rename to e2e/cypress/tests/integration/channels/integrations/incoming_webhook/inapp_username_profile_override_spec.js index b64fa1a3d4..8772016fb5 100644 --- a/webapp/channels/e2e/cypress/tests/integration/integrations/incoming_webhook/inapp_username_profile_override_spec.js +++ b/e2e/cypress/tests/integration/channels/integrations/incoming_webhook/inapp_username_profile_override_spec.js @@ -8,10 +8,10 @@ // *************************************************************** // Stage: @prod -// Group: @incoming_webhook +// Group: @channels @incoming_webhook -import {getRandomId} from '../../../utils'; -import * as TIMEOUTS from '../../../fixtures/timeouts'; +import {getRandomId} from '../../../../utils'; +import * as TIMEOUTS from '../../../../fixtures/timeouts'; describe('Incoming webhook', () => { const inAppUsername = 'in-app'; diff --git a/webapp/channels/e2e/cypress/tests/integration/integrations/incoming_webhook/incoming_webhook_creates_dm_spec.js b/e2e/cypress/tests/integration/channels/integrations/incoming_webhook/incoming_webhook_creates_dm_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/integrations/incoming_webhook/incoming_webhook_creates_dm_spec.js rename to e2e/cypress/tests/integration/channels/integrations/incoming_webhook/incoming_webhook_creates_dm_spec.js index d0e9ad09ae..47bf5f1a89 100644 --- a/webapp/channels/e2e/cypress/tests/integration/integrations/incoming_webhook/incoming_webhook_creates_dm_spec.js +++ b/e2e/cypress/tests/integration/channels/integrations/incoming_webhook/incoming_webhook_creates_dm_spec.js @@ -9,7 +9,7 @@ // Stage: @prod // Stage: @dev -// Group: @incoming_webhook +// Group: @channels @incoming_webhook import {enableUsernameAndIconOverride} from './helpers'; diff --git a/webapp/channels/e2e/cypress/tests/integration/integrations/incoming_webhook/incoming_webhook_is_image_only_spec.js b/e2e/cypress/tests/integration/channels/integrations/incoming_webhook/incoming_webhook_is_image_only_spec.js similarity index 99% rename from webapp/channels/e2e/cypress/tests/integration/integrations/incoming_webhook/incoming_webhook_is_image_only_spec.js rename to e2e/cypress/tests/integration/channels/integrations/incoming_webhook/incoming_webhook_is_image_only_spec.js index a2dfbd1308..a48e4c1c8a 100644 --- a/webapp/channels/e2e/cypress/tests/integration/integrations/incoming_webhook/incoming_webhook_is_image_only_spec.js +++ b/e2e/cypress/tests/integration/channels/integrations/incoming_webhook/incoming_webhook_is_image_only_spec.js @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @incoming_webhook +// Group: @channels @incoming_webhook import {enableUsernameAndIconOverride} from './helpers'; diff --git a/webapp/channels/e2e/cypress/tests/integration/integrations/incoming_webhook/integrations_display_on_team_where_created_spec.js b/e2e/cypress/tests/integration/channels/integrations/incoming_webhook/integrations_display_on_team_where_created_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/integrations/incoming_webhook/integrations_display_on_team_where_created_spec.js rename to e2e/cypress/tests/integration/channels/integrations/incoming_webhook/integrations_display_on_team_where_created_spec.js index b6c2f906c2..6048173788 100644 --- a/webapp/channels/e2e/cypress/tests/integration/integrations/incoming_webhook/integrations_display_on_team_where_created_spec.js +++ b/e2e/cypress/tests/integration/channels/integrations/incoming_webhook/integrations_display_on_team_where_created_spec.js @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @integrations +// Group: @channels @integrations describe('Integrations', () => { let teamA; diff --git a/webapp/channels/e2e/cypress/tests/integration/integrations/incoming_webhook/invalid_attachment_URL_webhook_spec.ts b/e2e/cypress/tests/integration/channels/integrations/incoming_webhook/invalid_attachment_URL_webhook_spec.ts similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/integrations/incoming_webhook/invalid_attachment_URL_webhook_spec.ts rename to e2e/cypress/tests/integration/channels/integrations/incoming_webhook/invalid_attachment_URL_webhook_spec.ts index 156ef17b8b..34a78fe6ff 100644 --- a/webapp/channels/e2e/cypress/tests/integration/integrations/incoming_webhook/invalid_attachment_URL_webhook_spec.ts +++ b/e2e/cypress/tests/integration/channels/integrations/incoming_webhook/invalid_attachment_URL_webhook_spec.ts @@ -7,7 +7,7 @@ // - Use element ID when selecting an element. Create one if none. // *************************************************************** -// Group: @incoming_webhook +// Group: @channels @incoming_webhook describe('Integrations/Incoming Webhook', () => { let incomingWebhook; diff --git a/webapp/channels/e2e/cypress/tests/integration/integrations/incoming_webhook/long_url_embedded_image_spec.js b/e2e/cypress/tests/integration/channels/integrations/incoming_webhook/long_url_embedded_image_spec.js similarity index 99% rename from webapp/channels/e2e/cypress/tests/integration/integrations/incoming_webhook/long_url_embedded_image_spec.js rename to e2e/cypress/tests/integration/channels/integrations/incoming_webhook/long_url_embedded_image_spec.js index ba65f21102..8e7af21764 100644 --- a/webapp/channels/e2e/cypress/tests/integration/integrations/incoming_webhook/long_url_embedded_image_spec.js +++ b/e2e/cypress/tests/integration/channels/integrations/incoming_webhook/long_url_embedded_image_spec.js @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @integrations +// Group: @channels @integrations describe('Integrations', () => { let testUser; diff --git a/webapp/channels/e2e/cypress/tests/integration/integrations/incoming_webhook/setting_spec.js b/e2e/cypress/tests/integration/channels/integrations/incoming_webhook/setting_spec.js similarity index 96% rename from webapp/channels/e2e/cypress/tests/integration/integrations/incoming_webhook/setting_spec.js rename to e2e/cypress/tests/integration/channels/integrations/incoming_webhook/setting_spec.js index 94ec8dc9f9..a5c5d5994a 100644 --- a/webapp/channels/e2e/cypress/tests/integration/integrations/incoming_webhook/setting_spec.js +++ b/e2e/cypress/tests/integration/channels/integrations/incoming_webhook/setting_spec.js @@ -8,10 +8,10 @@ // *************************************************************** // Stage: @prod -// Group: @incoming_webhook +// Group: @channels @incoming_webhook -import {getRandomId} from '../../../utils'; -import * as TIMEOUTS from '../../../fixtures/timeouts'; +import {getRandomId} from '../../../../utils'; +import * as TIMEOUTS from '../../../../fixtures/timeouts'; describe('Incoming webhook', () => { let testTeam; diff --git a/webapp/channels/e2e/cypress/tests/integration/integrations/incoming_webhook/setup_incoming_webhook_spec.js b/e2e/cypress/tests/integration/channels/integrations/incoming_webhook/setup_incoming_webhook_spec.js similarity index 99% rename from webapp/channels/e2e/cypress/tests/integration/integrations/incoming_webhook/setup_incoming_webhook_spec.js rename to e2e/cypress/tests/integration/channels/integrations/incoming_webhook/setup_incoming_webhook_spec.js index 50dfec8e82..8ad451b039 100644 --- a/webapp/channels/e2e/cypress/tests/integration/integrations/incoming_webhook/setup_incoming_webhook_spec.js +++ b/e2e/cypress/tests/integration/channels/integrations/incoming_webhook/setup_incoming_webhook_spec.js @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @incoming_webhook +// Group: @channels @incoming_webhook import {enableUsernameAndIconOverride} from './helpers'; diff --git a/webapp/channels/e2e/cypress/tests/integration/integrations/incoming_webhook/slack_formatting_spec.js b/e2e/cypress/tests/integration/channels/integrations/incoming_webhook/slack_formatting_spec.js similarity index 99% rename from webapp/channels/e2e/cypress/tests/integration/integrations/incoming_webhook/slack_formatting_spec.js rename to e2e/cypress/tests/integration/channels/integrations/incoming_webhook/slack_formatting_spec.js index 1585e42d53..5f9fb508fa 100644 --- a/webapp/channels/e2e/cypress/tests/integration/integrations/incoming_webhook/slack_formatting_spec.js +++ b/e2e/cypress/tests/integration/channels/integrations/incoming_webhook/slack_formatting_spec.js @@ -7,7 +7,7 @@ // - Use element ID when selecting an element. Create one if none. // *************************************************************** -// Group: @incoming_webhook +// Group: @channels @incoming_webhook describe('Incoming webhook', () => { let testTeam; diff --git a/webapp/channels/e2e/cypress/tests/integration/integrations/incoming_webhook/webhook_posts_when_creator_not_in_channel_spec.js b/e2e/cypress/tests/integration/channels/integrations/incoming_webhook/webhook_posts_when_creator_not_in_channel_spec.js similarity index 97% rename from webapp/channels/e2e/cypress/tests/integration/integrations/incoming_webhook/webhook_posts_when_creator_not_in_channel_spec.js rename to e2e/cypress/tests/integration/channels/integrations/incoming_webhook/webhook_posts_when_creator_not_in_channel_spec.js index 6706b3d8ca..ed6bb51f6c 100644 --- a/webapp/channels/e2e/cypress/tests/integration/integrations/incoming_webhook/webhook_posts_when_creator_not_in_channel_spec.js +++ b/e2e/cypress/tests/integration/channels/integrations/incoming_webhook/webhook_posts_when_creator_not_in_channel_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @integrations +// Group: @channels @integrations -import {getRandomId} from '../../../utils'; +import {getRandomId} from '../../../../utils'; describe('Integrations', () => { let testUser; diff --git a/webapp/channels/e2e/cypress/tests/integration/integrations/integrations_page_spec.js b/e2e/cypress/tests/integration/channels/integrations/integrations_page_spec.js similarity index 99% rename from webapp/channels/e2e/cypress/tests/integration/integrations/integrations_page_spec.js rename to e2e/cypress/tests/integration/channels/integrations/integrations_page_spec.js index 0355d2fc4b..de0e8fc601 100644 --- a/webapp/channels/e2e/cypress/tests/integration/integrations/integrations_page_spec.js +++ b/e2e/cypress/tests/integration/channels/integrations/integrations_page_spec.js @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @integrations +// Group: @channels @integrations describe('Integrations', () => { let teamA; diff --git a/webapp/channels/e2e/cypress/tests/integration/integrations/integrations_search_gives_feedback_spec.js b/e2e/cypress/tests/integration/channels/integrations/integrations_search_gives_feedback_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/integrations/integrations_search_gives_feedback_spec.js rename to e2e/cypress/tests/integration/channels/integrations/integrations_search_gives_feedback_spec.js index 6cbff82bfc..b3bc476151 100644 --- a/webapp/channels/e2e/cypress/tests/integration/integrations/integrations_search_gives_feedback_spec.js +++ b/e2e/cypress/tests/integration/channels/integrations/integrations_search_gives_feedback_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @integrations +// Group: @channels @integrations -import {getRandomId} from '../../utils'; +import {getRandomId} from '../../../utils'; describe('Integrations', () => { let teamName; diff --git a/webapp/channels/e2e/cypress/tests/integration/integrations/integrations_spec.js b/e2e/cypress/tests/integration/channels/integrations/integrations_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/integrations/integrations_spec.js rename to e2e/cypress/tests/integration/channels/integrations/integrations_spec.js index 0ef20b9f60..0bb25a86c4 100644 --- a/webapp/channels/e2e/cypress/tests/integration/integrations/integrations_spec.js +++ b/e2e/cypress/tests/integration/channels/integrations/integrations_spec.js @@ -8,11 +8,11 @@ // *************************************************************** // Stage: @prod -// Group: @integrations +// Group: @channels @integrations -import {getRandomId} from '../../utils'; -import * as MESSAGES from '../../fixtures/messages'; -import * as TIMEOUTS from '../../fixtures/timeouts'; +import {getRandomId} from '../../../utils'; +import * as MESSAGES from '../../../fixtures/messages'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; describe('Integrations page', () => { let testTeam; diff --git a/webapp/channels/e2e/cypress/tests/integration/integrations/message_to_channel_via_slash_command_spec.js b/e2e/cypress/tests/integration/channels/integrations/message_to_channel_via_slash_command_spec.js similarity index 99% rename from webapp/channels/e2e/cypress/tests/integration/integrations/message_to_channel_via_slash_command_spec.js rename to e2e/cypress/tests/integration/channels/integrations/message_to_channel_via_slash_command_spec.js index a1d0fa3c38..47171e8adc 100644 --- a/webapp/channels/e2e/cypress/tests/integration/integrations/message_to_channel_via_slash_command_spec.js +++ b/e2e/cypress/tests/integration/channels/integrations/message_to_channel_via_slash_command_spec.js @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @integrations +// Group: @channels @integrations /** * Note: This test requires webhook server running. Initiate `npm run start:webhook` to start. diff --git a/webapp/channels/e2e/cypress/tests/integration/integrations/outgoing_webhook/delete_outgoing_webhook_spec.js b/e2e/cypress/tests/integration/channels/integrations/outgoing_webhook/delete_outgoing_webhook_spec.js similarity index 97% rename from webapp/channels/e2e/cypress/tests/integration/integrations/outgoing_webhook/delete_outgoing_webhook_spec.js rename to e2e/cypress/tests/integration/channels/integrations/outgoing_webhook/delete_outgoing_webhook_spec.js index 94f7ebfbbb..7e284cf680 100644 --- a/webapp/channels/e2e/cypress/tests/integration/integrations/outgoing_webhook/delete_outgoing_webhook_spec.js +++ b/e2e/cypress/tests/integration/channels/integrations/outgoing_webhook/delete_outgoing_webhook_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @integrations +// Group: @channels @integrations -import * as TIMEOUTS from '../../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../../fixtures/timeouts'; describe('Integrations', () => { let testTeam; diff --git a/webapp/channels/e2e/cypress/tests/integration/integrations/outgoing_webhook/disable_outgoing_webhook_spec.js b/e2e/cypress/tests/integration/channels/integrations/outgoing_webhook/disable_outgoing_webhook_spec.js similarity index 97% rename from webapp/channels/e2e/cypress/tests/integration/integrations/outgoing_webhook/disable_outgoing_webhook_spec.js rename to e2e/cypress/tests/integration/channels/integrations/outgoing_webhook/disable_outgoing_webhook_spec.js index 1eb3fb16c2..aedcae69db 100644 --- a/webapp/channels/e2e/cypress/tests/integration/integrations/outgoing_webhook/disable_outgoing_webhook_spec.js +++ b/e2e/cypress/tests/integration/channels/integrations/outgoing_webhook/disable_outgoing_webhook_spec.js @@ -7,9 +7,9 @@ // - Use element ID when selecting an element. Create one if none. // *************************************************************** -// Group: @integrations +// Group: @channels @integrations -import * as TIMEOUTS from '../../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../../fixtures/timeouts'; describe('Integrations', () => { let testTeam; diff --git a/webapp/channels/e2e/cypress/tests/integration/integrations/outgoing_webhook/disable_override_username_profile_spec.js b/e2e/cypress/tests/integration/channels/integrations/outgoing_webhook/disable_override_username_profile_spec.js similarity index 99% rename from webapp/channels/e2e/cypress/tests/integration/integrations/outgoing_webhook/disable_override_username_profile_spec.js rename to e2e/cypress/tests/integration/channels/integrations/outgoing_webhook/disable_override_username_profile_spec.js index 78f2044765..80f4574d39 100644 --- a/webapp/channels/e2e/cypress/tests/integration/integrations/outgoing_webhook/disable_override_username_profile_spec.js +++ b/e2e/cypress/tests/integration/channels/integrations/outgoing_webhook/disable_override_username_profile_spec.js @@ -7,9 +7,9 @@ // - Use element ID when selecting an element. Create one if none. // *************************************************************** -// Group: @outgoing_webhook +// Group: @channels @outgoing_webhook -import * as TIMEOUTS from '../../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../../fixtures/timeouts'; import { enableUsernameAndIconOverrideInt, diff --git a/webapp/channels/e2e/cypress/tests/integration/integrations/outgoing_webhook/prompt_set_status_spec.js b/e2e/cypress/tests/integration/channels/integrations/outgoing_webhook/prompt_set_status_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/integrations/outgoing_webhook/prompt_set_status_spec.js rename to e2e/cypress/tests/integration/channels/integrations/outgoing_webhook/prompt_set_status_spec.js index fe4581cfa5..47d8ed895e 100644 --- a/webapp/channels/e2e/cypress/tests/integration/integrations/outgoing_webhook/prompt_set_status_spec.js +++ b/e2e/cypress/tests/integration/channels/integrations/outgoing_webhook/prompt_set_status_spec.js @@ -9,7 +9,7 @@ // Stage: @prod -import * as TIMEOUTS from '../../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../../fixtures/timeouts'; describe('Prompting set status', () => { let user1; diff --git a/webapp/channels/e2e/cypress/tests/integration/integrations/outgoing_webhook/regenerate_token_spec.js b/e2e/cypress/tests/integration/channels/integrations/outgoing_webhook/regenerate_token_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/integrations/outgoing_webhook/regenerate_token_spec.js rename to e2e/cypress/tests/integration/channels/integrations/outgoing_webhook/regenerate_token_spec.js index 13d5ce453a..1af4fb27c5 100644 --- a/webapp/channels/e2e/cypress/tests/integration/integrations/outgoing_webhook/regenerate_token_spec.js +++ b/e2e/cypress/tests/integration/channels/integrations/outgoing_webhook/regenerate_token_spec.js @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @integrations +// Group: @channels @integrations describe('Integrations', () => { let testTeam; diff --git a/webapp/channels/e2e/cypress/tests/integration/integrations/outgoing_webhook/search_on_outgoing_webhooks_spec.js b/e2e/cypress/tests/integration/channels/integrations/outgoing_webhook/search_on_outgoing_webhooks_spec.js similarity index 99% rename from webapp/channels/e2e/cypress/tests/integration/integrations/outgoing_webhook/search_on_outgoing_webhooks_spec.js rename to e2e/cypress/tests/integration/channels/integrations/outgoing_webhook/search_on_outgoing_webhooks_spec.js index 0228fb8004..e8c6b7f830 100644 --- a/webapp/channels/e2e/cypress/tests/integration/integrations/outgoing_webhook/search_on_outgoing_webhooks_spec.js +++ b/e2e/cypress/tests/integration/channels/integrations/outgoing_webhook/search_on_outgoing_webhooks_spec.js @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @integrations +// Group: @channels @integrations describe('Integrations', () => { let testTeam; diff --git a/webapp/channels/e2e/cypress/tests/integration/integrations/outgoing_webhook/token_copy_icon_spec.js b/e2e/cypress/tests/integration/channels/integrations/outgoing_webhook/token_copy_icon_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/integrations/outgoing_webhook/token_copy_icon_spec.js rename to e2e/cypress/tests/integration/channels/integrations/outgoing_webhook/token_copy_icon_spec.js index 9a40bffefe..186a1df6b0 100644 --- a/webapp/channels/e2e/cypress/tests/integration/integrations/outgoing_webhook/token_copy_icon_spec.js +++ b/e2e/cypress/tests/integration/channels/integrations/outgoing_webhook/token_copy_icon_spec.js @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @integrations +// Group: @channels @integrations describe('Integrations', () => { let testTeam; diff --git a/webapp/channels/e2e/cypress/tests/integration/integrations/plugin_slash_command_stays_visible_spec.js b/e2e/cypress/tests/integration/channels/integrations/plugin_slash_command_stays_visible_spec.js similarity index 93% rename from webapp/channels/e2e/cypress/tests/integration/integrations/plugin_slash_command_stays_visible_spec.js rename to e2e/cypress/tests/integration/channels/integrations/plugin_slash_command_stays_visible_spec.js index f17c1c24ea..3f1ac9f960 100644 --- a/webapp/channels/e2e/cypress/tests/integration/integrations/plugin_slash_command_stays_visible_spec.js +++ b/e2e/cypress/tests/integration/channels/integrations/plugin_slash_command_stays_visible_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @integrations @plugin @not_cloud +// Group: @channels @integrations @plugin @not_cloud -import {agendaPlugin} from '../../utils/plugins'; +import {agendaPlugin} from '../../../utils/plugins'; describe('Integrations', () => { before(() => { diff --git a/webapp/channels/e2e/cypress/tests/integration/integrations/poll_spec.js b/e2e/cypress/tests/integration/channels/integrations/poll_spec.js similarity index 97% rename from webapp/channels/e2e/cypress/tests/integration/integrations/poll_spec.js rename to e2e/cypress/tests/integration/channels/integrations/poll_spec.js index ff92b42451..cbeb6b91fd 100644 --- a/webapp/channels/e2e/cypress/tests/integration/integrations/poll_spec.js +++ b/e2e/cypress/tests/integration/channels/integrations/poll_spec.js @@ -7,10 +7,10 @@ // - Use element ID when selecting an element. Create one if none. // *************************************************************** -// Group: @plugin @not_cloud +// Group: @channels @plugin @not_cloud -import * as MESSAGES from '../../fixtures/messages'; -import {matterpollPlugin} from '../../utils/plugins'; +import * as MESSAGES from '../../../fixtures/messages'; +import {matterpollPlugin} from '../../../utils/plugins'; describe('/poll', () => { let user1; diff --git a/webapp/channels/e2e/cypress/tests/integration/integrations/regen_token_spec.js b/e2e/cypress/tests/integration/channels/integrations/regen_token_spec.js similarity index 96% rename from webapp/channels/e2e/cypress/tests/integration/integrations/regen_token_spec.js rename to e2e/cypress/tests/integration/channels/integrations/regen_token_spec.js index bb75cdbe3e..ee414b93a2 100644 --- a/webapp/channels/e2e/cypress/tests/integration/integrations/regen_token_spec.js +++ b/e2e/cypress/tests/integration/channels/integrations/regen_token_spec.js @@ -7,9 +7,9 @@ // - Use element ID when selecting an element. Create one if none. // *************************************************************** -// Group: @integrations +// Group: @channels @integrations -import * as TIMEOUTS from '../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; describe('Integrations', () => { let testTeam; diff --git a/webapp/channels/e2e/cypress/tests/integration/integrations/slash_commands_spec.js b/e2e/cypress/tests/integration/channels/integrations/slash_commands_spec.js similarity index 99% rename from webapp/channels/e2e/cypress/tests/integration/integrations/slash_commands_spec.js rename to e2e/cypress/tests/integration/channels/integrations/slash_commands_spec.js index 1175d68146..040cf56df4 100644 --- a/webapp/channels/e2e/cypress/tests/integration/integrations/slash_commands_spec.js +++ b/e2e/cypress/tests/integration/channels/integrations/slash_commands_spec.js @@ -8,13 +8,13 @@ // *************************************************************** // Stage: @prod -// Group: @integrations +// Group: @channels @integrations /** * Note: This test requires webhook server running. Initiate `npm run start:webhook` to start. */ -import {getRandomId} from '../../utils'; +import {getRandomId} from '../../../utils'; describe('Integrations', () => { let user1; diff --git a/webapp/channels/e2e/cypress/tests/integration/interactive_dialog/boolean_spec.js b/e2e/cypress/tests/integration/channels/interactive_dialog/boolean_spec.js similarity index 97% rename from webapp/channels/e2e/cypress/tests/integration/interactive_dialog/boolean_spec.js rename to e2e/cypress/tests/integration/channels/interactive_dialog/boolean_spec.js index 2a5a241d14..06162fbf85 100644 --- a/webapp/channels/e2e/cypress/tests/integration/interactive_dialog/boolean_spec.js +++ b/e2e/cypress/tests/integration/channels/interactive_dialog/boolean_spec.js @@ -8,13 +8,13 @@ // *************************************************************** // Stage: @prod -// Group: @interactive_dialog +// Group: @channels @interactive_dialog /** * Note: This test requires webhook server running. Initiate `npm run start:webhook` to start. */ -const webhookUtils = require('../../../utils/webhook_utils'); +const webhookUtils = require('../../../../utils/webhook_utils'); let createdCommand; let simpleDialog; diff --git a/webapp/channels/e2e/cypress/tests/integration/interactive_dialog/demo_boolean_spec.ts b/e2e/cypress/tests/integration/channels/interactive_dialog/demo_boolean_spec.ts similarity index 99% rename from webapp/channels/e2e/cypress/tests/integration/interactive_dialog/demo_boolean_spec.ts rename to e2e/cypress/tests/integration/channels/interactive_dialog/demo_boolean_spec.ts index 8e2d4cfb12..6b73e2bc38 100644 --- a/webapp/channels/e2e/cypress/tests/integration/interactive_dialog/demo_boolean_spec.ts +++ b/e2e/cypress/tests/integration/channels/interactive_dialog/demo_boolean_spec.ts @@ -7,11 +7,11 @@ // - Use element ID when selecting an element. Create one if none. // *************************************************************** -// Group: @interactive_dialog @plugin +// Group: @channels @interactive_dialog @plugin // If the contents of the interactive dialog from the demo plugin change, please update the demoPluginDialogElements object. -import {demoPlugin} from '../../utils/plugins'; +import {demoPlugin} from '../../../utils/plugins'; describe('Interactive Dialogs', () => { let testTeam; diff --git a/webapp/channels/e2e/cypress/tests/integration/interactive_dialog/full_dialog_spec.js b/e2e/cypress/tests/integration/channels/interactive_dialog/full_dialog_spec.js similarity index 99% rename from webapp/channels/e2e/cypress/tests/integration/interactive_dialog/full_dialog_spec.js rename to e2e/cypress/tests/integration/channels/interactive_dialog/full_dialog_spec.js index e3d03e3e43..e5a1e32309 100644 --- a/webapp/channels/e2e/cypress/tests/integration/interactive_dialog/full_dialog_spec.js +++ b/e2e/cypress/tests/integration/channels/interactive_dialog/full_dialog_spec.js @@ -8,13 +8,13 @@ // *************************************************************** // Stage: @prod -// Group: @interactive_dialog +// Group: @channels @interactive_dialog /** * Note: This test requires webhook server running. Initiate `npm run start:webhook` to start. */ -const webhookUtils = require('../../../utils/webhook_utils'); +const webhookUtils = require('../../../../utils/webhook_utils'); describe('Interactive Dialog', () => { const inputTypes = { diff --git a/webapp/channels/e2e/cypress/tests/integration/interactive_dialog/scrollable_spec.js b/e2e/cypress/tests/integration/channels/interactive_dialog/scrollable_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/interactive_dialog/scrollable_spec.js rename to e2e/cypress/tests/integration/channels/interactive_dialog/scrollable_spec.js index 2cbf3c9461..f54234a997 100644 --- a/webapp/channels/e2e/cypress/tests/integration/interactive_dialog/scrollable_spec.js +++ b/e2e/cypress/tests/integration/channels/interactive_dialog/scrollable_spec.js @@ -8,13 +8,13 @@ // *************************************************************** // Stage: @prod -// Group: @interactive_dialog +// Group: @channels @interactive_dialog /** * Note: This test requires webhook server running. Initiate `npm run start:webhook` to start. */ -const webhookUtils = require('../../../utils/webhook_utils'); +const webhookUtils = require('../../../../utils/webhook_utils'); let createdCommand; let userAndChannelDialog; diff --git a/webapp/channels/e2e/cypress/tests/integration/interactive_dialog/simple_dialog_spec.js b/e2e/cypress/tests/integration/channels/interactive_dialog/simple_dialog_spec.js similarity index 96% rename from webapp/channels/e2e/cypress/tests/integration/interactive_dialog/simple_dialog_spec.js rename to e2e/cypress/tests/integration/channels/interactive_dialog/simple_dialog_spec.js index 704a5de99b..90d97d9d8e 100644 --- a/webapp/channels/e2e/cypress/tests/integration/interactive_dialog/simple_dialog_spec.js +++ b/e2e/cypress/tests/integration/channels/interactive_dialog/simple_dialog_spec.js @@ -8,15 +8,15 @@ // *************************************************************** // Stage: @prod -// Group: @not_cloud @interactive_dialog +// Group: @channels @not_cloud @interactive_dialog /** * Note: This test requires webhook server running. Initiate `npm run start:webhook` to start. */ -import * as TIMEOUTS from '../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; -const webhookUtils = require('../../../utils/webhook_utils'); +const webhookUtils = require('../../../../utils/webhook_utils'); let createdCommand; let simpleDialog; diff --git a/webapp/channels/e2e/cypress/tests/integration/interactive_menu/basic_options_spec.js b/e2e/cypress/tests/integration/channels/interactive_menu/basic_options_spec.js similarity index 99% rename from webapp/channels/e2e/cypress/tests/integration/interactive_menu/basic_options_spec.js rename to e2e/cypress/tests/integration/channels/interactive_menu/basic_options_spec.js index 6d5be28f93..da55c12e78 100644 --- a/webapp/channels/e2e/cypress/tests/integration/interactive_menu/basic_options_spec.js +++ b/e2e/cypress/tests/integration/channels/interactive_menu/basic_options_spec.js @@ -8,15 +8,15 @@ // *************************************************************** // Stage: @prod -// Group: @interactive_menu +// Group: @channels @interactive_menu /** * Note: This test requires webhook server running. Initiate `npm run start:webhook` to start. */ -import messageMenusOptions from '../../fixtures/interactive_message_menus_options.json'; -import {getMessageMenusPayload} from '../../utils'; -import * as TIMEOUTS from '../../fixtures/timeouts'; +import messageMenusOptions from '../../../fixtures/interactive_message_menus_options.json'; +import {getMessageMenusPayload} from '../../../utils'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; const options = [ {text: 'Option 1', value: 'option1'}, diff --git a/webapp/channels/e2e/cypress/tests/integration/interactive_menu/select_with_keys_spec.js b/e2e/cypress/tests/integration/channels/interactive_menu/select_with_keys_spec.js similarity index 97% rename from webapp/channels/e2e/cypress/tests/integration/interactive_menu/select_with_keys_spec.js rename to e2e/cypress/tests/integration/channels/interactive_menu/select_with_keys_spec.js index 4902c47770..9287466c31 100644 --- a/webapp/channels/e2e/cypress/tests/integration/interactive_menu/select_with_keys_spec.js +++ b/e2e/cypress/tests/integration/channels/interactive_menu/select_with_keys_spec.js @@ -8,13 +8,13 @@ // *************************************************************** // Stage: @prod -// Group: @interactive_menu +// Group: @channels @interactive_menu /** * Note: This test requires webhook server running. Initiate `npm run start:webhook` to start. */ -import {getMessageMenusPayload} from '../../utils'; +import {getMessageMenusPayload} from '../../../utils'; const searchOptions = [ {text: 'SearchOption1', value: 'searchoption1'}, diff --git a/webapp/channels/e2e/cypress/tests/integration/interactive_menu/slack_parsing_message_button_spec.js b/e2e/cypress/tests/integration/channels/interactive_menu/slack_parsing_message_button_spec.js similarity index 97% rename from webapp/channels/e2e/cypress/tests/integration/interactive_menu/slack_parsing_message_button_spec.js rename to e2e/cypress/tests/integration/channels/interactive_menu/slack_parsing_message_button_spec.js index a6a4123a9b..799d032ea3 100644 --- a/webapp/channels/e2e/cypress/tests/integration/interactive_menu/slack_parsing_message_button_spec.js +++ b/e2e/cypress/tests/integration/channels/interactive_menu/slack_parsing_message_button_spec.js @@ -8,13 +8,13 @@ // *************************************************************** // Stage: @prod -// Group: @interactive_menu +// Group: @channels @interactive_menu /** * Note: This test requires webhook server running. Initiate `npm run start:webhook` to start. */ -import * as TIMEOUTS from '../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; describe('Interactive Menu', () => { let incomingWebhook; diff --git a/webapp/channels/e2e/cypress/tests/integration/keyboard_shortcuts/alt_option_plus_up_down_spec.js b/e2e/cypress/tests/integration/channels/keyboard_shortcuts/alt_option_plus_up_down_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/keyboard_shortcuts/alt_option_plus_up_down_spec.js rename to e2e/cypress/tests/integration/channels/keyboard_shortcuts/alt_option_plus_up_down_spec.js index bcf731b445..81636afec4 100644 --- a/webapp/channels/e2e/cypress/tests/integration/keyboard_shortcuts/alt_option_plus_up_down_spec.js +++ b/e2e/cypress/tests/integration/channels/keyboard_shortcuts/alt_option_plus_up_down_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @keyboard_shortcuts +// Group: @channels @keyboard_shortcuts -import * as TIMEOUTS from '../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; describe('Keyboard Shortcuts', () => { let sysadmin; diff --git a/webapp/channels/e2e/cypress/tests/integration/keyboard_shortcuts/backspace_spec.js b/e2e/cypress/tests/integration/channels/keyboard_shortcuts/backspace_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/keyboard_shortcuts/backspace_spec.js rename to e2e/cypress/tests/integration/channels/keyboard_shortcuts/backspace_spec.js index 659380cbdc..d352f2ab10 100644 --- a/webapp/channels/e2e/cypress/tests/integration/keyboard_shortcuts/backspace_spec.js +++ b/e2e/cypress/tests/integration/channels/keyboard_shortcuts/backspace_spec.js @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @keyboard_shortcuts +// Group: @channels @keyboard_shortcuts describe('Keyboard Shortcuts', () => { let testUser; diff --git a/webapp/channels/e2e/cypress/tests/integration/keyboard_shortcuts/ctrl_cmd_alt_I_toggles_channel_info_rhs_spec.js b/e2e/cypress/tests/integration/channels/keyboard_shortcuts/ctrl_cmd_alt_I_toggles_channel_info_rhs_spec.js similarity index 97% rename from webapp/channels/e2e/cypress/tests/integration/keyboard_shortcuts/ctrl_cmd_alt_I_toggles_channel_info_rhs_spec.js rename to e2e/cypress/tests/integration/channels/keyboard_shortcuts/ctrl_cmd_alt_I_toggles_channel_info_rhs_spec.js index e101bbf788..04467144d3 100644 --- a/webapp/channels/e2e/cypress/tests/integration/keyboard_shortcuts/ctrl_cmd_alt_I_toggles_channel_info_rhs_spec.js +++ b/e2e/cypress/tests/integration/channels/keyboard_shortcuts/ctrl_cmd_alt_I_toggles_channel_info_rhs_spec.js @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @keyboard_shortcuts +// Group: @channels @keyboard_shortcuts describe('Keyboard Shortcuts', () => { let url; diff --git a/webapp/channels/e2e/cypress/tests/integration/keyboard_shortcuts/ctrl_cmd_k_at_username_spec.js b/e2e/cypress/tests/integration/channels/keyboard_shortcuts/ctrl_cmd_k_at_username_spec.js similarity index 97% rename from webapp/channels/e2e/cypress/tests/integration/keyboard_shortcuts/ctrl_cmd_k_at_username_spec.js rename to e2e/cypress/tests/integration/channels/keyboard_shortcuts/ctrl_cmd_k_at_username_spec.js index d4a92aa2d7..3ea02c3115 100644 --- a/webapp/channels/e2e/cypress/tests/integration/keyboard_shortcuts/ctrl_cmd_k_at_username_spec.js +++ b/e2e/cypress/tests/integration/channels/keyboard_shortcuts/ctrl_cmd_k_at_username_spec.js @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @keyboard_shortcuts +// Group: @channels @keyboard_shortcuts describe('Keyboard Shortcuts', () => { let testTeam; diff --git a/webapp/channels/e2e/cypress/tests/integration/keyboard_shortcuts/ctrl_cmd_k_channel_switch_spec.js b/e2e/cypress/tests/integration/channels/keyboard_shortcuts/ctrl_cmd_k_channel_switch_spec.js similarity index 96% rename from webapp/channels/e2e/cypress/tests/integration/keyboard_shortcuts/ctrl_cmd_k_channel_switch_spec.js rename to e2e/cypress/tests/integration/channels/keyboard_shortcuts/ctrl_cmd_k_channel_switch_spec.js index bda433938c..aece046689 100644 --- a/webapp/channels/e2e/cypress/tests/integration/keyboard_shortcuts/ctrl_cmd_k_channel_switch_spec.js +++ b/e2e/cypress/tests/integration/channels/keyboard_shortcuts/ctrl_cmd_k_channel_switch_spec.js @@ -7,7 +7,7 @@ // - Use element ID when selecting an element. Create one if none. // *************************************************************** -// Group: @keyboard_shortcuts¨ +// Group: @channels @keyboard_shortcuts¨ describe('Keyboard Shortcuts', () => { before(() => { diff --git a/webapp/channels/e2e/cypress/tests/integration/keyboard_shortcuts/ctrl_cmd_k_focuses_message_box_spec.js b/e2e/cypress/tests/integration/channels/keyboard_shortcuts/ctrl_cmd_k_focuses_message_box_spec.js similarity index 94% rename from webapp/channels/e2e/cypress/tests/integration/keyboard_shortcuts/ctrl_cmd_k_focuses_message_box_spec.js rename to e2e/cypress/tests/integration/channels/keyboard_shortcuts/ctrl_cmd_k_focuses_message_box_spec.js index 12d725860e..f8a01b7b02 100644 --- a/webapp/channels/e2e/cypress/tests/integration/keyboard_shortcuts/ctrl_cmd_k_focuses_message_box_spec.js +++ b/e2e/cypress/tests/integration/channels/keyboard_shortcuts/ctrl_cmd_k_focuses_message_box_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @keyboard_shortcuts +// Group: @channels @keyboard_shortcuts -import * as TIMEOUTS from '../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; describe('Keyboard Shortcuts', () => { before(() => { diff --git a/webapp/channels/e2e/cypress/tests/integration/keyboard_shortcuts/ctrl_cmd_k_open_channel_from_global_threads_spec.js b/e2e/cypress/tests/integration/channels/keyboard_shortcuts/ctrl_cmd_k_open_channel_from_global_threads_spec.js similarity index 97% rename from webapp/channels/e2e/cypress/tests/integration/keyboard_shortcuts/ctrl_cmd_k_open_channel_from_global_threads_spec.js rename to e2e/cypress/tests/integration/channels/keyboard_shortcuts/ctrl_cmd_k_open_channel_from_global_threads_spec.js index 6e02e79625..c3792b9c31 100644 --- a/webapp/channels/e2e/cypress/tests/integration/keyboard_shortcuts/ctrl_cmd_k_open_channel_from_global_threads_spec.js +++ b/e2e/cypress/tests/integration/channels/keyboard_shortcuts/ctrl_cmd_k_open_channel_from_global_threads_spec.js @@ -7,9 +7,9 @@ // - Use element ID when selecting an element. Create one if none. // *************************************************************** -// Group: @keyboard_shortcuts +// Group: @channels @keyboard_shortcuts -import * as TIMEOUTS from '../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; describe('Keyboard Shortcuts', () => { let testTeam; diff --git a/webapp/channels/e2e/cypress/tests/integration/keyboard_shortcuts/ctrl_cmd_k_open_gm_with_mouse_spec.js b/e2e/cypress/tests/integration/channels/keyboard_shortcuts/ctrl_cmd_k_open_gm_with_mouse_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/keyboard_shortcuts/ctrl_cmd_k_open_gm_with_mouse_spec.js rename to e2e/cypress/tests/integration/channels/keyboard_shortcuts/ctrl_cmd_k_open_gm_with_mouse_spec.js index 169e9e666d..b413aea16a 100644 --- a/webapp/channels/e2e/cypress/tests/integration/keyboard_shortcuts/ctrl_cmd_k_open_gm_with_mouse_spec.js +++ b/e2e/cypress/tests/integration/channels/keyboard_shortcuts/ctrl_cmd_k_open_gm_with_mouse_spec.js @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @messaging +// Group: @channels @messaging describe('Keyboard Shortcuts', () => { let testTeam; diff --git a/webapp/channels/e2e/cypress/tests/integration/keyboard_shortcuts/ctrl_cmd_k_unreads_spec.js b/e2e/cypress/tests/integration/channels/keyboard_shortcuts/ctrl_cmd_k_unreads_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/keyboard_shortcuts/ctrl_cmd_k_unreads_spec.js rename to e2e/cypress/tests/integration/channels/keyboard_shortcuts/ctrl_cmd_k_unreads_spec.js index 7a703ef83f..49510f489c 100644 --- a/webapp/channels/e2e/cypress/tests/integration/keyboard_shortcuts/ctrl_cmd_k_unreads_spec.js +++ b/e2e/cypress/tests/integration/channels/keyboard_shortcuts/ctrl_cmd_k_unreads_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @keyboard_shortcuts +// Group: @channels @keyboard_shortcuts -import * as TIMEOUTS from '../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; describe('Keyboard Shortcuts', () => { let testUser; diff --git a/webapp/channels/e2e/cypress/tests/integration/keyboard_shortcuts/ctrl_cmd_k_user_from_other_team_spec.js b/e2e/cypress/tests/integration/channels/keyboard_shortcuts/ctrl_cmd_k_user_from_other_team_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/keyboard_shortcuts/ctrl_cmd_k_user_from_other_team_spec.js rename to e2e/cypress/tests/integration/channels/keyboard_shortcuts/ctrl_cmd_k_user_from_other_team_spec.js index 30c29dc582..9d54f0dc94 100644 --- a/webapp/channels/e2e/cypress/tests/integration/keyboard_shortcuts/ctrl_cmd_k_user_from_other_team_spec.js +++ b/e2e/cypress/tests/integration/channels/keyboard_shortcuts/ctrl_cmd_k_user_from_other_team_spec.js @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @keyboard_shortcuts +// Group: @channels @keyboard_shortcuts describe('Keyboard Shortcuts', () => { beforeEach(() => { diff --git a/webapp/channels/e2e/cypress/tests/integration/keyboard_shortcuts/ctrl_cmd_l_set_message_focus_spec.js b/e2e/cypress/tests/integration/channels/keyboard_shortcuts/ctrl_cmd_l_set_message_focus_spec.js similarity index 97% rename from webapp/channels/e2e/cypress/tests/integration/keyboard_shortcuts/ctrl_cmd_l_set_message_focus_spec.js rename to e2e/cypress/tests/integration/channels/keyboard_shortcuts/ctrl_cmd_l_set_message_focus_spec.js index 910e58338d..d119914af9 100644 --- a/webapp/channels/e2e/cypress/tests/integration/keyboard_shortcuts/ctrl_cmd_l_set_message_focus_spec.js +++ b/e2e/cypress/tests/integration/channels/keyboard_shortcuts/ctrl_cmd_l_set_message_focus_spec.js @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @keyboard_shortcuts +// Group: @channels @keyboard_shortcuts describe('Keyboard Shortcuts', () => { before(() => { diff --git a/webapp/channels/e2e/cypress/tests/integration/keyboard_shortcuts/ctrl_cmd_shift_a_account_settings_spec.js b/e2e/cypress/tests/integration/channels/keyboard_shortcuts/ctrl_cmd_shift_a_account_settings_spec.js similarity index 97% rename from webapp/channels/e2e/cypress/tests/integration/keyboard_shortcuts/ctrl_cmd_shift_a_account_settings_spec.js rename to e2e/cypress/tests/integration/channels/keyboard_shortcuts/ctrl_cmd_shift_a_account_settings_spec.js index 4556ea4964..9816358250 100644 --- a/webapp/channels/e2e/cypress/tests/integration/keyboard_shortcuts/ctrl_cmd_shift_a_account_settings_spec.js +++ b/e2e/cypress/tests/integration/channels/keyboard_shortcuts/ctrl_cmd_shift_a_account_settings_spec.js @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @keyboard_shortcuts +// Group: @channels @keyboard_shortcuts describe('Keyboard Shortcuts', () => { before(() => { diff --git a/webapp/channels/e2e/cypress/tests/integration/keyboard_shortcuts/ctrl_cmd_shift_l_does_not_change_focus_to_msgbox_spec.js b/e2e/cypress/tests/integration/channels/keyboard_shortcuts/ctrl_cmd_shift_l_does_not_change_focus_to_msgbox_spec.js similarity index 97% rename from webapp/channels/e2e/cypress/tests/integration/keyboard_shortcuts/ctrl_cmd_shift_l_does_not_change_focus_to_msgbox_spec.js rename to e2e/cypress/tests/integration/channels/keyboard_shortcuts/ctrl_cmd_shift_l_does_not_change_focus_to_msgbox_spec.js index 6638a9b5c7..1b785f3fb1 100644 --- a/webapp/channels/e2e/cypress/tests/integration/keyboard_shortcuts/ctrl_cmd_shift_l_does_not_change_focus_to_msgbox_spec.js +++ b/e2e/cypress/tests/integration/channels/keyboard_shortcuts/ctrl_cmd_shift_l_does_not_change_focus_to_msgbox_spec.js @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @keyboard_shortcuts +// Group: @channels @keyboard_shortcuts describe('Keyboard Shortcuts', () => { before(() => { diff --git a/webapp/channels/e2e/cypress/tests/integration/keyboard_shortcuts/ctrl_cmd_shift_m_spec.js b/e2e/cypress/tests/integration/channels/keyboard_shortcuts/ctrl_cmd_shift_m_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/keyboard_shortcuts/ctrl_cmd_shift_m_spec.js rename to e2e/cypress/tests/integration/channels/keyboard_shortcuts/ctrl_cmd_shift_m_spec.js index 66bf9a5d02..c51dd2b944 100644 --- a/webapp/channels/e2e/cypress/tests/integration/keyboard_shortcuts/ctrl_cmd_shift_m_spec.js +++ b/e2e/cypress/tests/integration/channels/keyboard_shortcuts/ctrl_cmd_shift_m_spec.js @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @keyboard_shortcuts +// Group: @channels @keyboard_shortcuts describe('Keyboard Shortcuts', () => { let testTeam; diff --git a/webapp/channels/e2e/cypress/tests/integration/keyboard_shortcuts/ctrl_cmd_shift_slash/helpers.js b/e2e/cypress/tests/integration/channels/keyboard_shortcuts/ctrl_cmd_shift_slash/helpers.js similarity index 95% rename from webapp/channels/e2e/cypress/tests/integration/keyboard_shortcuts/ctrl_cmd_shift_slash/helpers.js rename to e2e/cypress/tests/integration/channels/keyboard_shortcuts/ctrl_cmd_shift_slash/helpers.js index 26f74338c2..fcd6179a9b 100644 --- a/webapp/channels/e2e/cypress/tests/integration/keyboard_shortcuts/ctrl_cmd_shift_slash/helpers.js +++ b/e2e/cypress/tests/integration/channels/keyboard_shortcuts/ctrl_cmd_shift_slash/helpers.js @@ -1,7 +1,7 @@ // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. // See LICENSE.txt for license information. -import * as TIMEOUTS from '../../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../../fixtures/timeouts'; /** * Fires off keyboard shortcut for "React to last message" diff --git a/webapp/channels/e2e/cypress/tests/integration/keyboard_shortcuts/ctrl_cmd_shift_slash/not_open_emoji_picker_spec.js b/e2e/cypress/tests/integration/channels/keyboard_shortcuts/ctrl_cmd_shift_slash/not_open_emoji_picker_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/keyboard_shortcuts/ctrl_cmd_shift_slash/not_open_emoji_picker_spec.js rename to e2e/cypress/tests/integration/channels/keyboard_shortcuts/ctrl_cmd_shift_slash/not_open_emoji_picker_spec.js index bec1c8f5c5..ec1d9f39f6 100644 --- a/webapp/channels/e2e/cypress/tests/integration/keyboard_shortcuts/ctrl_cmd_shift_slash/not_open_emoji_picker_spec.js +++ b/e2e/cypress/tests/integration/channels/keyboard_shortcuts/ctrl_cmd_shift_slash/not_open_emoji_picker_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @emoji @keyboard_shortcuts +// Group: @channels @emoji @keyboard_shortcuts -import * as MESSAGES from '../../../fixtures/messages'; +import * as MESSAGES from '../../../../fixtures/messages'; import { doReactToLastMessageShortcut, diff --git a/webapp/channels/e2e/cypress/tests/integration/keyboard_shortcuts/ctrl_cmd_shift_slash/react_to_center_spec.js b/e2e/cypress/tests/integration/channels/keyboard_shortcuts/ctrl_cmd_shift_slash/react_to_center_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/keyboard_shortcuts/ctrl_cmd_shift_slash/react_to_center_spec.js rename to e2e/cypress/tests/integration/channels/keyboard_shortcuts/ctrl_cmd_shift_slash/react_to_center_spec.js index ad358cfaf8..c75dd0200b 100644 --- a/webapp/channels/e2e/cypress/tests/integration/keyboard_shortcuts/ctrl_cmd_shift_slash/react_to_center_spec.js +++ b/e2e/cypress/tests/integration/channels/keyboard_shortcuts/ctrl_cmd_shift_slash/react_to_center_spec.js @@ -8,10 +8,10 @@ // *************************************************************** // Stage: @prod -// Group: @emoji @keyboard_shortcuts +// Group: @channels @emoji @keyboard_shortcuts -import * as TIMEOUTS from '../../../fixtures/timeouts'; -import * as MESSAGES from '../../../fixtures/messages'; +import * as TIMEOUTS from '../../../../fixtures/timeouts'; +import * as MESSAGES from '../../../../fixtures/messages'; import { checkReactionFromPost, diff --git a/webapp/channels/e2e/cypress/tests/integration/keyboard_shortcuts/ctrl_cmd_shift_slash/react_to_rhs_spec.js b/e2e/cypress/tests/integration/channels/keyboard_shortcuts/ctrl_cmd_shift_slash/react_to_rhs_spec.js similarity index 95% rename from webapp/channels/e2e/cypress/tests/integration/keyboard_shortcuts/ctrl_cmd_shift_slash/react_to_rhs_spec.js rename to e2e/cypress/tests/integration/channels/keyboard_shortcuts/ctrl_cmd_shift_slash/react_to_rhs_spec.js index ac9631f23b..d00dfc5fc8 100644 --- a/webapp/channels/e2e/cypress/tests/integration/keyboard_shortcuts/ctrl_cmd_shift_slash/react_to_rhs_spec.js +++ b/e2e/cypress/tests/integration/channels/keyboard_shortcuts/ctrl_cmd_shift_slash/react_to_rhs_spec.js @@ -8,10 +8,10 @@ // *************************************************************** // Stage: @prod -// Group: @emoji @keyboard_shortcuts +// Group: @channels @emoji @keyboard_shortcuts -import * as TIMEOUTS from '../../../fixtures/timeouts'; -import * as MESSAGES from '../../../fixtures/messages'; +import * as TIMEOUTS from '../../../../fixtures/timeouts'; +import * as MESSAGES from '../../../../fixtures/messages'; import { checkReactionFromPost, diff --git a/webapp/channels/e2e/cypress/tests/integration/keyboard_shortcuts/ctrl_cmd_up_down_in_rhs_spec.js b/e2e/cypress/tests/integration/channels/keyboard_shortcuts/ctrl_cmd_up_down_in_rhs_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/keyboard_shortcuts/ctrl_cmd_up_down_in_rhs_spec.js rename to e2e/cypress/tests/integration/channels/keyboard_shortcuts/ctrl_cmd_up_down_in_rhs_spec.js index 256a28ab76..3036d0c803 100644 --- a/webapp/channels/e2e/cypress/tests/integration/keyboard_shortcuts/ctrl_cmd_up_down_in_rhs_spec.js +++ b/e2e/cypress/tests/integration/channels/keyboard_shortcuts/ctrl_cmd_up_down_in_rhs_spec.js @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @keyboard_shortcuts +// Group: @channels @keyboard_shortcuts describe('Keyboard Shortcuts', () => { before(() => { diff --git a/webapp/channels/e2e/cypress/tests/integration/keyboard_shortcuts/ctrl_cmd_up_down_no_action_spec.js b/e2e/cypress/tests/integration/channels/keyboard_shortcuts/ctrl_cmd_up_down_no_action_spec.js similarity index 94% rename from webapp/channels/e2e/cypress/tests/integration/keyboard_shortcuts/ctrl_cmd_up_down_no_action_spec.js rename to e2e/cypress/tests/integration/channels/keyboard_shortcuts/ctrl_cmd_up_down_no_action_spec.js index 8b06c8813e..3936f122db 100644 --- a/webapp/channels/e2e/cypress/tests/integration/keyboard_shortcuts/ctrl_cmd_up_down_no_action_spec.js +++ b/e2e/cypress/tests/integration/channels/keyboard_shortcuts/ctrl_cmd_up_down_no_action_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @keyboard_shortcuts +// Group: @channels @keyboard_shortcuts -import * as TIMEOUTS from '../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; describe('Keyboard Shortcuts', () => { before(() => { diff --git a/webapp/channels/e2e/cypress/tests/integration/keyboard_shortcuts/dot_menu_spec.js b/e2e/cypress/tests/integration/channels/keyboard_shortcuts/dot_menu_spec.js similarity index 96% rename from webapp/channels/e2e/cypress/tests/integration/keyboard_shortcuts/dot_menu_spec.js rename to e2e/cypress/tests/integration/channels/keyboard_shortcuts/dot_menu_spec.js index 799512725a..6e495bc454 100644 --- a/webapp/channels/e2e/cypress/tests/integration/keyboard_shortcuts/dot_menu_spec.js +++ b/e2e/cypress/tests/integration/channels/keyboard_shortcuts/dot_menu_spec.js @@ -8,10 +8,10 @@ // *************************************************************** // Stage: @prod -// Group: @keyboard_shortcuts +// Group: @channels @keyboard_shortcuts -import {beUnread} from '../../support/assertions'; -import {stubClipboard} from '../../utils'; +import {beUnread} from '../../../support/assertions'; +import {stubClipboard} from '../../../utils'; describe('Keyboard Shortcuts', () => { let testTeam; @@ -100,7 +100,6 @@ describe('Keyboard Shortcuts', () => { cy.viewport('iphone-6'); // # Save Post - cy.pause(); cy.uiPostDropdownMenuShortcut(postId, 'Save', 'S', 'RHS_ROOT'); // * Verify post is Saved diff --git a/webapp/channels/e2e/cypress/tests/integration/keyboard_shortcuts/esc_close_modal_spec.js b/e2e/cypress/tests/integration/channels/keyboard_shortcuts/esc_close_modal_spec.js similarity index 97% rename from webapp/channels/e2e/cypress/tests/integration/keyboard_shortcuts/esc_close_modal_spec.js rename to e2e/cypress/tests/integration/channels/keyboard_shortcuts/esc_close_modal_spec.js index e689669fd8..44aa605b0b 100644 --- a/webapp/channels/e2e/cypress/tests/integration/keyboard_shortcuts/esc_close_modal_spec.js +++ b/e2e/cypress/tests/integration/channels/keyboard_shortcuts/esc_close_modal_spec.js @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @keyboard_shortcuts +// Group: @channels @keyboard_shortcuts describe('Keyboard Shortcuts', () => { let channelUrl; diff --git a/webapp/channels/e2e/cypress/tests/integration/keyboard_shortcuts/keyboard_shortcuts_1_spec.js b/e2e/cypress/tests/integration/channels/keyboard_shortcuts/keyboard_shortcuts_1_spec.js similarity index 99% rename from webapp/channels/e2e/cypress/tests/integration/keyboard_shortcuts/keyboard_shortcuts_1_spec.js rename to e2e/cypress/tests/integration/channels/keyboard_shortcuts/keyboard_shortcuts_1_spec.js index 322c595083..61fb30d804 100644 --- a/webapp/channels/e2e/cypress/tests/integration/keyboard_shortcuts/keyboard_shortcuts_1_spec.js +++ b/e2e/cypress/tests/integration/channels/keyboard_shortcuts/keyboard_shortcuts_1_spec.js @@ -8,10 +8,10 @@ // *************************************************************** // Stage: @prod -// Group: @keyboard_shortcuts +// Group: @channels @keyboard_shortcuts -import * as messages from '../../fixtures/messages'; -import * as TIMEOUTS from '../../fixtures/timeouts'; +import * as messages from '../../../fixtures/messages'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; describe('Keyboard Shortcuts', () => { let testTeam; diff --git a/webapp/channels/e2e/cypress/tests/integration/keyboard_shortcuts/keyboard_shortcuts_2_spec.js b/e2e/cypress/tests/integration/channels/keyboard_shortcuts/keyboard_shortcuts_2_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/keyboard_shortcuts/keyboard_shortcuts_2_spec.js rename to e2e/cypress/tests/integration/channels/keyboard_shortcuts/keyboard_shortcuts_2_spec.js index da38cc4385..6b4a9b3346 100644 --- a/webapp/channels/e2e/cypress/tests/integration/keyboard_shortcuts/keyboard_shortcuts_2_spec.js +++ b/e2e/cypress/tests/integration/channels/keyboard_shortcuts/keyboard_shortcuts_2_spec.js @@ -8,10 +8,10 @@ // *************************************************************** // Stage: @prod -// Group: @keyboard_shortcuts +// Group: @channels @keyboard_shortcuts -import * as TIMEOUTS from '../../fixtures/timeouts'; -import {isMac} from '../../utils'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; +import {isMac} from '../../../utils'; describe('Keyboard Shortcuts', () => { let testTeam; diff --git a/webapp/channels/e2e/cypress/tests/integration/keyboard_shortcuts/keyboard_shortcuts_3_spec.js b/e2e/cypress/tests/integration/channels/keyboard_shortcuts/keyboard_shortcuts_3_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/keyboard_shortcuts/keyboard_shortcuts_3_spec.js rename to e2e/cypress/tests/integration/channels/keyboard_shortcuts/keyboard_shortcuts_3_spec.js index 60332191a2..125bcc6016 100644 --- a/webapp/channels/e2e/cypress/tests/integration/keyboard_shortcuts/keyboard_shortcuts_3_spec.js +++ b/e2e/cypress/tests/integration/channels/keyboard_shortcuts/keyboard_shortcuts_3_spec.js @@ -7,9 +7,9 @@ // - Use element ID when selecting an element. Create one if none. // *************************************************************** -// Group: @keyboard_shortcuts +// Group: @channels @keyboard_shortcuts -import {isMac} from '../../utils'; +import {isMac} from '../../../utils'; describe('Keyboard Shortcuts', () => { const count = 5; diff --git a/webapp/channels/e2e/cypress/tests/integration/keyboard_shortcuts/shift_up_focuses_on_rhs_spec.js b/e2e/cypress/tests/integration/channels/keyboard_shortcuts/shift_up_focuses_on_rhs_spec.js similarity index 97% rename from webapp/channels/e2e/cypress/tests/integration/keyboard_shortcuts/shift_up_focuses_on_rhs_spec.js rename to e2e/cypress/tests/integration/channels/keyboard_shortcuts/shift_up_focuses_on_rhs_spec.js index 8af866c395..125fbe5cfc 100644 --- a/webapp/channels/e2e/cypress/tests/integration/keyboard_shortcuts/shift_up_focuses_on_rhs_spec.js +++ b/e2e/cypress/tests/integration/channels/keyboard_shortcuts/shift_up_focuses_on_rhs_spec.js @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @keyboard_shortcuts +// Group: @channels @keyboard_shortcuts describe('Keyboard Shortcuts', () => { before(() => { diff --git a/webapp/channels/e2e/cypress/tests/integration/keyboard_shortcuts/system_message_not_open_for_edit_spec.js b/e2e/cypress/tests/integration/channels/keyboard_shortcuts/system_message_not_open_for_edit_spec.js similarity index 97% rename from webapp/channels/e2e/cypress/tests/integration/keyboard_shortcuts/system_message_not_open_for_edit_spec.js rename to e2e/cypress/tests/integration/channels/keyboard_shortcuts/system_message_not_open_for_edit_spec.js index 4de19e7e6b..685f54985c 100644 --- a/webapp/channels/e2e/cypress/tests/integration/keyboard_shortcuts/system_message_not_open_for_edit_spec.js +++ b/e2e/cypress/tests/integration/channels/keyboard_shortcuts/system_message_not_open_for_edit_spec.js @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @keyboard_shortcuts +// Group: @channels @keyboard_shortcuts describe('Keyboard Shortcuts', () => { before(() => { diff --git a/webapp/channels/e2e/cypress/tests/integration/keyboard_shortcuts/up_arrow_edit_message_rhs_spec.js b/e2e/cypress/tests/integration/channels/keyboard_shortcuts/up_arrow_edit_message_rhs_spec.js similarity index 97% rename from webapp/channels/e2e/cypress/tests/integration/keyboard_shortcuts/up_arrow_edit_message_rhs_spec.js rename to e2e/cypress/tests/integration/channels/keyboard_shortcuts/up_arrow_edit_message_rhs_spec.js index 29415d77df..a76bbdf697 100644 --- a/webapp/channels/e2e/cypress/tests/integration/keyboard_shortcuts/up_arrow_edit_message_rhs_spec.js +++ b/e2e/cypress/tests/integration/channels/keyboard_shortcuts/up_arrow_edit_message_rhs_spec.js @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @keyboard_shortcuts +// Group: @channels @keyboard_shortcuts describe('Keyboard Shortcuts', () => { before(() => { diff --git a/webapp/channels/e2e/cypress/tests/integration/keyboard_shortcuts/up_arrow_edit_message_spec.js b/e2e/cypress/tests/integration/channels/keyboard_shortcuts/up_arrow_edit_message_spec.js similarity index 99% rename from webapp/channels/e2e/cypress/tests/integration/keyboard_shortcuts/up_arrow_edit_message_spec.js rename to e2e/cypress/tests/integration/channels/keyboard_shortcuts/up_arrow_edit_message_spec.js index 89e0b223ca..3b8cc06468 100644 --- a/webapp/channels/e2e/cypress/tests/integration/keyboard_shortcuts/up_arrow_edit_message_spec.js +++ b/e2e/cypress/tests/integration/channels/keyboard_shortcuts/up_arrow_edit_message_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @keyboard_shortcuts +// Group: @channels @keyboard_shortcuts -import * as TIMEOUTS from '../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; describe('Keyboard Shortcuts', () => { let testTeam; diff --git a/webapp/channels/e2e/cypress/tests/integration/large_data_sets/unreads_channels_spec.ts b/e2e/cypress/tests/integration/channels/large_data_sets/unreads_channels_spec.ts similarity index 96% rename from webapp/channels/e2e/cypress/tests/integration/large_data_sets/unreads_channels_spec.ts rename to e2e/cypress/tests/integration/channels/large_data_sets/unreads_channels_spec.ts index dde7997abb..5054cda1d4 100644 --- a/webapp/channels/e2e/cypress/tests/integration/large_data_sets/unreads_channels_spec.ts +++ b/e2e/cypress/tests/integration/channels/large_data_sets/unreads_channels_spec.ts @@ -1,7 +1,7 @@ // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. // See LICENSE.txt for license information. -import * as TIMEOUTS from '../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; // *************************************************************** // - [#] indicates a test step (e.g. # Go to a page) @@ -10,7 +10,7 @@ import * as TIMEOUTS from '../../fixtures/timeouts'; // *************************************************************** // Stage: @prod -// Group: @large_data_set +// Group: @channels @large_data_set describe('unreads channels', () => { let adminUser: Cypress.UserProfile; diff --git a/webapp/channels/e2e/cypress/tests/integration/mark_as_unread/archive_channel_mark_as_unread_spec.js b/e2e/cypress/tests/integration/channels/mark_as_unread/archive_channel_mark_as_unread_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/mark_as_unread/archive_channel_mark_as_unread_spec.js rename to e2e/cypress/tests/integration/channels/mark_as_unread/archive_channel_mark_as_unread_spec.js index b19fcb6110..848d6c5cd2 100644 --- a/webapp/channels/e2e/cypress/tests/integration/mark_as_unread/archive_channel_mark_as_unread_spec.js +++ b/e2e/cypress/tests/integration/channels/mark_as_unread/archive_channel_mark_as_unread_spec.js @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @mark_as_unread +// Group: @channels @mark_as_unread import {notShowCursor, markAsUnreadShouldBeAbsent} from './helpers'; diff --git a/webapp/channels/e2e/cypress/tests/integration/mark_as_unread/bot_post_mark_as_unread_spec.js b/e2e/cypress/tests/integration/channels/mark_as_unread/bot_post_mark_as_unread_spec.js similarity index 96% rename from webapp/channels/e2e/cypress/tests/integration/mark_as_unread/bot_post_mark_as_unread_spec.js rename to e2e/cypress/tests/integration/channels/mark_as_unread/bot_post_mark_as_unread_spec.js index 9649487591..23c53c7b3d 100644 --- a/webapp/channels/e2e/cypress/tests/integration/mark_as_unread/bot_post_mark_as_unread_spec.js +++ b/e2e/cypress/tests/integration/channels/mark_as_unread/bot_post_mark_as_unread_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @mark_as_unread +// Group: @channels @mark_as_unread -import {beUnread} from '../../support/assertions'; +import {beUnread} from '../../../support/assertions'; import {markAsUnreadFromPost, verifyPostNextToNewMessageSeparator} from './helpers'; diff --git a/webapp/channels/e2e/cypress/tests/integration/mark_as_unread/channel_unread_spec.js b/e2e/cypress/tests/integration/channels/mark_as_unread/channel_unread_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/mark_as_unread/channel_unread_spec.js rename to e2e/cypress/tests/integration/channels/mark_as_unread/channel_unread_spec.js index 49905d24de..817a1a3fe3 100644 --- a/webapp/channels/e2e/cypress/tests/integration/mark_as_unread/channel_unread_spec.js +++ b/e2e/cypress/tests/integration/channels/mark_as_unread/channel_unread_spec.js @@ -7,9 +7,9 @@ // - Use element ID when selecting an element. Create one if none. // *************************************************************** -// Group: @channel +// Group: @channels @channel -import {beRead, beUnread} from '../../support/assertions'; +import {beRead, beUnread} from '../../../support/assertions'; import {verifyPostNextToNewMessageSeparator, switchToChannel} from './helpers'; diff --git a/webapp/channels/e2e/cypress/tests/integration/mark_as_unread/helpers.js b/e2e/cypress/tests/integration/channels/mark_as_unread/helpers.js similarity index 97% rename from webapp/channels/e2e/cypress/tests/integration/mark_as_unread/helpers.js rename to e2e/cypress/tests/integration/channels/mark_as_unread/helpers.js index 165963c252..4482bcb782 100644 --- a/webapp/channels/e2e/cypress/tests/integration/mark_as_unread/helpers.js +++ b/e2e/cypress/tests/integration/channels/mark_as_unread/helpers.js @@ -1,7 +1,7 @@ // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. // See LICENSE.txt for license information. -import * as TIMEOUTS from '../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; export function markAsUnreadFromPost(post, rhs = false) { const prefix = rhs ? 'rhsPost' : 'post'; diff --git a/webapp/channels/e2e/cypress/tests/integration/mark_as_unread/leave_channel_unread_spec.js b/e2e/cypress/tests/integration/channels/mark_as_unread/leave_channel_unread_spec.js similarity index 96% rename from webapp/channels/e2e/cypress/tests/integration/mark_as_unread/leave_channel_unread_spec.js rename to e2e/cypress/tests/integration/channels/mark_as_unread/leave_channel_unread_spec.js index 873c9d946e..0fc569f13d 100644 --- a/webapp/channels/e2e/cypress/tests/integration/mark_as_unread/leave_channel_unread_spec.js +++ b/e2e/cypress/tests/integration/channels/mark_as_unread/leave_channel_unread_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @mark_as_unread +// Group: @channels @mark_as_unread -import {beRead, beUnread} from '../../support/assertions'; +import {beRead, beUnread} from '../../../support/assertions'; import {markAsUnreadFromPost, switchToChannel} from './helpers'; diff --git a/webapp/channels/e2e/cypress/tests/integration/mark_as_unread/mark_as_unread_spec.js b/e2e/cypress/tests/integration/channels/mark_as_unread/mark_as_unread_spec.js similarity index 99% rename from webapp/channels/e2e/cypress/tests/integration/mark_as_unread/mark_as_unread_spec.js rename to e2e/cypress/tests/integration/channels/mark_as_unread/mark_as_unread_spec.js index 55c1e474ed..943fcbfe8e 100644 --- a/webapp/channels/e2e/cypress/tests/integration/mark_as_unread/mark_as_unread_spec.js +++ b/e2e/cypress/tests/integration/channels/mark_as_unread/mark_as_unread_spec.js @@ -7,9 +7,9 @@ // - Use element ID when selecting an element. Create one if none. // *************************************************************** -// Group: @mark_as_unread +// Group: @channels @mark_as_unread -import {beRead, beUnread} from '../../support/assertions'; +import {beRead, beUnread} from '../../../support/assertions'; import {verifyPostNextToNewMessageSeparator, verifyTopSpaceForNewMessage, verifyBottomSpaceForNewMessage, switchToChannel, showCursor, notShowCursor} from './helpers'; diff --git a/webapp/channels/e2e/cypress/tests/integration/mark_as_unread/mark_as_unread_using_shortcuts_spec.js b/e2e/cypress/tests/integration/channels/mark_as_unread/mark_as_unread_using_shortcuts_spec.js similarity index 97% rename from webapp/channels/e2e/cypress/tests/integration/mark_as_unread/mark_as_unread_using_shortcuts_spec.js rename to e2e/cypress/tests/integration/channels/mark_as_unread/mark_as_unread_using_shortcuts_spec.js index 2095108e38..b0546edf45 100644 --- a/webapp/channels/e2e/cypress/tests/integration/mark_as_unread/mark_as_unread_using_shortcuts_spec.js +++ b/e2e/cypress/tests/integration/channels/mark_as_unread/mark_as_unread_using_shortcuts_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @mark_as_unread +// Group: @channels @mark_as_unread -import {beRead, beUnread} from '../../support/assertions'; +import {beRead, beUnread} from '../../../support/assertions'; import {verifyPostNextToNewMessageSeparator, switchToChannel, showCursor} from './helpers'; diff --git a/webapp/channels/e2e/cypress/tests/integration/mark_as_unread/mark_dm_post_as_unread_spec.js b/e2e/cypress/tests/integration/channels/mark_as_unread/mark_dm_post_as_unread_spec.js similarity index 99% rename from webapp/channels/e2e/cypress/tests/integration/mark_as_unread/mark_dm_post_as_unread_spec.js rename to e2e/cypress/tests/integration/channels/mark_as_unread/mark_dm_post_as_unread_spec.js index 73886772ab..c08651e3d0 100644 --- a/webapp/channels/e2e/cypress/tests/integration/mark_as_unread/mark_dm_post_as_unread_spec.js +++ b/e2e/cypress/tests/integration/channels/mark_as_unread/mark_dm_post_as_unread_spec.js @@ -7,7 +7,7 @@ // - Use element ID when selecting an element. Create one if none. // *************************************************************** -// Group: @messaging +// Group: @channels @messaging import {verifyPostNextToNewMessageSeparator} from './helpers'; diff --git a/webapp/channels/e2e/cypress/tests/integration/mark_as_unread/mark_gm_as_unread_spec.js b/e2e/cypress/tests/integration/channels/mark_as_unread/mark_gm_as_unread_spec.js similarity index 97% rename from webapp/channels/e2e/cypress/tests/integration/mark_as_unread/mark_gm_as_unread_spec.js rename to e2e/cypress/tests/integration/channels/mark_as_unread/mark_gm_as_unread_spec.js index 6a08d697ad..c4a13a0628 100644 --- a/webapp/channels/e2e/cypress/tests/integration/mark_as_unread/mark_gm_as_unread_spec.js +++ b/e2e/cypress/tests/integration/channels/mark_as_unread/mark_gm_as_unread_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @mark_as_unread +// Group: @channels @mark_as_unread -import * as TIMEOUTS from '../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; import {verifyPostNextToNewMessageSeparator} from './helpers'; diff --git a/webapp/channels/e2e/cypress/tests/integration/mark_as_unread/mark_mentions_as_unread_spec.js b/e2e/cypress/tests/integration/channels/mark_as_unread/mark_mentions_as_unread_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/mark_as_unread/mark_mentions_as_unread_spec.js rename to e2e/cypress/tests/integration/channels/mark_as_unread/mark_mentions_as_unread_spec.js index 528e794da2..633acaf335 100644 --- a/webapp/channels/e2e/cypress/tests/integration/mark_as_unread/mark_mentions_as_unread_spec.js +++ b/e2e/cypress/tests/integration/channels/mark_as_unread/mark_mentions_as_unread_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @mark_as_unread +// Group: @channels @mark_as_unread -import {beUnread} from '../../support/assertions'; +import {beUnread} from '../../../support/assertions'; import {verifyPostNextToNewMessageSeparator, switchToChannel} from './helpers'; diff --git a/webapp/channels/e2e/cypress/tests/integration/mark_as_unread/toast_appears_unread_spec.js b/e2e/cypress/tests/integration/channels/mark_as_unread/toast_appears_unread_spec.js similarity index 99% rename from webapp/channels/e2e/cypress/tests/integration/mark_as_unread/toast_appears_unread_spec.js rename to e2e/cypress/tests/integration/channels/mark_as_unread/toast_appears_unread_spec.js index 430486e553..7cbc85ae6a 100644 --- a/webapp/channels/e2e/cypress/tests/integration/mark_as_unread/toast_appears_unread_spec.js +++ b/e2e/cypress/tests/integration/channels/mark_as_unread/toast_appears_unread_spec.js @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @mark_as_unread +// Group: @channels @mark_as_unread import {markAsUnreadFromPost, switchToChannel} from './helpers'; diff --git a/webapp/channels/e2e/cypress/tests/integration/mark_as_unread/unread_toast_count_spec.js b/e2e/cypress/tests/integration/channels/mark_as_unread/unread_toast_count_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/mark_as_unread/unread_toast_count_spec.js rename to e2e/cypress/tests/integration/channels/mark_as_unread/unread_toast_count_spec.js index 3fa590f09b..871d9f4aef 100644 --- a/webapp/channels/e2e/cypress/tests/integration/mark_as_unread/unread_toast_count_spec.js +++ b/e2e/cypress/tests/integration/channels/mark_as_unread/unread_toast_count_spec.js @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @mark_as_unread +// Group: @channels @mark_as_unread describe('Verify unread toast appears after repeated manual marking post as unread', () => { let currentChannel; diff --git a/webapp/channels/e2e/cypress/tests/integration/markdown/markdown_image_spec.js b/e2e/cypress/tests/integration/channels/markdown/markdown_image_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/markdown/markdown_image_spec.js rename to e2e/cypress/tests/integration/channels/markdown/markdown_image_spec.js index 1754e7f123..c7ab762957 100644 --- a/webapp/channels/e2e/cypress/tests/integration/markdown/markdown_image_spec.js +++ b/e2e/cypress/tests/integration/channels/markdown/markdown_image_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @markdown @not_cloud +// Group: @channels @markdown @not_cloud -import * as TIMEOUTS from '../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; describe('Markdown', () => { before(() => { diff --git a/webapp/channels/e2e/cypress/tests/integration/markdown/markdown_text_spec.js b/e2e/cypress/tests/integration/channels/markdown/markdown_text_spec.js similarity index 97% rename from webapp/channels/e2e/cypress/tests/integration/markdown/markdown_text_spec.js rename to e2e/cypress/tests/integration/channels/markdown/markdown_text_spec.js index 20fb46a4a0..abb8f91f57 100644 --- a/webapp/channels/e2e/cypress/tests/integration/markdown/markdown_text_spec.js +++ b/e2e/cypress/tests/integration/channels/markdown/markdown_text_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @markdown @not_cloud +// Group: @channels @markdown @not_cloud -import * as TIMEOUTS from '../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; const testCases = [ {name: 'Markdown - basic', fileKey: 'markdown_basic'}, diff --git a/webapp/channels/e2e/cypress/tests/integration/menus/main_menu_spec.js b/e2e/cypress/tests/integration/channels/menus/main_menu_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/menus/main_menu_spec.js rename to e2e/cypress/tests/integration/channels/menus/main_menu_spec.js index 587f620bb4..e3c1b0b727 100644 --- a/webapp/channels/e2e/cypress/tests/integration/menus/main_menu_spec.js +++ b/e2e/cypress/tests/integration/channels/menus/main_menu_spec.js @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @menu +// Group: @channels @menu describe('Main menu', () => { let testTeam; diff --git a/webapp/channels/e2e/cypress/tests/integration/menus/status_dropdown_spec.js b/e2e/cypress/tests/integration/channels/menus/status_dropdown_spec.js similarity index 96% rename from webapp/channels/e2e/cypress/tests/integration/menus/status_dropdown_spec.js rename to e2e/cypress/tests/integration/channels/menus/status_dropdown_spec.js index 4db86824ea..23119436ce 100644 --- a/webapp/channels/e2e/cypress/tests/integration/menus/status_dropdown_spec.js +++ b/e2e/cypress/tests/integration/channels/menus/status_dropdown_spec.js @@ -8,10 +8,10 @@ // *************************************************************** // Stage: @prod -// Group: @menu @custom_status @status_menu +// Group: @channels @menu @custom_status @status_menu -import * as TIMEOUTS from '../../fixtures/timeouts'; -import theme from '../../fixtures/theme.json'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; +import theme from '../../../fixtures/theme.json'; describe('Status dropdown menu', () => { const statusTestCases = [ diff --git a/webapp/channels/e2e/cypress/tests/integration/message_forwarding/forward_message_from_dm_spec.js b/e2e/cypress/tests/integration/channels/message_forwarding/forward_message_from_dm_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/message_forwarding/forward_message_from_dm_spec.js rename to e2e/cypress/tests/integration/channels/message_forwarding/forward_message_from_dm_spec.js index 2f7598ac44..d86e808c03 100644 --- a/webapp/channels/e2e/cypress/tests/integration/message_forwarding/forward_message_from_dm_spec.js +++ b/e2e/cypress/tests/integration/channels/message_forwarding/forward_message_from_dm_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @enterprise @messaging +// Group: @channels @enterprise @messaging -import * as TIMEOUTS from '../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; describe('Forward Message', () => { let user1; diff --git a/webapp/channels/e2e/cypress/tests/integration/message_forwarding/forward_message_from_gm_spec.js b/e2e/cypress/tests/integration/channels/message_forwarding/forward_message_from_gm_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/message_forwarding/forward_message_from_gm_spec.js rename to e2e/cypress/tests/integration/channels/message_forwarding/forward_message_from_gm_spec.js index 3aee701cb7..e1961bf0ef 100644 --- a/webapp/channels/e2e/cypress/tests/integration/message_forwarding/forward_message_from_gm_spec.js +++ b/e2e/cypress/tests/integration/channels/message_forwarding/forward_message_from_gm_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @enterprise @messaging +// Group: @channels @enterprise @messaging -import * as TIMEOUTS from '../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; describe('Forward Message', () => { let user1; diff --git a/webapp/channels/e2e/cypress/tests/integration/message_forwarding/forward_message_from_private_channel_spec.js b/e2e/cypress/tests/integration/channels/message_forwarding/forward_message_from_private_channel_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/message_forwarding/forward_message_from_private_channel_spec.js rename to e2e/cypress/tests/integration/channels/message_forwarding/forward_message_from_private_channel_spec.js index efa5f20b54..827b488d4b 100644 --- a/webapp/channels/e2e/cypress/tests/integration/message_forwarding/forward_message_from_private_channel_spec.js +++ b/e2e/cypress/tests/integration/channels/message_forwarding/forward_message_from_private_channel_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @enterprise @messaging +// Group: @channels @enterprise @messaging -import * as TIMEOUTS from '../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; describe('Forward Message', () => { let user1; diff --git a/webapp/channels/e2e/cypress/tests/integration/message_forwarding/forward_message_from_public_channel_spec.js b/e2e/cypress/tests/integration/channels/message_forwarding/forward_message_from_public_channel_spec.js similarity index 99% rename from webapp/channels/e2e/cypress/tests/integration/message_forwarding/forward_message_from_public_channel_spec.js rename to e2e/cypress/tests/integration/channels/message_forwarding/forward_message_from_public_channel_spec.js index ba3e5290a9..e17cf20b9c 100644 --- a/webapp/channels/e2e/cypress/tests/integration/message_forwarding/forward_message_from_public_channel_spec.js +++ b/e2e/cypress/tests/integration/channels/message_forwarding/forward_message_from_public_channel_spec.js @@ -7,9 +7,9 @@ // - Use element ID when selecting an element. Create one if none. // *************************************************************** -// Group: @enterprise @messaging +// Group: @channels @enterprise @messaging -import * as TIMEOUTS from '../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; const DEFAULT_CHARACTER_LIMIT = 16383; diff --git a/webapp/channels/e2e/cypress/tests/integration/messaging/at_mentions_user_spec.js b/e2e/cypress/tests/integration/channels/messaging/at_mentions_user_spec.js similarity index 97% rename from webapp/channels/e2e/cypress/tests/integration/messaging/at_mentions_user_spec.js rename to e2e/cypress/tests/integration/channels/messaging/at_mentions_user_spec.js index a70771adb8..620ed2e8d4 100644 --- a/webapp/channels/e2e/cypress/tests/integration/messaging/at_mentions_user_spec.js +++ b/e2e/cypress/tests/integration/channels/messaging/at_mentions_user_spec.js @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @messaging +// Group: @channels @messaging describe('Mention self', () => { let testUser; diff --git a/webapp/channels/e2e/cypress/tests/integration/messaging/autocomplete_shown_each_channel_spec.js b/e2e/cypress/tests/integration/channels/messaging/autocomplete_shown_each_channel_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/messaging/autocomplete_shown_each_channel_spec.js rename to e2e/cypress/tests/integration/channels/messaging/autocomplete_shown_each_channel_spec.js index c0509c064a..358b2087a7 100644 --- a/webapp/channels/e2e/cypress/tests/integration/messaging/autocomplete_shown_each_channel_spec.js +++ b/e2e/cypress/tests/integration/channels/messaging/autocomplete_shown_each_channel_spec.js @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @messaging +// Group: @channels @messaging describe('Identical Message Drafts', () => { let testTeam; diff --git a/webapp/channels/e2e/cypress/tests/integration/messaging/autocomplete_spec.js b/e2e/cypress/tests/integration/channels/messaging/autocomplete_spec.js similarity index 99% rename from webapp/channels/e2e/cypress/tests/integration/messaging/autocomplete_spec.js rename to e2e/cypress/tests/integration/channels/messaging/autocomplete_spec.js index d4b7d8184d..da404296d4 100644 --- a/webapp/channels/e2e/cypress/tests/integration/messaging/autocomplete_spec.js +++ b/e2e/cypress/tests/integration/channels/messaging/autocomplete_spec.js @@ -8,10 +8,10 @@ // *************************************************************** // Stage: @prod -// Group: @messaging +// Group: @channels @messaging -import * as TIMEOUTS from '../../fixtures/timeouts'; -import {getAdminAccount} from '../../support/env'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; +import {getAdminAccount} from '../../../support/env'; describe('autocomplete', () => { let testTeam; diff --git a/webapp/channels/e2e/cypress/tests/integration/messaging/autocomplete_with_space_spec.js b/e2e/cypress/tests/integration/channels/messaging/autocomplete_with_space_spec.js similarity index 99% rename from webapp/channels/e2e/cypress/tests/integration/messaging/autocomplete_with_space_spec.js rename to e2e/cypress/tests/integration/channels/messaging/autocomplete_with_space_spec.js index 1fe512ed22..fea488681d 100644 --- a/webapp/channels/e2e/cypress/tests/integration/messaging/autocomplete_with_space_spec.js +++ b/e2e/cypress/tests/integration/channels/messaging/autocomplete_with_space_spec.js @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @messaging +// Group: @channels @messaging describe('Messaging', () => { let testTeam; diff --git a/webapp/channels/e2e/cypress/tests/integration/messaging/center_channel_rhs_overlap_spec.js b/e2e/cypress/tests/integration/channels/messaging/center_channel_rhs_overlap_spec.js similarity index 99% rename from webapp/channels/e2e/cypress/tests/integration/messaging/center_channel_rhs_overlap_spec.js rename to e2e/cypress/tests/integration/channels/messaging/center_channel_rhs_overlap_spec.js index 39d056052b..e4867e3cde 100644 --- a/webapp/channels/e2e/cypress/tests/integration/messaging/center_channel_rhs_overlap_spec.js +++ b/e2e/cypress/tests/integration/channels/messaging/center_channel_rhs_overlap_spec.js @@ -8,11 +8,11 @@ // *************************************************************** // Stage: @prod -// Group: @messaging +// Group: @channels @messaging -import * as TIMEOUTS from '../../fixtures/timeouts'; -import * as MESSAGES from '../../fixtures/messages'; -import {isMac} from '../../utils'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; +import * as MESSAGES from '../../../fixtures/messages'; +import {isMac} from '../../../utils'; describe('Messaging', () => { let testTeam; diff --git a/webapp/channels/e2e/cypress/tests/integration/messaging/channel_and_posts_links_spec.js b/e2e/cypress/tests/integration/channels/messaging/channel_and_posts_links_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/messaging/channel_and_posts_links_spec.js rename to e2e/cypress/tests/integration/channels/messaging/channel_and_posts_links_spec.js index e8410e2095..aa4856023b 100644 --- a/webapp/channels/e2e/cypress/tests/integration/messaging/channel_and_posts_links_spec.js +++ b/e2e/cypress/tests/integration/channels/messaging/channel_and_posts_links_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @messaging +// Group: @channels @messaging -import * as TIMEOUTS from '../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; describe('Message permalink', () => { let testTeam; diff --git a/webapp/channels/e2e/cypress/tests/integration/messaging/channel_menu_spec.js b/e2e/cypress/tests/integration/channels/messaging/channel_menu_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/messaging/channel_menu_spec.js rename to e2e/cypress/tests/integration/channels/messaging/channel_menu_spec.js index 8d851d26c5..299b2b98ce 100644 --- a/webapp/channels/e2e/cypress/tests/integration/messaging/channel_menu_spec.js +++ b/e2e/cypress/tests/integration/channels/messaging/channel_menu_spec.js @@ -7,9 +7,9 @@ // - Use element ID when selecting an element. Create one if none. // *************************************************************** -// Group: @messaging +// Group: @channels @messaging -import {getAdminAccount} from '../../support/env'; +import {getAdminAccount} from '../../../support/env'; function demoteUserToGuest(user, admin) { // # Issue a Request to demote the user to guest diff --git a/webapp/channels/e2e/cypress/tests/integration/messaging/channel_read_after_permalink_spec.js b/e2e/cypress/tests/integration/channels/messaging/channel_read_after_permalink_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/messaging/channel_read_after_permalink_spec.js rename to e2e/cypress/tests/integration/channels/messaging/channel_read_after_permalink_spec.js index abda3260a9..a8d6826ead 100644 --- a/webapp/channels/e2e/cypress/tests/integration/messaging/channel_read_after_permalink_spec.js +++ b/e2e/cypress/tests/integration/channels/messaging/channel_read_after_permalink_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @messaging +// Group: @channels @messaging -import * as TIMEOUTS from '../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; describe('Messaging', () => { let testTeam; diff --git a/webapp/channels/e2e/cypress/tests/integration/messaging/channel_users_interactions_spec.js b/e2e/cypress/tests/integration/channels/messaging/channel_users_interactions_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/messaging/channel_users_interactions_spec.js rename to e2e/cypress/tests/integration/channels/messaging/channel_users_interactions_spec.js index d9d083863f..aa1a991e7e 100644 --- a/webapp/channels/e2e/cypress/tests/integration/messaging/channel_users_interactions_spec.js +++ b/e2e/cypress/tests/integration/channels/messaging/channel_users_interactions_spec.js @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @messaging +// Group: @channels @messaging describe('Channel users interactions', () => { let testTeam; diff --git a/webapp/channels/e2e/cypress/tests/integration/messaging/collapse_link_spec.js b/e2e/cypress/tests/integration/channels/messaging/collapse_link_spec.js similarity index 99% rename from webapp/channels/e2e/cypress/tests/integration/messaging/collapse_link_spec.js rename to e2e/cypress/tests/integration/channels/messaging/collapse_link_spec.js index d1225a0344..3b9c36ac08 100644 --- a/webapp/channels/e2e/cypress/tests/integration/messaging/collapse_link_spec.js +++ b/e2e/cypress/tests/integration/channels/messaging/collapse_link_spec.js @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @messaging +// Group: @channels @messaging describe('Messaging', () => { let testUser; diff --git a/webapp/channels/e2e/cypress/tests/integration/messaging/collapsed_message_spec.js b/e2e/cypress/tests/integration/channels/messaging/collapsed_message_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/messaging/collapsed_message_spec.js rename to e2e/cypress/tests/integration/channels/messaging/collapsed_message_spec.js index ddd346a46c..64977c53cd 100644 --- a/webapp/channels/e2e/cypress/tests/integration/messaging/collapsed_message_spec.js +++ b/e2e/cypress/tests/integration/channels/messaging/collapsed_message_spec.js @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @messaging +// Group: @channels @messaging describe('Long message', () => { before(() => { diff --git a/webapp/channels/e2e/cypress/tests/integration/messaging/copy_post_text_spec.js b/e2e/cypress/tests/integration/channels/messaging/copy_post_text_spec.js similarity index 97% rename from webapp/channels/e2e/cypress/tests/integration/messaging/copy_post_text_spec.js rename to e2e/cypress/tests/integration/channels/messaging/copy_post_text_spec.js index 37ce9207d7..d5d551a592 100644 --- a/webapp/channels/e2e/cypress/tests/integration/messaging/copy_post_text_spec.js +++ b/e2e/cypress/tests/integration/channels/messaging/copy_post_text_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @messaging +// Group: @channels @messaging -import {stubClipboard} from '../../utils'; +import {stubClipboard} from '../../../utils'; describe('Permalink message edit', () => { before(() => { diff --git a/webapp/channels/e2e/cypress/tests/integration/messaging/ctrl_cmd_k_find_gm_by_matching_name_spec.js b/e2e/cypress/tests/integration/channels/messaging/ctrl_cmd_k_find_gm_by_matching_name_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/messaging/ctrl_cmd_k_find_gm_by_matching_name_spec.js rename to e2e/cypress/tests/integration/channels/messaging/ctrl_cmd_k_find_gm_by_matching_name_spec.js index 68a37225d6..69baab83bd 100644 --- a/webapp/channels/e2e/cypress/tests/integration/messaging/ctrl_cmd_k_find_gm_by_matching_name_spec.js +++ b/e2e/cypress/tests/integration/channels/messaging/ctrl_cmd_k_find_gm_by_matching_name_spec.js @@ -8,7 +8,7 @@ // *********************************************************** **** // Stage: @prod -// Group: @messaging +// Group: @channels @messaging describe('Messaging', () => { let testTeam; diff --git a/webapp/channels/e2e/cypress/tests/integration/messaging/ctrl_cmd_k_open_dm_with_mouse_spec.js b/e2e/cypress/tests/integration/channels/messaging/ctrl_cmd_k_open_dm_with_mouse_spec.js similarity index 96% rename from webapp/channels/e2e/cypress/tests/integration/messaging/ctrl_cmd_k_open_dm_with_mouse_spec.js rename to e2e/cypress/tests/integration/channels/messaging/ctrl_cmd_k_open_dm_with_mouse_spec.js index b3b6141036..3a81ae9e84 100644 --- a/webapp/channels/e2e/cypress/tests/integration/messaging/ctrl_cmd_k_open_dm_with_mouse_spec.js +++ b/e2e/cypress/tests/integration/channels/messaging/ctrl_cmd_k_open_dm_with_mouse_spec.js @@ -8,9 +8,9 @@ // *********************************************************** **** // Stage: @prod -// Group: @messaging @keyboard_shortcuts +// Group: @channels @messaging @keyboard_shortcuts -import * as TIMEOUTS from '../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; describe('Messaging', () => { let firstUser; diff --git a/webapp/channels/e2e/cypress/tests/integration/messaging/date_separator_spec.js b/e2e/cypress/tests/integration/channels/messaging/date_separator_spec.js similarity index 97% rename from webapp/channels/e2e/cypress/tests/integration/messaging/date_separator_spec.js rename to e2e/cypress/tests/integration/channels/messaging/date_separator_spec.js index 6b67c5fa64..72dc7707d9 100644 --- a/webapp/channels/e2e/cypress/tests/integration/messaging/date_separator_spec.js +++ b/e2e/cypress/tests/integration/channels/messaging/date_separator_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @messaging +// Group: @channels @messaging -import {getAdminAccount} from '../../support/env'; +import {getAdminAccount} from '../../../support/env'; describe('Messaging', () => { const admin = getAdminAccount(); diff --git a/webapp/channels/e2e/cypress/tests/integration/messaging/direct_message_spec.js b/e2e/cypress/tests/integration/channels/messaging/direct_message_spec.js similarity index 97% rename from webapp/channels/e2e/cypress/tests/integration/messaging/direct_message_spec.js rename to e2e/cypress/tests/integration/channels/messaging/direct_message_spec.js index 9ed8ba65de..561abb13e7 100644 --- a/webapp/channels/e2e/cypress/tests/integration/messaging/direct_message_spec.js +++ b/e2e/cypress/tests/integration/channels/messaging/direct_message_spec.js @@ -8,10 +8,10 @@ // *************************************************************** // Stage: @prod -// Group: @messaging +// Group: @channels @messaging -import * as TIMEOUTS from '../../fixtures/timeouts'; -import {spyNotificationAs} from '../../support/notification'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; +import {spyNotificationAs} from '../../../support/notification'; describe('Direct Message', () => { let testTeam; diff --git a/webapp/channels/e2e/cypress/tests/integration/messaging/dm_list_of_users_spec.js b/e2e/cypress/tests/integration/channels/messaging/dm_list_of_users_spec.js similarity index 97% rename from webapp/channels/e2e/cypress/tests/integration/messaging/dm_list_of_users_spec.js rename to e2e/cypress/tests/integration/channels/messaging/dm_list_of_users_spec.js index 2827b17406..581e1a6d8e 100644 --- a/webapp/channels/e2e/cypress/tests/integration/messaging/dm_list_of_users_spec.js +++ b/e2e/cypress/tests/integration/channels/messaging/dm_list_of_users_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @messaging @not_cloud +// Group: @channels @messaging @not_cloud -import * as TIMEOUTS from '../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; describe('Messaging', () => { let testTeam; diff --git a/webapp/channels/e2e/cypress/tests/integration/messaging/draft_with_only_2_byte_characters_spec.js b/e2e/cypress/tests/integration/channels/messaging/draft_with_only_2_byte_characters_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/messaging/draft_with_only_2_byte_characters_spec.js rename to e2e/cypress/tests/integration/channels/messaging/draft_with_only_2_byte_characters_spec.js index 0fa7110bc5..973559db8a 100644 --- a/webapp/channels/e2e/cypress/tests/integration/messaging/draft_with_only_2_byte_characters_spec.js +++ b/e2e/cypress/tests/integration/channels/messaging/draft_with_only_2_byte_characters_spec.js @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @messaging +// Group: @channels @messaging describe('Messaging', () => { let testTeam; diff --git a/webapp/channels/e2e/cypress/tests/integration/messaging/edit_message_spec.js b/e2e/cypress/tests/integration/channels/messaging/edit_message_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/messaging/edit_message_spec.js rename to e2e/cypress/tests/integration/channels/messaging/edit_message_spec.js index 15315591a0..0bf2363650 100644 --- a/webapp/channels/e2e/cypress/tests/integration/messaging/edit_message_spec.js +++ b/e2e/cypress/tests/integration/channels/messaging/edit_message_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @messaging +// Group: @channels @messaging -import * as TIMEOUTS from '../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; describe('Edit Message', () => { let offTopicUrl; diff --git a/webapp/channels/e2e/cypress/tests/integration/messaging/emoji_followed_by_punctuation_spec.js b/e2e/cypress/tests/integration/channels/messaging/emoji_followed_by_punctuation_spec.js similarity index 97% rename from webapp/channels/e2e/cypress/tests/integration/messaging/emoji_followed_by_punctuation_spec.js rename to e2e/cypress/tests/integration/channels/messaging/emoji_followed_by_punctuation_spec.js index 32500c7062..4fac4d1cee 100644 --- a/webapp/channels/e2e/cypress/tests/integration/messaging/emoji_followed_by_punctuation_spec.js +++ b/e2e/cypress/tests/integration/channels/messaging/emoji_followed_by_punctuation_spec.js @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @messaging +// Group: @channels @messaging function emojiVerification(postId) { // # set the postMessageTextId var diff --git a/webapp/channels/e2e/cypress/tests/integration/messaging/emoji_gender_spec.ts b/e2e/cypress/tests/integration/channels/messaging/emoji_gender_spec.ts similarity index 97% rename from webapp/channels/e2e/cypress/tests/integration/messaging/emoji_gender_spec.ts rename to e2e/cypress/tests/integration/channels/messaging/emoji_gender_spec.ts index 2a4ba47c89..774eae7380 100644 --- a/webapp/channels/e2e/cypress/tests/integration/messaging/emoji_gender_spec.ts +++ b/e2e/cypress/tests/integration/channels/messaging/emoji_gender_spec.ts @@ -7,7 +7,7 @@ // - Use element ID when selecting an element. Create one if none. // *************************************************************** -// Group: @messaging +// Group: @channels @messaging describe('Messaging', () => { before(() => { diff --git a/webapp/channels/e2e/cypress/tests/integration/messaging/emoji_insert_position_spec.js b/e2e/cypress/tests/integration/channels/messaging/emoji_insert_position_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/messaging/emoji_insert_position_spec.js rename to e2e/cypress/tests/integration/channels/messaging/emoji_insert_position_spec.js index a52c30d0f4..d5beacbc5e 100644 --- a/webapp/channels/e2e/cypress/tests/integration/messaging/emoji_insert_position_spec.js +++ b/e2e/cypress/tests/integration/channels/messaging/emoji_insert_position_spec.js @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @messaging +// Group: @channels @messaging describe('Messaging', () => { before(() => { diff --git a/webapp/channels/e2e/cypress/tests/integration/messaging/emoji_keyboard_entry_spec.js b/e2e/cypress/tests/integration/channels/messaging/emoji_keyboard_entry_spec.js similarity index 99% rename from webapp/channels/e2e/cypress/tests/integration/messaging/emoji_keyboard_entry_spec.js rename to e2e/cypress/tests/integration/channels/messaging/emoji_keyboard_entry_spec.js index 50a3ed0477..14e9bed66c 100644 --- a/webapp/channels/e2e/cypress/tests/integration/messaging/emoji_keyboard_entry_spec.js +++ b/e2e/cypress/tests/integration/channels/messaging/emoji_keyboard_entry_spec.js @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @messaging +// Group: @channels @messaging describe('MM-T154 Use keyboard navigation in emoji picker', () => { before(() => { diff --git a/webapp/channels/e2e/cypress/tests/integration/messaging/emoji_no_overlap_spec.js b/e2e/cypress/tests/integration/channels/messaging/emoji_no_overlap_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/messaging/emoji_no_overlap_spec.js rename to e2e/cypress/tests/integration/channels/messaging/emoji_no_overlap_spec.js index 6d4cd6c79b..00ddccf97d 100644 --- a/webapp/channels/e2e/cypress/tests/integration/messaging/emoji_no_overlap_spec.js +++ b/e2e/cypress/tests/integration/channels/messaging/emoji_no_overlap_spec.js @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @messaging +// Group: @channels @messaging describe('Messaging', () => { before(() => { diff --git a/webapp/channels/e2e/cypress/tests/integration/messaging/emoji_picker_keyboard_usability_spec.js b/e2e/cypress/tests/integration/channels/messaging/emoji_picker_keyboard_usability_spec.js similarity index 99% rename from webapp/channels/e2e/cypress/tests/integration/messaging/emoji_picker_keyboard_usability_spec.js rename to e2e/cypress/tests/integration/channels/messaging/emoji_picker_keyboard_usability_spec.js index a0a9ad96c3..57094c8654 100644 --- a/webapp/channels/e2e/cypress/tests/integration/messaging/emoji_picker_keyboard_usability_spec.js +++ b/e2e/cypress/tests/integration/channels/messaging/emoji_picker_keyboard_usability_spec.js @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @messaging +// Group: @channels @messaging describe('MM-13064 - Emoji picker keyboard usability', () => { let offTopicUrl; diff --git a/webapp/channels/e2e/cypress/tests/integration/messaging/emoji_recently_used_spec.js b/e2e/cypress/tests/integration/channels/messaging/emoji_recently_used_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/messaging/emoji_recently_used_spec.js rename to e2e/cypress/tests/integration/channels/messaging/emoji_recently_used_spec.js index 9a27294d25..60178697bd 100644 --- a/webapp/channels/e2e/cypress/tests/integration/messaging/emoji_recently_used_spec.js +++ b/e2e/cypress/tests/integration/channels/messaging/emoji_recently_used_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @messaging +// Group: @channels @messaging -import timeouts from '../../fixtures/timeouts'; +import timeouts from '../../../fixtures/timeouts'; describe('Messaging', () => { let offTopicPath; diff --git a/webapp/channels/e2e/cypress/tests/integration/messaging/emoji_size_spec.js b/e2e/cypress/tests/integration/channels/messaging/emoji_size_spec.js similarity index 99% rename from webapp/channels/e2e/cypress/tests/integration/messaging/emoji_size_spec.js rename to e2e/cypress/tests/integration/channels/messaging/emoji_size_spec.js index 20de41ba58..50ae5e8909 100644 --- a/webapp/channels/e2e/cypress/tests/integration/messaging/emoji_size_spec.js +++ b/e2e/cypress/tests/integration/channels/messaging/emoji_size_spec.js @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @messaging +// Group: @channels @messaging describe('Messaging', () => { before(() => { diff --git a/webapp/channels/e2e/cypress/tests/integration/messaging/emoji_skin_tone_spec.js b/e2e/cypress/tests/integration/channels/messaging/emoji_skin_tone_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/messaging/emoji_skin_tone_spec.js rename to e2e/cypress/tests/integration/channels/messaging/emoji_skin_tone_spec.js index 3d3c610b03..8029f9475e 100644 --- a/webapp/channels/e2e/cypress/tests/integration/messaging/emoji_skin_tone_spec.js +++ b/e2e/cypress/tests/integration/channels/messaging/emoji_skin_tone_spec.js @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @messaging +// Group: @channels @messaging describe('Messaging', () => { before(() => { diff --git a/webapp/channels/e2e/cypress/tests/integration/messaging/emoji_to_markdown_spec.js b/e2e/cypress/tests/integration/channels/messaging/emoji_to_markdown_spec.js similarity index 96% rename from webapp/channels/e2e/cypress/tests/integration/messaging/emoji_to_markdown_spec.js rename to e2e/cypress/tests/integration/channels/messaging/emoji_to_markdown_spec.js index e8d3cf8b18..a3bdc0fed2 100644 --- a/webapp/channels/e2e/cypress/tests/integration/messaging/emoji_to_markdown_spec.js +++ b/e2e/cypress/tests/integration/channels/messaging/emoji_to_markdown_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @messaging +// Group: @channels @messaging -import * as TIMEOUTS from '../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; describe('Messaging', () => { before(() => { diff --git a/webapp/channels/e2e/cypress/tests/integration/messaging/file_upload_in_center_channel_spec.js b/e2e/cypress/tests/integration/channels/messaging/file_upload_in_center_channel_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/messaging/file_upload_in_center_channel_spec.js rename to e2e/cypress/tests/integration/channels/messaging/file_upload_in_center_channel_spec.js index 2d2de73468..b39dd3705e 100644 --- a/webapp/channels/e2e/cypress/tests/integration/messaging/file_upload_in_center_channel_spec.js +++ b/e2e/cypress/tests/integration/channels/messaging/file_upload_in_center_channel_spec.js @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @messaging +// Group: @channels @messaging describe('Messaging', () => { before(() => { diff --git a/webapp/channels/e2e/cypress/tests/integration/messaging/focus_move_spec.js b/e2e/cypress/tests/integration/channels/messaging/focus_move_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/messaging/focus_move_spec.js rename to e2e/cypress/tests/integration/channels/messaging/focus_move_spec.js index ae8ceff7e4..b85d382ef7 100644 --- a/webapp/channels/e2e/cypress/tests/integration/messaging/focus_move_spec.js +++ b/e2e/cypress/tests/integration/channels/messaging/focus_move_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @messaging +// Group: @channels @messaging -import * as TIMEOUTS from '../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; describe('Messaging', () => { let offTopicUrl; diff --git a/webapp/channels/e2e/cypress/tests/integration/messaging/group_message_spec.js b/e2e/cypress/tests/integration/channels/messaging/group_message_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/messaging/group_message_spec.js rename to e2e/cypress/tests/integration/channels/messaging/group_message_spec.js index 397d00ff37..721bc985e4 100644 --- a/webapp/channels/e2e/cypress/tests/integration/messaging/group_message_spec.js +++ b/e2e/cypress/tests/integration/channels/messaging/group_message_spec.js @@ -7,10 +7,10 @@ // - Use element ID when selecting an element. Create one if none. // *************************************************************** -// Group: @messaging +// Group: @channels @messaging -import * as TIMEOUTS from '../../fixtures/timeouts'; -import {spyNotificationAs} from '../../support/notification'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; +import {spyNotificationAs} from '../../../support/notification'; describe('Group Message', () => { let testTeam; diff --git a/webapp/channels/e2e/cypress/tests/integration/messaging/header_not_cloud_spec.js b/e2e/cypress/tests/integration/channels/messaging/header_not_cloud_spec.js similarity index 93% rename from webapp/channels/e2e/cypress/tests/integration/messaging/header_not_cloud_spec.js rename to e2e/cypress/tests/integration/channels/messaging/header_not_cloud_spec.js index 0f8ed00c62..677d008cbf 100644 --- a/webapp/channels/e2e/cypress/tests/integration/messaging/header_not_cloud_spec.js +++ b/e2e/cypress/tests/integration/channels/messaging/header_not_cloud_spec.js @@ -8,10 +8,10 @@ // *************************************************************** // Stage: @prod -// Group: @messaging @plugin @not_cloud +// Group: @channels @messaging @plugin @not_cloud -import * as TIMEOUTS from '../../fixtures/timeouts'; -import {matterpollPlugin} from '../../utils/plugins'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; +import {matterpollPlugin} from '../../../utils/plugins'; describe('Header', () => { before(() => { diff --git a/webapp/channels/e2e/cypress/tests/integration/messaging/header_spec.js b/e2e/cypress/tests/integration/channels/messaging/header_spec.js similarity index 97% rename from webapp/channels/e2e/cypress/tests/integration/messaging/header_spec.js rename to e2e/cypress/tests/integration/channels/messaging/header_spec.js index 28ff747401..34542139a4 100644 --- a/webapp/channels/e2e/cypress/tests/integration/messaging/header_spec.js +++ b/e2e/cypress/tests/integration/channels/messaging/header_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @messaging +// Group: @channels @messaging -import * as TIMEOUTS from '../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; describe('Header', () => { let otherUser; diff --git a/webapp/channels/e2e/cypress/tests/integration/messaging/helpers.js b/e2e/cypress/tests/integration/channels/messaging/helpers.js similarity index 100% rename from webapp/channels/e2e/cypress/tests/integration/messaging/helpers.js rename to e2e/cypress/tests/integration/channels/messaging/helpers.js diff --git a/webapp/channels/e2e/cypress/tests/integration/messaging/image_attachment_spec.js b/e2e/cypress/tests/integration/channels/messaging/image_attachment_spec.js similarity index 99% rename from webapp/channels/e2e/cypress/tests/integration/messaging/image_attachment_spec.js rename to e2e/cypress/tests/integration/channels/messaging/image_attachment_spec.js index d0b647d892..4ee9322d7c 100644 --- a/webapp/channels/e2e/cypress/tests/integration/messaging/image_attachment_spec.js +++ b/e2e/cypress/tests/integration/channels/messaging/image_attachment_spec.js @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @messaging +// Group: @channels @messaging describe('Image attachment', () => { before(() => { diff --git a/webapp/channels/e2e/cypress/tests/integration/messaging/inline_images_open_preview_window_spec.js b/e2e/cypress/tests/integration/channels/messaging/inline_images_open_preview_window_spec.js similarity index 97% rename from webapp/channels/e2e/cypress/tests/integration/messaging/inline_images_open_preview_window_spec.js rename to e2e/cypress/tests/integration/channels/messaging/inline_images_open_preview_window_spec.js index f2852b4252..4846998ec4 100644 --- a/webapp/channels/e2e/cypress/tests/integration/messaging/inline_images_open_preview_window_spec.js +++ b/e2e/cypress/tests/integration/channels/messaging/inline_images_open_preview_window_spec.js @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @messaging +// Group: @channels @messaging describe('Messaging', () => { before(() => { diff --git a/webapp/channels/e2e/cypress/tests/integration/messaging/inline_markdown_image_link_open_link_spec.js b/e2e/cypress/tests/integration/channels/messaging/inline_markdown_image_link_open_link_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/messaging/inline_markdown_image_link_open_link_spec.js rename to e2e/cypress/tests/integration/channels/messaging/inline_markdown_image_link_open_link_spec.js index ffcfe47ce6..66d8a1ac9b 100644 --- a/webapp/channels/e2e/cypress/tests/integration/messaging/inline_markdown_image_link_open_link_spec.js +++ b/e2e/cypress/tests/integration/channels/messaging/inline_markdown_image_link_open_link_spec.js @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @messaging +// Group: @channels @messaging describe('Messaging', () => { before(() => { diff --git a/webapp/channels/e2e/cypress/tests/integration/messaging/input_box_expands_spec.js b/e2e/cypress/tests/integration/channels/messaging/input_box_expands_spec.js similarity index 99% rename from webapp/channels/e2e/cypress/tests/integration/messaging/input_box_expands_spec.js rename to e2e/cypress/tests/integration/channels/messaging/input_box_expands_spec.js index 0cceab40f3..727cd031aa 100644 --- a/webapp/channels/e2e/cypress/tests/integration/messaging/input_box_expands_spec.js +++ b/e2e/cypress/tests/integration/channels/messaging/input_box_expands_spec.js @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @messaging +// Group: @channels @messaging describe('Messaging', () => { before(() => { diff --git a/webapp/channels/e2e/cypress/tests/integration/messaging/input_box_expands_with_rhs_spec.js b/e2e/cypress/tests/integration/channels/messaging/input_box_expands_with_rhs_spec.js similarity index 95% rename from webapp/channels/e2e/cypress/tests/integration/messaging/input_box_expands_with_rhs_spec.js rename to e2e/cypress/tests/integration/channels/messaging/input_box_expands_with_rhs_spec.js index cea78c62ab..b351d6ece7 100644 --- a/webapp/channels/e2e/cypress/tests/integration/messaging/input_box_expands_with_rhs_spec.js +++ b/e2e/cypress/tests/integration/channels/messaging/input_box_expands_with_rhs_spec.js @@ -8,10 +8,10 @@ // *************************************************************** // Stage: @prod -// Group: @messaging +// Group: @channels @messaging -import * as TIMEOUTS from '../../fixtures/timeouts'; -import {getAdminAccount} from '../../support/env'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; +import {getAdminAccount} from '../../../support/env'; describe('Messaging', () => { const admin = getAdminAccount(); diff --git a/webapp/channels/e2e/cypress/tests/integration/messaging/invalid_emojis_as_text_spec.js b/e2e/cypress/tests/integration/channels/messaging/invalid_emojis_as_text_spec.js similarity index 96% rename from webapp/channels/e2e/cypress/tests/integration/messaging/invalid_emojis_as_text_spec.js rename to e2e/cypress/tests/integration/channels/messaging/invalid_emojis_as_text_spec.js index 525b0aa98c..cdfbfb6e2d 100644 --- a/webapp/channels/e2e/cypress/tests/integration/messaging/invalid_emojis_as_text_spec.js +++ b/e2e/cypress/tests/integration/channels/messaging/invalid_emojis_as_text_spec.js @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @messaging @emoji +// Group: @channels @messaging @emoji describe('Messaging', () => { before(() => { diff --git a/webapp/channels/e2e/cypress/tests/integration/messaging/local_date_time_spec.js b/e2e/cypress/tests/integration/channels/messaging/local_date_time_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/messaging/local_date_time_spec.js rename to e2e/cypress/tests/integration/channels/messaging/local_date_time_spec.js index 3c2d12bc14..0a661332bd 100644 --- a/webapp/channels/e2e/cypress/tests/integration/messaging/local_date_time_spec.js +++ b/e2e/cypress/tests/integration/channels/messaging/local_date_time_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @messaging +// Group: @channels @messaging -import {getAdminAccount} from '../../support/env'; +import {getAdminAccount} from '../../../support/env'; describe('Messaging', () => { const sysadmin = getAdminAccount(); diff --git a/webapp/channels/e2e/cypress/tests/integration/messaging/long_draft_spec.js b/e2e/cypress/tests/integration/channels/messaging/long_draft_spec.js similarity index 97% rename from webapp/channels/e2e/cypress/tests/integration/messaging/long_draft_spec.js rename to e2e/cypress/tests/integration/channels/messaging/long_draft_spec.js index c9b4496e04..544fccad1b 100644 --- a/webapp/channels/e2e/cypress/tests/integration/messaging/long_draft_spec.js +++ b/e2e/cypress/tests/integration/channels/messaging/long_draft_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @messaging +// Group: @channels @messaging -import * as TIMEOUTS from '../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; describe('Messaging', () => { let otherChannelName; diff --git a/webapp/channels/e2e/cypress/tests/integration/messaging/long_post_attachments_spec.js b/e2e/cypress/tests/integration/channels/messaging/long_post_attachments_spec.js similarity index 97% rename from webapp/channels/e2e/cypress/tests/integration/messaging/long_post_attachments_spec.js rename to e2e/cypress/tests/integration/channels/messaging/long_post_attachments_spec.js index 020ce03c2c..e8c929664f 100644 --- a/webapp/channels/e2e/cypress/tests/integration/messaging/long_post_attachments_spec.js +++ b/e2e/cypress/tests/integration/channels/messaging/long_post_attachments_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @messaging +// Group: @channels @messaging -import * as TIMEOUTS from '../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; describe('Messaging', () => { before(() => { diff --git a/webapp/channels/e2e/cypress/tests/integration/messaging/markdown_preview_inline_image_spec.js b/e2e/cypress/tests/integration/channels/messaging/markdown_preview_inline_image_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/messaging/markdown_preview_inline_image_spec.js rename to e2e/cypress/tests/integration/channels/messaging/markdown_preview_inline_image_spec.js index d6e972e155..5fe98f1062 100644 --- a/webapp/channels/e2e/cypress/tests/integration/messaging/markdown_preview_inline_image_spec.js +++ b/e2e/cypress/tests/integration/channels/messaging/markdown_preview_inline_image_spec.js @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @messaging @markdown +// Group: @channels @messaging @markdown describe('Messaging', () => { before(() => { diff --git a/webapp/channels/e2e/cypress/tests/integration/messaging/markdown_quotation_paragraphs_spec.js b/e2e/cypress/tests/integration/channels/messaging/markdown_quotation_paragraphs_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/messaging/markdown_quotation_paragraphs_spec.js rename to e2e/cypress/tests/integration/channels/messaging/markdown_quotation_paragraphs_spec.js index 50f3c0036e..5c5a7ff95d 100644 --- a/webapp/channels/e2e/cypress/tests/integration/messaging/markdown_quotation_paragraphs_spec.js +++ b/e2e/cypress/tests/integration/channels/messaging/markdown_quotation_paragraphs_spec.js @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @messaging @markdown +// Group: @channels @messaging @markdown describe('Messaging', () => { before(() => { diff --git a/webapp/channels/e2e/cypress/tests/integration/messaging/markdown_spec.js b/e2e/cypress/tests/integration/channels/messaging/markdown_spec.js similarity index 97% rename from webapp/channels/e2e/cypress/tests/integration/messaging/markdown_spec.js rename to e2e/cypress/tests/integration/channels/messaging/markdown_spec.js index 1f49004094..57959160c5 100644 --- a/webapp/channels/e2e/cypress/tests/integration/messaging/markdown_spec.js +++ b/e2e/cypress/tests/integration/channels/messaging/markdown_spec.js @@ -7,9 +7,9 @@ // - Use element ID when selecting an element. Create one if none. // *************************************************************** -// Group: @not_cloud @messaging @markdown +// Group: @channels @not_cloud @messaging @markdown -import * as TIMEOUTS from '../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; const testCases = [ {name: 'Markdown - typescript', fileKey: 'markdown_typescript'}, diff --git a/webapp/channels/e2e/cypress/tests/integration/messaging/mention_autocomplete_overlap_spec.js b/e2e/cypress/tests/integration/channels/messaging/mention_autocomplete_overlap_spec.js similarity index 97% rename from webapp/channels/e2e/cypress/tests/integration/messaging/mention_autocomplete_overlap_spec.js rename to e2e/cypress/tests/integration/channels/messaging/mention_autocomplete_overlap_spec.js index e654a0f769..3fc7934225 100644 --- a/webapp/channels/e2e/cypress/tests/integration/messaging/mention_autocomplete_overlap_spec.js +++ b/e2e/cypress/tests/integration/channels/messaging/mention_autocomplete_overlap_spec.js @@ -8,10 +8,10 @@ // *************************************************************** // Stage: @prod -// Group: @messaging +// Group: @channels @messaging -import * as TIMEOUTS from '../../fixtures/timeouts'; -import * as MESSAGES from '../../fixtures/messages'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; +import * as MESSAGES from '../../../fixtures/messages'; describe('Messaging', () => { before(() => { diff --git a/webapp/channels/e2e/cypress/tests/integration/messaging/message_auto_response_spec.js b/e2e/cypress/tests/integration/channels/messaging/message_auto_response_spec.js similarity index 97% rename from webapp/channels/e2e/cypress/tests/integration/messaging/message_auto_response_spec.js rename to e2e/cypress/tests/integration/channels/messaging/message_auto_response_spec.js index 03ba6abab4..42db600700 100644 --- a/webapp/channels/e2e/cypress/tests/integration/messaging/message_auto_response_spec.js +++ b/e2e/cypress/tests/integration/channels/messaging/message_auto_response_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @auto_response @messaging +// Group: @channels @auto_response @messaging -import * as TIMEOUTS from '../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; describe('Auto Response In DMs', () => { const AUTO_RESPONSE_MESSAGE = 'Out of Office'; diff --git a/webapp/channels/e2e/cypress/tests/integration/messaging/message_bullets_spec.js b/e2e/cypress/tests/integration/channels/messaging/message_bullets_spec.js similarity index 99% rename from webapp/channels/e2e/cypress/tests/integration/messaging/message_bullets_spec.js rename to e2e/cypress/tests/integration/channels/messaging/message_bullets_spec.js index f5fba604cf..951b466cea 100644 --- a/webapp/channels/e2e/cypress/tests/integration/messaging/message_bullets_spec.js +++ b/e2e/cypress/tests/integration/channels/messaging/message_bullets_spec.js @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @messaging +// Group: @channels @messaging describe('Message', () => { before(() => { diff --git a/webapp/channels/e2e/cypress/tests/integration/messaging/message_by_aeroplane_icon_spec.js b/e2e/cypress/tests/integration/channels/messaging/message_by_aeroplane_icon_spec.js similarity index 97% rename from webapp/channels/e2e/cypress/tests/integration/messaging/message_by_aeroplane_icon_spec.js rename to e2e/cypress/tests/integration/channels/messaging/message_by_aeroplane_icon_spec.js index 1220378576..66d737d5e6 100644 --- a/webapp/channels/e2e/cypress/tests/integration/messaging/message_by_aeroplane_icon_spec.js +++ b/e2e/cypress/tests/integration/channels/messaging/message_by_aeroplane_icon_spec.js @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @messaging @markdown +// Group: @channels @messaging @markdown describe('Messaging', () => { before(() => { diff --git a/webapp/channels/e2e/cypress/tests/integration/messaging/message_channel_draw_spec.js b/e2e/cypress/tests/integration/channels/messaging/message_channel_draw_spec.js similarity index 93% rename from webapp/channels/e2e/cypress/tests/integration/messaging/message_channel_draw_spec.js rename to e2e/cypress/tests/integration/channels/messaging/message_channel_draw_spec.js index 8f07ce7831..9861722ff5 100644 --- a/webapp/channels/e2e/cypress/tests/integration/messaging/message_channel_draw_spec.js +++ b/e2e/cypress/tests/integration/channels/messaging/message_channel_draw_spec.js @@ -8,11 +8,11 @@ // *************************************************************** // Stage: @prod -// Group: @not_cloud @messaging @plugin +// Group: @channels @not_cloud @messaging @plugin -import * as TIMEOUTS from '../../fixtures/timeouts'; -import {getRandomId} from '../../utils'; -import {drawPlugin} from '../../utils/plugins'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; +import {getRandomId} from '../../../utils'; +import {drawPlugin} from '../../../utils/plugins'; describe('M17448 Does not post draft message', () => { before(() => { diff --git a/webapp/channels/e2e/cypress/tests/integration/messaging/message_channel_reference_spec.js b/e2e/cypress/tests/integration/channels/messaging/message_channel_reference_spec.js similarity index 94% rename from webapp/channels/e2e/cypress/tests/integration/messaging/message_channel_reference_spec.js rename to e2e/cypress/tests/integration/channels/messaging/message_channel_reference_spec.js index 51b5e82ea1..cf01e58643 100644 --- a/webapp/channels/e2e/cypress/tests/integration/messaging/message_channel_reference_spec.js +++ b/e2e/cypress/tests/integration/channels/messaging/message_channel_reference_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @messaging +// Group: @channels @messaging -import * as TIMEOUTS from '../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; describe('Messaging', () => { before(() => { diff --git a/webapp/channels/e2e/cypress/tests/integration/messaging/message_deleted_on_reply_spec.js b/e2e/cypress/tests/integration/channels/messaging/message_deleted_on_reply_spec.js similarity index 96% rename from webapp/channels/e2e/cypress/tests/integration/messaging/message_deleted_on_reply_spec.js rename to e2e/cypress/tests/integration/channels/messaging/message_deleted_on_reply_spec.js index e12da225ac..ec6a39197c 100644 --- a/webapp/channels/e2e/cypress/tests/integration/messaging/message_deleted_on_reply_spec.js +++ b/e2e/cypress/tests/integration/channels/messaging/message_deleted_on_reply_spec.js @@ -8,10 +8,10 @@ // *************************************************************** // Stage: @prod -// Group: @messaging +// Group: @channels @messaging -import * as TIMEOUTS from '../../fixtures/timeouts'; -import {getAdminAccount} from '../../support/env'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; +import {getAdminAccount} from '../../../support/env'; describe('Messaging', () => { const admin = getAdminAccount(); diff --git a/webapp/channels/e2e/cypress/tests/integration/messaging/message_deletion_spec.js b/e2e/cypress/tests/integration/channels/messaging/message_deletion_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/messaging/message_deletion_spec.js rename to e2e/cypress/tests/integration/channels/messaging/message_deletion_spec.js index 997c850a5d..c9e4c09fa0 100644 --- a/webapp/channels/e2e/cypress/tests/integration/messaging/message_deletion_spec.js +++ b/e2e/cypress/tests/integration/channels/messaging/message_deletion_spec.js @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @messaging +// Group: @channels @messaging describe('Message deletion', () => { before(() => { diff --git a/webapp/channels/e2e/cypress/tests/integration/messaging/message_draft_persistance_spec.js b/e2e/cypress/tests/integration/channels/messaging/message_draft_persistance_spec.js similarity index 99% rename from webapp/channels/e2e/cypress/tests/integration/messaging/message_draft_persistance_spec.js rename to e2e/cypress/tests/integration/channels/messaging/message_draft_persistance_spec.js index 1736f22f08..5637b9e5f6 100644 --- a/webapp/channels/e2e/cypress/tests/integration/messaging/message_draft_persistance_spec.js +++ b/e2e/cypress/tests/integration/channels/messaging/message_draft_persistance_spec.js @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @messaging +// Group: @channels @messaging import localForage from 'localforage'; diff --git a/webapp/channels/e2e/cypress/tests/integration/messaging/message_draft_spec.js b/e2e/cypress/tests/integration/channels/messaging/message_draft_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/messaging/message_draft_spec.js rename to e2e/cypress/tests/integration/channels/messaging/message_draft_spec.js index 839f6635c2..979c905c01 100644 --- a/webapp/channels/e2e/cypress/tests/integration/messaging/message_draft_spec.js +++ b/e2e/cypress/tests/integration/channels/messaging/message_draft_spec.js @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @messaging +// Group: @channels @messaging describe('Message Draft', () => { let testTeam; diff --git a/webapp/channels/e2e/cypress/tests/integration/messaging/message_draft_then_switch_channel_spec.js b/e2e/cypress/tests/integration/channels/messaging/message_draft_then_switch_channel_spec.js similarity index 99% rename from webapp/channels/e2e/cypress/tests/integration/messaging/message_draft_then_switch_channel_spec.js rename to e2e/cypress/tests/integration/channels/messaging/message_draft_then_switch_channel_spec.js index 6dffb3afe1..9fabc7ad48 100644 --- a/webapp/channels/e2e/cypress/tests/integration/messaging/message_draft_then_switch_channel_spec.js +++ b/e2e/cypress/tests/integration/channels/messaging/message_draft_then_switch_channel_spec.js @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @messaging +// Group: @channels @messaging import {verifyDraftIcon} from './helpers'; diff --git a/webapp/channels/e2e/cypress/tests/integration/messaging/message_draft_with_attachment_then_switch_channel_spec.js b/e2e/cypress/tests/integration/channels/messaging/message_draft_with_attachment_then_switch_channel_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/messaging/message_draft_with_attachment_then_switch_channel_spec.js rename to e2e/cypress/tests/integration/channels/messaging/message_draft_with_attachment_then_switch_channel_spec.js index fe6b1a6be8..39718fd6d4 100644 --- a/webapp/channels/e2e/cypress/tests/integration/messaging/message_draft_with_attachment_then_switch_channel_spec.js +++ b/e2e/cypress/tests/integration/channels/messaging/message_draft_with_attachment_then_switch_channel_spec.js @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @messaging +// Group: @channels @messaging describe('Message Draft with attachment and Switch Channels', () => { let testChannel1; diff --git a/webapp/channels/e2e/cypress/tests/integration/messaging/message_edit_post_clear_text_spec.js b/e2e/cypress/tests/integration/channels/messaging/message_edit_post_clear_text_spec.js similarity index 95% rename from webapp/channels/e2e/cypress/tests/integration/messaging/message_edit_post_clear_text_spec.js rename to e2e/cypress/tests/integration/channels/messaging/message_edit_post_clear_text_spec.js index a043e28027..dfd56feb05 100644 --- a/webapp/channels/e2e/cypress/tests/integration/messaging/message_edit_post_clear_text_spec.js +++ b/e2e/cypress/tests/integration/channels/messaging/message_edit_post_clear_text_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @messaging +// Group: @channels @messaging -import * as TIMEOUTS from '../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; describe('Delete the post on text clear', () => { let offtopiclink; diff --git a/webapp/channels/e2e/cypress/tests/integration/messaging/message_edit_post_history_spec.ts b/e2e/cypress/tests/integration/channels/messaging/message_edit_post_history_spec.ts similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/messaging/message_edit_post_history_spec.ts rename to e2e/cypress/tests/integration/channels/messaging/message_edit_post_history_spec.ts index 45b01929c9..c75c21d299 100644 --- a/webapp/channels/e2e/cypress/tests/integration/messaging/message_edit_post_history_spec.ts +++ b/e2e/cypress/tests/integration/channels/messaging/message_edit_post_history_spec.ts @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @messaging +// Group: @channels @messaging -import * as TIMEOUTS from '../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; describe('Post Edit History', () => { let offtopiclink: string; diff --git a/webapp/channels/e2e/cypress/tests/integration/messaging/message_edit_post_with_attachment_spec.js b/e2e/cypress/tests/integration/channels/messaging/message_edit_post_with_attachment_spec.js similarity index 96% rename from webapp/channels/e2e/cypress/tests/integration/messaging/message_edit_post_with_attachment_spec.js rename to e2e/cypress/tests/integration/channels/messaging/message_edit_post_with_attachment_spec.js index 82bc9fd034..b371fcaf41 100644 --- a/webapp/channels/e2e/cypress/tests/integration/messaging/message_edit_post_with_attachment_spec.js +++ b/e2e/cypress/tests/integration/channels/messaging/message_edit_post_with_attachment_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @messaging +// Group: @channels @messaging -import * as TIMEOUTS from '../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; describe('Messaging', () => { let offtopiclink; diff --git a/webapp/channels/e2e/cypress/tests/integration/messaging/message_emoji_jumbo_spec.js b/e2e/cypress/tests/integration/channels/messaging/message_emoji_jumbo_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/messaging/message_emoji_jumbo_spec.js rename to e2e/cypress/tests/integration/channels/messaging/message_emoji_jumbo_spec.js index 67364d4523..fbbffeba11 100644 --- a/webapp/channels/e2e/cypress/tests/integration/messaging/message_emoji_jumbo_spec.js +++ b/e2e/cypress/tests/integration/channels/messaging/message_emoji_jumbo_spec.js @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @messaging @emoji +// Group: @channels @messaging @emoji const normalSize = '21px'; const jumboSize = '32px'; diff --git a/webapp/channels/e2e/cypress/tests/integration/messaging/message_ephemeral_spec.js b/e2e/cypress/tests/integration/channels/messaging/message_ephemeral_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/messaging/message_ephemeral_spec.js rename to e2e/cypress/tests/integration/channels/messaging/message_ephemeral_spec.js index 55992dfeb3..c57900f669 100644 --- a/webapp/channels/e2e/cypress/tests/integration/messaging/message_ephemeral_spec.js +++ b/e2e/cypress/tests/integration/channels/messaging/message_ephemeral_spec.js @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @messaging +// Group: @channels @messaging describe('Hide ephemeral message on refresh', () => { let offtopiclink; diff --git a/webapp/channels/e2e/cypress/tests/integration/messaging/message_in_another_language_spec.js b/e2e/cypress/tests/integration/channels/messaging/message_in_another_language_spec.js similarity index 97% rename from webapp/channels/e2e/cypress/tests/integration/messaging/message_in_another_language_spec.js rename to e2e/cypress/tests/integration/channels/messaging/message_in_another_language_spec.js index a4522c804c..e2392b659b 100644 --- a/webapp/channels/e2e/cypress/tests/integration/messaging/message_in_another_language_spec.js +++ b/e2e/cypress/tests/integration/channels/messaging/message_in_another_language_spec.js @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @messaging +// Group: @channels @messaging describe('Messaging', () => { before(() => { diff --git a/webapp/channels/e2e/cypress/tests/integration/messaging/message_parse_spec.js b/e2e/cypress/tests/integration/channels/messaging/message_parse_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/messaging/message_parse_spec.js rename to e2e/cypress/tests/integration/channels/messaging/message_parse_spec.js index 0dd60ef52c..a256740dd5 100644 --- a/webapp/channels/e2e/cypress/tests/integration/messaging/message_parse_spec.js +++ b/e2e/cypress/tests/integration/channels/messaging/message_parse_spec.js @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @messaging +// Group: @channels @messaging describe('Messaging', () => { before(() => { diff --git a/webapp/channels/e2e/cypress/tests/integration/messaging/message_permalink_spec.js b/e2e/cypress/tests/integration/channels/messaging/message_permalink_spec.js similarity index 97% rename from webapp/channels/e2e/cypress/tests/integration/messaging/message_permalink_spec.js rename to e2e/cypress/tests/integration/channels/messaging/message_permalink_spec.js index b9df6e6beb..6fa189bdd3 100644 --- a/webapp/channels/e2e/cypress/tests/integration/messaging/message_permalink_spec.js +++ b/e2e/cypress/tests/integration/channels/messaging/message_permalink_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @messaging +// Group: @channels @messaging -import * as TIMEOUTS from '../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; describe('Message permalink', () => { let testTeam; diff --git a/webapp/channels/e2e/cypress/tests/integration/messaging/message_pinning_unpinning_spec.js b/e2e/cypress/tests/integration/channels/messaging/message_pinning_unpinning_spec.js similarity index 99% rename from webapp/channels/e2e/cypress/tests/integration/messaging/message_pinning_unpinning_spec.js rename to e2e/cypress/tests/integration/channels/messaging/message_pinning_unpinning_spec.js index ebb86d096a..0aab9f65a3 100644 --- a/webapp/channels/e2e/cypress/tests/integration/messaging/message_pinning_unpinning_spec.js +++ b/e2e/cypress/tests/integration/channels/messaging/message_pinning_unpinning_spec.js @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @messaging +// Group: @channels @messaging const pinnedPosts = []; diff --git a/webapp/channels/e2e/cypress/tests/integration/messaging/message_reaction_gm_spec.js b/e2e/cypress/tests/integration/channels/messaging/message_reaction_gm_spec.js similarity index 99% rename from webapp/channels/e2e/cypress/tests/integration/messaging/message_reaction_gm_spec.js rename to e2e/cypress/tests/integration/channels/messaging/message_reaction_gm_spec.js index 9e53e3d5ec..968cd5659a 100644 --- a/webapp/channels/e2e/cypress/tests/integration/messaging/message_reaction_gm_spec.js +++ b/e2e/cypress/tests/integration/channels/messaging/message_reaction_gm_spec.js @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @messaging +// Group: @channels @messaging describe('Emoji reactions to posts/messages in GM channels', () => { let userOne; diff --git a/webapp/channels/e2e/cypress/tests/integration/messaging/message_reaction_spec.js b/e2e/cypress/tests/integration/channels/messaging/message_reaction_spec.js similarity index 99% rename from webapp/channels/e2e/cypress/tests/integration/messaging/message_reaction_spec.js rename to e2e/cypress/tests/integration/channels/messaging/message_reaction_spec.js index 212f2c0ed5..4d63a9114f 100644 --- a/webapp/channels/e2e/cypress/tests/integration/messaging/message_reaction_spec.js +++ b/e2e/cypress/tests/integration/channels/messaging/message_reaction_spec.js @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod @smoke -// Group: @messaging +// Group: @channels @messaging describe('Emoji reactions to posts/messages', () => { let userOne; diff --git a/webapp/channels/e2e/cypress/tests/integration/messaging/message_reply_bot_post_spec.js b/e2e/cypress/tests/integration/channels/messaging/message_reply_bot_post_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/messaging/message_reply_bot_post_spec.js rename to e2e/cypress/tests/integration/channels/messaging/message_reply_bot_post_spec.js index 614f3af848..dc386bc568 100644 --- a/webapp/channels/e2e/cypress/tests/integration/messaging/message_reply_bot_post_spec.js +++ b/e2e/cypress/tests/integration/channels/messaging/message_reply_bot_post_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @messaging +// Group: @channels @messaging -import {getAdminAccount} from '../../support/env'; +import {getAdminAccount} from '../../../support/env'; describe('Messaging', () => { const sysadmin = getAdminAccount(); diff --git a/webapp/channels/e2e/cypress/tests/integration/messaging/message_reply_gm_spec.js b/e2e/cypress/tests/integration/channels/messaging/message_reply_gm_spec.js similarity index 96% rename from webapp/channels/e2e/cypress/tests/integration/messaging/message_reply_gm_spec.js rename to e2e/cypress/tests/integration/channels/messaging/message_reply_gm_spec.js index 6d159ec36f..bf6d735fd4 100644 --- a/webapp/channels/e2e/cypress/tests/integration/messaging/message_reply_gm_spec.js +++ b/e2e/cypress/tests/integration/channels/messaging/message_reply_gm_spec.js @@ -8,10 +8,10 @@ // *************************************************************** // Stage: @prod -// Group: @messaging +// Group: @channels @messaging -import {getRandomId} from '../../utils'; -import * as TIMEOUTS from '../../fixtures/timeouts'; +import {getRandomId} from '../../../utils'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; describe('Reply in existing GM', () => { let testUser; diff --git a/webapp/channels/e2e/cypress/tests/integration/messaging/message_reply_input_box_expand_spec.js b/e2e/cypress/tests/integration/channels/messaging/message_reply_input_box_expand_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/messaging/message_reply_input_box_expand_spec.js rename to e2e/cypress/tests/integration/channels/messaging/message_reply_input_box_expand_spec.js index 0b4337c0f8..4f5e8cb76f 100644 --- a/webapp/channels/e2e/cypress/tests/integration/messaging/message_reply_input_box_expand_spec.js +++ b/e2e/cypress/tests/integration/channels/messaging/message_reply_input_box_expand_spec.js @@ -7,9 +7,9 @@ // - Use element ID when selecting an element. Create one if none. // *************************************************************** -// Group: @messaging +// Group: @channels @messaging -import * as TIMEOUTS from '../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; describe('Messaging', () => { before(() => { diff --git a/webapp/channels/e2e/cypress/tests/integration/messaging/message_reply_part2_spec.js b/e2e/cypress/tests/integration/channels/messaging/message_reply_part2_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/messaging/message_reply_part2_spec.js rename to e2e/cypress/tests/integration/channels/messaging/message_reply_part2_spec.js index fe315b9235..8482470f69 100644 --- a/webapp/channels/e2e/cypress/tests/integration/messaging/message_reply_part2_spec.js +++ b/e2e/cypress/tests/integration/channels/messaging/message_reply_part2_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @messaging +// Group: @channels @messaging -const TIMEOUTS = require('../../fixtures/timeouts'); +const TIMEOUTS = require('../../../fixtures/timeouts'); describe('Message Reply', () => { let mainChannel; diff --git a/webapp/channels/e2e/cypress/tests/integration/messaging/message_reply_scrollable_spec.js b/e2e/cypress/tests/integration/channels/messaging/message_reply_scrollable_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/messaging/message_reply_scrollable_spec.js rename to e2e/cypress/tests/integration/channels/messaging/message_reply_scrollable_spec.js index 933a53ec12..0f3ba2bcae 100644 --- a/webapp/channels/e2e/cypress/tests/integration/messaging/message_reply_scrollable_spec.js +++ b/e2e/cypress/tests/integration/channels/messaging/message_reply_scrollable_spec.js @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @messaging +// Group: @channels @messaging describe('Message reply scrollable', () => { before(() => { diff --git a/webapp/channels/e2e/cypress/tests/integration/messaging/message_reply_spec.js b/e2e/cypress/tests/integration/channels/messaging/message_reply_spec.js similarity index 97% rename from webapp/channels/e2e/cypress/tests/integration/messaging/message_reply_spec.js rename to e2e/cypress/tests/integration/channels/messaging/message_reply_spec.js index 42ef1335e8..55e6e0d752 100644 --- a/webapp/channels/e2e/cypress/tests/integration/messaging/message_reply_spec.js +++ b/e2e/cypress/tests/integration/channels/messaging/message_reply_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @messaging +// Group: @channels @messaging -import {getAdminAccount} from '../../support/env'; +import {getAdminAccount} from '../../../support/env'; describe('Message Reply', () => { const sysadmin = getAdminAccount(); diff --git a/webapp/channels/e2e/cypress/tests/integration/messaging/message_reply_too_long_spec.js b/e2e/cypress/tests/integration/channels/messaging/message_reply_too_long_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/messaging/message_reply_too_long_spec.js rename to e2e/cypress/tests/integration/channels/messaging/message_reply_too_long_spec.js index ed06d94807..1c3c41d21c 100644 --- a/webapp/channels/e2e/cypress/tests/integration/messaging/message_reply_too_long_spec.js +++ b/e2e/cypress/tests/integration/channels/messaging/message_reply_too_long_spec.js @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @messaging +// Group: @channels @messaging describe('Message Reply too long', () => { before(() => { diff --git a/webapp/channels/e2e/cypress/tests/integration/messaging/message_shortlinking_spec.js b/e2e/cypress/tests/integration/channels/messaging/message_shortlinking_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/messaging/message_shortlinking_spec.js rename to e2e/cypress/tests/integration/channels/messaging/message_shortlinking_spec.js index 2828a56a00..b4f01d717c 100644 --- a/webapp/channels/e2e/cypress/tests/integration/messaging/message_shortlinking_spec.js +++ b/e2e/cypress/tests/integration/channels/messaging/message_shortlinking_spec.js @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @messaging +// Group: @channels @messaging describe('Message', () => { let testChannel; diff --git a/webapp/channels/e2e/cypress/tests/integration/messaging/message_spec.js b/e2e/cypress/tests/integration/channels/messaging/message_spec.js similarity index 97% rename from webapp/channels/e2e/cypress/tests/integration/messaging/message_spec.js rename to e2e/cypress/tests/integration/channels/messaging/message_spec.js index 898ef658bc..2625a46a48 100644 --- a/webapp/channels/e2e/cypress/tests/integration/messaging/message_spec.js +++ b/e2e/cypress/tests/integration/channels/messaging/message_spec.js @@ -8,11 +8,11 @@ // *************************************************************** // Stage: @prod -// Group: @messaging @smoke +// Group: @channels @messaging @smoke -import {getAdminAccount} from '../../support/env'; -import * as MESSAGES from '../../fixtures/messages'; -import timeouts from '../../fixtures/timeouts'; +import {getAdminAccount} from '../../../support/env'; +import * as MESSAGES from '../../../fixtures/messages'; +import timeouts from '../../../fixtures/timeouts'; describe('Message', () => { const admin = getAdminAccount(); diff --git a/webapp/channels/e2e/cypress/tests/integration/messaging/message_with_gif_spec.js b/e2e/cypress/tests/integration/channels/messaging/message_with_gif_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/messaging/message_with_gif_spec.js rename to e2e/cypress/tests/integration/channels/messaging/message_with_gif_spec.js index 8814ee530e..9b1727949f 100644 --- a/webapp/channels/e2e/cypress/tests/integration/messaging/message_with_gif_spec.js +++ b/e2e/cypress/tests/integration/channels/messaging/message_with_gif_spec.js @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @messaging +// Group: @channels @messaging describe('Show GIF images properly', () => { let offtopiclink; diff --git a/webapp/channels/e2e/cypress/tests/integration/messaging/mobile_message_deletion_spec.js b/e2e/cypress/tests/integration/channels/messaging/mobile_message_deletion_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/messaging/mobile_message_deletion_spec.js rename to e2e/cypress/tests/integration/channels/messaging/mobile_message_deletion_spec.js index 65f9a33299..048944884a 100644 --- a/webapp/channels/e2e/cypress/tests/integration/messaging/mobile_message_deletion_spec.js +++ b/e2e/cypress/tests/integration/channels/messaging/mobile_message_deletion_spec.js @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @messaging +// Group: @channels @messaging describe('Delete Parent Message', () => { before(() => { diff --git a/webapp/channels/e2e/cypress/tests/integration/messaging/mobile_profile_popover_spec.js b/e2e/cypress/tests/integration/channels/messaging/mobile_profile_popover_spec.js similarity index 95% rename from webapp/channels/e2e/cypress/tests/integration/messaging/mobile_profile_popover_spec.js rename to e2e/cypress/tests/integration/channels/messaging/mobile_profile_popover_spec.js index 3edfb89540..9a7e2246af 100644 --- a/webapp/channels/e2e/cypress/tests/integration/messaging/mobile_profile_popover_spec.js +++ b/e2e/cypress/tests/integration/channels/messaging/mobile_profile_popover_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @messaging +// Group: @channels @messaging -import * as TIMEOUTS from '../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; describe('Profile popover', () => { before(() => { diff --git a/webapp/channels/e2e/cypress/tests/integration/messaging/no_matches_for_autocomplete_spec.js b/e2e/cypress/tests/integration/channels/messaging/no_matches_for_autocomplete_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/messaging/no_matches_for_autocomplete_spec.js rename to e2e/cypress/tests/integration/channels/messaging/no_matches_for_autocomplete_spec.js index f8df25b1a6..e2344c481e 100644 --- a/webapp/channels/e2e/cypress/tests/integration/messaging/no_matches_for_autocomplete_spec.js +++ b/e2e/cypress/tests/integration/channels/messaging/no_matches_for_autocomplete_spec.js @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @messaging +// Group: @channels @messaging describe('No Matches for Autocomplete', () => { before(() => { diff --git a/webapp/channels/e2e/cypress/tests/integration/messaging/permalink_click_spec.js b/e2e/cypress/tests/integration/channels/messaging/permalink_click_spec.js similarity index 97% rename from webapp/channels/e2e/cypress/tests/integration/messaging/permalink_click_spec.js rename to e2e/cypress/tests/integration/channels/messaging/permalink_click_spec.js index 51f426e2ed..bed65aa3ee 100644 --- a/webapp/channels/e2e/cypress/tests/integration/messaging/permalink_click_spec.js +++ b/e2e/cypress/tests/integration/channels/messaging/permalink_click_spec.js @@ -8,11 +8,11 @@ // *************************************************************** // Stage: @prod -// Group: @messaging +// Group: @channels @messaging -import * as TIMEOUTS from '../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; -import {getAdminAccount} from '../../support/env'; +import {getAdminAccount} from '../../../support/env'; describe('Permalink message edit', () => { let testTeam; diff --git a/webapp/channels/e2e/cypress/tests/integration/messaging/permalink_loading_indicator_spec.js b/e2e/cypress/tests/integration/channels/messaging/permalink_loading_indicator_spec.js similarity index 96% rename from webapp/channels/e2e/cypress/tests/integration/messaging/permalink_loading_indicator_spec.js rename to e2e/cypress/tests/integration/channels/messaging/permalink_loading_indicator_spec.js index 3fc19f01db..7d92d9a467 100644 --- a/webapp/channels/e2e/cypress/tests/integration/messaging/permalink_loading_indicator_spec.js +++ b/e2e/cypress/tests/integration/channels/messaging/permalink_loading_indicator_spec.js @@ -8,10 +8,10 @@ // *************************************************************** // Stage: @prod -// Group: @messaging +// Group: @channels @messaging -import {getRandomId} from '../../utils'; -import * as TIMEOUTS from '../../fixtures/timeouts'; +import {getRandomId} from '../../../utils'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; describe('Messaging', () => { let testTeam; diff --git a/webapp/channels/e2e/cypress/tests/integration/messaging/permalink_message_edit_spec.js b/e2e/cypress/tests/integration/channels/messaging/permalink_message_edit_spec.js similarity index 97% rename from webapp/channels/e2e/cypress/tests/integration/messaging/permalink_message_edit_spec.js rename to e2e/cypress/tests/integration/channels/messaging/permalink_message_edit_spec.js index bc0273cfce..bc97eaf784 100644 --- a/webapp/channels/e2e/cypress/tests/integration/messaging/permalink_message_edit_spec.js +++ b/e2e/cypress/tests/integration/channels/messaging/permalink_message_edit_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @messaging +// Group: @channels @messaging -import * as TIMEOUTS from '../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; describe('Permalink message edit', () => { let testTeam; diff --git a/webapp/channels/e2e/cypress/tests/integration/messaging/pinned_parent_post_spec.js b/e2e/cypress/tests/integration/channels/messaging/pinned_parent_post_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/messaging/pinned_parent_post_spec.js rename to e2e/cypress/tests/integration/channels/messaging/pinned_parent_post_spec.js index b41a0ffb55..7d87a59c0e 100644 --- a/webapp/channels/e2e/cypress/tests/integration/messaging/pinned_parent_post_spec.js +++ b/e2e/cypress/tests/integration/channels/messaging/pinned_parent_post_spec.js @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @messaging +// Group: @channels @messaging describe('Messaging', () => { let testTeam; diff --git a/webapp/channels/e2e/cypress/tests/integration/messaging/pinned_posts_1_spec.js b/e2e/cypress/tests/integration/channels/messaging/pinned_posts_1_spec.js similarity index 99% rename from webapp/channels/e2e/cypress/tests/integration/messaging/pinned_posts_1_spec.js rename to e2e/cypress/tests/integration/channels/messaging/pinned_posts_1_spec.js index d288776b28..572cbce265 100644 --- a/webapp/channels/e2e/cypress/tests/integration/messaging/pinned_posts_1_spec.js +++ b/e2e/cypress/tests/integration/channels/messaging/pinned_posts_1_spec.js @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @messaging +// Group: @channels @messaging describe('Messaging', () => { let testTeam; diff --git a/webapp/channels/e2e/cypress/tests/integration/messaging/pinned_posts_2_spec.js b/e2e/cypress/tests/integration/channels/messaging/pinned_posts_2_spec.js similarity index 99% rename from webapp/channels/e2e/cypress/tests/integration/messaging/pinned_posts_2_spec.js rename to e2e/cypress/tests/integration/channels/messaging/pinned_posts_2_spec.js index c8202abe64..05df85c702 100644 --- a/webapp/channels/e2e/cypress/tests/integration/messaging/pinned_posts_2_spec.js +++ b/e2e/cypress/tests/integration/channels/messaging/pinned_posts_2_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @messaging +// Group: @channels @messaging -import {getAdminAccount} from '../../support/env'; +import {getAdminAccount} from '../../../support/env'; describe('Pinned posts', () => { let testTeam; diff --git a/webapp/channels/e2e/cypress/tests/integration/messaging/post_header_spec.js b/e2e/cypress/tests/integration/channels/messaging/post_header_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/messaging/post_header_spec.js rename to e2e/cypress/tests/integration/channels/messaging/post_header_spec.js index 15fd357824..51e134831e 100644 --- a/webapp/channels/e2e/cypress/tests/integration/messaging/post_header_spec.js +++ b/e2e/cypress/tests/integration/channels/messaging/post_header_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @messaging +// Group: @channels @messaging -import * as TIMEOUTS from '../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; describe('Post Header', () => { let testTeam; diff --git a/webapp/channels/e2e/cypress/tests/integration/messaging/post_html_table_spec.js b/e2e/cypress/tests/integration/channels/messaging/post_html_table_spec.js similarity index 93% rename from webapp/channels/e2e/cypress/tests/integration/messaging/post_html_table_spec.js rename to e2e/cypress/tests/integration/channels/messaging/post_html_table_spec.js index eb563ae2f3..cd3e8e12d2 100644 --- a/webapp/channels/e2e/cypress/tests/integration/messaging/post_html_table_spec.js +++ b/e2e/cypress/tests/integration/channels/messaging/post_html_table_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @messaging +// Group: @channels @messaging -import * as TIMEOUTS from '../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; describe('Post HTML', () => { before(() => { diff --git a/webapp/channels/e2e/cypress/tests/integration/messaging/post_options_menu_spec.js b/e2e/cypress/tests/integration/channels/messaging/post_options_menu_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/messaging/post_options_menu_spec.js rename to e2e/cypress/tests/integration/channels/messaging/post_options_menu_spec.js index 682b5085b3..15efcce2c4 100644 --- a/webapp/channels/e2e/cypress/tests/integration/messaging/post_options_menu_spec.js +++ b/e2e/cypress/tests/integration/channels/messaging/post_options_menu_spec.js @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @messaging +// Group: @channels @messaging describe('Messaging', () => { before(() => { diff --git a/webapp/channels/e2e/cypress/tests/integration/messaging/post_pre_header_spec.js b/e2e/cypress/tests/integration/channels/messaging/post_pre_header_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/messaging/post_pre_header_spec.js rename to e2e/cypress/tests/integration/channels/messaging/post_pre_header_spec.js index 2f498222b8..a9dcaa737c 100644 --- a/webapp/channels/e2e/cypress/tests/integration/messaging/post_pre_header_spec.js +++ b/e2e/cypress/tests/integration/channels/messaging/post_pre_header_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @messaging +// Group: @channels @messaging -import {verifySavedPost} from '../../support/ui/post'; +import {verifySavedPost} from '../../../support/ui/post'; describe('Post PreHeader', () => { let testTeam; diff --git a/webapp/channels/e2e/cypress/tests/integration/messaging/post_textbox_height_spec.js b/e2e/cypress/tests/integration/channels/messaging/post_textbox_height_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/messaging/post_textbox_height_spec.js rename to e2e/cypress/tests/integration/channels/messaging/post_textbox_height_spec.js index 2b31bb9410..b637da3107 100644 --- a/webapp/channels/e2e/cypress/tests/integration/messaging/post_textbox_height_spec.js +++ b/e2e/cypress/tests/integration/channels/messaging/post_textbox_height_spec.js @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @messaging +// Group: @channels @messaging describe('Messaging', () => { before(() => { diff --git a/webapp/channels/e2e/cypress/tests/integration/messaging/private_channel_open_spec.js b/e2e/cypress/tests/integration/channels/messaging/private_channel_open_spec.js similarity index 95% rename from webapp/channels/e2e/cypress/tests/integration/messaging/private_channel_open_spec.js rename to e2e/cypress/tests/integration/channels/messaging/private_channel_open_spec.js index 15a74477c4..e66ab5fcee 100644 --- a/webapp/channels/e2e/cypress/tests/integration/messaging/private_channel_open_spec.js +++ b/e2e/cypress/tests/integration/channels/messaging/private_channel_open_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @messaging +// Group: @channels @messaging -import * as TIMEOUTS from '../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; describe('Messaging - Opening a private channel using keyboard shortcuts', () => { let testTeam; diff --git a/webapp/channels/e2e/cypress/tests/integration/messaging/quick_send_spec.js b/e2e/cypress/tests/integration/channels/messaging/quick_send_spec.js similarity index 97% rename from webapp/channels/e2e/cypress/tests/integration/messaging/quick_send_spec.js rename to e2e/cypress/tests/integration/channels/messaging/quick_send_spec.js index e5dda43919..f25c40f68e 100644 --- a/webapp/channels/e2e/cypress/tests/integration/messaging/quick_send_spec.js +++ b/e2e/cypress/tests/integration/channels/messaging/quick_send_spec.js @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @messaging +// Group: @channels @messaging describe('Messaging', () => { before(() => { diff --git a/webapp/channels/e2e/cypress/tests/integration/messaging/quote_notation_spec.js b/e2e/cypress/tests/integration/channels/messaging/quote_notation_spec.js similarity index 99% rename from webapp/channels/e2e/cypress/tests/integration/messaging/quote_notation_spec.js rename to e2e/cypress/tests/integration/channels/messaging/quote_notation_spec.js index 68247fcc33..3e67d122fb 100644 --- a/webapp/channels/e2e/cypress/tests/integration/messaging/quote_notation_spec.js +++ b/e2e/cypress/tests/integration/channels/messaging/quote_notation_spec.js @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @messaging +// Group: @channels @messaging describe('Compact view: Markdown quotation', () => { let testTeam; diff --git a/webapp/channels/e2e/cypress/tests/integration/messaging/reactions_spec.js b/e2e/cypress/tests/integration/channels/messaging/reactions_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/messaging/reactions_spec.js rename to e2e/cypress/tests/integration/channels/messaging/reactions_spec.js index 66ba3645cf..8a7bd33e7f 100644 --- a/webapp/channels/e2e/cypress/tests/integration/messaging/reactions_spec.js +++ b/e2e/cypress/tests/integration/channels/messaging/reactions_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @messaging +// Group: @channels @messaging -import * as TIMEOUTS from '../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; describe('Messaging', () => { before(() => { diff --git a/webapp/channels/e2e/cypress/tests/integration/messaging/receive_message_on_socket_reconnect_spec.js b/e2e/cypress/tests/integration/channels/messaging/receive_message_on_socket_reconnect_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/messaging/receive_message_on_socket_reconnect_spec.js rename to e2e/cypress/tests/integration/channels/messaging/receive_message_on_socket_reconnect_spec.js index 12688f0ff1..9d04d94705 100644 --- a/webapp/channels/e2e/cypress/tests/integration/messaging/receive_message_on_socket_reconnect_spec.js +++ b/e2e/cypress/tests/integration/channels/messaging/receive_message_on_socket_reconnect_spec.js @@ -7,9 +7,9 @@ // - Use element ID when selecting an element. Create one if none. // *************************************************************** -// Group: @messaging +// Group: @channels @messaging -import * as TIMEOUTS from '../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; describe('Messaging', () => { let testTeam; diff --git a/webapp/channels/e2e/cypress/tests/integration/messaging/remove_gif_spec.js b/e2e/cypress/tests/integration/channels/messaging/remove_gif_spec.js similarity index 97% rename from webapp/channels/e2e/cypress/tests/integration/messaging/remove_gif_spec.js rename to e2e/cypress/tests/integration/channels/messaging/remove_gif_spec.js index 6ee21d3c1c..c8b2bf7484 100644 --- a/webapp/channels/e2e/cypress/tests/integration/messaging/remove_gif_spec.js +++ b/e2e/cypress/tests/integration/channels/messaging/remove_gif_spec.js @@ -8,10 +8,10 @@ // *************************************************************** // Stage: @prod -// Group: @messaging +// Group: @channels @messaging -import * as TIMEOUTS from '../../fixtures/timeouts'; -import {getAdminAccount} from '../../support/env'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; +import {getAdminAccount} from '../../../support/env'; describe('Messaging', () => { const admin = getAdminAccount(); diff --git a/webapp/channels/e2e/cypress/tests/integration/messaging/remove_last_post_in_channel_spec.js b/e2e/cypress/tests/integration/channels/messaging/remove_last_post_in_channel_spec.js similarity index 95% rename from webapp/channels/e2e/cypress/tests/integration/messaging/remove_last_post_in_channel_spec.js rename to e2e/cypress/tests/integration/channels/messaging/remove_last_post_in_channel_spec.js index 1db7e58aff..450ae8e292 100644 --- a/webapp/channels/e2e/cypress/tests/integration/messaging/remove_last_post_in_channel_spec.js +++ b/e2e/cypress/tests/integration/channels/messaging/remove_last_post_in_channel_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @messaging +// Group: @channels @messaging -import * as TIMEOUTS from '../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; describe('Remove Last Post', () => { let testTeam; diff --git a/webapp/channels/e2e/cypress/tests/integration/messaging/save_post_spec.js b/e2e/cypress/tests/integration/channels/messaging/save_post_spec.js similarity index 96% rename from webapp/channels/e2e/cypress/tests/integration/messaging/save_post_spec.js rename to e2e/cypress/tests/integration/channels/messaging/save_post_spec.js index 98bf355cbf..366add13d4 100644 --- a/webapp/channels/e2e/cypress/tests/integration/messaging/save_post_spec.js +++ b/e2e/cypress/tests/integration/channels/messaging/save_post_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @messaging +// Group: @channels @messaging -import {verifySavedPost, verifyUnsavedPost} from '../../support/ui/post'; +import {verifySavedPost, verifyUnsavedPost} from '../../../support/ui/post'; describe('Save Post', () => { before(() => { diff --git a/webapp/channels/e2e/cypress/tests/integration/messaging/scroll_channel_messages_spec.js b/e2e/cypress/tests/integration/channels/messaging/scroll_channel_messages_spec.js similarity index 97% rename from webapp/channels/e2e/cypress/tests/integration/messaging/scroll_channel_messages_spec.js rename to e2e/cypress/tests/integration/channels/messaging/scroll_channel_messages_spec.js index c16b355ea7..5f2f7bf72f 100644 --- a/webapp/channels/e2e/cypress/tests/integration/messaging/scroll_channel_messages_spec.js +++ b/e2e/cypress/tests/integration/channels/messaging/scroll_channel_messages_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @messaging +// Group: @channels @messaging -import {getAdminAccount} from '../../support/env'; +import {getAdminAccount} from '../../../support/env'; describe('Scroll channel`s messages in mobile view', () => { const sysadmin = getAdminAccount(); diff --git a/webapp/channels/e2e/cypress/tests/integration/messaging/send_message_via_profile_popover_spec.js b/e2e/cypress/tests/integration/channels/messaging/send_message_via_profile_popover_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/messaging/send_message_via_profile_popover_spec.js rename to e2e/cypress/tests/integration/channels/messaging/send_message_via_profile_popover_spec.js index 24c068dc79..b561cc107c 100644 --- a/webapp/channels/e2e/cypress/tests/integration/messaging/send_message_via_profile_popover_spec.js +++ b/e2e/cypress/tests/integration/channels/messaging/send_message_via_profile_popover_spec.js @@ -7,9 +7,9 @@ // - Use element ID when selecting an element. Create one if none. // *************************************************************** -// Group: @messaging +// Group: @channels @messaging -import * as TIMEOUTS from '../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; describe('Profile popover', () => { const message = `Testing ${Date.now()}`; diff --git a/webapp/channels/e2e/cypress/tests/integration/messaging/single_image_thumbnail_spec.js b/e2e/cypress/tests/integration/channels/messaging/single_image_thumbnail_spec.js similarity index 95% rename from webapp/channels/e2e/cypress/tests/integration/messaging/single_image_thumbnail_spec.js rename to e2e/cypress/tests/integration/channels/messaging/single_image_thumbnail_spec.js index 5e016a3034..0d7e285390 100644 --- a/webapp/channels/e2e/cypress/tests/integration/messaging/single_image_thumbnail_spec.js +++ b/e2e/cypress/tests/integration/channels/messaging/single_image_thumbnail_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @messaging @smoke +// Group: @channels @messaging @smoke -import * as MESSAGES from '../../fixtures/messages'; +import * as MESSAGES from '../../../fixtures/messages'; describe('Message', () => { before(() => { diff --git a/webapp/channels/e2e/cypress/tests/integration/messaging/strikethrough_spec.js b/e2e/cypress/tests/integration/channels/messaging/strikethrough_spec.js similarity index 96% rename from webapp/channels/e2e/cypress/tests/integration/messaging/strikethrough_spec.js rename to e2e/cypress/tests/integration/channels/messaging/strikethrough_spec.js index 202e428fc9..63f3c73bdf 100644 --- a/webapp/channels/e2e/cypress/tests/integration/messaging/strikethrough_spec.js +++ b/e2e/cypress/tests/integration/channels/messaging/strikethrough_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @messaging +// Group: @channels @messaging -import * as TIMEOUTS from '../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; describe('Messaging', () => { before(() => { diff --git a/webapp/channels/e2e/cypress/tests/integration/messaging/system_message_limited_options_spec.js b/e2e/cypress/tests/integration/channels/messaging/system_message_limited_options_spec.js similarity index 96% rename from webapp/channels/e2e/cypress/tests/integration/messaging/system_message_limited_options_spec.js rename to e2e/cypress/tests/integration/channels/messaging/system_message_limited_options_spec.js index 869500a1b5..15d710e003 100644 --- a/webapp/channels/e2e/cypress/tests/integration/messaging/system_message_limited_options_spec.js +++ b/e2e/cypress/tests/integration/channels/messaging/system_message_limited_options_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @messaging +// Group: @channels @messaging -import * as TIMEOUTS from '../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; describe('Messaging', () => { let townsquareLink; diff --git a/webapp/channels/e2e/cypress/tests/integration/messaging/system_message_spec.js b/e2e/cypress/tests/integration/channels/messaging/system_message_spec.js similarity index 99% rename from webapp/channels/e2e/cypress/tests/integration/messaging/system_message_spec.js rename to e2e/cypress/tests/integration/channels/messaging/system_message_spec.js index 09dbdae060..9de1047024 100644 --- a/webapp/channels/e2e/cypress/tests/integration/messaging/system_message_spec.js +++ b/e2e/cypress/tests/integration/channels/messaging/system_message_spec.js @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @messaging +// Group: @channels @messaging // helper function to count the lines in a block of text by wrapping each word in a span and finding where the text breaks the line function getLines(e) { diff --git a/webapp/channels/e2e/cypress/tests/integration/messaging/thread_appears_and_scrollable_in_the_rhs_spec.js b/e2e/cypress/tests/integration/channels/messaging/thread_appears_and_scrollable_in_the_rhs_spec.js similarity index 97% rename from webapp/channels/e2e/cypress/tests/integration/messaging/thread_appears_and_scrollable_in_the_rhs_spec.js rename to e2e/cypress/tests/integration/channels/messaging/thread_appears_and_scrollable_in_the_rhs_spec.js index 5b6efb4fc3..ac24f70683 100644 --- a/webapp/channels/e2e/cypress/tests/integration/messaging/thread_appears_and_scrollable_in_the_rhs_spec.js +++ b/e2e/cypress/tests/integration/channels/messaging/thread_appears_and_scrollable_in_the_rhs_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @messaging +// Group: @channels @messaging -import * as TIMEOUTS from '../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; describe('Thread Scrolling Inside RHS ', () => { beforeEach(function() { diff --git a/webapp/channels/e2e/cypress/tests/integration/messaging/tooltip_visual_verification_spec.js b/e2e/cypress/tests/integration/channels/messaging/tooltip_visual_verification_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/messaging/tooltip_visual_verification_spec.js rename to e2e/cypress/tests/integration/channels/messaging/tooltip_visual_verification_spec.js index 14ddf652dc..30bbdf260a 100644 --- a/webapp/channels/e2e/cypress/tests/integration/messaging/tooltip_visual_verification_spec.js +++ b/e2e/cypress/tests/integration/channels/messaging/tooltip_visual_verification_spec.js @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @messaging +// Group: @channels @messaging describe('Messaging', () => { before(() => { diff --git a/webapp/channels/e2e/cypress/tests/integration/messaging/tooltips_on_top_nav_channel_icons_posts_spec.js b/e2e/cypress/tests/integration/channels/messaging/tooltips_on_top_nav_channel_icons_posts_spec.js similarity index 97% rename from webapp/channels/e2e/cypress/tests/integration/messaging/tooltips_on_top_nav_channel_icons_posts_spec.js rename to e2e/cypress/tests/integration/channels/messaging/tooltips_on_top_nav_channel_icons_posts_spec.js index df3e01ca12..77d3c5674e 100644 --- a/webapp/channels/e2e/cypress/tests/integration/messaging/tooltips_on_top_nav_channel_icons_posts_spec.js +++ b/e2e/cypress/tests/integration/channels/messaging/tooltips_on_top_nav_channel_icons_posts_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @messaging @plugin @not_cloud +// Group: @channels @messaging @plugin @not_cloud -import {demoPlugin} from '../../utils/plugins'; +import {demoPlugin} from '../../../utils/plugins'; describe('Messaging', () => { let testTeam; diff --git a/webapp/channels/e2e/cypress/tests/integration/messaging/typing_on_middle_spec.js b/e2e/cypress/tests/integration/channels/messaging/typing_on_middle_spec.js similarity index 93% rename from webapp/channels/e2e/cypress/tests/integration/messaging/typing_on_middle_spec.js rename to e2e/cypress/tests/integration/channels/messaging/typing_on_middle_spec.js index d04525b5ab..953895788d 100644 --- a/webapp/channels/e2e/cypress/tests/integration/messaging/typing_on_middle_spec.js +++ b/e2e/cypress/tests/integration/channels/messaging/typing_on_middle_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @messaging +// Group: @channels @messaging -import * as TIMEOUTS from '../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; describe('Messaging', () => { before(() => { diff --git a/webapp/channels/e2e/cypress/tests/integration/messaging/typing_should_show_up_when_editing_spec.js b/e2e/cypress/tests/integration/channels/messaging/typing_should_show_up_when_editing_spec.js similarity index 94% rename from webapp/channels/e2e/cypress/tests/integration/messaging/typing_should_show_up_when_editing_spec.js rename to e2e/cypress/tests/integration/channels/messaging/typing_should_show_up_when_editing_spec.js index 15059c6ac4..c8e3b30916 100644 --- a/webapp/channels/e2e/cypress/tests/integration/messaging/typing_should_show_up_when_editing_spec.js +++ b/e2e/cypress/tests/integration/channels/messaging/typing_should_show_up_when_editing_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @messaging +// Group: @channels @messaging -import * as TIMEOUTS from '../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; describe('Messaging', () => { before(() => { diff --git a/webapp/channels/e2e/cypress/tests/integration/modals/quick_switcher_spec.js b/e2e/cypress/tests/integration/channels/modals/quick_switcher_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/modals/quick_switcher_spec.js rename to e2e/cypress/tests/integration/channels/modals/quick_switcher_spec.js index 179ece24fa..3da99ea413 100644 --- a/webapp/channels/e2e/cypress/tests/integration/modals/quick_switcher_spec.js +++ b/e2e/cypress/tests/integration/channels/modals/quick_switcher_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @modals +// Group: @channels @modals -import * as TIMEOUTS from '../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; describe('Quick switcher', () => { const userPrefix = 'az'; diff --git a/webapp/channels/e2e/cypress/tests/integration/multi_team_and_dm/channel_user_count_spec.js b/e2e/cypress/tests/integration/channels/multi_team_and_dm/channel_user_count_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/multi_team_and_dm/channel_user_count_spec.js rename to e2e/cypress/tests/integration/channels/multi_team_and_dm/channel_user_count_spec.js index c2cc50bfb3..536deb5eda 100644 --- a/webapp/channels/e2e/cypress/tests/integration/multi_team_and_dm/channel_user_count_spec.js +++ b/e2e/cypress/tests/integration/channels/multi_team_and_dm/channel_user_count_spec.js @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @channel +// Group: @channels @channel describe('Channel user count', () => { let testTeam; diff --git a/webapp/channels/e2e/cypress/tests/integration/multi_team_and_dm/check_user_status_spec.js b/e2e/cypress/tests/integration/channels/multi_team_and_dm/check_user_status_spec.js similarity index 96% rename from webapp/channels/e2e/cypress/tests/integration/multi_team_and_dm/check_user_status_spec.js rename to e2e/cypress/tests/integration/channels/multi_team_and_dm/check_user_status_spec.js index 19e7bfd9a8..7e0940a5bc 100644 --- a/webapp/channels/e2e/cypress/tests/integration/multi_team_and_dm/check_user_status_spec.js +++ b/e2e/cypress/tests/integration/channels/multi_team_and_dm/check_user_status_spec.js @@ -1,8 +1,8 @@ // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. // See LICENSE.txt for license information. -import * as TIMEOUTS from '../../fixtures/timeouts'; -import * as MESSAGES from '../../fixtures/messages'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; +import * as MESSAGES from '../../../fixtures/messages'; // *************************************************************** // [#] indicates a test step (e.g. # Go to a page) @@ -10,7 +10,7 @@ import * as MESSAGES from '../../fixtures/messages'; // Use element ID when selecting an element. Create one if none. // *************************************************************** -// Group: @multi_team_and_dm +// Group: @channels @multi_team_and_dm describe('Multi-Team + DMs', () => { let userA; diff --git a/webapp/channels/e2e/cypress/tests/integration/multi_team_and_dm/close_current_dm_redirects_spec.js b/e2e/cypress/tests/integration/channels/multi_team_and_dm/close_current_dm_redirects_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/multi_team_and_dm/close_current_dm_redirects_spec.js rename to e2e/cypress/tests/integration/channels/multi_team_and_dm/close_current_dm_redirects_spec.js index 9c758842d9..3ac7bbd7ba 100644 --- a/webapp/channels/e2e/cypress/tests/integration/multi_team_and_dm/close_current_dm_redirects_spec.js +++ b/e2e/cypress/tests/integration/channels/multi_team_and_dm/close_current_dm_redirects_spec.js @@ -2,9 +2,9 @@ // See LICENSE.txt for license information. // Stage: @prod -// Group: @multi_team_and_dm +// Group: @channels @multi_team_and_dm -import * as TIMEOUTS from '../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; describe('Direct messages: redirections', () => { let testUser; diff --git a/webapp/channels/e2e/cypress/tests/integration/multi_team_and_dm/close_gm_via_menu_spec.js b/e2e/cypress/tests/integration/channels/multi_team_and_dm/close_gm_via_menu_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/multi_team_and_dm/close_gm_via_menu_spec.js rename to e2e/cypress/tests/integration/channels/multi_team_and_dm/close_gm_via_menu_spec.js index ab516dd8ec..3eb259b664 100644 --- a/webapp/channels/e2e/cypress/tests/integration/multi_team_and_dm/close_gm_via_menu_spec.js +++ b/e2e/cypress/tests/integration/channels/multi_team_and_dm/close_gm_via_menu_spec.js @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @multi_team_and_dm +// Group: @channels @multi_team_and_dm describe('Multi-user group messages', () => { let testUser; diff --git a/webapp/channels/e2e/cypress/tests/integration/multi_team_and_dm/dm_more_searching_from_page_spec.js b/e2e/cypress/tests/integration/channels/multi_team_and_dm/dm_more_searching_from_page_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/multi_team_and_dm/dm_more_searching_from_page_spec.js rename to e2e/cypress/tests/integration/channels/multi_team_and_dm/dm_more_searching_from_page_spec.js index 8cc774d2cd..aebedbddfb 100644 --- a/webapp/channels/e2e/cypress/tests/integration/multi_team_and_dm/dm_more_searching_from_page_spec.js +++ b/e2e/cypress/tests/integration/channels/multi_team_and_dm/dm_more_searching_from_page_spec.js @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @multi_team_and_dm +// Group: @channels @multi_team_and_dm describe('Multi Team and DM', () => { let testChannel; diff --git a/webapp/channels/e2e/cypress/tests/integration/multi_team_and_dm/dm_more_show_user_count_spec.js b/e2e/cypress/tests/integration/channels/multi_team_and_dm/dm_more_show_user_count_spec.js similarity index 96% rename from webapp/channels/e2e/cypress/tests/integration/multi_team_and_dm/dm_more_show_user_count_spec.js rename to e2e/cypress/tests/integration/channels/multi_team_and_dm/dm_more_show_user_count_spec.js index 91432d9848..c87f06476c 100644 --- a/webapp/channels/e2e/cypress/tests/integration/multi_team_and_dm/dm_more_show_user_count_spec.js +++ b/e2e/cypress/tests/integration/channels/multi_team_and_dm/dm_more_show_user_count_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @multi_team_and_dm +// Group: @channels @multi_team_and_dm -import {getRandomId} from '../../utils'; +import {getRandomId} from '../../../utils'; describe('Multi Team and DM', () => { let testChannel; diff --git a/webapp/channels/e2e/cypress/tests/integration/multi_team_and_dm/existing_channel_name_spec.js b/e2e/cypress/tests/integration/channels/multi_team_and_dm/existing_channel_name_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/multi_team_and_dm/existing_channel_name_spec.js rename to e2e/cypress/tests/integration/channels/multi_team_and_dm/existing_channel_name_spec.js index 1ff1cbed37..5e0ccafda9 100644 --- a/webapp/channels/e2e/cypress/tests/integration/multi_team_and_dm/existing_channel_name_spec.js +++ b/e2e/cypress/tests/integration/channels/multi_team_and_dm/existing_channel_name_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @multi_team_and_dm +// Group: @channels @multi_team_and_dm -import * as TIMEOUTS from '../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; describe('Channel', () => { let testTeamId; diff --git a/webapp/channels/e2e/cypress/tests/integration/multi_team_and_dm/favorite_and_close_spec.js b/e2e/cypress/tests/integration/channels/multi_team_and_dm/favorite_and_close_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/multi_team_and_dm/favorite_and_close_spec.js rename to e2e/cypress/tests/integration/channels/multi_team_and_dm/favorite_and_close_spec.js index 64eac8c3dd..7c04b32687 100644 --- a/webapp/channels/e2e/cypress/tests/integration/multi_team_and_dm/favorite_and_close_spec.js +++ b/e2e/cypress/tests/integration/channels/multi_team_and_dm/favorite_and_close_spec.js @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @multi_team_and_dm +// Group: @channels @multi_team_and_dm describe('Close group messages', () => { let testUser; diff --git a/webapp/channels/e2e/cypress/tests/integration/multi_team_and_dm/gm_add_user_spec.js b/e2e/cypress/tests/integration/channels/multi_team_and_dm/gm_add_user_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/multi_team_and_dm/gm_add_user_spec.js rename to e2e/cypress/tests/integration/channels/multi_team_and_dm/gm_add_user_spec.js index c7e45ef84d..5e92e3fe16 100644 --- a/webapp/channels/e2e/cypress/tests/integration/multi_team_and_dm/gm_add_user_spec.js +++ b/e2e/cypress/tests/integration/channels/multi_team_and_dm/gm_add_user_spec.js @@ -2,9 +2,9 @@ // See LICENSE.txt for license information. // Stage: @prod -// Group: @multi_team_and_dm +// Group: @channels @multi_team_and_dm -import * as TIMEOUTS from '../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; describe('Multi-user group messages', () => { let testUser; diff --git a/webapp/channels/e2e/cypress/tests/integration/multi_team_and_dm/gm_header_spec.js b/e2e/cypress/tests/integration/channels/multi_team_and_dm/gm_header_spec.js similarity index 97% rename from webapp/channels/e2e/cypress/tests/integration/multi_team_and_dm/gm_header_spec.js rename to e2e/cypress/tests/integration/channels/multi_team_and_dm/gm_header_spec.js index 9bc545f035..7adc6a55cb 100644 --- a/webapp/channels/e2e/cypress/tests/integration/multi_team_and_dm/gm_header_spec.js +++ b/e2e/cypress/tests/integration/channels/multi_team_and_dm/gm_header_spec.js @@ -8,10 +8,10 @@ // *************************************************************** // Stage: @prod -// Group: @multi_team_and_dm +// Group: @channels @multi_team_and_dm -import {beRead, beUnread} from '../../support/assertions'; -import * as TIMEOUTS from '../../fixtures/timeouts'; +import {beRead, beUnread} from '../../../support/assertions'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; describe('Multi-user group header', () => { let testUser; diff --git a/webapp/channels/e2e/cypress/tests/integration/multi_team_and_dm/join_open_team_from_dm_spec.js b/e2e/cypress/tests/integration/channels/multi_team_and_dm/join_open_team_from_dm_spec.js similarity index 99% rename from webapp/channels/e2e/cypress/tests/integration/multi_team_and_dm/join_open_team_from_dm_spec.js rename to e2e/cypress/tests/integration/channels/multi_team_and_dm/join_open_team_from_dm_spec.js index e99cc1f7ea..932ddb0e3f 100644 --- a/webapp/channels/e2e/cypress/tests/integration/multi_team_and_dm/join_open_team_from_dm_spec.js +++ b/e2e/cypress/tests/integration/channels/multi_team_and_dm/join_open_team_from_dm_spec.js @@ -2,7 +2,7 @@ // See LICENSE.txt for license information. // Stage: @prod -// Group: @multi_team_and_dm +// Group: @channels @multi_team_and_dm describe('Join an open team from a direct message link', () => { let openTeam; diff --git a/webapp/channels/e2e/cypress/tests/integration/multi_team_and_dm/max_gm_members_spec.js b/e2e/cypress/tests/integration/channels/multi_team_and_dm/max_gm_members_spec.js similarity index 99% rename from webapp/channels/e2e/cypress/tests/integration/multi_team_and_dm/max_gm_members_spec.js rename to e2e/cypress/tests/integration/channels/multi_team_and_dm/max_gm_members_spec.js index c5ff0c0086..87c10f821d 100644 --- a/webapp/channels/e2e/cypress/tests/integration/multi_team_and_dm/max_gm_members_spec.js +++ b/e2e/cypress/tests/integration/channels/multi_team_and_dm/max_gm_members_spec.js @@ -7,7 +7,7 @@ // - Use element ID when selecting an element. Create one if none. // *************************************************************** -// Group: @multi_team_and_dm +// Group: @channels @multi_team_and_dm describe('Multi-user group messages', () => { let testUser; diff --git a/webapp/channels/e2e/cypress/tests/integration/multi_team_and_dm/multi_team_join_spec.js b/e2e/cypress/tests/integration/channels/multi_team_and_dm/multi_team_join_spec.js similarity index 94% rename from webapp/channels/e2e/cypress/tests/integration/multi_team_and_dm/multi_team_join_spec.js rename to e2e/cypress/tests/integration/channels/multi_team_and_dm/multi_team_join_spec.js index 576b2b86c9..da1e731677 100644 --- a/webapp/channels/e2e/cypress/tests/integration/multi_team_and_dm/multi_team_join_spec.js +++ b/e2e/cypress/tests/integration/channels/multi_team_and_dm/multi_team_join_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @multi_team_and_dm +// Group: @channels @multi_team_and_dm -import {DEFAULT_TEAM} from '../../support/constants'; +import {DEFAULT_TEAM} from '../../../support/constants'; const NUMBER_OF_TEAMS = 3; diff --git a/webapp/channels/e2e/cypress/tests/integration/multi_team_and_dm/multi_team_spec.js b/e2e/cypress/tests/integration/channels/multi_team_and_dm/multi_team_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/multi_team_and_dm/multi_team_spec.js rename to e2e/cypress/tests/integration/channels/multi_team_and_dm/multi_team_spec.js index cc0f05c784..66a8563af0 100644 --- a/webapp/channels/e2e/cypress/tests/integration/multi_team_and_dm/multi_team_spec.js +++ b/e2e/cypress/tests/integration/channels/multi_team_and_dm/multi_team_spec.js @@ -1,7 +1,7 @@ // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. // See LICENSE.txt for license information. -import * as TIMEOUTS from '../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; // *************************************************************** // - [#] indicates a test step (e.g. # Go to a page) @@ -10,7 +10,7 @@ import * as TIMEOUTS from '../../fixtures/timeouts'; // *************************************************************** // Stage: @prod -// Group: @multi_team_and_dm +// Group: @channels @multi_team_and_dm describe('Send a DM', () => { let userA; // Member of team A and B diff --git a/webapp/channels/e2e/cypress/tests/integration/multi_team_and_dm/send_dm_user_no_team_spec.js b/e2e/cypress/tests/integration/channels/multi_team_and_dm/send_dm_user_no_team_spec.js similarity index 94% rename from webapp/channels/e2e/cypress/tests/integration/multi_team_and_dm/send_dm_user_no_team_spec.js rename to e2e/cypress/tests/integration/channels/multi_team_and_dm/send_dm_user_no_team_spec.js index 0115dea943..0b3fb03982 100644 --- a/webapp/channels/e2e/cypress/tests/integration/multi_team_and_dm/send_dm_user_no_team_spec.js +++ b/e2e/cypress/tests/integration/channels/multi_team_and_dm/send_dm_user_no_team_spec.js @@ -8,10 +8,10 @@ // *************************************************************** // Stage: @prod -// Group: @multi_team_and_dm +// Group: @channels @multi_team_and_dm -import * as TIMEOUTS from '../../fixtures/timeouts'; -import * as MESSAGES from '../../fixtures/messages'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; +import * as MESSAGES from '../../../fixtures/messages'; describe('Send a DM', () => { let userA; diff --git a/webapp/channels/e2e/cypress/tests/integration/multi_team_and_dm/system_message_spec.js b/e2e/cypress/tests/integration/channels/multi_team_and_dm/system_message_spec.js similarity index 96% rename from webapp/channels/e2e/cypress/tests/integration/multi_team_and_dm/system_message_spec.js rename to e2e/cypress/tests/integration/channels/multi_team_and_dm/system_message_spec.js index 430550b162..ef59744f43 100644 --- a/webapp/channels/e2e/cypress/tests/integration/multi_team_and_dm/system_message_spec.js +++ b/e2e/cypress/tests/integration/channels/multi_team_and_dm/system_message_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @multi_team_and_dm +// Group: @channels @multi_team_and_dm -import {getRandomId} from '../../utils'; +import {getRandomId} from '../../../utils'; describe('System message', () => { before(() => { diff --git a/webapp/channels/e2e/cypress/tests/integration/multi_team_and_dm/town_square_not_marked_as_unread_spec.js b/e2e/cypress/tests/integration/channels/multi_team_and_dm/town_square_not_marked_as_unread_spec.js similarity index 96% rename from webapp/channels/e2e/cypress/tests/integration/multi_team_and_dm/town_square_not_marked_as_unread_spec.js rename to e2e/cypress/tests/integration/channels/multi_team_and_dm/town_square_not_marked_as_unread_spec.js index 31e9e49003..21d588473c 100644 --- a/webapp/channels/e2e/cypress/tests/integration/multi_team_and_dm/town_square_not_marked_as_unread_spec.js +++ b/e2e/cypress/tests/integration/channels/multi_team_and_dm/town_square_not_marked_as_unread_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @multi_team_and_dm +// Group: @channels @multi_team_and_dm -import {getAdminAccount} from '../../support/env'; +import {getAdminAccount} from '../../../support/env'; describe('Multi Team and DM', () => { let testChannel; diff --git a/webapp/channels/e2e/cypress/tests/integration/notifications/at_icon_still_shows_mentions_list_with_deactivated_triggers_spec.js b/e2e/cypress/tests/integration/channels/notifications/at_icon_still_shows_mentions_list_with_deactivated_triggers_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/notifications/at_icon_still_shows_mentions_list_with_deactivated_triggers_spec.js rename to e2e/cypress/tests/integration/channels/notifications/at_icon_still_shows_mentions_list_with_deactivated_triggers_spec.js index 7c2682a4c4..44d4065051 100644 --- a/webapp/channels/e2e/cypress/tests/integration/notifications/at_icon_still_shows_mentions_list_with_deactivated_triggers_spec.js +++ b/e2e/cypress/tests/integration/channels/notifications/at_icon_still_shows_mentions_list_with_deactivated_triggers_spec.js @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @notifications +// Group: @channels @notifications describe('Notifications', () => { let testTeam; diff --git a/webapp/channels/e2e/cypress/tests/integration/notifications/at_mentions_spec.js b/e2e/cypress/tests/integration/channels/notifications/at_mentions_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/notifications/at_mentions_spec.js rename to e2e/cypress/tests/integration/channels/notifications/at_mentions_spec.js index dc34b5ca62..822e2de01a 100644 --- a/webapp/channels/e2e/cypress/tests/integration/notifications/at_mentions_spec.js +++ b/e2e/cypress/tests/integration/channels/notifications/at_mentions_spec.js @@ -8,10 +8,10 @@ // *************************************************************** // Stage: @prod -// Group: @notification +// Group: @channels @notification -import {getAdminAccount} from '../../support/env'; -import {spyNotificationAs} from '../../support/notification'; +import {getAdminAccount} from '../../../support/env'; +import {spyNotificationAs} from '../../../support/notification'; describe('Notifications', () => { const admin = getAdminAccount(); diff --git a/webapp/channels/e2e/cypress/tests/integration/notifications/browser_tab_notification_1_spec.js b/e2e/cypress/tests/integration/channels/notifications/browser_tab_notification_1_spec.js similarity index 96% rename from webapp/channels/e2e/cypress/tests/integration/notifications/browser_tab_notification_1_spec.js rename to e2e/cypress/tests/integration/channels/notifications/browser_tab_notification_1_spec.js index e82f949d64..d8974f37f9 100644 --- a/webapp/channels/e2e/cypress/tests/integration/notifications/browser_tab_notification_1_spec.js +++ b/e2e/cypress/tests/integration/channels/notifications/browser_tab_notification_1_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @notifications +// Group: @channels @notifications -import * as TIMEOUTS from '../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; describe('Notifications', () => { let testUser; diff --git a/webapp/channels/e2e/cypress/tests/integration/notifications/browser_tab_notification_2_spec.js b/e2e/cypress/tests/integration/channels/notifications/browser_tab_notification_2_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/notifications/browser_tab_notification_2_spec.js rename to e2e/cypress/tests/integration/channels/notifications/browser_tab_notification_2_spec.js index d4b7379535..878bf6c797 100644 --- a/webapp/channels/e2e/cypress/tests/integration/notifications/browser_tab_notification_2_spec.js +++ b/e2e/cypress/tests/integration/channels/notifications/browser_tab_notification_2_spec.js @@ -7,9 +7,9 @@ // - Use element ID when selecting an element. Create one if none. // *************************************************************** -// Group: @notifications +// Group: @channels @notifications -import * as TIMEOUTS from '../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; describe('Notifications', () => { let user1; diff --git a/webapp/channels/e2e/cypress/tests/integration/notifications/channel_links_show_as_links_spec.js b/e2e/cypress/tests/integration/channels/notifications/channel_links_show_as_links_spec.js similarity index 97% rename from webapp/channels/e2e/cypress/tests/integration/notifications/channel_links_show_as_links_spec.js rename to e2e/cypress/tests/integration/channels/notifications/channel_links_show_as_links_spec.js index 3b401a0542..8751f3e8ff 100644 --- a/webapp/channels/e2e/cypress/tests/integration/notifications/channel_links_show_as_links_spec.js +++ b/e2e/cypress/tests/integration/channels/notifications/channel_links_show_as_links_spec.js @@ -8,14 +8,14 @@ // *************************************************************** // Stage: @prod -// Group: @notifications +// Group: @channels @notifications -import * as TIMEOUTS from '../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; import { FixedCloudConfig, getMentionEmailTemplate, verifyEmailBody, -} from '../../utils'; +} from '../../../utils'; describe('Notifications', () => { let config; diff --git a/webapp/channels/e2e/cypress/tests/integration/notifications/deselect_username_mention_trigger_spec.js b/e2e/cypress/tests/integration/channels/notifications/deselect_username_mention_trigger_spec.js similarity index 96% rename from webapp/channels/e2e/cypress/tests/integration/notifications/deselect_username_mention_trigger_spec.js rename to e2e/cypress/tests/integration/channels/notifications/deselect_username_mention_trigger_spec.js index 61e7ad9339..25544935bb 100644 --- a/webapp/channels/e2e/cypress/tests/integration/notifications/deselect_username_mention_trigger_spec.js +++ b/e2e/cypress/tests/integration/channels/notifications/deselect_username_mention_trigger_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @notifications +// Group: @channels @notifications -import * as TIMEOUTS from '../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; describe('Notifications', () => { let testTeam; diff --git a/webapp/channels/e2e/cypress/tests/integration/notifications/desktop_notifications_1_spec.js b/e2e/cypress/tests/integration/channels/notifications/desktop_notifications_1_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/notifications/desktop_notifications_1_spec.js rename to e2e/cypress/tests/integration/channels/notifications/desktop_notifications_1_spec.js index 125084a2dd..248849a1f0 100644 --- a/webapp/channels/e2e/cypress/tests/integration/notifications/desktop_notifications_1_spec.js +++ b/e2e/cypress/tests/integration/channels/notifications/desktop_notifications_1_spec.js @@ -8,11 +8,11 @@ // *************************************************************** // Stage: @prod -// Group: @notifications +// Group: @channels @notifications -import * as MESSAGES from '../../fixtures/messages'; -import * as TIMEOUTS from '../../fixtures/timeouts'; -import {spyNotificationAs} from '../../support/notification'; +import * as MESSAGES from '../../../fixtures/messages'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; +import {spyNotificationAs} from '../../../support/notification'; import { changeDesktopNotificationAs, diff --git a/webapp/channels/e2e/cypress/tests/integration/notifications/desktop_notifications_2_spec.js b/e2e/cypress/tests/integration/channels/notifications/desktop_notifications_2_spec.js similarity index 96% rename from webapp/channels/e2e/cypress/tests/integration/notifications/desktop_notifications_2_spec.js rename to e2e/cypress/tests/integration/channels/notifications/desktop_notifications_2_spec.js index 7625f3696b..433e6ff380 100644 --- a/webapp/channels/e2e/cypress/tests/integration/notifications/desktop_notifications_2_spec.js +++ b/e2e/cypress/tests/integration/channels/notifications/desktop_notifications_2_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @notifications +// Group: @channels @notifications -import {spyNotificationAs} from '../../support/notification'; +import {spyNotificationAs} from '../../../support/notification'; import {changeDesktopNotificationAs} from './helper'; diff --git a/webapp/channels/e2e/cypress/tests/integration/notifications/desktop_notifications_3_spec.js b/e2e/cypress/tests/integration/channels/notifications/desktop_notifications_3_spec.js similarity index 95% rename from webapp/channels/e2e/cypress/tests/integration/notifications/desktop_notifications_3_spec.js rename to e2e/cypress/tests/integration/channels/notifications/desktop_notifications_3_spec.js index 168445bf87..0a5942b6d5 100644 --- a/webapp/channels/e2e/cypress/tests/integration/notifications/desktop_notifications_3_spec.js +++ b/e2e/cypress/tests/integration/channels/notifications/desktop_notifications_3_spec.js @@ -8,11 +8,11 @@ // *************************************************************** // Stage: @prod -// Group: @notifications +// Group: @channels @notifications -import * as TIMEOUTS from '../../fixtures/timeouts'; -import {spyNotificationAs} from '../../support/notification'; -import {getAdminAccount} from '../../support/env'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; +import {spyNotificationAs} from '../../../support/notification'; +import {getAdminAccount} from '../../../support/env'; import { changeDesktopNotificationAs, diff --git a/webapp/channels/e2e/cypress/tests/integration/notifications/direct_messages_do_not_add_indicator_spec.js b/e2e/cypress/tests/integration/channels/notifications/direct_messages_do_not_add_indicator_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/notifications/direct_messages_do_not_add_indicator_spec.js rename to e2e/cypress/tests/integration/channels/notifications/direct_messages_do_not_add_indicator_spec.js index 000791aa28..b64dc7e4da 100644 --- a/webapp/channels/e2e/cypress/tests/integration/notifications/direct_messages_do_not_add_indicator_spec.js +++ b/e2e/cypress/tests/integration/channels/notifications/direct_messages_do_not_add_indicator_spec.js @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @notifications +// Group: @channels @notifications describe('Notifications', () => { let user1; diff --git a/webapp/channels/e2e/cypress/tests/integration/notifications/helper.js b/e2e/cypress/tests/integration/channels/notifications/helper.js similarity index 100% rename from webapp/channels/e2e/cypress/tests/integration/notifications/helper.js rename to e2e/cypress/tests/integration/channels/notifications/helper.js diff --git a/webapp/channels/e2e/cypress/tests/integration/notifications/ignore_channel_mentions_spec.js b/e2e/cypress/tests/integration/channels/notifications/ignore_channel_mentions_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/notifications/ignore_channel_mentions_spec.js rename to e2e/cypress/tests/integration/channels/notifications/ignore_channel_mentions_spec.js index bf521269e8..22c60ee93d 100644 --- a/webapp/channels/e2e/cypress/tests/integration/notifications/ignore_channel_mentions_spec.js +++ b/e2e/cypress/tests/integration/channels/notifications/ignore_channel_mentions_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @notifications +// Group: @channels @notifications -import * as TIMEOUTS from '../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; describe('Notifications', () => { let testTeam; diff --git a/webapp/channels/e2e/cypress/tests/integration/notifications/mention_email_notification_spec.js b/e2e/cypress/tests/integration/channels/notifications/mention_email_notification_spec.js similarity index 96% rename from webapp/channels/e2e/cypress/tests/integration/notifications/mention_email_notification_spec.js rename to e2e/cypress/tests/integration/channels/notifications/mention_email_notification_spec.js index 2abb8cde53..bff07c2f42 100644 --- a/webapp/channels/e2e/cypress/tests/integration/notifications/mention_email_notification_spec.js +++ b/e2e/cypress/tests/integration/channels/notifications/mention_email_notification_spec.js @@ -8,14 +8,14 @@ // *************************************************************** // Stage: @prod -// Group: @notification +// Group: @channels @notification -import * as TIMEOUTS from '../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; import { FixedCloudConfig, getMentionEmailTemplate, verifyEmailBody, -} from '../../utils'; +} from '../../../utils'; describe('Email notification', () => { let config; diff --git a/webapp/channels/e2e/cypress/tests/integration/notifications/message_bar_spec.js b/e2e/cypress/tests/integration/channels/notifications/message_bar_spec.js similarity index 96% rename from webapp/channels/e2e/cypress/tests/integration/notifications/message_bar_spec.js rename to e2e/cypress/tests/integration/channels/notifications/message_bar_spec.js index 7d27c1f9f0..d955266d13 100644 --- a/webapp/channels/e2e/cypress/tests/integration/notifications/message_bar_spec.js +++ b/e2e/cypress/tests/integration/channels/notifications/message_bar_spec.js @@ -8,10 +8,10 @@ // *************************************************************** // Stage: @prod -// Group: @notifications +// Group: @channels @notifications -import * as MESSAGES from '../../fixtures/messages'; -import * as TIMEOUTS from '../../fixtures/timeouts'; +import * as MESSAGES from '../../../fixtures/messages'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; describe('Notifications', () => { let testTeam; diff --git a/webapp/channels/e2e/cypress/tests/integration/notifications/message_posted_while_scrolled_up_spec.js b/e2e/cypress/tests/integration/channels/notifications/message_posted_while_scrolled_up_spec.js similarity index 96% rename from webapp/channels/e2e/cypress/tests/integration/notifications/message_posted_while_scrolled_up_spec.js rename to e2e/cypress/tests/integration/channels/notifications/message_posted_while_scrolled_up_spec.js index 7d3a6c39e9..b2e2c1d3ef 100644 --- a/webapp/channels/e2e/cypress/tests/integration/notifications/message_posted_while_scrolled_up_spec.js +++ b/e2e/cypress/tests/integration/channels/notifications/message_posted_while_scrolled_up_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @notifications +// Group: @channels @notifications -import {getRandomId} from '../../utils'; +import {getRandomId} from '../../../utils'; describe('Notifications', () => { let otherUser; diff --git a/webapp/channels/e2e/cypress/tests/integration/notifications/notification_preferences_do_not_save_spec.js b/e2e/cypress/tests/integration/channels/notifications/notification_preferences_do_not_save_spec.js similarity index 96% rename from webapp/channels/e2e/cypress/tests/integration/notifications/notification_preferences_do_not_save_spec.js rename to e2e/cypress/tests/integration/channels/notifications/notification_preferences_do_not_save_spec.js index cc91ec13b1..9daf4ebea0 100644 --- a/webapp/channels/e2e/cypress/tests/integration/notifications/notification_preferences_do_not_save_spec.js +++ b/e2e/cypress/tests/integration/channels/notifications/notification_preferences_do_not_save_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @notifications +// Group: @channels @notifications -import * as TIMEOUTS from '../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; describe('Notifications', () => { let testTeam; diff --git a/webapp/channels/e2e/cypress/tests/integration/notifications/own_user_posts_reply_while_scrolled_up_spec.js b/e2e/cypress/tests/integration/channels/notifications/own_user_posts_reply_while_scrolled_up_spec.js similarity index 95% rename from webapp/channels/e2e/cypress/tests/integration/notifications/own_user_posts_reply_while_scrolled_up_spec.js rename to e2e/cypress/tests/integration/channels/notifications/own_user_posts_reply_while_scrolled_up_spec.js index ec5be5105e..2ac2137d01 100644 --- a/webapp/channels/e2e/cypress/tests/integration/notifications/own_user_posts_reply_while_scrolled_up_spec.js +++ b/e2e/cypress/tests/integration/channels/notifications/own_user_posts_reply_while_scrolled_up_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @notifications +// Group: @channels @notifications -import {getRandomId} from '../../utils'; +import {getRandomId} from '../../../utils'; describe('Notifications', () => { let otherUser; diff --git a/webapp/channels/e2e/cypress/tests/integration/notifications/reply_notifications_spec.js b/e2e/cypress/tests/integration/channels/notifications/reply_notifications_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/notifications/reply_notifications_spec.js rename to e2e/cypress/tests/integration/channels/notifications/reply_notifications_spec.js index ddd635e835..0e9c2bdcc9 100644 --- a/webapp/channels/e2e/cypress/tests/integration/notifications/reply_notifications_spec.js +++ b/e2e/cypress/tests/integration/channels/notifications/reply_notifications_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @notifications +// Group: @channels @notifications -import {spyNotificationAs} from '../../support/notification'; +import {spyNotificationAs} from '../../../support/notification'; describe('reply-notifications', () => { let testTeam; diff --git a/webapp/channels/e2e/cypress/tests/integration/notifications/unread_on_public_channel_spec.js b/e2e/cypress/tests/integration/channels/notifications/unread_on_public_channel_spec.js similarity index 97% rename from webapp/channels/e2e/cypress/tests/integration/notifications/unread_on_public_channel_spec.js rename to e2e/cypress/tests/integration/channels/notifications/unread_on_public_channel_spec.js index cf9919b921..c505460ac9 100644 --- a/webapp/channels/e2e/cypress/tests/integration/notifications/unread_on_public_channel_spec.js +++ b/e2e/cypress/tests/integration/channels/notifications/unread_on_public_channel_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @notifications +// Group: @channels @notifications -import * as TIMEOUTS from '../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; describe('Notifications', () => { let testUser; diff --git a/webapp/channels/e2e/cypress/tests/integration/notifications/users_with_same_firstname_channel_mentions_spec.js b/e2e/cypress/tests/integration/channels/notifications/users_with_same_firstname_channel_mentions_spec.js similarity index 97% rename from webapp/channels/e2e/cypress/tests/integration/notifications/users_with_same_firstname_channel_mentions_spec.js rename to e2e/cypress/tests/integration/channels/notifications/users_with_same_firstname_channel_mentions_spec.js index 3a1adb9b60..4a230d3ec0 100644 --- a/webapp/channels/e2e/cypress/tests/integration/notifications/users_with_same_firstname_channel_mentions_spec.js +++ b/e2e/cypress/tests/integration/channels/notifications/users_with_same_firstname_channel_mentions_spec.js @@ -8,10 +8,10 @@ // *********************************************************** **** // Stage: @prod -// Group: @notifications +// Group: @channels @notifications -import * as TIMEOUTS from '../../fixtures/timeouts'; -import {getRandomId} from '../../utils'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; +import {getRandomId} from '../../../utils'; describe('Notifications', () => { let testTeam; diff --git a/webapp/channels/e2e/cypress/tests/integration/onboarding/existing_email_adress_spec.js b/e2e/cypress/tests/integration/channels/onboarding/existing_email_adress_spec.js similarity index 94% rename from webapp/channels/e2e/cypress/tests/integration/onboarding/existing_email_adress_spec.js rename to e2e/cypress/tests/integration/channels/onboarding/existing_email_adress_spec.js index 85526bd31f..6849be8aaa 100644 --- a/webapp/channels/e2e/cypress/tests/integration/onboarding/existing_email_adress_spec.js +++ b/e2e/cypress/tests/integration/channels/onboarding/existing_email_adress_spec.js @@ -8,10 +8,10 @@ // *************************************************************** // Stage: @prod -// Group: @onboarding +// Group: @channels @onboarding -import * as TIMEOUTS from '../../fixtures/timeouts'; -import {getRandomId} from '../../utils'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; +import {getRandomId} from '../../../utils'; const uniqueUserId = getRandomId(); diff --git a/webapp/channels/e2e/cypress/tests/integration/onboarding/invalidate_pending_email_invitations_spec.js b/e2e/cypress/tests/integration/channels/onboarding/invalidate_pending_email_invitations_spec.js similarity index 95% rename from webapp/channels/e2e/cypress/tests/integration/onboarding/invalidate_pending_email_invitations_spec.js rename to e2e/cypress/tests/integration/channels/onboarding/invalidate_pending_email_invitations_spec.js index 9797420b13..46cf7b224e 100644 --- a/webapp/channels/e2e/cypress/tests/integration/onboarding/invalidate_pending_email_invitations_spec.js +++ b/e2e/cypress/tests/integration/channels/onboarding/invalidate_pending_email_invitations_spec.js @@ -8,11 +8,11 @@ // *************************************************************** // Stage: @prod -// Group: @te_only @onboarding +// Group: @channels @te_only @onboarding -import * as TIMEOUTS from '../../fixtures/timeouts'; -import {getAdminAccount} from '../../support/env'; -import {getRandomId} from '../../utils'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; +import {getAdminAccount} from '../../../support/env'; +import {getRandomId} from '../../../utils'; import {inviteUserByEmail, verifyEmailInviteAndVisitLink, signupAndVerifyTutorial} from '../team_settings/helpers'; diff --git a/webapp/channels/e2e/cypress/tests/integration/onboarding/login_page_link_account_creation_spec.js b/e2e/cypress/tests/integration/channels/onboarding/login_page_link_account_creation_spec.js similarity index 96% rename from webapp/channels/e2e/cypress/tests/integration/onboarding/login_page_link_account_creation_spec.js rename to e2e/cypress/tests/integration/channels/onboarding/login_page_link_account_creation_spec.js index 5aafae5602..502ffd3995 100644 --- a/webapp/channels/e2e/cypress/tests/integration/onboarding/login_page_link_account_creation_spec.js +++ b/e2e/cypress/tests/integration/channels/onboarding/login_page_link_account_creation_spec.js @@ -8,15 +8,15 @@ // *************************************************************** // Stage: @prod -// Group: @enterprise @onboarding +// Group: @channels @enterprise @onboarding -import * as TIMEOUTS from '../../fixtures/timeouts'; -import {generateRandomUser} from '../../support/api/user'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; +import {generateRandomUser} from '../../../support/api/user'; import { getWelcomeEmailTemplate, reUrl, verifyEmailBody, -} from '../../utils'; +} from '../../../utils'; describe('Onboarding', () => { let siteName; diff --git a/webapp/channels/e2e/cypress/tests/integration/onboarding/use_team_invite_link_to_sign_up_spec.js b/e2e/cypress/tests/integration/channels/onboarding/use_team_invite_link_to_sign_up_spec.js similarity index 96% rename from webapp/channels/e2e/cypress/tests/integration/onboarding/use_team_invite_link_to_sign_up_spec.js rename to e2e/cypress/tests/integration/channels/onboarding/use_team_invite_link_to_sign_up_spec.js index 4e4ec262bb..b004dd2a2b 100644 --- a/webapp/channels/e2e/cypress/tests/integration/onboarding/use_team_invite_link_to_sign_up_spec.js +++ b/e2e/cypress/tests/integration/channels/onboarding/use_team_invite_link_to_sign_up_spec.js @@ -8,16 +8,16 @@ // *************************************************************** // Stage: @prod -// Group: @onboarding +// Group: @channels @onboarding -import * as TIMEOUTS from '../../fixtures/timeouts'; -import {generateRandomUser} from '../../support/api/user'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; +import {generateRandomUser} from '../../../support/api/user'; import { getWelcomeEmailTemplate, reUrl, verifyEmailBody, stubClipboard, -} from '../../utils'; +} from '../../../utils'; describe('Onboarding', () => { let testTeam; diff --git a/webapp/channels/e2e/cypress/tests/integration/performance/channel_switch_spec.js b/e2e/cypress/tests/integration/channels/performance/channel_switch_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/performance/channel_switch_spec.js rename to e2e/cypress/tests/integration/channels/performance/channel_switch_spec.js index e60edd546d..083e47cf26 100644 --- a/webapp/channels/e2e/cypress/tests/integration/performance/channel_switch_spec.js +++ b/e2e/cypress/tests/integration/channels/performance/channel_switch_spec.js @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @channel +// Group: @channels @channel import {measurePerformance} from './utils.js'; diff --git a/webapp/channels/e2e/cypress/tests/integration/performance/team_switch_spec.js b/e2e/cypress/tests/integration/channels/performance/team_switch_spec.js similarity index 100% rename from webapp/channels/e2e/cypress/tests/integration/performance/team_switch_spec.js rename to e2e/cypress/tests/integration/channels/performance/team_switch_spec.js diff --git a/webapp/channels/e2e/cypress/tests/integration/performance/utils.js b/e2e/cypress/tests/integration/channels/performance/utils.js similarity index 100% rename from webapp/channels/e2e/cypress/tests/integration/performance/utils.js rename to e2e/cypress/tests/integration/channels/performance/utils.js diff --git a/webapp/channels/e2e/cypress/tests/integration/plugins/demo_plugin/webhook_spec.js b/e2e/cypress/tests/integration/channels/plugins/demo_plugin/webhook_spec.js similarity index 97% rename from webapp/channels/e2e/cypress/tests/integration/plugins/demo_plugin/webhook_spec.js rename to e2e/cypress/tests/integration/channels/plugins/demo_plugin/webhook_spec.js index b3b69f4821..2c462ddc05 100644 --- a/webapp/channels/e2e/cypress/tests/integration/plugins/demo_plugin/webhook_spec.js +++ b/e2e/cypress/tests/integration/channels/plugins/demo_plugin/webhook_spec.js @@ -8,10 +8,10 @@ // *************************************************************** // Stage: @prod -// Group: @plugin @not_cloud +// Group: @channels @plugin @not_cloud -import * as TIMEOUTS from '../../../fixtures/timeouts'; -import {demoPlugin} from '../../../utils/plugins'; +import * as TIMEOUTS from '../../../../fixtures/timeouts'; +import {demoPlugin} from '../../../../utils/plugins'; describe('Demo plugin - Webhook events', () => { let team1; diff --git a/webapp/channels/e2e/cypress/tests/integration/plugins/helpers.js b/e2e/cypress/tests/integration/channels/plugins/helpers.js similarity index 91% rename from webapp/channels/e2e/cypress/tests/integration/plugins/helpers.js rename to e2e/cypress/tests/integration/channels/plugins/helpers.js index 788d0b9c3a..3a2185dde4 100644 --- a/webapp/channels/e2e/cypress/tests/integration/plugins/helpers.js +++ b/e2e/cypress/tests/integration/channels/plugins/helpers.js @@ -1,7 +1,7 @@ // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. // See LICENSE.txt for license information. -import * as TIMEOUTS from '../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; export function waitForAlertMessage(pluginId, message) { const checkFn = () => { diff --git a/webapp/channels/e2e/cypress/tests/integration/plugins/link_tooltip_spec.js b/e2e/cypress/tests/integration/channels/plugins/link_tooltip_spec.js similarity index 95% rename from webapp/channels/e2e/cypress/tests/integration/plugins/link_tooltip_spec.js rename to e2e/cypress/tests/integration/channels/plugins/link_tooltip_spec.js index d6bea96749..e02d73885c 100644 --- a/webapp/channels/e2e/cypress/tests/integration/plugins/link_tooltip_spec.js +++ b/e2e/cypress/tests/integration/channels/plugins/link_tooltip_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @not_cloud @plugin +// Group: @channels @not_cloud @plugin -import {demoPlugin} from '../../utils'; +import {demoPlugin} from '../../../utils'; describe('Link tooltips', () => { before(() => { diff --git a/webapp/channels/e2e/cypress/tests/integration/plugins/marketplace/disabled_remote_marketplace_spec.js b/e2e/cypress/tests/integration/channels/plugins/marketplace/disabled_remote_marketplace_spec.js similarity index 95% rename from webapp/channels/e2e/cypress/tests/integration/plugins/marketplace/disabled_remote_marketplace_spec.js rename to e2e/cypress/tests/integration/channels/plugins/marketplace/disabled_remote_marketplace_spec.js index 4564899901..fd8eeedc9e 100644 --- a/webapp/channels/e2e/cypress/tests/integration/plugins/marketplace/disabled_remote_marketplace_spec.js +++ b/e2e/cypress/tests/integration/channels/plugins/marketplace/disabled_remote_marketplace_spec.js @@ -7,9 +7,9 @@ // - Use element ID when selecting an element. Create one if none. // *************************************************************** -// Group: @not_cloud @plugin_marketplace @plugin +// Group: @channels @not_cloud @plugin_marketplace @plugin -import {githubPlugin} from '../../../utils/plugins'; +import {githubPlugin} from '../../../../utils/plugins'; describe('Plugin Marketplace', () => { let townsquareLink; diff --git a/webapp/channels/e2e/cypress/tests/integration/plugins/marketplace/helpers.js b/e2e/cypress/tests/integration/channels/plugins/marketplace/helpers.js similarity index 100% rename from webapp/channels/e2e/cypress/tests/integration/plugins/marketplace/helpers.js rename to e2e/cypress/tests/integration/channels/plugins/marketplace/helpers.js diff --git a/webapp/channels/e2e/cypress/tests/integration/plugins/marketplace/invalid_marketplace_url_spec.js b/e2e/cypress/tests/integration/channels/plugins/marketplace/invalid_marketplace_url_spec.js similarity index 96% rename from webapp/channels/e2e/cypress/tests/integration/plugins/marketplace/invalid_marketplace_url_spec.js rename to e2e/cypress/tests/integration/channels/plugins/marketplace/invalid_marketplace_url_spec.js index cad075d156..13cff24896 100644 --- a/webapp/channels/e2e/cypress/tests/integration/plugins/marketplace/invalid_marketplace_url_spec.js +++ b/e2e/cypress/tests/integration/channels/plugins/marketplace/invalid_marketplace_url_spec.js @@ -7,9 +7,9 @@ // - Use element ID when selecting an element. Create one if none. // *************************************************************** -// Group: @not_cloud @plugin_marketplace @plugin +// Group: @channels @not_cloud @plugin_marketplace @plugin -import {githubPlugin} from '../../../utils/plugins'; +import {githubPlugin} from '../../../../utils/plugins'; describe('Plugin Marketplace', () => { let townsquareLink; diff --git a/webapp/channels/e2e/cypress/tests/integration/plugins/marketplace/not_render_in_main_menu_spec.js b/e2e/cypress/tests/integration/channels/plugins/marketplace/not_render_in_main_menu_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/plugins/marketplace/not_render_in_main_menu_spec.js rename to e2e/cypress/tests/integration/channels/plugins/marketplace/not_render_in_main_menu_spec.js index 48f601bc18..c426df7d46 100644 --- a/webapp/channels/e2e/cypress/tests/integration/plugins/marketplace/not_render_in_main_menu_spec.js +++ b/e2e/cypress/tests/integration/channels/plugins/marketplace/not_render_in_main_menu_spec.js @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @plugin_marketplace @not_cloud +// Group: @channels @plugin_marketplace @not_cloud import {verifyPluginMarketplaceVisibility} from './helpers'; diff --git a/webapp/channels/e2e/cypress/tests/integration/plugins/marketplace/render_in_main_menu_spec.js b/e2e/cypress/tests/integration/channels/plugins/marketplace/render_in_main_menu_spec.js similarity index 95% rename from webapp/channels/e2e/cypress/tests/integration/plugins/marketplace/render_in_main_menu_spec.js rename to e2e/cypress/tests/integration/channels/plugins/marketplace/render_in_main_menu_spec.js index 88f6618ef9..dc4834fb33 100644 --- a/webapp/channels/e2e/cypress/tests/integration/plugins/marketplace/render_in_main_menu_spec.js +++ b/e2e/cypress/tests/integration/channels/plugins/marketplace/render_in_main_menu_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @plugin_marketplace @not_cloud +// Group: @channels @plugin_marketplace @not_cloud -import * as TIMEOUTS from '../../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../../fixtures/timeouts'; import {verifyPluginMarketplaceVisibility} from './helpers'; diff --git a/webapp/channels/e2e/cypress/tests/integration/plugins/marketplace/ui_spec.js b/e2e/cypress/tests/integration/channels/plugins/marketplace/ui_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/plugins/marketplace/ui_spec.js rename to e2e/cypress/tests/integration/channels/plugins/marketplace/ui_spec.js index 1f2537d5c5..34b7c1051b 100644 --- a/webapp/channels/e2e/cypress/tests/integration/plugins/marketplace/ui_spec.js +++ b/e2e/cypress/tests/integration/channels/plugins/marketplace/ui_spec.js @@ -7,10 +7,10 @@ // - Use element ID when selecting an element. Create one if none. // *************************************************************** -// Group: @not_cloud @plugin_marketplace @plugin +// Group: @channels @not_cloud @plugin_marketplace @plugin -import * as TIMEOUTS from '../../../fixtures/timeouts'; -import {githubPluginOld} from '../../../utils/plugins'; +import * as TIMEOUTS from '../../../../fixtures/timeouts'; +import {githubPluginOld} from '../../../../utils/plugins'; describe('Plugin Marketplace', () => { let townsquareLink; diff --git a/webapp/channels/e2e/cypress/tests/integration/plugins/plugin_buttons_spec.js b/e2e/cypress/tests/integration/channels/plugins/plugin_buttons_spec.js similarity index 94% rename from webapp/channels/e2e/cypress/tests/integration/plugins/plugin_buttons_spec.js rename to e2e/cypress/tests/integration/channels/plugins/plugin_buttons_spec.js index 2b17f15653..0dc107044c 100644 --- a/webapp/channels/e2e/cypress/tests/integration/plugins/plugin_buttons_spec.js +++ b/e2e/cypress/tests/integration/channels/plugins/plugin_buttons_spec.js @@ -8,10 +8,10 @@ // *************************************************************** // Stage: @prod -// Group: @plugin @not_cloud +// Group: @channels @plugin @not_cloud -import * as TIMEOUTS from '../../fixtures/timeouts'; -import {demoPlugin, testPlugin} from '../../utils/plugins'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; +import {demoPlugin, testPlugin} from '../../../utils/plugins'; describe('collapse on 15 plugin buttons', () => { let testTeam; diff --git a/webapp/channels/e2e/cypress/tests/integration/plugins/plugin_install_spec.js b/e2e/cypress/tests/integration/channels/plugins/plugin_install_spec.js similarity index 95% rename from webapp/channels/e2e/cypress/tests/integration/plugins/plugin_install_spec.js rename to e2e/cypress/tests/integration/channels/plugins/plugin_install_spec.js index a2abeb11e0..c362924984 100644 --- a/webapp/channels/e2e/cypress/tests/integration/plugins/plugin_install_spec.js +++ b/e2e/cypress/tests/integration/channels/plugins/plugin_install_spec.js @@ -16,10 +16,10 @@ * under fixtures folder. */ -// Group: @system_console @plugin @not_cloud @timeout_error +// Group: @channels @system_console @plugin @not_cloud @timeout_error -import * as TIMEOUTS from '../../fixtures/timeouts'; -import {demoPlugin} from '../../utils/plugins'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; +import {demoPlugin} from '../../../utils/plugins'; import {waitForAlertMessage} from './helpers'; diff --git a/webapp/channels/e2e/cypress/tests/integration/plugins/plugin_startup_fail_spec.js b/e2e/cypress/tests/integration/channels/plugins/plugin_startup_fail_spec.js similarity index 93% rename from webapp/channels/e2e/cypress/tests/integration/plugins/plugin_startup_fail_spec.js rename to e2e/cypress/tests/integration/channels/plugins/plugin_startup_fail_spec.js index 188937f7ca..2860a43e8d 100644 --- a/webapp/channels/e2e/cypress/tests/integration/plugins/plugin_startup_fail_spec.js +++ b/e2e/cypress/tests/integration/channels/plugins/plugin_startup_fail_spec.js @@ -15,10 +15,10 @@ */ // Stage: @prod -// Group: @system_console @plugin @not_cloud @timeout_error +// Group: @channels @system_console @plugin @not_cloud @timeout_error -import * as TIMEOUTS from '../../fixtures/timeouts'; -import {gitlabPlugin} from '../../utils/plugins'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; +import {gitlabPlugin} from '../../../utils/plugins'; describe('If plugins fail to start, they can be disabled', () => { before(() => { diff --git a/webapp/channels/e2e/cypress/tests/integration/plugins/upgrade_spec.js b/e2e/cypress/tests/integration/channels/plugins/upgrade_spec.js similarity index 97% rename from webapp/channels/e2e/cypress/tests/integration/plugins/upgrade_spec.js rename to e2e/cypress/tests/integration/channels/plugins/upgrade_spec.js index 44b4177ca4..bb943a4154 100644 --- a/webapp/channels/e2e/cypress/tests/integration/plugins/upgrade_spec.js +++ b/e2e/cypress/tests/integration/channels/plugins/upgrade_spec.js @@ -15,10 +15,10 @@ * under fixtures folder. */ -// Group: @system_console @plugin @not_cloud +// Group: @channels @system_console @plugin @not_cloud -import * as TIMEOUTS from '../../fixtures/timeouts'; -import {demoPlugin, demoPluginOld} from '../../utils/plugins'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; +import {demoPlugin, demoPluginOld} from '../../../utils/plugins'; import {waitForAlertMessage} from './helpers'; diff --git a/webapp/channels/e2e/cypress/tests/integration/profile_settings/profile_settings_spec.js b/e2e/cypress/tests/integration/channels/profile_settings/profile_settings_spec.js similarity index 97% rename from webapp/channels/e2e/cypress/tests/integration/profile_settings/profile_settings_spec.js rename to e2e/cypress/tests/integration/channels/profile_settings/profile_settings_spec.js index 431d44266e..73416dcc87 100644 --- a/webapp/channels/e2e/cypress/tests/integration/profile_settings/profile_settings_spec.js +++ b/e2e/cypress/tests/integration/channels/profile_settings/profile_settings_spec.js @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @profile_settings +// Group: @channels @profile_settings describe('Profile Settings', () => { let testUser; diff --git a/webapp/channels/e2e/cypress/tests/integration/scroll/channel_scroll_spec.js b/e2e/cypress/tests/integration/channels/scroll/channel_scroll_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/scroll/channel_scroll_spec.js rename to e2e/cypress/tests/integration/channels/scroll/channel_scroll_spec.js index 3003f3c39a..34ba206b99 100644 --- a/webapp/channels/e2e/cypress/tests/integration/scroll/channel_scroll_spec.js +++ b/e2e/cypress/tests/integration/channels/scroll/channel_scroll_spec.js @@ -8,10 +8,10 @@ // *************************************************************** // Stage: @prod -// Group: @scroll +// Group: @channels @scroll -import * as MESSAGES from '../../fixtures/messages'; -import * as TIMEOUTS from '../../fixtures/timeouts'; +import * as MESSAGES from '../../../fixtures/messages'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; describe('Scroll', () => { let testTeam; diff --git a/webapp/channels/e2e/cypress/tests/integration/scroll/default_images_collapsed_spec.js b/e2e/cypress/tests/integration/channels/scroll/default_images_collapsed_spec.js similarity index 100% rename from webapp/channels/e2e/cypress/tests/integration/scroll/default_images_collapsed_spec.js rename to e2e/cypress/tests/integration/channels/scroll/default_images_collapsed_spec.js diff --git a/webapp/channels/e2e/cypress/tests/integration/scroll/deleting_image_scroll_spec.js b/e2e/cypress/tests/integration/channels/scroll/deleting_image_scroll_spec.js similarity index 99% rename from webapp/channels/e2e/cypress/tests/integration/scroll/deleting_image_scroll_spec.js rename to e2e/cypress/tests/integration/channels/scroll/deleting_image_scroll_spec.js index 7fd2bd126b..f82e9912b3 100644 --- a/webapp/channels/e2e/cypress/tests/integration/scroll/deleting_image_scroll_spec.js +++ b/e2e/cypress/tests/integration/channels/scroll/deleting_image_scroll_spec.js @@ -7,7 +7,7 @@ // - Use element ID when selecting an element. Create one if none. // *************************************************************** -// Group: @scroll +// Group: @channels @scroll import {deletePostAndVerifyScroll, postListOfMessages, scrollCurrentChannelFromTop} from './helpers'; diff --git a/webapp/channels/e2e/cypress/tests/integration/scroll/deleting_scroll_spec.js b/e2e/cypress/tests/integration/channels/scroll/deleting_scroll_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/scroll/deleting_scroll_spec.js rename to e2e/cypress/tests/integration/channels/scroll/deleting_scroll_spec.js index 6905a1d2f1..d6280c0ee0 100644 --- a/webapp/channels/e2e/cypress/tests/integration/scroll/deleting_scroll_spec.js +++ b/e2e/cypress/tests/integration/channels/scroll/deleting_scroll_spec.js @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @scroll +// Group: @channels @scroll import {deletePostAndVerifyScroll, postListOfMessages, scrollCurrentChannelFromTop} from './helpers'; diff --git a/webapp/channels/e2e/cypress/tests/integration/scroll/editing_scroll_spec.js b/e2e/cypress/tests/integration/channels/scroll/editing_scroll_spec.js similarity index 97% rename from webapp/channels/e2e/cypress/tests/integration/scroll/editing_scroll_spec.js rename to e2e/cypress/tests/integration/channels/scroll/editing_scroll_spec.js index ceb70eee01..907493010c 100644 --- a/webapp/channels/e2e/cypress/tests/integration/scroll/editing_scroll_spec.js +++ b/e2e/cypress/tests/integration/channels/scroll/editing_scroll_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @scroll +// Group: @channels @scroll -import * as TIMEOUTS from '../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; import {postListOfMessages, scrollCurrentChannelFromTop} from './helpers'; diff --git a/webapp/channels/e2e/cypress/tests/integration/scroll/fixed_width_spec.js b/e2e/cypress/tests/integration/channels/scroll/fixed_width_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/scroll/fixed_width_spec.js rename to e2e/cypress/tests/integration/channels/scroll/fixed_width_spec.js index 638834498f..c7305c4fb9 100644 --- a/webapp/channels/e2e/cypress/tests/integration/scroll/fixed_width_spec.js +++ b/e2e/cypress/tests/integration/channels/scroll/fixed_width_spec.js @@ -1,7 +1,7 @@ // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. // See LICENSE.txt for license information. -const timeouts = require('../../fixtures/timeouts'); +const timeouts = require('../../../fixtures/timeouts'); // *************************************************************** // - [#] indicates a test step (e.g. # Go to a page) @@ -10,7 +10,7 @@ const timeouts = require('../../fixtures/timeouts'); // *************************************************************** // Stage: @prod -// Group: @scroll +// Group: @channels @scroll describe('Scroll', () => { let testTeam; diff --git a/webapp/channels/e2e/cypress/tests/integration/scroll/helpers.js b/e2e/cypress/tests/integration/channels/scroll/helpers.js similarity index 97% rename from webapp/channels/e2e/cypress/tests/integration/scroll/helpers.js rename to e2e/cypress/tests/integration/channels/scroll/helpers.js index 94a5042588..36d5a5bfa7 100644 --- a/webapp/channels/e2e/cypress/tests/integration/scroll/helpers.js +++ b/e2e/cypress/tests/integration/channels/scroll/helpers.js @@ -1,7 +1,7 @@ // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. // See LICENSE.txt for license information. -import * as TIMEOUTS from '../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; // # Other user posts a few messages so that the first message is hidden export function postListOfMessages({sender, channelId, numberOfMessages = 30}) { diff --git a/webapp/channels/e2e/cypress/tests/integration/scroll/image_aspect_ratio_spec.js b/e2e/cypress/tests/integration/channels/scroll/image_aspect_ratio_spec.js similarity index 100% rename from webapp/channels/e2e/cypress/tests/integration/scroll/image_aspect_ratio_spec.js rename to e2e/cypress/tests/integration/channels/scroll/image_aspect_ratio_spec.js diff --git a/webapp/channels/e2e/cypress/tests/integration/search/clear_input_spec.js b/e2e/cypress/tests/integration/channels/search/clear_input_spec.js similarity index 94% rename from webapp/channels/e2e/cypress/tests/integration/search/clear_input_spec.js rename to e2e/cypress/tests/integration/channels/search/clear_input_spec.js index fb87c68f6b..214dca8ed3 100644 --- a/webapp/channels/e2e/cypress/tests/integration/search/clear_input_spec.js +++ b/e2e/cypress/tests/integration/channels/search/clear_input_spec.js @@ -8,10 +8,10 @@ // *************************************************************** // Stage: @prod -// Group: @search +// Group: @channels @search -import * as TIMEOUTS from '../../fixtures/timeouts'; -import * as MESSAGES from '../../fixtures/messages'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; +import * as MESSAGES from '../../../fixtures/messages'; describe('Search', () => { before(() => { diff --git a/webapp/channels/e2e/cypress/tests/integration/search/cleared_search_term_spec.js b/e2e/cypress/tests/integration/channels/search/cleared_search_term_spec.js similarity index 95% rename from webapp/channels/e2e/cypress/tests/integration/search/cleared_search_term_spec.js rename to e2e/cypress/tests/integration/channels/search/cleared_search_term_spec.js index 843970ca13..bee56c28a0 100644 --- a/webapp/channels/e2e/cypress/tests/integration/search/cleared_search_term_spec.js +++ b/e2e/cypress/tests/integration/channels/search/cleared_search_term_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @search +// Group: @channels @search -import * as TIMEOUTS from '../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; describe('Search', () => { const term = 'London'; diff --git a/webapp/channels/e2e/cypress/tests/integration/search/mobile_search_spec.js b/e2e/cypress/tests/integration/channels/search/mobile_search_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/search/mobile_search_spec.js rename to e2e/cypress/tests/integration/channels/search/mobile_search_spec.js index 1f1f7163ca..a236bb452d 100644 --- a/webapp/channels/e2e/cypress/tests/integration/search/mobile_search_spec.js +++ b/e2e/cypress/tests/integration/channels/search/mobile_search_spec.js @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @search +// Group: @channels @search function openSidebarMenu() { // # Open the sidebar menu diff --git a/webapp/channels/e2e/cypress/tests/integration/search/post_search_display_not_cloud_spec.js b/e2e/cypress/tests/integration/channels/search/post_search_display_not_cloud_spec.js similarity index 97% rename from webapp/channels/e2e/cypress/tests/integration/search/post_search_display_not_cloud_spec.js rename to e2e/cypress/tests/integration/channels/search/post_search_display_not_cloud_spec.js index 32e18ecca3..0584c4a2eb 100644 --- a/webapp/channels/e2e/cypress/tests/integration/search/post_search_display_not_cloud_spec.js +++ b/e2e/cypress/tests/integration/channels/search/post_search_display_not_cloud_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @search @not_cloud +// Group: @channels @search @not_cloud -import * as TIMEOUTS from '../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; describe('Search', () => { before(() => { diff --git a/webapp/channels/e2e/cypress/tests/integration/search/post_search_display_spec.js b/e2e/cypress/tests/integration/channels/search/post_search_display_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/search/post_search_display_spec.js rename to e2e/cypress/tests/integration/channels/search/post_search_display_spec.js index 87aa5d9145..408faff5a8 100644 --- a/webapp/channels/e2e/cypress/tests/integration/search/post_search_display_spec.js +++ b/e2e/cypress/tests/integration/channels/search/post_search_display_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @search +// Group: @channels @search -import * as TIMEOUTS from '../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; describe('Search', () => { let testTeam; diff --git a/webapp/channels/e2e/cypress/tests/integration/search/results_post_comment_spec.js b/e2e/cypress/tests/integration/channels/search/results_post_comment_spec.js similarity index 97% rename from webapp/channels/e2e/cypress/tests/integration/search/results_post_comment_spec.js rename to e2e/cypress/tests/integration/channels/search/results_post_comment_spec.js index be342cd265..3a1f1589e7 100644 --- a/webapp/channels/e2e/cypress/tests/integration/search/results_post_comment_spec.js +++ b/e2e/cypress/tests/integration/channels/search/results_post_comment_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @search +// Group: @channels @search -import {getRandomId} from '../../utils'; +import {getRandomId} from '../../../utils'; describe('Search', () => { before(() => { diff --git a/webapp/channels/e2e/cypress/tests/integration/search/results_post_spec.js b/e2e/cypress/tests/integration/channels/search/results_post_spec.js similarity index 97% rename from webapp/channels/e2e/cypress/tests/integration/search/results_post_spec.js rename to e2e/cypress/tests/integration/channels/search/results_post_spec.js index 8dd47cee93..c172e01316 100644 --- a/webapp/channels/e2e/cypress/tests/integration/search/results_post_spec.js +++ b/e2e/cypress/tests/integration/channels/search/results_post_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @search +// Group: @channels @search -import {getRandomId} from '../../utils'; +import {getRandomId} from '../../../utils'; describe('Search', () => { before(() => { diff --git a/webapp/channels/e2e/cypress/tests/integration/search/search_bar_popup_focus_spec.js b/e2e/cypress/tests/integration/channels/search/search_bar_popup_focus_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/search/search_bar_popup_focus_spec.js rename to e2e/cypress/tests/integration/channels/search/search_bar_popup_focus_spec.js index bfc3890112..312c9d077d 100644 --- a/webapp/channels/e2e/cypress/tests/integration/search/search_bar_popup_focus_spec.js +++ b/e2e/cypress/tests/integration/channels/search/search_bar_popup_focus_spec.js @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @search +// Group: @channels @search describe('Search', () => { before(() => { diff --git a/webapp/channels/e2e/cypress/tests/integration/search/search_group_message_spec.js b/e2e/cypress/tests/integration/channels/search/search_group_message_spec.js similarity index 99% rename from webapp/channels/e2e/cypress/tests/integration/search/search_group_message_spec.js rename to e2e/cypress/tests/integration/channels/search/search_group_message_spec.js index d9c19d5da3..ce509db415 100644 --- a/webapp/channels/e2e/cypress/tests/integration/search/search_group_message_spec.js +++ b/e2e/cypress/tests/integration/channels/search/search_group_message_spec.js @@ -7,7 +7,7 @@ // - Use element ID when selecting an element. Create one if none. // *************************************************************** -// Group: @search @filesearch +// Group: @channels @search @filesearch describe('Search', () => { let testTeam; diff --git a/webapp/channels/e2e/cypress/tests/integration/search/search_user_file_spec.js b/e2e/cypress/tests/integration/channels/search/search_user_file_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/search/search_user_file_spec.js rename to e2e/cypress/tests/integration/channels/search/search_user_file_spec.js index d80d35da84..c9fa404d16 100644 --- a/webapp/channels/e2e/cypress/tests/integration/search/search_user_file_spec.js +++ b/e2e/cypress/tests/integration/channels/search/search_user_file_spec.js @@ -7,7 +7,7 @@ // - Use element ID when selecting an element. Create one if none. // *************************************************************** -// Group: @search @smoke @filesearch +// Group: @channels @search @smoke @filesearch /** * create new DM channel diff --git a/webapp/channels/e2e/cypress/tests/integration/search/search_user_post_spec.js b/e2e/cypress/tests/integration/channels/search/search_user_post_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/search/search_user_post_spec.js rename to e2e/cypress/tests/integration/channels/search/search_user_post_spec.js index e8d71b882b..ac6fdf65fe 100644 --- a/webapp/channels/e2e/cypress/tests/integration/search/search_user_post_spec.js +++ b/e2e/cypress/tests/integration/channels/search/search_user_post_spec.js @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @search @smoke +// Group: @channels @search @smoke /** * create new DM channel diff --git a/webapp/channels/e2e/cypress/tests/integration/search_autocomplete/channels_spec.js b/e2e/cypress/tests/integration/channels/search_autocomplete/channels_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/search_autocomplete/channels_spec.js rename to e2e/cypress/tests/integration/channels/search_autocomplete/channels_spec.js index 378abda221..2785ea7af2 100644 --- a/webapp/channels/e2e/cypress/tests/integration/search_autocomplete/channels_spec.js +++ b/e2e/cypress/tests/integration/channels/search_autocomplete/channels_spec.js @@ -8,14 +8,14 @@ // *************************************************************** // Stage: @prod -// Group: @autocomplete +// Group: @channels @autocomplete import { createPrivateChannel, searchForChannel, } from '../enterprise/elasticsearch_autocomplete/helpers'; -import {getAdminAccount} from '../../support/env'; +import {getAdminAccount} from '../../../support/env'; describe('Autocomplete without Elasticsearch - Channel', () => { const admin = getAdminAccount(); diff --git a/webapp/channels/e2e/cypress/tests/integration/search_autocomplete/renaming_spec.js b/e2e/cypress/tests/integration/channels/search_autocomplete/renaming_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/search_autocomplete/renaming_spec.js rename to e2e/cypress/tests/integration/channels/search_autocomplete/renaming_spec.js index 543c9f857d..0d41e95e2a 100644 --- a/webapp/channels/e2e/cypress/tests/integration/search_autocomplete/renaming_spec.js +++ b/e2e/cypress/tests/integration/channels/search_autocomplete/renaming_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @autocomplete +// Group: @channels @autocomplete -import * as TIMEOUTS from '../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; import {withTimestamp, createEmail} from '../enterprise/elasticsearch_autocomplete/helpers'; diff --git a/webapp/channels/e2e/cypress/tests/integration/search_autocomplete/scroll_spec.js b/e2e/cypress/tests/integration/channels/search_autocomplete/scroll_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/search_autocomplete/scroll_spec.js rename to e2e/cypress/tests/integration/channels/search_autocomplete/scroll_spec.js index 136df9a819..eb0a1f9fcd 100644 --- a/webapp/channels/e2e/cypress/tests/integration/search_autocomplete/scroll_spec.js +++ b/e2e/cypress/tests/integration/channels/search_autocomplete/scroll_spec.js @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @autocomplete @search +// Group: @channels @autocomplete @search describe('Autocomplete in the search box - scrolling', () => { const usersCount = 15; diff --git a/webapp/channels/e2e/cypress/tests/integration/search_filter/after_spec.js b/e2e/cypress/tests/integration/channels/search_filter/after_spec.js similarity index 95% rename from webapp/channels/e2e/cypress/tests/integration/search_filter/after_spec.js rename to e2e/cypress/tests/integration/channels/search_filter/after_spec.js index 216f97936c..10149a86d5 100644 --- a/webapp/channels/e2e/cypress/tests/integration/search_filter/after_spec.js +++ b/e2e/cypress/tests/integration/channels/search_filter/after_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @search_date_filter +// Group: @channels @search_date_filter -import {getAdminAccount} from '../../support/env'; +import {getAdminAccount} from '../../../support/env'; import { searchAndValidate, diff --git a/webapp/channels/e2e/cypress/tests/integration/search_filter/before_spec.js b/e2e/cypress/tests/integration/channels/search_filter/before_spec.js similarity index 95% rename from webapp/channels/e2e/cypress/tests/integration/search_filter/before_spec.js rename to e2e/cypress/tests/integration/channels/search_filter/before_spec.js index 8835b6cc6d..762a261138 100644 --- a/webapp/channels/e2e/cypress/tests/integration/search_filter/before_spec.js +++ b/e2e/cypress/tests/integration/channels/search_filter/before_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @search_date_filter +// Group: @channels @search_date_filter -import {getAdminAccount} from '../../support/env'; +import {getAdminAccount} from '../../../support/env'; import { getTestMessages, diff --git a/webapp/channels/e2e/cypress/tests/integration/search_filter/edit_spec.js b/e2e/cypress/tests/integration/channels/search_filter/edit_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/search_filter/edit_spec.js rename to e2e/cypress/tests/integration/channels/search_filter/edit_spec.js index 6dbf250f91..d4e5310154 100644 --- a/webapp/channels/e2e/cypress/tests/integration/search_filter/edit_spec.js +++ b/e2e/cypress/tests/integration/channels/search_filter/edit_spec.js @@ -7,9 +7,9 @@ // - Use element ID when selecting an element. Create one if none. // *************************************************************** -// Group: @search_date_filter +// Group: @channels @search_date_filter -import {getAdminAccount} from '../../support/env'; +import {getAdminAccount} from '../../../support/env'; import { getMsAndQueryForDate, diff --git a/webapp/channels/e2e/cypress/tests/integration/search_filter/future_date_spec.js b/e2e/cypress/tests/integration/channels/search_filter/future_date_spec.js similarity index 94% rename from webapp/channels/e2e/cypress/tests/integration/search_filter/future_date_spec.js rename to e2e/cypress/tests/integration/channels/search_filter/future_date_spec.js index 157e0dcd07..b84ae346fc 100644 --- a/webapp/channels/e2e/cypress/tests/integration/search_filter/future_date_spec.js +++ b/e2e/cypress/tests/integration/channels/search_filter/future_date_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @search_date_filter +// Group: @channels @search_date_filter -import {getAdminAccount} from '../../support/env'; +import {getAdminAccount} from '../../../support/env'; import { searchAndValidate, diff --git a/webapp/channels/e2e/cypress/tests/integration/search_filter/helpers.js b/e2e/cypress/tests/integration/channels/search_filter/helpers.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/search_filter/helpers.js rename to e2e/cypress/tests/integration/channels/search_filter/helpers.js index 4c6765395f..caf163ca1f 100644 --- a/webapp/channels/e2e/cypress/tests/integration/search_filter/helpers.js +++ b/e2e/cypress/tests/integration/channels/search_filter/helpers.js @@ -7,8 +7,8 @@ // - Use element ID when selecting an element. Create one if none. // *************************************************************** -import * as TIMEOUTS from '../../fixtures/timeouts'; -import {getRandomId} from '../../utils'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; +import {getRandomId} from '../../../utils'; export function searchAndValidate(query, expectedResults = []) { // # Enter in search query, and hit enter diff --git a/webapp/channels/e2e/cypress/tests/integration/search_filter/input_spec.js b/e2e/cypress/tests/integration/channels/search_filter/input_spec.js similarity index 96% rename from webapp/channels/e2e/cypress/tests/integration/search_filter/input_spec.js rename to e2e/cypress/tests/integration/channels/search_filter/input_spec.js index 001cdfd021..59cd0d932a 100644 --- a/webapp/channels/e2e/cypress/tests/integration/search_filter/input_spec.js +++ b/e2e/cypress/tests/integration/channels/search_filter/input_spec.js @@ -8,10 +8,10 @@ // *************************************************************** // Stage: @prod -// Group: @search_date_filter +// Group: @channels @search_date_filter -import {getAdminAccount} from '../../support/env'; -import * as TIMEOUTS from '../../fixtures/timeouts'; +import {getAdminAccount} from '../../../support/env'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; import { getTestMessages, diff --git a/webapp/channels/e2e/cypress/tests/integration/search_filter/invalid_spec.js b/e2e/cypress/tests/integration/channels/search_filter/invalid_spec.js similarity index 94% rename from webapp/channels/e2e/cypress/tests/integration/search_filter/invalid_spec.js rename to e2e/cypress/tests/integration/channels/search_filter/invalid_spec.js index a2512057cf..296864492e 100644 --- a/webapp/channels/e2e/cypress/tests/integration/search_filter/invalid_spec.js +++ b/e2e/cypress/tests/integration/channels/search_filter/invalid_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @search_date_filter +// Group: @channels @search_date_filter -import {getAdminAccount} from '../../support/env'; +import {getAdminAccount} from '../../../support/env'; import { getTestMessages, diff --git a/webapp/channels/e2e/cypress/tests/integration/search_filter/mixed_spec.js b/e2e/cypress/tests/integration/channels/search_filter/mixed_spec.js similarity index 95% rename from webapp/channels/e2e/cypress/tests/integration/search_filter/mixed_spec.js rename to e2e/cypress/tests/integration/channels/search_filter/mixed_spec.js index df343b95bf..03bc6ecc92 100644 --- a/webapp/channels/e2e/cypress/tests/integration/search_filter/mixed_spec.js +++ b/e2e/cypress/tests/integration/channels/search_filter/mixed_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @search_date_filter +// Group: @channels @search_date_filter -import {getAdminAccount} from '../../support/env'; +import {getAdminAccount} from '../../../support/env'; import { getTestMessages, diff --git a/webapp/channels/e2e/cypress/tests/integration/search_filter/negative_spec.js b/e2e/cypress/tests/integration/channels/search_filter/negative_spec.js similarity index 96% rename from webapp/channels/e2e/cypress/tests/integration/search_filter/negative_spec.js rename to e2e/cypress/tests/integration/channels/search_filter/negative_spec.js index 0fc28bba5b..c507919768 100644 --- a/webapp/channels/e2e/cypress/tests/integration/search_filter/negative_spec.js +++ b/e2e/cypress/tests/integration/channels/search_filter/negative_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @search_date_filter +// Group: @channels @search_date_filter -import * as TIMEOUTS from '../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; describe('Negative search filters will omit results', () => { const message = 'negative' + Date.now(); diff --git a/webapp/channels/e2e/cypress/tests/integration/search_filter/on_spec.js b/e2e/cypress/tests/integration/channels/search_filter/on_spec.js similarity index 97% rename from webapp/channels/e2e/cypress/tests/integration/search_filter/on_spec.js rename to e2e/cypress/tests/integration/channels/search_filter/on_spec.js index 8f19bc74d1..76dc39c210 100644 --- a/webapp/channels/e2e/cypress/tests/integration/search_filter/on_spec.js +++ b/e2e/cypress/tests/integration/channels/search_filter/on_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @search_date_filter +// Group: @channels @search_date_filter -import {getAdminAccount} from '../../support/env'; +import {getAdminAccount} from '../../../support/env'; import { getMsAndQueryForDate, diff --git a/webapp/channels/e2e/cypress/tests/integration/settings/display/channel_display_mode_spec.js b/e2e/cypress/tests/integration/channels/settings/display/channel_display_mode_spec.js similarity index 99% rename from webapp/channels/e2e/cypress/tests/integration/settings/display/channel_display_mode_spec.js rename to e2e/cypress/tests/integration/channels/settings/display/channel_display_mode_spec.js index e42bb48a5d..16ae396810 100644 --- a/webapp/channels/e2e/cypress/tests/integration/settings/display/channel_display_mode_spec.js +++ b/e2e/cypress/tests/integration/channels/settings/display/channel_display_mode_spec.js @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @account_setting +// Group: @channels @account_setting describe('Settings > Display > Channel Display Mode', () => { before(() => { diff --git a/webapp/channels/e2e/cypress/tests/integration/settings/display/clock_display_mode_spec.js b/e2e/cypress/tests/integration/channels/settings/display/clock_display_mode_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/settings/display/clock_display_mode_spec.js rename to e2e/cypress/tests/integration/channels/settings/display/clock_display_mode_spec.js index 8600971090..3d69cf7c27 100644 --- a/webapp/channels/e2e/cypress/tests/integration/settings/display/clock_display_mode_spec.js +++ b/e2e/cypress/tests/integration/channels/settings/display/clock_display_mode_spec.js @@ -8,11 +8,11 @@ // *************************************************************** // Stage: @prod -// Group: @account_setting +// Group: @channels @account_setting import moment from 'moment-timezone'; -import * as DATE_TIME_FORMAT from '../../../fixtures/date_time_format'; +import * as DATE_TIME_FORMAT from '../../../../fixtures/date_time_format'; describe('Settings > Display > Clock Display Mode', () => { const mainMessage = 'Test for clock display mode'; diff --git a/webapp/channels/e2e/cypress/tests/integration/settings/display/message_display_mode_colorize_username_spec.js b/e2e/cypress/tests/integration/channels/settings/display/message_display_mode_colorize_username_spec.js similarity index 99% rename from webapp/channels/e2e/cypress/tests/integration/settings/display/message_display_mode_colorize_username_spec.js rename to e2e/cypress/tests/integration/channels/settings/display/message_display_mode_colorize_username_spec.js index b8d1d3bea0..51057f7c9c 100644 --- a/webapp/channels/e2e/cypress/tests/integration/settings/display/message_display_mode_colorize_username_spec.js +++ b/e2e/cypress/tests/integration/channels/settings/display/message_display_mode_colorize_username_spec.js @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @account_setting +// Group: @channels @account_setting describe('Settings > Display > Message Display: Colorize username', () => { let testTeam; diff --git a/webapp/channels/e2e/cypress/tests/integration/settings/display/message_display_mode_spec.js b/e2e/cypress/tests/integration/channels/settings/display/message_display_mode_spec.js similarity index 96% rename from webapp/channels/e2e/cypress/tests/integration/settings/display/message_display_mode_spec.js rename to e2e/cypress/tests/integration/channels/settings/display/message_display_mode_spec.js index ce8e12c91e..5333878eb6 100644 --- a/webapp/channels/e2e/cypress/tests/integration/settings/display/message_display_mode_spec.js +++ b/e2e/cypress/tests/integration/channels/settings/display/message_display_mode_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @account_setting +// Group: @channels @account_setting -import * as TIMEOUTS from '../../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../../fixtures/timeouts'; describe('Settings > Display > Message Display', () => { before(() => { diff --git a/webapp/channels/e2e/cypress/tests/integration/settings/display/theme/code_theme_colors_spec.js b/e2e/cypress/tests/integration/channels/settings/display/theme/code_theme_colors_spec.js similarity index 96% rename from webapp/channels/e2e/cypress/tests/integration/settings/display/theme/code_theme_colors_spec.js rename to e2e/cypress/tests/integration/channels/settings/display/theme/code_theme_colors_spec.js index 60a0a5a409..c1d81837ed 100644 --- a/webapp/channels/e2e/cypress/tests/integration/settings/display/theme/code_theme_colors_spec.js +++ b/e2e/cypress/tests/integration/channels/settings/display/theme/code_theme_colors_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @account_setting +// Group: @channels @account_setting -import * as TIMEOUTS from '../../../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../../../fixtures/timeouts'; describe('Settings > Display > Theme > Custom Theme Colors', () => { before(() => { diff --git a/webapp/channels/e2e/cypress/tests/integration/settings/display/theme/custom_theme_color_picker_spec.js b/e2e/cypress/tests/integration/channels/settings/display/theme/custom_theme_color_picker_spec.js similarity index 97% rename from webapp/channels/e2e/cypress/tests/integration/settings/display/theme/custom_theme_color_picker_spec.js rename to e2e/cypress/tests/integration/channels/settings/display/theme/custom_theme_color_picker_spec.js index 3d4fc16557..688df5d345 100644 --- a/webapp/channels/e2e/cypress/tests/integration/settings/display/theme/custom_theme_color_picker_spec.js +++ b/e2e/cypress/tests/integration/channels/settings/display/theme/custom_theme_color_picker_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @account_setting +// Group: @channels @account_setting -import {hexToRgbArray, rgbArrayToString} from '../../../../utils'; +import {hexToRgbArray, rgbArrayToString} from '../../../../../utils'; describe('Settings > Display > Theme', () => { before(() => { diff --git a/webapp/channels/e2e/cypress/tests/integration/settings/display/theme/custom_theme_sidebar_styles_spec.js b/e2e/cypress/tests/integration/channels/settings/display/theme/custom_theme_sidebar_styles_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/settings/display/theme/custom_theme_sidebar_styles_spec.js rename to e2e/cypress/tests/integration/channels/settings/display/theme/custom_theme_sidebar_styles_spec.js index a124e238cb..b59f2a1c43 100644 --- a/webapp/channels/e2e/cypress/tests/integration/settings/display/theme/custom_theme_sidebar_styles_spec.js +++ b/e2e/cypress/tests/integration/channels/settings/display/theme/custom_theme_sidebar_styles_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @account_setting +// Group: @channels @account_setting -import {hexToRgbArray, rgbArrayToString} from '../../../../utils'; +import {hexToRgbArray, rgbArrayToString} from '../../../../../utils'; describe('Custom Theme - Sidebar Styles', () => { const themeRgbColor = {}; diff --git a/webapp/channels/e2e/cypress/tests/integration/settings/display/theme/save_theme_spec.js b/e2e/cypress/tests/integration/channels/settings/display/theme/save_theme_spec.js similarity index 94% rename from webapp/channels/e2e/cypress/tests/integration/settings/display/theme/save_theme_spec.js rename to e2e/cypress/tests/integration/channels/settings/display/theme/save_theme_spec.js index 81b105c3fc..2defba96f7 100644 --- a/webapp/channels/e2e/cypress/tests/integration/settings/display/theme/save_theme_spec.js +++ b/e2e/cypress/tests/integration/channels/settings/display/theme/save_theme_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @account_setting +// Group: @channels @account_setting -import * as TIMEOUTS from '../../../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../../../fixtures/timeouts'; describe('Settings > Display > Theme > Save', () => { before(() => { diff --git a/webapp/channels/e2e/cypress/tests/integration/settings/display/theme/settings_view_spec.js b/e2e/cypress/tests/integration/channels/settings/display/theme/settings_view_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/settings/display/theme/settings_view_spec.js rename to e2e/cypress/tests/integration/channels/settings/display/theme/settings_view_spec.js index ba7da4dab4..5264caf8a7 100644 --- a/webapp/channels/e2e/cypress/tests/integration/settings/display/theme/settings_view_spec.js +++ b/e2e/cypress/tests/integration/channels/settings/display/theme/settings_view_spec.js @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @account_setting +// Group: @channels @account_setting describe('Settings > Display > Theme', () => { before(() => { diff --git a/webapp/channels/e2e/cypress/tests/integration/settings/display/timezone_display_mode_spec.js b/e2e/cypress/tests/integration/channels/settings/display/timezone_display_mode_spec.js similarity index 97% rename from webapp/channels/e2e/cypress/tests/integration/settings/display/timezone_display_mode_spec.js rename to e2e/cypress/tests/integration/channels/settings/display/timezone_display_mode_spec.js index 9ddd82cdfb..64b9643bb9 100644 --- a/webapp/channels/e2e/cypress/tests/integration/settings/display/timezone_display_mode_spec.js +++ b/e2e/cypress/tests/integration/channels/settings/display/timezone_display_mode_spec.js @@ -8,14 +8,14 @@ // *************************************************************** // Stage: @prod -// Group: @account_setting +// Group: @channels @account_setting import moment from 'moment-timezone'; -import * as DATE_TIME_FORMAT from '../../../fixtures/date_time_format'; -import * as TIMEOUTS from '../../../fixtures/timeouts'; -import {getTimezoneLabel} from '../../../utils/timezone'; -import {getAdminAccount} from '../../../support/env'; +import * as DATE_TIME_FORMAT from '../../../../fixtures/date_time_format'; +import * as TIMEOUTS from '../../../../fixtures/timeouts'; +import {getTimezoneLabel} from '../../../../utils/timezone'; +import {getAdminAccount} from '../../../../support/env'; describe('Profile > Display > Timezone', () => { const sysadmin = getAdminAccount(); diff --git a/webapp/channels/e2e/cypress/tests/integration/settings/sidebar/channel_switcher_not_cloud_spec.js b/e2e/cypress/tests/integration/channels/settings/sidebar/channel_switcher_not_cloud_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/settings/sidebar/channel_switcher_not_cloud_spec.js rename to e2e/cypress/tests/integration/channels/settings/sidebar/channel_switcher_not_cloud_spec.js index 1109b7f873..2e2b2c374c 100644 --- a/webapp/channels/e2e/cypress/tests/integration/settings/sidebar/channel_switcher_not_cloud_spec.js +++ b/e2e/cypress/tests/integration/channels/settings/sidebar/channel_switcher_not_cloud_spec.js @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @account_setting +// Group: @channels @account_setting describe('Settings > Sidebar > Channel Switcher', () => { let testUser; diff --git a/webapp/channels/e2e/cypress/tests/integration/settings/sidebar/channel_switcher_spec.js b/e2e/cypress/tests/integration/channels/settings/sidebar/channel_switcher_spec.js similarity index 95% rename from webapp/channels/e2e/cypress/tests/integration/settings/sidebar/channel_switcher_spec.js rename to e2e/cypress/tests/integration/channels/settings/sidebar/channel_switcher_spec.js index cbe40c9279..d0c990afd0 100644 --- a/webapp/channels/e2e/cypress/tests/integration/settings/sidebar/channel_switcher_spec.js +++ b/e2e/cypress/tests/integration/channels/settings/sidebar/channel_switcher_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @account_setting @not_cloud +// Group: @channels @account_setting @not_cloud -import * as TIMEOUTS from '../../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../../fixtures/timeouts'; describe('Settings > Sidebar > Channel Switcher', () => { let testChannel; diff --git a/webapp/channels/e2e/cypress/tests/integration/settings/sidebar/fullname_spec.js b/e2e/cypress/tests/integration/channels/settings/sidebar/fullname_spec.js similarity index 96% rename from webapp/channels/e2e/cypress/tests/integration/settings/sidebar/fullname_spec.js rename to e2e/cypress/tests/integration/channels/settings/sidebar/fullname_spec.js index c5eccb139a..74a0220bab 100644 --- a/webapp/channels/e2e/cypress/tests/integration/settings/sidebar/fullname_spec.js +++ b/e2e/cypress/tests/integration/channels/settings/sidebar/fullname_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @account_setting +// Group: @channels @account_setting -import {getRandomId} from '../../../utils'; +import {getRandomId} from '../../../../utils'; describe('Settings > Sidebar > General', () => { const randomId = getRandomId(); diff --git a/webapp/channels/e2e/cypress/tests/integration/signin_authentication/authentication_spec.js b/e2e/cypress/tests/integration/channels/signin_authentication/authentication_spec.js similarity index 97% rename from webapp/channels/e2e/cypress/tests/integration/signin_authentication/authentication_spec.js rename to e2e/cypress/tests/integration/channels/signin_authentication/authentication_spec.js index c9c87c952f..b64c967b99 100644 --- a/webapp/channels/e2e/cypress/tests/integration/signin_authentication/authentication_spec.js +++ b/e2e/cypress/tests/integration/channels/signin_authentication/authentication_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @signin_authentication +// Group: @channels @signin_authentication -import timeouts from '../../fixtures/timeouts'; +import timeouts from '../../../fixtures/timeouts'; import {fillCredentialsForUser} from './helpers'; diff --git a/webapp/channels/e2e/cypress/tests/integration/signin_authentication/desktop_session_expire_spec.js b/e2e/cypress/tests/integration/channels/signin_authentication/desktop_session_expire_spec.js similarity index 92% rename from webapp/channels/e2e/cypress/tests/integration/signin_authentication/desktop_session_expire_spec.js rename to e2e/cypress/tests/integration/channels/signin_authentication/desktop_session_expire_spec.js index 0b9e74e397..28d1a34854 100644 --- a/webapp/channels/e2e/cypress/tests/integration/signin_authentication/desktop_session_expire_spec.js +++ b/e2e/cypress/tests/integration/channels/signin_authentication/desktop_session_expire_spec.js @@ -7,11 +7,11 @@ // - Use element ID when selecting an element. Create one if none. // *************************************************************** -// Group: @signin_authentication +// Group: @channels @signin_authentication -import {getAdminAccount} from '../../support/env'; -import {spyNotificationAs} from '../../support/notification'; -import timeouts from '../../fixtures/timeouts'; +import {getAdminAccount} from '../../../support/env'; +import {spyNotificationAs} from '../../../support/notification'; +import timeouts from '../../../fixtures/timeouts'; import {fillCredentialsForUser} from './helpers'; diff --git a/webapp/channels/e2e/cypress/tests/integration/signin_authentication/forgot_password_spec.js b/e2e/cypress/tests/integration/channels/signin_authentication/forgot_password_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/signin_authentication/forgot_password_spec.js rename to e2e/cypress/tests/integration/channels/signin_authentication/forgot_password_spec.js index b75978e629..c53c510b08 100644 --- a/webapp/channels/e2e/cypress/tests/integration/signin_authentication/forgot_password_spec.js +++ b/e2e/cypress/tests/integration/channels/signin_authentication/forgot_password_spec.js @@ -8,13 +8,13 @@ // *************************************************************** // Stage: @prod -// Group: @signin_authentication +// Group: @channels @signin_authentication import { getPasswordResetEmailTemplate, reUrl, verifyEmailBody, -} from '../../utils'; +} from '../../../utils'; describe('Signin/Authentication', () => { let testUser; diff --git a/webapp/channels/e2e/cypress/tests/integration/signin_authentication/helpers.js b/e2e/cypress/tests/integration/channels/signin_authentication/helpers.js similarity index 90% rename from webapp/channels/e2e/cypress/tests/integration/signin_authentication/helpers.js rename to e2e/cypress/tests/integration/channels/signin_authentication/helpers.js index b4d133ef92..92aa4c1ee8 100644 --- a/webapp/channels/e2e/cypress/tests/integration/signin_authentication/helpers.js +++ b/e2e/cypress/tests/integration/channels/signin_authentication/helpers.js @@ -1,7 +1,7 @@ // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. // See LICENSE.txt for license information. -import timeouts from '../../fixtures/timeouts'; +import timeouts from '../../../fixtures/timeouts'; export function fillCredentialsForUser(user) { cy.wait(timeouts.TWO_SEC); diff --git a/webapp/channels/e2e/cypress/tests/integration/signin_authentication/login_close_server_spec.js b/e2e/cypress/tests/integration/channels/signin_authentication/login_close_server_spec.js similarity index 96% rename from webapp/channels/e2e/cypress/tests/integration/signin_authentication/login_close_server_spec.js rename to e2e/cypress/tests/integration/channels/signin_authentication/login_close_server_spec.js index cfd7b8877a..f7eb8ca0f0 100644 --- a/webapp/channels/e2e/cypress/tests/integration/signin_authentication/login_close_server_spec.js +++ b/e2e/cypress/tests/integration/channels/signin_authentication/login_close_server_spec.js @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @signin_authentication +// Group: @channels @signin_authentication describe('Login page with close server', () => { before(() => { diff --git a/webapp/channels/e2e/cypress/tests/integration/signin_authentication/login_logout_smoke_spec.js b/e2e/cypress/tests/integration/channels/signin_authentication/login_logout_smoke_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/signin_authentication/login_logout_smoke_spec.js rename to e2e/cypress/tests/integration/channels/signin_authentication/login_logout_smoke_spec.js index 2a4afe4f5b..80ad91fa62 100644 --- a/webapp/channels/e2e/cypress/tests/integration/signin_authentication/login_logout_smoke_spec.js +++ b/e2e/cypress/tests/integration/channels/signin_authentication/login_logout_smoke_spec.js @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @signin_authentication +// Group: @channels @signin_authentication describe('SignIn Authentication', () => { let testUser; diff --git a/webapp/channels/e2e/cypress/tests/integration/signin_authentication/login_open_server_spec.js b/e2e/cypress/tests/integration/channels/signin_authentication/login_open_server_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/signin_authentication/login_open_server_spec.js rename to e2e/cypress/tests/integration/channels/signin_authentication/login_open_server_spec.js index f0be969b7e..213f662c13 100644 --- a/webapp/channels/e2e/cypress/tests/integration/signin_authentication/login_open_server_spec.js +++ b/e2e/cypress/tests/integration/channels/signin_authentication/login_open_server_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @signin_authentication +// Group: @channels @signin_authentication -import {FixedCloudConfig} from '../../utils/constants'; +import {FixedCloudConfig} from '../../../utils/constants'; describe('Login page with open server', () => { let config; diff --git a/webapp/channels/e2e/cypress/tests/integration/signin_authentication/mfa_authentication_spec.js b/e2e/cypress/tests/integration/channels/signin_authentication/mfa_authentication_spec.js similarity index 97% rename from webapp/channels/e2e/cypress/tests/integration/signin_authentication/mfa_authentication_spec.js rename to e2e/cypress/tests/integration/channels/signin_authentication/mfa_authentication_spec.js index 85db23e7d2..3bc8fc5924 100644 --- a/webapp/channels/e2e/cypress/tests/integration/signin_authentication/mfa_authentication_spec.js +++ b/e2e/cypress/tests/integration/channels/signin_authentication/mfa_authentication_spec.js @@ -8,11 +8,11 @@ // *************************************************************** // Stage: @prod -// Group: @signin_authentication @mfa +// Group: @channels @signin_authentication @mfa import authenticator from 'authenticator'; -import timeouts from '../../fixtures/timeouts'; +import timeouts from '../../../fixtures/timeouts'; import {fillCredentialsForUser} from './helpers'; diff --git a/webapp/channels/e2e/cypress/tests/integration/signin_authentication/signup_spec.js b/e2e/cypress/tests/integration/channels/signin_authentication/signup_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/signin_authentication/signup_spec.js rename to e2e/cypress/tests/integration/channels/signin_authentication/signup_spec.js index 283bd345c0..e9469fb487 100644 --- a/webapp/channels/e2e/cypress/tests/integration/signin_authentication/signup_spec.js +++ b/e2e/cypress/tests/integration/channels/signin_authentication/signup_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @signin_authentication +// Group: @channels @signin_authentication -import {FixedCloudConfig} from '../../utils/constants'; +import {FixedCloudConfig} from '../../../utils/constants'; describe('Signup Email page', () => { let config; diff --git a/webapp/channels/e2e/cypress/tests/integration/slash_commands/autocomplete_spec.js b/e2e/cypress/tests/integration/channels/slash_commands/autocomplete_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/slash_commands/autocomplete_spec.js rename to e2e/cypress/tests/integration/channels/slash_commands/autocomplete_spec.js index eaa2e8f4e8..2d593a520c 100644 --- a/webapp/channels/e2e/cypress/tests/integration/slash_commands/autocomplete_spec.js +++ b/e2e/cypress/tests/integration/channels/slash_commands/autocomplete_spec.js @@ -7,9 +7,9 @@ // - Use element ID when selecting an element. Create one if none. // *************************************************************** -// Group: @not_cloud @integrations @plugin +// Group: @channels @not_cloud @integrations @plugin -import {demoPlugin, jiraPlugin} from '../../utils/plugins'; +import {demoPlugin, jiraPlugin} from '../../../utils/plugins'; describe('Integrations', () => { before(() => { diff --git a/webapp/channels/e2e/cypress/tests/integration/status/status_dnd_1_spec.js b/e2e/cypress/tests/integration/channels/status/status_dnd_1_spec.js similarity index 99% rename from webapp/channels/e2e/cypress/tests/integration/status/status_dnd_1_spec.js rename to e2e/cypress/tests/integration/channels/status/status_dnd_1_spec.js index cd86aad35f..64e4f21820 100644 --- a/webapp/channels/e2e/cypress/tests/integration/status/status_dnd_1_spec.js +++ b/e2e/cypress/tests/integration/channels/status/status_dnd_1_spec.js @@ -7,7 +7,7 @@ // - Use element ID when selecting an element. Create one if none. // *************************************************************** -// Group: @status @timed_dnd +// Group: @channels @status @timed_dnd describe('DND Status - Setting Your Own DND Status', () => { const dndTimes = [ diff --git a/webapp/channels/e2e/cypress/tests/integration/subpath/subpath_channel_routing_spec.js b/e2e/cypress/tests/integration/channels/subpath/subpath_channel_routing_spec.js similarity index 97% rename from webapp/channels/e2e/cypress/tests/integration/subpath/subpath_channel_routing_spec.js rename to e2e/cypress/tests/integration/channels/subpath/subpath_channel_routing_spec.js index 65174e4fd4..73d5339fa7 100644 --- a/webapp/channels/e2e/cypress/tests/integration/subpath/subpath_channel_routing_spec.js +++ b/e2e/cypress/tests/integration/channels/subpath/subpath_channel_routing_spec.js @@ -7,9 +7,9 @@ // - Use element ID when selecting an element. Create one if none. // *************************************************************** -// Group: @subpath +// Group: @channels @subpath -import * as TIMEOUTS from '../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; describe('Subpath Channel routing', () => { let testUser; diff --git a/webapp/channels/e2e/cypress/tests/integration/subpath/subpath_dm_search_spec.js b/e2e/cypress/tests/integration/channels/subpath/subpath_dm_search_spec.js similarity index 92% rename from webapp/channels/e2e/cypress/tests/integration/subpath/subpath_dm_search_spec.js rename to e2e/cypress/tests/integration/channels/subpath/subpath_dm_search_spec.js index b69e4dd831..939fe9b06b 100644 --- a/webapp/channels/e2e/cypress/tests/integration/subpath/subpath_dm_search_spec.js +++ b/e2e/cypress/tests/integration/channels/subpath/subpath_dm_search_spec.js @@ -7,11 +7,11 @@ // - Use element ID when selecting an element. Create one if none. // *************************************************************** -// Group: @subpath +// Group: @channels @subpath -import * as TIMEOUTS from '../../fixtures/timeouts'; -import {generateRandomUser} from '../../support/api/user'; -import {getAdminAccount} from '../../support/env'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; +import {generateRandomUser} from '../../../support/api/user'; +import {getAdminAccount} from '../../../support/env'; describe('Subpath Direct Message Search', () => { let testTeam; diff --git a/webapp/channels/e2e/cypress/tests/integration/subpath/subpath_login_spec.js b/e2e/cypress/tests/integration/channels/subpath/subpath_login_spec.js similarity index 97% rename from webapp/channels/e2e/cypress/tests/integration/subpath/subpath_login_spec.js rename to e2e/cypress/tests/integration/channels/subpath/subpath_login_spec.js index fa844ce8e2..b4cca647aa 100644 --- a/webapp/channels/e2e/cypress/tests/integration/subpath/subpath_login_spec.js +++ b/e2e/cypress/tests/integration/channels/subpath/subpath_login_spec.js @@ -7,7 +7,7 @@ // - Use element ID when selecting an element. Create one if none. // *************************************************************** -// Group: @subpath @not_cloud @signin_authentication +// Group: @channels @subpath @not_cloud @signin_authentication describe('Cookie with Subpath', () => { let testUser; diff --git a/webapp/channels/e2e/cypress/tests/integration/system_console/authentication/password_settings_spec.js b/e2e/cypress/tests/integration/channels/system_console/authentication/password_settings_spec.js similarity index 92% rename from webapp/channels/e2e/cypress/tests/integration/system_console/authentication/password_settings_spec.js rename to e2e/cypress/tests/integration/channels/system_console/authentication/password_settings_spec.js index 5baff79459..0a85f51a26 100644 --- a/webapp/channels/e2e/cypress/tests/integration/system_console/authentication/password_settings_spec.js +++ b/e2e/cypress/tests/integration/channels/system_console/authentication/password_settings_spec.js @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @not_cloud @system_console @restrict_system_admin +// Group: @channels @not_cloud @system_console @restrict_system_admin describe('Password settings', () => { it('MM-T4679 - Should NOT show MaximumLoginAttempts when ExperimentalSettings.RestrictSystemAdmin is true', () => { diff --git a/webapp/channels/e2e/cypress/tests/integration/system_console/compliance/custom_terms_of_service_spec.js b/e2e/cypress/tests/integration/channels/system_console/compliance/custom_terms_of_service_spec.js similarity index 99% rename from webapp/channels/e2e/cypress/tests/integration/system_console/compliance/custom_terms_of_service_spec.js rename to e2e/cypress/tests/integration/channels/system_console/compliance/custom_terms_of_service_spec.js index 3c8794089b..53e9a652de 100644 --- a/webapp/channels/e2e/cypress/tests/integration/system_console/compliance/custom_terms_of_service_spec.js +++ b/e2e/cypress/tests/integration/channels/system_console/compliance/custom_terms_of_service_spec.js @@ -7,7 +7,7 @@ // - Use element ID when selecting an element. Create one if none. // *************************************************************** -// Group: @system_console +// Group: @channels @system_console describe('Custom Terms of Service', () => { let testUser; diff --git a/webapp/channels/e2e/cypress/tests/integration/system_console/demoted_user_spec.js b/e2e/cypress/tests/integration/channels/system_console/demoted_user_spec.js similarity index 92% rename from webapp/channels/e2e/cypress/tests/integration/system_console/demoted_user_spec.js rename to e2e/cypress/tests/integration/channels/system_console/demoted_user_spec.js index e3c08b99c0..18dcd7e4c1 100644 --- a/webapp/channels/e2e/cypress/tests/integration/system_console/demoted_user_spec.js +++ b/e2e/cypress/tests/integration/channels/system_console/demoted_user_spec.js @@ -8,10 +8,10 @@ // *************************************************************** // Stage: @prod -// Group: @system_console @smoke +// Group: @channels @system_console @smoke -import * as TIMEOUTS from '../../fixtures/timeouts'; -import {getAdminAccount} from '../../support/env'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; +import {getAdminAccount} from '../../../support/env'; describe('System Console', () => { const sysadmin = getAdminAccount(); diff --git a/webapp/channels/e2e/cypress/tests/integration/system_console/environment_spec.js b/e2e/cypress/tests/integration/channels/system_console/environment_spec.js similarity index 99% rename from webapp/channels/e2e/cypress/tests/integration/system_console/environment_spec.js rename to e2e/cypress/tests/integration/channels/system_console/environment_spec.js index e63b946240..20cbb70309 100644 --- a/webapp/channels/e2e/cypress/tests/integration/system_console/environment_spec.js +++ b/e2e/cypress/tests/integration/channels/system_console/environment_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @not_cloud +// Group: @channels @not_cloud -import * as TIMEOUTS from '../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; describe('Environment', () => { let townsquareLink; diff --git a/webapp/channels/e2e/cypress/tests/integration/system_console/feature_discovery_cloud_spec.js b/e2e/cypress/tests/integration/channels/system_console/feature_discovery_cloud_spec.js similarity index 99% rename from webapp/channels/e2e/cypress/tests/integration/system_console/feature_discovery_cloud_spec.js rename to e2e/cypress/tests/integration/channels/system_console/feature_discovery_cloud_spec.js index e50131398a..eba774b224 100644 --- a/webapp/channels/e2e/cypress/tests/integration/system_console/feature_discovery_cloud_spec.js +++ b/e2e/cypress/tests/integration/channels/system_console/feature_discovery_cloud_spec.js @@ -7,7 +7,7 @@ // - Use element ID when selecting an element. Create one if none. // *************************************************************** -// Group: @cloud_only +// Group: @channels @cloud_only const professionalPaidFeatures = [ {sidebarName: 'Announcement Banner', featureDiscoveryTitle: 'custom announcement banners'}, diff --git a/webapp/channels/e2e/cypress/tests/integration/system_console/feature_discovery_not_cloud_spec.js b/e2e/cypress/tests/integration/channels/system_console/feature_discovery_not_cloud_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/system_console/feature_discovery_not_cloud_spec.js rename to e2e/cypress/tests/integration/channels/system_console/feature_discovery_not_cloud_spec.js index 61d2a6814b..449dad2d0d 100644 --- a/webapp/channels/e2e/cypress/tests/integration/system_console/feature_discovery_not_cloud_spec.js +++ b/e2e/cypress/tests/integration/channels/system_console/feature_discovery_not_cloud_spec.js @@ -7,7 +7,7 @@ // - Use element ID when selecting an element. Create one if none. // *************************************************************** -// Group: @system_console @not_cloud +// Group: @channels @system_console @not_cloud const professionalPaidFeatures = [ {sidebarName: 'Announcement Banner', featureDiscoveryTitle: 'custom announcement banners'}, diff --git a/webapp/channels/e2e/cypress/tests/integration/system_console/feature_discovery_spec.js b/e2e/cypress/tests/integration/channels/system_console/feature_discovery_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/system_console/feature_discovery_spec.js rename to e2e/cypress/tests/integration/channels/system_console/feature_discovery_spec.js index 74b5dba0ca..2a7312bd70 100644 --- a/webapp/channels/e2e/cypress/tests/integration/system_console/feature_discovery_spec.js +++ b/e2e/cypress/tests/integration/channels/system_console/feature_discovery_spec.js @@ -7,7 +7,7 @@ // - Use element ID when selecting an element. Create one if none. // *************************************************************** -// Group: @te_only @system_console +// Group: @channels @te_only @system_console describe('Feature discovery', () => { before(() => { diff --git a/webapp/channels/e2e/cypress/tests/integration/system_console/inactive_users_spec.js b/e2e/cypress/tests/integration/channels/system_console/inactive_users_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/system_console/inactive_users_spec.js rename to e2e/cypress/tests/integration/channels/system_console/inactive_users_spec.js index 04f488ad00..a1b1ad3b90 100644 --- a/webapp/channels/e2e/cypress/tests/integration/system_console/inactive_users_spec.js +++ b/e2e/cypress/tests/integration/channels/system_console/inactive_users_spec.js @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @system_console +// Group: @channels @system_console /** * Note: This test requires hundreds of deactivated users diff --git a/webapp/channels/e2e/cypress/tests/integration/system_console/lock_teammate_name_display_spec.js b/e2e/cypress/tests/integration/channels/system_console/lock_teammate_name_display_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/system_console/lock_teammate_name_display_spec.js rename to e2e/cypress/tests/integration/channels/system_console/lock_teammate_name_display_spec.js index 851d21d07e..1000127e24 100644 --- a/webapp/channels/e2e/cypress/tests/integration/system_console/lock_teammate_name_display_spec.js +++ b/e2e/cypress/tests/integration/channels/system_console/lock_teammate_name_display_spec.js @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @system_console +// Group: @channels @system_console describe('System Console', () => { let townSquareUrl; diff --git a/webapp/channels/e2e/cypress/tests/integration/system_console/main_menu_spec.js b/e2e/cypress/tests/integration/channels/system_console/main_menu_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/system_console/main_menu_spec.js rename to e2e/cypress/tests/integration/channels/system_console/main_menu_spec.js index 9bb8da5479..e350a43809 100644 --- a/webapp/channels/e2e/cypress/tests/integration/system_console/main_menu_spec.js +++ b/e2e/cypress/tests/integration/channels/system_console/main_menu_spec.js @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @system_console +// Group: @channels @system_console describe('Main menu', () => { before(() => { diff --git a/webapp/channels/e2e/cypress/tests/integration/system_console/mobile_settings_spec.js b/e2e/cypress/tests/integration/channels/system_console/mobile_settings_spec.js similarity index 96% rename from webapp/channels/e2e/cypress/tests/integration/system_console/mobile_settings_spec.js rename to e2e/cypress/tests/integration/channels/system_console/mobile_settings_spec.js index af65d0d39d..d1026b4bf2 100644 --- a/webapp/channels/e2e/cypress/tests/integration/system_console/mobile_settings_spec.js +++ b/e2e/cypress/tests/integration/channels/system_console/mobile_settings_spec.js @@ -7,7 +7,7 @@ // - Use element ID when selecting an element. Create one if none. // *************************************************************** -// Group: @system_console @te_only +// Group: @channels @system_console @te_only describe('Settings', () => { before(() => { diff --git a/webapp/channels/e2e/cypress/tests/integration/system_console/plugin_marketplace_url_spec.js b/e2e/cypress/tests/integration/channels/system_console/plugin_marketplace_url_spec.js similarity index 97% rename from webapp/channels/e2e/cypress/tests/integration/system_console/plugin_marketplace_url_spec.js rename to e2e/cypress/tests/integration/channels/system_console/plugin_marketplace_url_spec.js index 06af580739..7129abbc14 100644 --- a/webapp/channels/e2e/cypress/tests/integration/system_console/plugin_marketplace_url_spec.js +++ b/e2e/cypress/tests/integration/channels/system_console/plugin_marketplace_url_spec.js @@ -10,7 +10,7 @@ // - Requires mmctl at fixtures folder // -> copy ./mmctl/mmctl to ./mattermost-webapp/e2e/cypress/tests/fixtures/mmctl -// Group: @plugin @system_console +// Group: @channels @plugin @system_console describe('System Console > Plugin Management ', () => { before(() => { diff --git a/webapp/channels/e2e/cypress/tests/integration/system_console/reporting/server_logs_spec.js b/e2e/cypress/tests/integration/channels/system_console/reporting/server_logs_spec.js similarity index 92% rename from webapp/channels/e2e/cypress/tests/integration/system_console/reporting/server_logs_spec.js rename to e2e/cypress/tests/integration/channels/system_console/reporting/server_logs_spec.js index 904e69ed4a..5a7bab252b 100644 --- a/webapp/channels/e2e/cypress/tests/integration/system_console/reporting/server_logs_spec.js +++ b/e2e/cypress/tests/integration/channels/system_console/reporting/server_logs_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @system_console @not_cloud +// Group: @channels @system_console @not_cloud -import * as TIMEOUTS from '../../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../../fixtures/timeouts'; describe('System Console > Server Logs', () => { before(() => { diff --git a/webapp/channels/e2e/cypress/tests/integration/system_console/reporting/site_statistics_spec.js b/e2e/cypress/tests/integration/channels/system_console/reporting/site_statistics_spec.js similarity index 96% rename from webapp/channels/e2e/cypress/tests/integration/system_console/reporting/site_statistics_spec.js rename to e2e/cypress/tests/integration/channels/system_console/reporting/site_statistics_spec.js index 404ba6c390..86b891ce6b 100644 --- a/webapp/channels/e2e/cypress/tests/integration/system_console/reporting/site_statistics_spec.js +++ b/e2e/cypress/tests/integration/channels/system_console/reporting/site_statistics_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @system_console @not_cloud +// Group: @channels @system_console @not_cloud -import * as TIMEOUTS from '../../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../../fixtures/timeouts'; describe('System Console > Site Statistics', () => { let testUser; diff --git a/webapp/channels/e2e/cypress/tests/integration/system_console/reporting/site_statistics_te_spec.js b/e2e/cypress/tests/integration/channels/system_console/reporting/site_statistics_te_spec.js similarity index 95% rename from webapp/channels/e2e/cypress/tests/integration/system_console/reporting/site_statistics_te_spec.js rename to e2e/cypress/tests/integration/channels/system_console/reporting/site_statistics_te_spec.js index fcc530a4fe..708b0e2480 100644 --- a/webapp/channels/e2e/cypress/tests/integration/system_console/reporting/site_statistics_te_spec.js +++ b/e2e/cypress/tests/integration/channels/system_console/reporting/site_statistics_te_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @te_only @system_console +// Group: @channels @te_only @system_console -import * as TIMEOUTS from '../../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../../fixtures/timeouts'; describe('System Console > Site Statistics', () => { before(() => { diff --git a/webapp/channels/e2e/cypress/tests/integration/system_console/reporting/team_statistics_spec.js b/e2e/cypress/tests/integration/channels/system_console/reporting/team_statistics_spec.js similarity index 97% rename from webapp/channels/e2e/cypress/tests/integration/system_console/reporting/team_statistics_spec.js rename to e2e/cypress/tests/integration/channels/system_console/reporting/team_statistics_spec.js index 779855798c..36e8aa5951 100644 --- a/webapp/channels/e2e/cypress/tests/integration/system_console/reporting/team_statistics_spec.js +++ b/e2e/cypress/tests/integration/channels/system_console/reporting/team_statistics_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @system_console +// Group: @channels @system_console -import * as TIMEOUTS from '../../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../../fixtures/timeouts'; describe('System Console > Team Statistics', () => { before(() => { diff --git a/webapp/channels/e2e/cypress/tests/integration/system_console/revoke_all_sessions_spec.js b/e2e/cypress/tests/integration/channels/system_console/revoke_all_sessions_spec.js similarity index 95% rename from webapp/channels/e2e/cypress/tests/integration/system_console/revoke_all_sessions_spec.js rename to e2e/cypress/tests/integration/channels/system_console/revoke_all_sessions_spec.js index 44310a6316..5bddee4465 100644 --- a/webapp/channels/e2e/cypress/tests/integration/system_console/revoke_all_sessions_spec.js +++ b/e2e/cypress/tests/integration/channels/system_console/revoke_all_sessions_spec.js @@ -8,10 +8,10 @@ // *************************************************************** // Stage: @prod -// Group: @system_console +// Group: @channels @system_console -import * as TIMEOUTS from '../../fixtures/timeouts'; -import {getAdminAccount} from '../../support/env'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; +import {getAdminAccount} from '../../../support/env'; describe('System Console > User Management > Users', () => { const admin = getAdminAccount(); diff --git a/webapp/channels/e2e/cypress/tests/integration/system_console/search_box_not_cloud_spec.js b/e2e/cypress/tests/integration/channels/system_console/search_box_not_cloud_spec.js similarity index 96% rename from webapp/channels/e2e/cypress/tests/integration/system_console/search_box_not_cloud_spec.js rename to e2e/cypress/tests/integration/channels/system_console/search_box_not_cloud_spec.js index ae6afc0519..b630e4efa8 100644 --- a/webapp/channels/e2e/cypress/tests/integration/system_console/search_box_not_cloud_spec.js +++ b/e2e/cypress/tests/integration/channels/system_console/search_box_not_cloud_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @not_cloud @system_console +// Group: @channels @not_cloud @system_console -import * as TIMEOUTS from '../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; describe('System console', () => { before(() => { diff --git a/webapp/channels/e2e/cypress/tests/integration/system_console/session_length_spec.js b/e2e/cypress/tests/integration/channels/system_console/session_length_spec.js similarity index 99% rename from webapp/channels/e2e/cypress/tests/integration/system_console/session_length_spec.js rename to e2e/cypress/tests/integration/channels/system_console/session_length_spec.js index 645ef3e332..73a9240557 100644 --- a/webapp/channels/e2e/cypress/tests/integration/system_console/session_length_spec.js +++ b/e2e/cypress/tests/integration/channels/system_console/session_length_spec.js @@ -7,7 +7,7 @@ // - Use element ID when selecting an element. Create one if none. // *************************************************************** -// Group: @not_cloud @system_console +// Group: @channels @not_cloud @system_console // # Goes to the System Scheme page as System Admin const goToSessionLengths = () => { diff --git a/webapp/channels/e2e/cypress/tests/integration/system_console/sidebar_link_navigation_team_spec.js b/e2e/cypress/tests/integration/channels/system_console/sidebar_link_navigation_team_spec.js similarity index 93% rename from webapp/channels/e2e/cypress/tests/integration/system_console/sidebar_link_navigation_team_spec.js rename to e2e/cypress/tests/integration/channels/system_console/sidebar_link_navigation_team_spec.js index 36554740fb..598bceb2d2 100644 --- a/webapp/channels/e2e/cypress/tests/integration/system_console/sidebar_link_navigation_team_spec.js +++ b/e2e/cypress/tests/integration/channels/system_console/sidebar_link_navigation_team_spec.js @@ -8,10 +8,10 @@ // *************************************************************** // Stage: @prod -// Group: @te_only @system_console +// Group: @channels @te_only @system_console -import * as TIMEOUTS from '../../fixtures/timeouts'; -import {adminConsoleNavigation} from '../../utils/admin_console'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; +import {adminConsoleNavigation} from '../../../utils/admin_console'; describe('System Console - Team', () => { before(() => { diff --git a/webapp/channels/e2e/cypress/tests/integration/system_console/site_configuration/announcement_banner_spec.js b/e2e/cypress/tests/integration/channels/system_console/site_configuration/announcement_banner_spec.js similarity index 96% rename from webapp/channels/e2e/cypress/tests/integration/system_console/site_configuration/announcement_banner_spec.js rename to e2e/cypress/tests/integration/channels/system_console/site_configuration/announcement_banner_spec.js index 07d7164eed..4cb0be105d 100644 --- a/webapp/channels/e2e/cypress/tests/integration/system_console/site_configuration/announcement_banner_spec.js +++ b/e2e/cypress/tests/integration/channels/system_console/site_configuration/announcement_banner_spec.js @@ -8,10 +8,10 @@ // *************************************************************** // Stage: @prod -// Group: @enterprise @system_console @announcement_banner +// Group: @channels @enterprise @system_console @announcement_banner -import {hexToRgbArray, rgbArrayToString} from '../../../utils'; -import * as TIMEOUTS from '../../../fixtures/timeouts'; +import {hexToRgbArray, rgbArrayToString} from '../../../../utils'; +import * as TIMEOUTS from '../../../../fixtures/timeouts'; describe('Announcement Banner', () => { before(() => { diff --git a/webapp/channels/e2e/cypress/tests/integration/system_console/site_configuration/customization_spec.js b/e2e/cypress/tests/integration/channels/system_console/site_configuration/customization_spec.js similarity index 99% rename from webapp/channels/e2e/cypress/tests/integration/system_console/site_configuration/customization_spec.js rename to e2e/cypress/tests/integration/channels/system_console/site_configuration/customization_spec.js index af9d34330c..da7e1a33df 100644 --- a/webapp/channels/e2e/cypress/tests/integration/system_console/site_configuration/customization_spec.js +++ b/e2e/cypress/tests/integration/channels/system_console/site_configuration/customization_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @system_console +// Group: @channels @system_console -import * as TIMEOUTS from '../../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../../fixtures/timeouts'; describe('Customization', () => { beforeEach(() => { diff --git a/webapp/channels/e2e/cypress/tests/integration/system_console/site_configuration/helper.js b/e2e/cypress/tests/integration/channels/system_console/site_configuration/helper.js similarity index 88% rename from webapp/channels/e2e/cypress/tests/integration/system_console/site_configuration/helper.js rename to e2e/cypress/tests/integration/channels/system_console/site_configuration/helper.js index e13d4058d7..a61ca66322 100644 --- a/webapp/channels/e2e/cypress/tests/integration/system_console/site_configuration/helper.js +++ b/e2e/cypress/tests/integration/channels/system_console/site_configuration/helper.js @@ -1,7 +1,7 @@ // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. // See LICENSE.txt for license information. -import * as TIMEOUTS from '../../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../../fixtures/timeouts'; export function saveSetting() { // # Click save button, and verify text and visibility diff --git a/webapp/channels/e2e/cypress/tests/integration/system_console/site_configuration/link_customization_cloud_spec.js b/e2e/cypress/tests/integration/channels/system_console/site_configuration/link_customization_cloud_spec.js similarity index 93% rename from webapp/channels/e2e/cypress/tests/integration/system_console/site_configuration/link_customization_cloud_spec.js rename to e2e/cypress/tests/integration/channels/system_console/site_configuration/link_customization_cloud_spec.js index 8dd0e8103e..cd9107b47c 100644 --- a/webapp/channels/e2e/cypress/tests/integration/system_console/site_configuration/link_customization_cloud_spec.js +++ b/e2e/cypress/tests/integration/channels/system_console/site_configuration/link_customization_cloud_spec.js @@ -8,10 +8,10 @@ // *************************************************************** // Stage: @prod -// Group: @system_console @enterprise @cloud_only +// Group: @channels @system_console @enterprise @cloud_only -import * as TIMEOUTS from '../../../fixtures/timeouts'; -import {SupportSettings} from '../../../utils/constants'; +import * as TIMEOUTS from '../../../../fixtures/timeouts'; +import {SupportSettings} from '../../../../utils/constants'; describe('SupportSettings', () => { before(() => { diff --git a/webapp/channels/e2e/cypress/tests/integration/system_console/site_configuration/link_customization_e20_1_spec.js b/e2e/cypress/tests/integration/channels/system_console/site_configuration/link_customization_e20_1_spec.js similarity index 97% rename from webapp/channels/e2e/cypress/tests/integration/system_console/site_configuration/link_customization_e20_1_spec.js rename to e2e/cypress/tests/integration/channels/system_console/site_configuration/link_customization_e20_1_spec.js index d2acfa0fcc..2ccd69e7f3 100644 --- a/webapp/channels/e2e/cypress/tests/integration/system_console/site_configuration/link_customization_e20_1_spec.js +++ b/e2e/cypress/tests/integration/channels/system_console/site_configuration/link_customization_e20_1_spec.js @@ -8,10 +8,10 @@ // *************************************************************** // Stage: @prod -// Group: @system_console @enterprise @e20_only @not_cloud +// Group: @channels @system_console @enterprise @e20_only @not_cloud -import * as TIMEOUTS from '../../../fixtures/timeouts'; -import {TERMS_OF_SERVICE_LINK} from '../../../utils/constants'; +import * as TIMEOUTS from '../../../../fixtures/timeouts'; +import {TERMS_OF_SERVICE_LINK} from '../../../../utils/constants'; import {backToTeam, saveSetting} from './helper'; diff --git a/webapp/channels/e2e/cypress/tests/integration/system_console/site_configuration/link_customization_e20_2_spec.js b/e2e/cypress/tests/integration/channels/system_console/site_configuration/link_customization_e20_2_spec.js similarity index 96% rename from webapp/channels/e2e/cypress/tests/integration/system_console/site_configuration/link_customization_e20_2_spec.js rename to e2e/cypress/tests/integration/channels/system_console/site_configuration/link_customization_e20_2_spec.js index 5d0b044c56..6bc806bdc3 100644 --- a/webapp/channels/e2e/cypress/tests/integration/system_console/site_configuration/link_customization_e20_2_spec.js +++ b/e2e/cypress/tests/integration/channels/system_console/site_configuration/link_customization_e20_2_spec.js @@ -8,13 +8,13 @@ // *************************************************************** // Stage: @prod -// Group: @not_cloud @system_console +// Group: @channels @not_cloud @system_console import { FixedPublicLinks, -} from '../../../utils'; +} from '../../../../utils'; -import * as TIMEOUTS from '../../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../../fixtures/timeouts'; import {backToTeam, saveSetting} from './helper'; diff --git a/webapp/channels/e2e/cypress/tests/integration/system_console/site_url_config_spec.js b/e2e/cypress/tests/integration/channels/system_console/site_url_config_spec.js similarity index 97% rename from webapp/channels/e2e/cypress/tests/integration/system_console/site_url_config_spec.js rename to e2e/cypress/tests/integration/channels/system_console/site_url_config_spec.js index 98ef5120fa..d0184e214c 100644 --- a/webapp/channels/e2e/cypress/tests/integration/system_console/site_url_config_spec.js +++ b/e2e/cypress/tests/integration/channels/system_console/site_url_config_spec.js @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @not_cloud @system_console +// Group: @channels @not_cloud @system_console describe('Site URL', () => { before(() => { diff --git a/webapp/channels/e2e/cypress/tests/integration/system_console/support_packet_generation_spec.js b/e2e/cypress/tests/integration/channels/system_console/support_packet_generation_spec.js similarity index 95% rename from webapp/channels/e2e/cypress/tests/integration/system_console/support_packet_generation_spec.js rename to e2e/cypress/tests/integration/channels/system_console/support_packet_generation_spec.js index 09173cbf96..3780c55a7e 100644 --- a/webapp/channels/e2e/cypress/tests/integration/system_console/support_packet_generation_spec.js +++ b/e2e/cypress/tests/integration/channels/system_console/support_packet_generation_spec.js @@ -7,7 +7,7 @@ // - Use element ID when selecting an element. Create one if none. // *************************************************************** -// Group: @system_console @te_only +// Group: @channels @system_console @te_only describe('Support Packet Generation', () => { it('MM-T3817 - Commercial Support Dialog UI - No License', () => { diff --git a/webapp/channels/e2e/cypress/tests/integration/system_console/true_up_review_spec.js b/e2e/cypress/tests/integration/channels/system_console/true_up_review_spec.js similarity index 100% rename from webapp/channels/e2e/cypress/tests/integration/system_console/true_up_review_spec.js rename to e2e/cypress/tests/integration/channels/system_console/true_up_review_spec.js diff --git a/webapp/channels/e2e/cypress/tests/integration/system_console/ui_and_api/custom_site_name_description_spec.ts b/e2e/cypress/tests/integration/channels/system_console/ui_and_api/custom_site_name_description_spec.ts similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/system_console/ui_and_api/custom_site_name_description_spec.ts rename to e2e/cypress/tests/integration/channels/system_console/ui_and_api/custom_site_name_description_spec.ts index fbdd695d22..545137e09f 100644 --- a/webapp/channels/e2e/cypress/tests/integration/system_console/ui_and_api/custom_site_name_description_spec.ts +++ b/e2e/cypress/tests/integration/channels/system_console/ui_and_api/custom_site_name_description_spec.ts @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @customization +// Group: @channels @customization describe('Customization', () => { it('MM-T5379 - Should match title and custom description in root html', () => { diff --git a/webapp/channels/e2e/cypress/tests/integration/system_console/ui_and_api/customization_not_cloud_spec.js b/e2e/cypress/tests/integration/channels/system_console/ui_and_api/customization_not_cloud_spec.js similarity index 99% rename from webapp/channels/e2e/cypress/tests/integration/system_console/ui_and_api/customization_not_cloud_spec.js rename to e2e/cypress/tests/integration/channels/system_console/ui_and_api/customization_not_cloud_spec.js index e1f9c04f33..3a9bdd8fc2 100644 --- a/webapp/channels/e2e/cypress/tests/integration/system_console/ui_and_api/customization_not_cloud_spec.js +++ b/e2e/cypress/tests/integration/channels/system_console/ui_and_api/customization_not_cloud_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @not_cloud @system_console +// Group: @channels @not_cloud @system_console -import * as TIMEOUTS from '../../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../../fixtures/timeouts'; describe('Customization', () => { let origConfig; diff --git a/webapp/channels/e2e/cypress/tests/integration/system_console/ui_and_api/customization_spec.js b/e2e/cypress/tests/integration/channels/system_console/ui_and_api/customization_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/system_console/ui_and_api/customization_spec.js rename to e2e/cypress/tests/integration/channels/system_console/ui_and_api/customization_spec.js index 932e78dfda..f2be052311 100644 --- a/webapp/channels/e2e/cypress/tests/integration/system_console/ui_and_api/customization_spec.js +++ b/e2e/cypress/tests/integration/channels/system_console/ui_and_api/customization_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @system_console +// Group: @channels @system_console -import * as TIMEOUTS from '../../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../../fixtures/timeouts'; describe('Customization', () => { let origConfig; diff --git a/webapp/channels/e2e/cypress/tests/integration/system_console/unsaved_changes_spec.js b/e2e/cypress/tests/integration/channels/system_console/unsaved_changes_spec.js similarity index 96% rename from webapp/channels/e2e/cypress/tests/integration/system_console/unsaved_changes_spec.js rename to e2e/cypress/tests/integration/channels/system_console/unsaved_changes_spec.js index 8e654e4736..a53f7cf027 100644 --- a/webapp/channels/e2e/cypress/tests/integration/system_console/unsaved_changes_spec.js +++ b/e2e/cypress/tests/integration/channels/system_console/unsaved_changes_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @not_cloud @system_console +// Group: @channels @not_cloud @system_console -import {fileSizeToString} from '../../utils'; +import {fileSizeToString} from '../../../utils'; describe('Unsaved Changes', () => { let defaultMaxFileSize; diff --git a/webapp/channels/e2e/cypress/tests/integration/system_console/user_management/users_deactivation_1_spec.js b/e2e/cypress/tests/integration/channels/system_console/user_management/users_deactivation_1_spec.js similarity index 96% rename from webapp/channels/e2e/cypress/tests/integration/system_console/user_management/users_deactivation_1_spec.js rename to e2e/cypress/tests/integration/channels/system_console/user_management/users_deactivation_1_spec.js index b70315a8e1..822555d7cd 100644 --- a/webapp/channels/e2e/cypress/tests/integration/system_console/user_management/users_deactivation_1_spec.js +++ b/e2e/cypress/tests/integration/channels/system_console/user_management/users_deactivation_1_spec.js @@ -7,9 +7,9 @@ // - Use element ID when selecting an element. Create one if none. // *************************************************************** -// Group: @system_console +// Group: @channels @system_console -import * as MESSAGES from '../../../fixtures/messages'; +import * as MESSAGES from '../../../../fixtures/messages'; describe('System Console > User Management > Deactivation', () => { let team1; diff --git a/webapp/channels/e2e/cypress/tests/integration/system_console/user_management/users_deactivation_not_cloud_spec.js b/e2e/cypress/tests/integration/channels/system_console/user_management/users_deactivation_not_cloud_spec.js similarity index 95% rename from webapp/channels/e2e/cypress/tests/integration/system_console/user_management/users_deactivation_not_cloud_spec.js rename to e2e/cypress/tests/integration/channels/system_console/user_management/users_deactivation_not_cloud_spec.js index a9204f5fa8..51d4e2cf8f 100644 --- a/webapp/channels/e2e/cypress/tests/integration/system_console/user_management/users_deactivation_not_cloud_spec.js +++ b/e2e/cypress/tests/integration/channels/system_console/user_management/users_deactivation_not_cloud_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @system_console @not_cloud +// Group: @channels @system_console @not_cloud -import * as TIMEOUTS from '../../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../../fixtures/timeouts'; describe('System Console > User Management > Deactivation', () => { let testUser; diff --git a/webapp/channels/e2e/cypress/tests/integration/system_console/user_management/users_deactivation_spec.js b/e2e/cypress/tests/integration/channels/system_console/user_management/users_deactivation_spec.js similarity index 97% rename from webapp/channels/e2e/cypress/tests/integration/system_console/user_management/users_deactivation_spec.js rename to e2e/cypress/tests/integration/channels/system_console/user_management/users_deactivation_spec.js index 25f786efc2..7f24904ba7 100644 --- a/webapp/channels/e2e/cypress/tests/integration/system_console/user_management/users_deactivation_spec.js +++ b/e2e/cypress/tests/integration/channels/system_console/user_management/users_deactivation_spec.js @@ -8,10 +8,10 @@ // *************************************************************** // Stage: @prod -// Group: @system_console +// Group: @channels @system_console -import * as TIMEOUTS from '../../../fixtures/timeouts'; -import * as MESSAGES from '../../../fixtures/messages'; +import * as TIMEOUTS from '../../../../fixtures/timeouts'; +import * as MESSAGES from '../../../../fixtures/messages'; describe('System Console > User Management > Deactivation', () => { let team1; diff --git a/webapp/channels/e2e/cypress/tests/integration/system_console/user_management/users_reactivation_spec.js b/e2e/cypress/tests/integration/channels/system_console/user_management/users_reactivation_spec.js similarity index 93% rename from webapp/channels/e2e/cypress/tests/integration/system_console/user_management/users_reactivation_spec.js rename to e2e/cypress/tests/integration/channels/system_console/user_management/users_reactivation_spec.js index 82e6a08058..84a43cd3c0 100644 --- a/webapp/channels/e2e/cypress/tests/integration/system_console/user_management/users_reactivation_spec.js +++ b/e2e/cypress/tests/integration/channels/system_console/user_management/users_reactivation_spec.js @@ -8,12 +8,12 @@ // *************************************************************** // Stage: @prod -// Group: @not_cloud @system_console +// Group: @channels @not_cloud @system_console -import * as TIMEOUTS from '../../../fixtures/timeouts'; -import * as MESSAGES from '../../../fixtures/messages'; +import * as TIMEOUTS from '../../../../fixtures/timeouts'; +import * as MESSAGES from '../../../../fixtures/messages'; -import {getRandomId} from '../../../utils'; +import {getRandomId} from '../../../../utils'; describe('System Console > User Management > Reactivation', () => { before(() => { diff --git a/webapp/channels/e2e/cypress/tests/integration/system_console/user_management/users_spec.js b/e2e/cypress/tests/integration/channels/system_console/user_management/users_spec.js similarity index 99% rename from webapp/channels/e2e/cypress/tests/integration/system_console/user_management/users_spec.js rename to e2e/cypress/tests/integration/channels/system_console/user_management/users_spec.js index 5994fa3789..f39a056cd6 100644 --- a/webapp/channels/e2e/cypress/tests/integration/system_console/user_management/users_spec.js +++ b/e2e/cypress/tests/integration/channels/system_console/user_management/users_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @system_console +// Group: @channels @system_console -import * as TIMEOUTS from '../../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../../fixtures/timeouts'; describe('System Console > User Management > Users', () => { let testUser; diff --git a/webapp/channels/e2e/cypress/tests/integration/system_console/user_management_not_cloud_spec.js b/e2e/cypress/tests/integration/channels/system_console/user_management_not_cloud_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/system_console/user_management_not_cloud_spec.js rename to e2e/cypress/tests/integration/channels/system_console/user_management_not_cloud_spec.js index 905c1b8573..e19b5df5fc 100644 --- a/webapp/channels/e2e/cypress/tests/integration/system_console/user_management_not_cloud_spec.js +++ b/e2e/cypress/tests/integration/channels/system_console/user_management_not_cloud_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @system_console @not_cloud +// Group: @channels @system_console @not_cloud -const TIMEOUTS = require('../../fixtures/timeouts'); +const TIMEOUTS = require('../../../fixtures/timeouts'); describe('User Management', () => { let testTeam; diff --git a/webapp/channels/e2e/cypress/tests/integration/system_console/user_management_spec.js b/e2e/cypress/tests/integration/channels/system_console/user_management_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/system_console/user_management_spec.js rename to e2e/cypress/tests/integration/channels/system_console/user_management_spec.js index ae6e348ac4..f3a096c561 100644 --- a/webapp/channels/e2e/cypress/tests/integration/system_console/user_management_spec.js +++ b/e2e/cypress/tests/integration/channels/system_console/user_management_spec.js @@ -8,16 +8,16 @@ // *************************************************************** // Stage: @prod -// Group: @system_console +// Group: @channels @system_console import { getEmailResetEmailTemplate, getEmailVerifyEmailTemplate, getRandomId, verifyEmailBody, -} from '../../utils'; +} from '../../../utils'; -const TIMEOUTS = require('../../fixtures/timeouts'); +const TIMEOUTS = require('../../../fixtures/timeouts'); describe('User Management', () => { const newUsername = 'u' + getRandomId(); diff --git a/webapp/channels/e2e/cypress/tests/integration/system_console/workspace_deletion_spec.js b/e2e/cypress/tests/integration/channels/system_console/workspace_deletion_spec.js similarity index 99% rename from webapp/channels/e2e/cypress/tests/integration/system_console/workspace_deletion_spec.js rename to e2e/cypress/tests/integration/channels/system_console/workspace_deletion_spec.js index e74b99575a..33ec4ee7e9 100644 --- a/webapp/channels/e2e/cypress/tests/integration/system_console/workspace_deletion_spec.js +++ b/e2e/cypress/tests/integration/channels/system_console/workspace_deletion_spec.js @@ -7,7 +7,7 @@ // - Use element ID when selecting an element. Create one if none. // *************************************************************** -// Group: @system_console +// Group: @channels @system_console describe('Workspace deletion', () => { const host = window.location.host; diff --git a/webapp/channels/e2e/cypress/tests/integration/team_settings/archive_team_spec.ts b/e2e/cypress/tests/integration/channels/team_settings/archive_team_spec.ts similarity index 96% rename from webapp/channels/e2e/cypress/tests/integration/team_settings/archive_team_spec.ts rename to e2e/cypress/tests/integration/channels/team_settings/archive_team_spec.ts index 577ff85469..2a02f5817e 100644 --- a/webapp/channels/e2e/cypress/tests/integration/team_settings/archive_team_spec.ts +++ b/e2e/cypress/tests/integration/channels/team_settings/archive_team_spec.ts @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @team_settings +// Group: @channels @team_settings -import * as TIMEOUTS from '../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; describe('Teams Settings', () => { let sysadmin: Cypress.UserProfile; diff --git a/webapp/channels/e2e/cypress/tests/integration/team_settings/closed_team_invite_by_email_spec.js b/e2e/cypress/tests/integration/channels/team_settings/closed_team_invite_by_email_spec.js similarity index 96% rename from webapp/channels/e2e/cypress/tests/integration/team_settings/closed_team_invite_by_email_spec.js rename to e2e/cypress/tests/integration/channels/team_settings/closed_team_invite_by_email_spec.js index 86c794c498..ddaa36945d 100644 --- a/webapp/channels/e2e/cypress/tests/integration/team_settings/closed_team_invite_by_email_spec.js +++ b/e2e/cypress/tests/integration/channels/team_settings/closed_team_invite_by_email_spec.js @@ -8,16 +8,16 @@ // *************************************************************** // Stage: @prod -// Group: @team_settings +// Group: @channels @team_settings -import {getAdminAccount} from '../../support/env'; -import * as TIMEOUTS from '../../fixtures/timeouts'; +import {getAdminAccount} from '../../../support/env'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; import { getJoinEmailTemplate, getRandomId, reUrl, verifyEmailBody, -} from '../../utils'; +} from '../../../utils'; describe('Team Settings', () => { const sysadmin = getAdminAccount(); diff --git a/webapp/channels/e2e/cypress/tests/integration/team_settings/closed_team_invite_with_non_mattermost_domain_spec.js b/e2e/cypress/tests/integration/channels/team_settings/closed_team_invite_with_non_mattermost_domain_spec.js similarity index 93% rename from webapp/channels/e2e/cypress/tests/integration/team_settings/closed_team_invite_with_non_mattermost_domain_spec.js rename to e2e/cypress/tests/integration/channels/team_settings/closed_team_invite_with_non_mattermost_domain_spec.js index b0b72b6f41..bb0d0ccc03 100644 --- a/webapp/channels/e2e/cypress/tests/integration/team_settings/closed_team_invite_with_non_mattermost_domain_spec.js +++ b/e2e/cypress/tests/integration/channels/team_settings/closed_team_invite_with_non_mattermost_domain_spec.js @@ -7,10 +7,10 @@ // - Use element ID when selecting an element. Create one if none. // *************************************************************** -// Group: @te_only @team_settings +// Group: @channels @te_only @team_settings -import {getAdminAccount} from '../../support/env'; -import {generateRandomUser} from '../../support/api/user'; +import {getAdminAccount} from '../../../support/env'; +import {generateRandomUser} from '../../../support/api/user'; import {allowOnlyUserFromSpecificDomain, inviteUserByEmail, verifyEmailInviteAndVisitLink, signupAndVerifyTutorial} from './helpers'; diff --git a/webapp/channels/e2e/cypress/tests/integration/team_settings/closed_team_invite_with_specific_domain_spec.js b/e2e/cypress/tests/integration/channels/team_settings/closed_team_invite_with_specific_domain_spec.js similarity index 92% rename from webapp/channels/e2e/cypress/tests/integration/team_settings/closed_team_invite_with_specific_domain_spec.js rename to e2e/cypress/tests/integration/channels/team_settings/closed_team_invite_with_specific_domain_spec.js index e9f36a7558..ae9aae3d9e 100644 --- a/webapp/channels/e2e/cypress/tests/integration/team_settings/closed_team_invite_with_specific_domain_spec.js +++ b/e2e/cypress/tests/integration/channels/team_settings/closed_team_invite_with_specific_domain_spec.js @@ -7,10 +7,10 @@ // - Use element ID when selecting an element. Create one if none. // *************************************************************** -// Group: @te_only @team_settings +// Group: @channels @te_only @team_settings -import {getAdminAccount} from '../../support/env'; -import {generateRandomUser} from '../../support/api/user'; +import {getAdminAccount} from '../../../support/env'; +import {generateRandomUser} from '../../../support/api/user'; import {allowOnlyUserFromSpecificDomain, inviteUserByEmail, verifyEmailInviteAndVisitLink, signupAndVerifyTutorial} from './helpers'; diff --git a/webapp/channels/e2e/cypress/tests/integration/team_settings/create_a_team_spec.js b/e2e/cypress/tests/integration/channels/team_settings/create_a_team_spec.js similarity index 97% rename from webapp/channels/e2e/cypress/tests/integration/team_settings/create_a_team_spec.js rename to e2e/cypress/tests/integration/channels/team_settings/create_a_team_spec.js index 161d66e9e0..c2ee706eb8 100644 --- a/webapp/channels/e2e/cypress/tests/integration/team_settings/create_a_team_spec.js +++ b/e2e/cypress/tests/integration/channels/team_settings/create_a_team_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @team_settings @smoke +// Group: @channels @team_settings @smoke -import {getRandomId} from '../../utils'; +import {getRandomId} from '../../../utils'; describe('Teams Suite', () => { before(() => { diff --git a/webapp/channels/e2e/cypress/tests/integration/team_settings/helpers.js b/e2e/cypress/tests/integration/channels/team_settings/helpers.js similarity index 97% rename from webapp/channels/e2e/cypress/tests/integration/team_settings/helpers.js rename to e2e/cypress/tests/integration/channels/team_settings/helpers.js index 156da3df1f..7cef607d78 100644 --- a/webapp/channels/e2e/cypress/tests/integration/team_settings/helpers.js +++ b/e2e/cypress/tests/integration/channels/team_settings/helpers.js @@ -1,12 +1,12 @@ // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. // See LICENSE.txt for license information. -import * as TIMEOUTS from '../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; import { getJoinEmailTemplate, reUrl, verifyEmailBody, -} from '../../utils'; +} from '../../../utils'; export const allowOnlyUserFromSpecificDomain = (domain) => { // # Open 'Team Settings' modal diff --git a/webapp/channels/e2e/cypress/tests/integration/team_settings/invite_members_backdrop_spec.js b/e2e/cypress/tests/integration/channels/team_settings/invite_members_backdrop_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/team_settings/invite_members_backdrop_spec.js rename to e2e/cypress/tests/integration/channels/team_settings/invite_members_backdrop_spec.js index 1bcbd800eb..1360c0f227 100644 --- a/webapp/channels/e2e/cypress/tests/integration/team_settings/invite_members_backdrop_spec.js +++ b/e2e/cypress/tests/integration/channels/team_settings/invite_members_backdrop_spec.js @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @team_settings +// Group: @channels @team_settings describe('Invite Members', () => { before(() => { diff --git a/webapp/channels/e2e/cypress/tests/integration/team_settings/invite_members_spec.js b/e2e/cypress/tests/integration/channels/team_settings/invite_members_spec.js similarity index 99% rename from webapp/channels/e2e/cypress/tests/integration/team_settings/invite_members_spec.js rename to e2e/cypress/tests/integration/channels/team_settings/invite_members_spec.js index 8ab33461ab..29d3072971 100644 --- a/webapp/channels/e2e/cypress/tests/integration/team_settings/invite_members_spec.js +++ b/e2e/cypress/tests/integration/channels/team_settings/invite_members_spec.js @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @team_settings +// Group: @channels @team_settings describe('Invite Members', () => { let testUser; diff --git a/webapp/channels/e2e/cypress/tests/integration/team_settings/invite_user_to_closed_team_spec.js b/e2e/cypress/tests/integration/channels/team_settings/invite_user_to_closed_team_spec.js similarity index 96% rename from webapp/channels/e2e/cypress/tests/integration/team_settings/invite_user_to_closed_team_spec.js rename to e2e/cypress/tests/integration/channels/team_settings/invite_user_to_closed_team_spec.js index ffbb52c279..cff33f6517 100644 --- a/webapp/channels/e2e/cypress/tests/integration/team_settings/invite_user_to_closed_team_spec.js +++ b/e2e/cypress/tests/integration/channels/team_settings/invite_user_to_closed_team_spec.js @@ -8,10 +8,10 @@ // *************************************************************** // Stage: @prod -// Group: @team_settings +// Group: @channels @team_settings -import {getRandomId} from '../../utils'; -import * as TIMEOUTS from '../../fixtures/timeouts'; +import {getRandomId} from '../../../utils'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; describe('Team Settings', () => { let newUser; diff --git a/webapp/channels/e2e/cypress/tests/integration/team_settings/join_closed_team_with_not_allowed_email_spec.js b/e2e/cypress/tests/integration/channels/team_settings/join_closed_team_with_not_allowed_email_spec.js similarity index 97% rename from webapp/channels/e2e/cypress/tests/integration/team_settings/join_closed_team_with_not_allowed_email_spec.js rename to e2e/cypress/tests/integration/channels/team_settings/join_closed_team_with_not_allowed_email_spec.js index 143a02bf4e..3753e85dee 100644 --- a/webapp/channels/e2e/cypress/tests/integration/team_settings/join_closed_team_with_not_allowed_email_spec.js +++ b/e2e/cypress/tests/integration/channels/team_settings/join_closed_team_with_not_allowed_email_spec.js @@ -8,10 +8,10 @@ // *************************************************************** // Stage: @prod -// Group: @team_settings +// Group: @channels @team_settings -import {getRandomId, stubClipboard} from '../../utils'; -import * as TIMEOUTS from '../../fixtures/timeouts'; +import {getRandomId, stubClipboard} from '../../../utils'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; describe('Team Settings', () => { const randomId = getRandomId(); diff --git a/webapp/channels/e2e/cypress/tests/integration/team_settings/manage_members_spec.js b/e2e/cypress/tests/integration/channels/team_settings/manage_members_spec.js similarity index 99% rename from webapp/channels/e2e/cypress/tests/integration/team_settings/manage_members_spec.js rename to e2e/cypress/tests/integration/channels/team_settings/manage_members_spec.js index 7893914763..0cff4b281b 100644 --- a/webapp/channels/e2e/cypress/tests/integration/team_settings/manage_members_spec.js +++ b/e2e/cypress/tests/integration/channels/team_settings/manage_members_spec.js @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @team_settings +// Group: @channels @team_settings import { promoteToChannelOrTeamAdmin, diff --git a/webapp/channels/e2e/cypress/tests/integration/team_settings/remove_team_icon_spec.js b/e2e/cypress/tests/integration/channels/team_settings/remove_team_icon_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/team_settings/remove_team_icon_spec.js rename to e2e/cypress/tests/integration/channels/team_settings/remove_team_icon_spec.js index 90e70984fb..ba1c0a0389 100644 --- a/webapp/channels/e2e/cypress/tests/integration/team_settings/remove_team_icon_spec.js +++ b/e2e/cypress/tests/integration/channels/team_settings/remove_team_icon_spec.js @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @team_settings +// Group: @channels @team_settings describe('Teams Settings', () => { let testTeam; diff --git a/webapp/channels/e2e/cypress/tests/integration/team_settings/teammates_pagination_spec.js b/e2e/cypress/tests/integration/channels/team_settings/teammates_pagination_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/team_settings/teammates_pagination_spec.js rename to e2e/cypress/tests/integration/channels/team_settings/teammates_pagination_spec.js index 507f1521db..1f8683d579 100755 --- a/webapp/channels/e2e/cypress/tests/integration/team_settings/teammates_pagination_spec.js +++ b/e2e/cypress/tests/integration/channels/team_settings/teammates_pagination_spec.js @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @team_settings +// Group: @channels @team_settings describe('Teams Suite', () => { before(() => { diff --git a/webapp/channels/e2e/cypress/tests/integration/team_settings/teams_spec.js b/e2e/cypress/tests/integration/channels/team_settings/teams_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/team_settings/teams_spec.js rename to e2e/cypress/tests/integration/channels/team_settings/teams_spec.js index f63ebd9eb0..211ecaa40a 100644 --- a/webapp/channels/e2e/cypress/tests/integration/team_settings/teams_spec.js +++ b/e2e/cypress/tests/integration/channels/team_settings/teams_spec.js @@ -8,10 +8,10 @@ // *************************************************************** // Stage: @prod -// Group: @team_settings +// Group: @channels @team_settings -import * as TIMEOUTS from '../../fixtures/timeouts'; -import {getAdminAccount} from '../../support/env'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; +import {getAdminAccount} from '../../../support/env'; describe('Teams Suite', () => { let testTeam; diff --git a/webapp/channels/e2e/cypress/tests/integration/toast/helpers.js b/e2e/cypress/tests/integration/channels/toast/helpers.js similarity index 94% rename from webapp/channels/e2e/cypress/tests/integration/toast/helpers.js rename to e2e/cypress/tests/integration/channels/toast/helpers.js index 54eefe05c6..3e43f22aef 100644 --- a/webapp/channels/e2e/cypress/tests/integration/toast/helpers.js +++ b/e2e/cypress/tests/integration/channels/toast/helpers.js @@ -7,8 +7,8 @@ // Use element ID when selecting an element. Create one if none. // *************************************************************** -import * as TIMEOUTS from '../../fixtures/timeouts'; -import {getRandomId} from '../../utils'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; +import {getRandomId} from '../../../utils'; export function visitTownSquareAndWaitForPageToLoad() { // # Click town-square at LHS and wait for post list to load diff --git a/webapp/channels/e2e/cypress/tests/integration/toast/new_messages_toast_spec.js b/e2e/cypress/tests/integration/channels/toast/new_messages_toast_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/toast/new_messages_toast_spec.js rename to e2e/cypress/tests/integration/channels/toast/new_messages_toast_spec.js index 848fc270ef..83f528972e 100644 --- a/webapp/channels/e2e/cypress/tests/integration/toast/new_messages_toast_spec.js +++ b/e2e/cypress/tests/integration/channels/toast/new_messages_toast_spec.js @@ -8,11 +8,11 @@ // *************************************************************** // Stage: @prod -// Group: @toast +// Group: @channels @toast -import {getRandomId} from '../../utils'; +import {getRandomId} from '../../../utils'; -import * as TIMEOUTS from '../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; import { scrollDown, diff --git a/webapp/channels/e2e/cypress/tests/integration/toast/permalink_jump_to_spec.js b/e2e/cypress/tests/integration/channels/toast/permalink_jump_to_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/toast/permalink_jump_to_spec.js rename to e2e/cypress/tests/integration/channels/toast/permalink_jump_to_spec.js index 8410fc0397..644526a01a 100644 --- a/webapp/channels/e2e/cypress/tests/integration/toast/permalink_jump_to_spec.js +++ b/e2e/cypress/tests/integration/channels/toast/permalink_jump_to_spec.js @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @toast +// Group: @channels @toast describe('Toast', () => { let testChannelDisplayName; diff --git a/webapp/channels/e2e/cypress/tests/integration/toast/permalink_post_spec.js b/e2e/cypress/tests/integration/channels/toast/permalink_post_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/toast/permalink_post_spec.js rename to e2e/cypress/tests/integration/channels/toast/permalink_post_spec.js index 330385d306..2e82db763c 100644 --- a/webapp/channels/e2e/cypress/tests/integration/toast/permalink_post_spec.js +++ b/e2e/cypress/tests/integration/channels/toast/permalink_post_spec.js @@ -8,7 +8,7 @@ // *************************************************************** // Stage: @prod -// Group: @toast +// Group: @channels @toast describe('Toast', () => { let testTeam; diff --git a/webapp/channels/e2e/cypress/tests/integration/toast/permalink_post_with_new_message_spec.js b/e2e/cypress/tests/integration/channels/toast/permalink_post_with_new_message_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/toast/permalink_post_with_new_message_spec.js rename to e2e/cypress/tests/integration/channels/toast/permalink_post_with_new_message_spec.js index bc1df65837..816e94b4a0 100644 --- a/webapp/channels/e2e/cypress/tests/integration/toast/permalink_post_with_new_message_spec.js +++ b/e2e/cypress/tests/integration/channels/toast/permalink_post_with_new_message_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @toast +// Group: @channels @toast -import {getRandomId} from '../../utils'; +import {getRandomId} from '../../../utils'; describe('Toast', () => { let testTeam; diff --git a/webapp/channels/e2e/cypress/tests/integration/toast/toast_spec.js b/e2e/cypress/tests/integration/channels/toast/toast_spec.js similarity index 99% rename from webapp/channels/e2e/cypress/tests/integration/toast/toast_spec.js rename to e2e/cypress/tests/integration/channels/toast/toast_spec.js index c22ae677ad..75c488bdfc 100644 --- a/webapp/channels/e2e/cypress/tests/integration/toast/toast_spec.js +++ b/e2e/cypress/tests/integration/channels/toast/toast_spec.js @@ -7,9 +7,9 @@ // Use element ID when selecting an element. Create one if none. // *************************************************************** -// Group: @toast +// Group: @channels @toast -import * as TIMEOUTS from '../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; import { scrollDown, diff --git a/webapp/channels/e2e/cypress/tests/integration/toast/unread_with_bottom_start_toast_spec.js b/e2e/cypress/tests/integration/channels/toast/unread_with_bottom_start_toast_spec.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/integration/toast/unread_with_bottom_start_toast_spec.js rename to e2e/cypress/tests/integration/channels/toast/unread_with_bottom_start_toast_spec.js index 780d87e505..2c5129c9d9 100644 --- a/webapp/channels/e2e/cypress/tests/integration/toast/unread_with_bottom_start_toast_spec.js +++ b/e2e/cypress/tests/integration/channels/toast/unread_with_bottom_start_toast_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @toast +// Group: @channels @toast -import * as TIMEOUTS from '../../fixtures/timeouts'; +import * as TIMEOUTS from '../../../fixtures/timeouts'; import {scrollToTop} from './helpers'; diff --git a/webapp/channels/e2e/cypress/tests/integration/websocket/channel_created/new_sidebar_spec.js b/e2e/cypress/tests/integration/channels/websocket/channel_created/new_sidebar_spec.js similarity index 94% rename from webapp/channels/e2e/cypress/tests/integration/websocket/channel_created/new_sidebar_spec.js rename to e2e/cypress/tests/integration/channels/websocket/channel_created/new_sidebar_spec.js index 05c983bfd3..57bf308dc1 100644 --- a/webapp/channels/e2e/cypress/tests/integration/websocket/channel_created/new_sidebar_spec.js +++ b/e2e/cypress/tests/integration/channels/websocket/channel_created/new_sidebar_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @websocket +// Group: @channels @websocket -import {getRandomId} from '../../../utils'; +import {getRandomId} from '../../../../utils'; describe('Handle removed user - new sidebar', () => { it('MM-27202 should add new channels to the sidebar when created from another session', () => { diff --git a/webapp/channels/e2e/cypress/tests/integration/websocket/channel_created/old_sidebar_spec.js b/e2e/cypress/tests/integration/channels/websocket/channel_created/old_sidebar_spec.js similarity index 94% rename from webapp/channels/e2e/cypress/tests/integration/websocket/channel_created/old_sidebar_spec.js rename to e2e/cypress/tests/integration/channels/websocket/channel_created/old_sidebar_spec.js index 05c983bfd3..57bf308dc1 100644 --- a/webapp/channels/e2e/cypress/tests/integration/websocket/channel_created/old_sidebar_spec.js +++ b/e2e/cypress/tests/integration/channels/websocket/channel_created/old_sidebar_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @websocket +// Group: @channels @websocket -import {getRandomId} from '../../../utils'; +import {getRandomId} from '../../../../utils'; describe('Handle removed user - new sidebar', () => { it('MM-27202 should add new channels to the sidebar when created from another session', () => { diff --git a/webapp/channels/e2e/cypress/tests/integration/websocket/handle_new_post_spec.js b/e2e/cypress/tests/integration/channels/websocket/handle_new_post_spec.js similarity index 96% rename from webapp/channels/e2e/cypress/tests/integration/websocket/handle_new_post_spec.js rename to e2e/cypress/tests/integration/channels/websocket/handle_new_post_spec.js index c3c318ed23..fe28103ae4 100644 --- a/webapp/channels/e2e/cypress/tests/integration/websocket/handle_new_post_spec.js +++ b/e2e/cypress/tests/integration/channels/websocket/handle_new_post_spec.js @@ -8,12 +8,12 @@ // *************************************************************** // Stage: @prod -// Group: @websocket +// Group: @channels @websocket -import {beRead, beUnread} from '../../support/assertions'; -import {getAdminAccount} from '../../support/env'; +import {beRead, beUnread} from '../../../support/assertions'; +import {getAdminAccount} from '../../../support/env'; -import {getRandomId} from '../../utils'; +import {getRandomId} from '../../../utils'; describe('Handle new post', () => { const admin = getAdminAccount(); diff --git a/webapp/channels/e2e/cypress/tests/integration/websocket/handle_removed_user/helpers.js b/e2e/cypress/tests/integration/channels/websocket/handle_removed_user/helpers.js similarity index 100% rename from webapp/channels/e2e/cypress/tests/integration/websocket/handle_removed_user/helpers.js rename to e2e/cypress/tests/integration/channels/websocket/handle_removed_user/helpers.js diff --git a/webapp/channels/e2e/cypress/tests/integration/websocket/handle_removed_user/new_sidebar_spec.js b/e2e/cypress/tests/integration/channels/websocket/handle_removed_user/new_sidebar_spec.js similarity index 96% rename from webapp/channels/e2e/cypress/tests/integration/websocket/handle_removed_user/new_sidebar_spec.js rename to e2e/cypress/tests/integration/channels/websocket/handle_removed_user/new_sidebar_spec.js index c8c51ccaa5..675fe04823 100644 --- a/webapp/channels/e2e/cypress/tests/integration/websocket/handle_removed_user/new_sidebar_spec.js +++ b/e2e/cypress/tests/integration/channels/websocket/handle_removed_user/new_sidebar_spec.js @@ -8,9 +8,9 @@ // *************************************************************** // Stage: @prod -// Group: @websocket +// Group: @channels @websocket -import {getRandomId} from '../../../utils'; +import {getRandomId} from '../../../../utils'; import { createNewTeamAndMoveToOffTopic, diff --git a/e2e/cypress/tests/integration/playbooks/adminconsole/analytics_spec.js b/e2e/cypress/tests/integration/playbooks/adminconsole/analytics_spec.js new file mode 100644 index 0000000000..89aa5df18b --- /dev/null +++ b/e2e/cypress/tests/integration/playbooks/adminconsole/analytics_spec.js @@ -0,0 +1,107 @@ +// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. + +// *************************************************************** +// - [#] indicates a test step (e.g. # Go to a page) +// - [*] indicates an assertion (e.g. * Check the title) +// *************************************************************** + +// Stage: @prod +// Group: @playbooks + +describe('admin console', () => { + let testUser; + let testTeam; + let testPlaybook; + let testSysadmin; + + before(() => { + cy.apiInitSetup().then(({team, user}) => { + testTeam = team; + testUser = user; + cy.apiCreateCustomAdmin().then(({sysadmin}) => { + testSysadmin = sysadmin; + }); + cy.apiCreatePlaybook({ + teamId: testTeam.id, + title: 'Playbook', + memberIDs: [], + }).then((playbook) => { + testPlaybook = playbook; + }); + }); + }); + + beforeEach(() => { + // # Login as testSysddmin + cy.apiLogin(testSysadmin); + }); + + describe('site statistics', () => { + it('playbooks and runs counters are visible', () => { + // # Go to admin console > site statistics + cy.visit('/admin_console/reporting/system_analytics'); + + // * Check that the playbook and run counters are visible + cy.findByTestId('playbooks.playbook_count').should('exist'); + cy.findByTestId('playbooks.playbook_run_count').should('exist'); + }); + + it('playbook counter increases after creating a playbook', () => { + let counter; + + // # Go to admin console > site statistics + cy.visit('/admin_console/reporting/system_analytics'); + + // # Capture current value of playbook counter + cy.findByTestId('playbooks.playbook_count').invoke('prop', 'innerText').then((pbCount) => { + counter = parseInt(pbCount, 10); + cy.apiLogin(testUser); + + // # Create a playbook + cy.apiCreatePlaybook({ + teamId: testTeam.id, + title: 'Playbook', + memberIDs: [], + }).then(() => { + cy.apiLogin(testSysadmin); + + // # Go to admin console > site statistics + cy.visit('/admin_console/reporting/system_analytics'); + + // * Verify that the Playbook Counter has been increased by 1 + cy.findByTestId('playbooks.playbook_count').contains(String(counter + 1)); + }); + }); + }); + + it('run counter increases after creating a run', () => { + let counter; + + // # Go to admin console > site statistics + cy.visit('/admin_console/reporting/system_analytics'); + + // # Capture current value of run counter + cy.findByTestId('playbooks.playbook_run_count').invoke('prop', 'innerText').then((runCount) => { + counter = parseInt(runCount, 10); + cy.apiLogin(testUser); + + // # create a run + cy.apiRunPlaybook({ + teamId: testTeam.id, + playbookId: testPlaybook.id, + playbookRunName: 'My run for test', + ownerUserId: testUser.id, + }).then(() => { + cy.apiLogin(testSysadmin); + + // # Go to admin console > site statistics + cy.visit('/admin_console/reporting/system_analytics'); + + // * Verify that the Run Counter has been increased by 1 + cy.findByTestId('playbooks.playbook_run_count').contains(String(counter + 1)); + }); + }); + }); + }); +}); diff --git a/e2e/cypress/tests/integration/playbooks/api/runs_spec.js b/e2e/cypress/tests/integration/playbooks/api/runs_spec.js new file mode 100644 index 0000000000..140eb4cf3c --- /dev/null +++ b/e2e/cypress/tests/integration/playbooks/api/runs_spec.js @@ -0,0 +1,189 @@ +// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. + +// *************************************************************** +// - [#] indicates a test step (e.g. # Go to a page) +// - [*] indicates an assertion (e.g. * Check the title) +// *************************************************************** + +// Stage: @prod +// Group: @playbooks + +describe('api > runs', () => { + let testTeam; + let testUser; + let testPlaybook; + + before(() => { + cy.apiInitSetup().then(({team, user}) => { + testTeam = team; + testUser = user; + + // # Login as testUser + cy.apiLogin(testUser); + + // # Create a public playbook + cy.apiCreatePlaybook({ + teamId: testTeam.id, + title: 'Playbook', + memberIDs: [], + createPublicPlaybookRun: true, + }).then((playbook) => { + testPlaybook = playbook; + }); + }); + }); + + beforeEach(() => { + // # Login as testUser + cy.apiLogin(testUser); + }); + + describe('creating a run', () => { + describe('in an existing, public channel', () => { + it('with no team_id specified', () => { + // # Create a test channel without a playbook run + cy.apiCreateChannel(testTeam.id, 'channel', 'Channel').then(({channel}) => { + // # Run the testPlaybook in the previously created channel + + cy.apiRunPlaybook({ + ownerUserId: testUser.id, + channelId: channel.id, + playbookId: testPlaybook.id, + }, {expectedStatusCode: 201}).then((body) => { + expect(body).to.have.property('owner_user_id', testUser.id); + expect(body).to.have.property('reporter_user_id', testUser.id); + expect(body).to.have.property('team_id', testTeam.id); + expect(body).to.have.property('channel_id', channel.id); + expect(body).to.have.property('playbook_id', testPlaybook.id); + }); + }); + }); + + it('with correct team_id specified', () => { + // # Create a test channel without a playbook run + cy.apiCreateChannel(testTeam.id, 'channel', 'Channel').then(({channel}) => { + // # Run the testPlaybook in the previously created channel + cy.apiRunPlaybook({ + ownerUserId: testUser.id, + channelId: channel.id, + playbookId: testPlaybook.id, + teamId: testTeam.id, + }, {expectedStatusCode: 201}).then((body) => { + expect(body).to.have.property('owner_user_id', testUser.id); + expect(body).to.have.property('reporter_user_id', testUser.id); + expect(body).to.have.property('team_id', testTeam.id); + expect(body).to.have.property('channel_id', channel.id); + expect(body).to.have.property('playbook_id', testPlaybook.id); + }); + }); + }); + + it('with wrong team_id specified', () => { + // # Create a test channel without a playbook run + cy.apiCreateChannel(testTeam.id, 'channel', 'Channel').then(({channel}) => { + // # Run the testPlaybook in the previously created channel + cy.apiRunPlaybook({ + ownerUserId: testUser.id, + channelId: channel.id, + playbookId: testPlaybook.id, + teamId: 'other_team_id', + }, {expectedStatusCode: 400}).then((body) => { + expect(body).to.have.property('error', 'unable to create playbook run'); + }); + }); + }); + }); + + describe('in an existing, private channel', () => { + it('with no team_id specified', () => { + // # Create a test channel without a playbook run + cy.apiCreateChannel(testTeam.id, 'channel', 'Channel', 'P').then(({channel}) => { + // # Run the testPlaybook in the previously created channel + cy.apiRunPlaybook({ + ownerUserId: testUser.id, + channelId: channel.id, + playbookId: testPlaybook.id, + }, {expectedStatusCode: 201}).then((body) => { + expect(body).to.have.property('owner_user_id', testUser.id); + expect(body).to.have.property('reporter_user_id', testUser.id); + expect(body).to.have.property('team_id', testTeam.id); + expect(body).to.have.property('channel_id', channel.id); + expect(body).to.have.property('playbook_id', testPlaybook.id); + }); + }); + }); + + it('with correct team_id specified', () => { + // # Create a test channel without a playbook run + cy.apiCreateChannel(testTeam.id, 'channel', 'Channel', 'P').then(({channel}) => { + // # Run the testPlaybook in the previously created channel + cy.apiRunPlaybook({ + ownerUserId: testUser.id, + channelId: channel.id, + playbookId: testPlaybook.id, + teamId: testTeam.id, + }, {expectedStatusCode: 201}).then((body) => { + expect(body).to.have.property('owner_user_id', testUser.id); + expect(body).to.have.property('reporter_user_id', testUser.id); + expect(body).to.have.property('team_id', testTeam.id); + expect(body).to.have.property('channel_id', channel.id); + expect(body).to.have.property('playbook_id', testPlaybook.id); + }); + }); + }); + + it('with wrong team_id specified', () => { + // # Create a test channel without a playbook run + cy.apiCreateChannel(testTeam.id, 'channel', 'Channel', 'P').then(({channel}) => { + // # Run the testPlaybook in the previously created channel + cy.apiRunPlaybook({ + ownerUserId: testUser.id, + channelId: channel.id, + playbookId: testPlaybook.id, + teamId: 'other_team_id', + }, {expectedStatusCode: 400}).then((body) => { + expect(body).to.have.property('error', 'unable to create playbook run'); + }); + }); + }); + }); + + it('in an existing, private channel, of which the user is not a member', () => { + // # Create a test channel without a playbook run + cy.apiCreateChannel(testTeam.id, 'channel', 'Channel', 'P').then(({channel}) => { + // # Leave the channel + cy.apiRemoveUserFromChannel(channel.id, testUser.id); + + // # Run the testPlaybook in the previously created channel + cy.apiRunPlaybook({ + ownerUserId: testUser.id, + channelId: channel.id, + playbookId: testPlaybook.id, + teamId: testTeam.id, + }, {expectedStatusCode: 403}).then((body) => { + expect(body).to.have.property('error', 'unable to create playbook run'); + }); + }); + }); + + it('in a channel with an existing playbook run', () => { + // # Run the playbook, creating a channel. + cy.apiRunPlaybook({ + teamId: testTeam.id, + playbookId: testPlaybook.id, + playbookRunName: 'Playbook', + ownerUserId: testUser.id, + }).then((playbookRun) => { + // # Run the testPlaybook in the previously created channel + cy.apiRunPlaybook({ + owner_user_id: testUser.id, + channel_id: playbookRun.channel_id, + playbook_id: testPlaybook.id, + }, {expectedStatusCode: 400}).then((body) => { + expect(body).to.have.property('error', 'unable to create playbook run'); + }); + }); + }); + }); +}); diff --git a/e2e/cypress/tests/integration/playbooks/channels/app_bar_spec.js b/e2e/cypress/tests/integration/playbooks/channels/app_bar_spec.js new file mode 100644 index 0000000000..4f49a0e1a6 --- /dev/null +++ b/e2e/cypress/tests/integration/playbooks/channels/app_bar_spec.js @@ -0,0 +1,97 @@ +// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. + +// *************************************************************** +// - [#] indicates a test step (e.g. # Go to a page) +// - [*] indicates an assertion (e.g. * Check the title) +// *************************************************************** + +// Stage: @prod +// Group: @playbooks + +import {onlyOn} from '@cypress/skip-test'; + +describe('channels > App Bar', () => { + let testTeam; + let testUser; + let testPlaybook; + let appBarEnabled; + + before(() => { + cy.apiInitSetup().then(({team, user}) => { + testTeam = team; + testUser = user; + + // # Login as testUser + cy.apiLogin(testUser); + + // # Create a playbook + cy.apiCreateTestPlaybook({ + teamId: testTeam.id, + title: 'Playbook', + userId: testUser.id, + }).then((playbook) => { + testPlaybook = playbook; + + // # Start a playbook run + cy.apiRunPlaybook({ + teamId: testTeam.id, + playbookId: testPlaybook.id, + playbookRunName: 'Playbook Run', + ownerUserId: testUser.id, + }); + }); + + cy.apiGetConfig(true).then(({config}) => { + appBarEnabled = config.EnableAppBar === 'true'; + }); + }); + }); + + beforeEach(() => { + // # Size the viewport to show the RHS without covering posts. + cy.viewport('macbook-13'); + + // # Login as testUser + cy.apiLogin(testUser); + }); + + describe('App Bar disabled', () => { + it('should not show the Playbook App Bar icon', () => { + onlyOn(!appBarEnabled); + + // # Navigate directly to a non-playbook run channel + cy.visit(`/${testTeam.name}/channels/town-square`); + + // * Verify App Bar icon is not showing + cy.get('#channel_view').within(() => { + cy.getPlaybooksAppBarIcon().should('not.exist'); + }); + }); + }); + + describe('App Bar enabled', () => { + it('should show the Playbook App Bar icon', () => { + onlyOn(appBarEnabled); + + // # Navigate directly to a non-playbook run channel + cy.visit(`/${testTeam.name}/channels/town-square`); + + // * Verify App Bar icon is showing + cy.getPlaybooksAppBarIcon().should('exist'); + }); + + it('should show "Playbooks" tooltip for Playbook App Bar icon', () => { + onlyOn(appBarEnabled); + + // # Navigate directly to a non-playbook run channel + cy.visit(`/${testTeam.name}/channels/town-square`); + + // # Hover over the channel header icon + cy.getPlaybooksAppBarIcon().trigger('mouseover'); + + // * Verify tooltip text + cy.findByRole('tooltip', {name: 'Playbooks'}).should('be.visible'); + }); + }); +}); diff --git a/e2e/cypress/tests/integration/playbooks/channels/broadcast_spec.js b/e2e/cypress/tests/integration/playbooks/channels/broadcast_spec.js new file mode 100644 index 0000000000..b744e29914 --- /dev/null +++ b/e2e/cypress/tests/integration/playbooks/channels/broadcast_spec.js @@ -0,0 +1,382 @@ +// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. + +// *************************************************************** +// - [#] indicates a test step (e.g. # Go to a page) +// - [*] indicates an assertion (e.g. * Check the title) +// *************************************************************** + +// Stage: @prod +// Group: @playbooks + +describe('channels > broadcast', () => { + let testTeam; + let testUser; + let testAdmin; + let testPublicChannel1; + let testPublicChannel2; + let testPrivateChannel1; + let testPrivateChannel2; + let publicBroadcastPlaybook; + let privateBroadcastPlaybook; + let allBroadcastPlaybook; + let rootDeletePlaybook; + + before(() => { + cy.apiInitSetup().then(({team, user}) => { + testTeam = team; + testUser = user; + + cy.apiCreateCustomAdmin().then(({sysadmin: adminUser}) => { + testAdmin = adminUser; + cy.apiAddUserToTeam(testTeam.id, adminUser.id); + cy.apiSaveJoinLeaveMessagesPreference(adminUser.id, false); + + // # Login as testUser + cy.apiLogin(testUser); + + // # Create a public channel + cy.apiCreateChannel( + testTeam.id, + 'public-channel', + 'Public Channel 1', + 'O', + ).then(({channel: publicChannel1}) => { + testPublicChannel1 = publicChannel1; + + // # Create a public channel + cy.apiCreateChannel( + testTeam.id, + 'public-channel', + 'Public Channel 2', + 'O', + ).then(({channel: publicChannel2}) => { + testPublicChannel2 = publicChannel2; + + // # Create a private channel + cy.apiCreateChannel( + testTeam.id, + 'private-channel', + 'Private Channel 1', + 'P', + ).then(({channel: privateChannel1}) => { + testPrivateChannel1 = privateChannel1; + + // # Create a private channel + cy.apiCreateChannel( + testTeam.id, + 'private-channel', + 'Private Channel 2', + 'P', + ).then(({channel: privateChannel2}) => { + testPrivateChannel2 = privateChannel2; + + // # Create a playbook that will broadcast to public channel1 + cy.apiCreateTestPlaybook({ + teamId: testTeam.id, + title: 'Playbook - public broadcast', + userId: testUser.id, + broadcastChannelIds: [testPublicChannel1.id], + broadcastEnabled: true, + }).then((playbook) => { + publicBroadcastPlaybook = playbook; + }); + + // # Create a playbook that will broadcast to private channel1 + cy.apiCreateTestPlaybook({ + teamId: testTeam.id, + title: 'Playbook - private broadcast', + userId: testUser.id, + broadcastChannelIds: [testPrivateChannel1.id], + broadcastEnabled: true, + }).then((playbook) => { + privateBroadcastPlaybook = playbook; + }); + + // # Create a playbook that will broadcast to all 4 channels + cy.apiCreateTestPlaybook({ + teamId: testTeam.id, + title: 'Playbook - public and private broadcast', + userId: testUser.id, + broadcastChannelIds: [testPublicChannel1.id, testPublicChannel2.id, testPrivateChannel1.id, testPrivateChannel2.id], + broadcastEnabled: true, + }).then((playbook) => { + allBroadcastPlaybook = playbook; + }); + + // # Create a playbook for testing deleting root posts + cy.apiCreateTestPlaybook({ + teamId: testTeam.id, + title: 'Playbook - test deleting root posts', + userId: testUser.id, + broadcastChannelIds: [testPublicChannel1.id, testPrivateChannel1.id], + broadcastEnabled: true, + otherMembers: [testAdmin.id], + invitedUserIds: [testAdmin.id], + }).then((playbook) => { + rootDeletePlaybook = playbook; + }); + + // # invite testAdmin to the channel they will need to be in to delete the post + cy.apiAddUserToChannel(testPublicChannel1.id, testAdmin.id); + cy.apiAddUserToChannel(testPrivateChannel1.id, testAdmin.id); + }); + }); + }); + }); + }); + }); + }); + + beforeEach(() => { + // # Login as testUser + cy.apiLogin(testUser); + + // # Size the viewport to show the RHS without covering posts. + cy.viewport('macbook-13'); + + // # Go to Town Square + cy.visit(`/${testTeam.name}/channels/town-square`); + }); + + it('to public channels', () => { + // # Create a new playbook run + const now = Date.now(); + const playbookRunName = `Playbook Run (${now})`; + const playbookRunChannelName = `playbook-run-${now}`; + cy.apiRunPlaybook({ + teamId: testTeam.id, + playbookId: publicBroadcastPlaybook.id, + playbookRunName, + ownerUserId: testUser.id, + }); + + // # Navigate directly to the application and the playbook run channel + cy.visit(`/${testTeam.name}/channels/${playbookRunChannelName}`); + + // # Update the playbook run's status + const updateMessage = 'Update - ' + now; + cy.updateStatus(updateMessage); + + // * Verify the posts + const initialMessage = playbookRunName; + verifyInitialAndStatusPostInBroadcast(testTeam, testPublicChannel1.name, playbookRunName, initialMessage, updateMessage); + }); + + it('does not broadcast when broadcast is disabled, even if broadcastChannelIds contain data', () => { + // # Create a brand new channel + cy.apiCreateChannel( + testTeam.id, + 'public-channel-do-not-broadcast', + 'Public Channel 1 - do not broadcast', + 'O', + ).then(({channel}) => { + // # Create a playbook with broadcast disabled, but with broadcastChannelIds containing channel1 + cy.apiCreateTestPlaybook({ + teamId: testTeam.id, + title: 'Playbook - disabled public broadcast', + userId: testUser.id, + broadcastChannelIds: [channel.id], + broadcastEnabled: false, + }).then((playbook) => { + // # Create a new playbook run with that playbook + const now = Date.now(); + const playbookRunName = `Playbook Run (${now})`; + const playbookRunChannelName = `playbook-run-${now}`; + cy.apiRunPlaybook({ + teamId: testTeam.id, + playbookId: playbook.id, + playbookRunName, + ownerUserId: testUser.id, + }); + + // # Navigate directly to the application and the playbook run channel + cy.visit(`/${testTeam.name}/channels/${playbookRunChannelName}`); + + // # Update the playbook run's status + const updateMessage = 'Update - ' + now; + cy.updateStatus(updateMessage); + + // # Navigate to the broadcast channel + cy.visit(`/${testTeam.name}/channels/${channel.name}`); + + // * Verify that the last post is the system post containing the join message, + // so no announcement nor update was posted + cy.getLastPostId().then((lastPostId) => { + cy.get(`#postMessageText_${lastPostId}`).contains('You joined the channel'); + }); + }); + }); + }); + + it('to private channels', () => { + // # Create a new playbook run + const now = Date.now(); + const playbookRunName = 'Playbook Run (' + now + ')'; + const playbookRunChannelName = 'playbook-run-' + now; + cy.apiRunPlaybook({ + teamId: testTeam.id, + playbookId: privateBroadcastPlaybook.id, + playbookRunName, + ownerUserId: testUser.id, + }); + + // # Navigate directly to the application and the playbook run channel + cy.visit(`/${testTeam.name}/channels/${playbookRunChannelName}`); + + // # Update the playbook run's status + const updateMessage = 'Update - ' + now; + cy.updateStatus(updateMessage); + + // * Verify the posts + const initialMessage = playbookRunName; + verifyInitialAndStatusPostInBroadcast(testTeam, testPrivateChannel1.name, playbookRunName, initialMessage, updateMessage); + }); + + it('to 4 public and private channels', () => { + // # Create a new playbook run + const now = Date.now(); + const playbookRunName = 'Playbook Run (' + now + ')'; + const playbookRunChannelName = 'playbook-run-' + now; + cy.apiRunPlaybook({ + teamId: testTeam.id, + playbookId: allBroadcastPlaybook.id, + playbookRunName, + ownerUserId: testUser.id, + }); + + // # Navigate directly to the application and the playbook run channel + cy.visit(`/${testTeam.name}/channels/${playbookRunChannelName}`); + + // # Update the playbook run's status + const updateMessage = 'Update - ' + now; + cy.updateStatus(updateMessage, 0); + + // * Verify the posts + const initialMessage = playbookRunName; + verifyInitialAndStatusPostInBroadcast(testTeam, testPublicChannel1.name, playbookRunName, initialMessage, updateMessage); + verifyInitialAndStatusPostInBroadcast(testTeam, testPrivateChannel1.name, playbookRunName, initialMessage, updateMessage); + verifyInitialAndStatusPostInBroadcast(testTeam, testPublicChannel2.name, playbookRunName, initialMessage, updateMessage); + verifyInitialAndStatusPostInBroadcast(testTeam, testPrivateChannel2.name, playbookRunName, initialMessage, updateMessage); + }); + + it('to 2 channels, delete the root post, update again', () => { + // # Create a new playbook run + const now = Date.now(); + const playbookRunName = 'Playbook Run (' + now + ')'; + const playbookRunChannelName = 'playbook-run-' + now; + cy.apiRunPlaybook({ + teamId: testTeam.id, + playbookId: rootDeletePlaybook.id, + playbookRunName, + ownerUserId: testUser.id, + }); + + // # Navigate directly to the application and the playbook run channel + cy.visit(`/${testTeam.name}/channels/${playbookRunChannelName}`); + + // # Update the playbook run's status + const updateMessage = 'Update - ' + now; + cy.updateStatus(updateMessage, 0); + + // * Verify the posts + const initialMessage = playbookRunName; + verifyInitialAndStatusPostInBroadcast(testTeam, testPublicChannel1.name, playbookRunName, initialMessage, updateMessage); + verifyInitialAndStatusPostInBroadcast(testTeam, testPrivateChannel1.name, playbookRunName, initialMessage, updateMessage); + + // # need to be admin to delete the bot's posts + cy.apiLogin(testAdmin); + + // # Delete both root posts + deleteLatestPostRoot(testTeam, testPublicChannel1.name); + deleteLatestPostRoot(testTeam, testPrivateChannel1.name); + + // # Log back in as testUser + cy.apiLogin(testUser); + + // # Make two more updates + // # Navigate directly to the application and the playbook run channel + cy.visit(`/${testTeam.name}/channels/${playbookRunChannelName}`); + + // # Update the playbook run's status twice + const updateMessage2 = updateMessage + ' - 2'; + cy.updateStatus(updateMessage2, 0); + const updateMessage3 = updateMessage + ' - 3'; + cy.updateStatus(updateMessage3, 0); + + // * Verify the posts + verifyInitialAndStatusPostInBroadcast(testTeam, testPublicChannel1.name, playbookRunName, updateMessage2, updateMessage3); + verifyInitialAndStatusPostInBroadcast(testTeam, testPrivateChannel1.name, playbookRunName, updateMessage2, updateMessage3); + }); +}); + +const verifyInitialAndStatusPostInBroadcast = (testTeam, channelName, runName, initialMessage, updateMessage) => { + cy.log(`Verifying initial and status post in broadcast (channel ${channelName}, run ${runName})`); + + // # Navigate to the broadcast channel + cy.visit(`/${testTeam.name}/channels/${channelName}`); + + // * Verify that the last post contains the expected header and the update message verbatim + cy.getLastPostId().then((lastPostId) => { + // # Open RHS comment menu + cy.clickPostCommentIcon(lastPostId); + + cy.get('#rhsContainer'). + should('exist'). + within(() => { + // * Thread should have two posts + cy.findAllByRole('listitem').should('have.length', 2); + + // * The first should be announcement + cy.findAllByRole('listitem').eq(0).contains(initialMessage); + + // * Latest post should be update + cy.get(`#rhsPost_${lastPostId}`).contains( + `posted an update for ${runName}`, + ); + cy.get(`#rhsPost_${lastPostId}`).contains('tasks checked'); + cy.get(`#rhsPost_${lastPostId}`).contains('participant'); + cy.get(`#rhsPost_${lastPostId}`).contains(updateMessage); + }); + }); +}; + +const deleteLatestPostRoot = (testTeam, channelName) => { + cy.log(`Deleting latest root post (channel ${channelName})`); + + // # Navigate to the channel + cy.visit(`/${testTeam.name}/channels/${channelName}`); + + cy.getLastPostId().then((lastPostId) => { + // # Open RHS comment menu + cy.clickPostCommentIcon(lastPostId); + + cy.get('#rhsContainer'). + should('exist'). + within(() => { + cy.findAllByRole('listitem').eq(0).then((root) => { + const rootId = root.attr('id').slice(8); + + // # Click root's post dot menu. + cy.clickPostDotMenu(rootId, 'RHS_ROOT'); + + // # Click delete button. + const id = `#delete_post_${rootId}`; + cy.get(id).click(); + }); + }); + + // * Check that confirmation dialog is open. + cy.get('#deletePostModal').should('be.visible'); + + // * Check that confirmation dialog contains correct text + cy.get('#deletePostModal'). + should('contain', 'Are you sure you want to delete this Post?'); + + // * Check that confirmation dialog shows that the post has one comment on it + cy.get('#deletePostModal').should('contain', 'This post has 1 comment on it.'); + + // # Confirm deletion. + cy.get('#deletePostModalButton').click(); + }); +}; diff --git a/e2e/cypress/tests/integration/playbooks/channels/channel_header_spec.js b/e2e/cypress/tests/integration/playbooks/channels/channel_header_spec.js new file mode 100644 index 0000000000..6b3d965eae --- /dev/null +++ b/e2e/cypress/tests/integration/playbooks/channels/channel_header_spec.js @@ -0,0 +1,125 @@ +// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. + +// *************************************************************** +// - [#] indicates a test step (e.g. # Go to a page) +// - [*] indicates an assertion (e.g. * Check the title) +// *************************************************************** + +// Stage: @prod +// Group: @playbooks + +import {onlyOn} from '@cypress/skip-test'; + +describe('channels > channel header', () => { + let testTeam; + let testUser; + let testPlaybook; + let testPlaybookRun; + let appBarEnabled; + + before(() => { + cy.apiInitSetup().then(({team, user}) => { + testTeam = team; + testUser = user; + + // # Login as testUser + cy.apiLogin(testUser); + + // # Create a playbook + cy.apiCreateTestPlaybook({ + teamId: testTeam.id, + title: 'Playbook', + userId: testUser.id, + }).then((playbook) => { + testPlaybook = playbook; + + // # Start a playbook run + cy.apiRunPlaybook({ + teamId: testTeam.id, + playbookId: testPlaybook.id, + playbookRunName: 'Playbook Run', + ownerUserId: testUser.id, + }).then((run) => { + testPlaybookRun = run; + }); + }); + + cy.apiGetConfig(true).then(({config}) => { + appBarEnabled = config.EnableAppBar === 'true'; + }); + }); + }); + + beforeEach(() => { + // # Size the viewport to show the RHS without covering posts. + cy.viewport('macbook-13'); + + // # Login as testUser + cy.apiLogin(testUser); + }); + + describe('App Bar enabled', () => { + it('webapp should hide the Playbook channel header button', () => { + onlyOn(appBarEnabled); + + // # Navigate directly to a non-playbook run channel + cy.visit(`/${testTeam.name}/channels/town-square`); + + // * Verify channel header button is not showing + cy.get('#channel-header').within(() => { + cy.get('#incidentIcon').should('not.exist'); + }); + }); + }); + + describe('App Bar disabled', () => { + it('webapp should show the Playbook channel header button', () => { + onlyOn(!appBarEnabled); + + // # Navigate directly to a non-playbook run channel + cy.visit(`/${testTeam.name}/channels/town-square`); + + // * Verify channel header button is showing + cy.get('#channel-header').within(() => { + cy.get('#incidentIcon').should('exist'); + }); + }); + + it('tooltip text should show "Playbooks" for Playbook channel header button', () => { + onlyOn(!appBarEnabled); + + // # Navigate directly to a non-playbook run channel + cy.visit(`/${testTeam.name}/channels/town-square`); + + // # Hover over the channel header icon + cy.get('#channel-header').within(() => { + cy.get('#incidentIcon').trigger('mouseover'); + }); + + // * Verify tooltip text + cy.get('#pluginTooltip').contains('Playbooks'); + }); + }); + + describe('description text', () => { + it('should contain a link to the playbook', () => { + // # Navigate directly to a playbook run channel + cy.visit(`/${testTeam.name}/channels/playbook-run`); + + // * Verify link to playbook + cy.get('.header-description__text').findByText('Playbook').should('have.attr', 'href').then((href) => { + expect(href).to.equals(`/playbooks/playbooks/${testPlaybook.id}`); + }); + }); + it('should contain a link to the overview page', () => { + // # Navigate directly to a playbook run channel + cy.visit(`/${testTeam.name}/channels/playbook-run`); + + // * Verify link to overview page + cy.get('.header-description__text').findByText('the overview page').should('have.attr', 'href').then((href) => { + expect(href).to.equals(`/playbooks/runs/${testPlaybookRun.id}`); + }); + }); + }); +}); diff --git a/e2e/cypress/tests/integration/playbooks/channels/general_actions_spec.js b/e2e/cypress/tests/integration/playbooks/channels/general_actions_spec.js new file mode 100644 index 0000000000..531bc1ce2e --- /dev/null +++ b/e2e/cypress/tests/integration/playbooks/channels/general_actions_spec.js @@ -0,0 +1,367 @@ +// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. + +// *************************************************************** +// - [#] indicates a test step (e.g. # Go to a page) +// - [*] indicates an assertion (e.g. * Check the title) +// *************************************************************** + +// Stage: @prod +// Group: @playbooks +import * as TIMEOUTS from '../../../fixtures/timeouts'; + +describe('channels > general actions', () => { + let testTeam; + let testSysadmin; + let testUser; + let testChannel; + + beforeEach(() => { + cy.apiAdminLogin(); + + cy.apiInitSetup({promoteNewUserAsAdmin: true}).then(({team, user}) => { + testTeam = team; + testSysadmin = user; + + cy.apiCreateUser().then((resp) => { + testUser = resp.user; + cy.apiAddUserToTeam(team.id, resp.user.id); + + cy.apiLogin(testUser); + + // TODO: Make this work with CRT enabled. + cy.apiSaveCRTPreference(testUser.id, 'off'); + }); + + cy.apiLogin(testSysadmin); + + // TODO: Make this work with CRT enabled. + cy.apiSaveCRTPreference(testSysadmin.id, 'off'); + + cy.apiCreateChannel( + testTeam.id, + 'action-channel', + 'Action Channel', + 'O', + ).then(({channel}) => { + testChannel = channel; + }); + }); + }); + + describe('on join trigger', () => { + it('channel categorization can be enabled and works', () => { + // # Go to the test channel + cy.visit(`/${testTeam.name}/channels/${testChannel.name}`); + + // # Open Channel Header and the Channel Actions modal + cy.get('#channelHeaderTitle').click(); + cy.findByText('Channel Actions').click(); + + // # Enable the categorization action and set the name + cy.contains('sidebar category').click(); + cy.contains('Enter category name').click().type('example category{enter}'); + + cy.get('#channel-actions-modal').within(() => { + // # Save action + cy.findByRole('button', {name: /save/i}).click(); + }); + + // # Switch to another user and reload + // # This drops them into the same channel + cy.apiLogin(testUser); + cy.reload(); + cy.wait(TIMEOUTS.TEN_SEC); + + // * Verify the channel category + channel exists + cy.contains('.SidebarChannelGroup', 'example category', {matchCase: false}). + should('exist'). + within(() => { + cy.contains(testChannel.display_name).should('exist'); + }); + }); + + it('welcome message can be enabled and is shown to a joining user', () => { + // # Go to the test channel + cy.visit(`/${testTeam.name}/channels/${testChannel.name}`); + + // # Open Channel Header and the Channel Actions modal + cy.get('#channelHeaderTitle').click(); + cy.findByText('Channel Actions').click(); + + // # Toggle on and set the welcome message + cy.contains('temporary welcome message').click(); + cy.findByTestId('channel-actions-modal_welcome-msg'). + type('test ephemeral welcome message'); + + cy.get('#channel-actions-modal').within(() => { + // # Save action + cy.findByRole('button', {name: /save/i}).click(); + }); + + // # Switch to another user and reload + // # This drops them into the same channel + cy.apiLogin(testUser); + cy.reload(); + cy.wait(TIMEOUTS.FIVE_SEC); + + // * Verify the welcome message is shown + cy.verifyEphemeralMessage('test ephemeral welcome message'); + }); + }); + + describe('keyword trigger', () => { + it('prompt to run playbook can be enabled and works', () => { + // # Create a public playbook + cy.apiCreatePlaybook({ + teamId: testTeam.id, + title: 'Public Playbook', + memberIDs: [], + }); + + // # Login as the non-sysadmin user first + // # to do the channel & action creation. + // # In the 'Select a playbook' dropdown later in this test, + // # sysadmin users could potentially see many other playbooks + // # besides the one created directly above. `testUser` will not. + cy.apiLogin(testUser); + cy.apiCreateChannel( + testTeam.id, + 'action-channel', + 'Action Channel', + 'O', + ).then(({channel}) => { + // # Go to the test channel + cy.visit(`/${testTeam.name}/channels/${channel.name}`); + + // # Open Channel Header and the Channel Actions modal + cy.get('#channelHeaderTitle').click(); + cy.findByText('Channel Actions').click(); + + // # Set a keyword, enable the playbook trigger, + // # and select the Playbook to run + cy.contains('Type a keyword or phrase, then press Enter on your keyboard').click().type('red alert{enter}'); + cy.contains('Prompt to run a playbook').click(); + cy.contains('Select a playbook').click(); + cy.findByText('Public Playbook').click(); + + cy.get('#channel-actions-modal').within(() => { + // # Save action + cy.findByRole('button', {name: /save/i}).click(); + }); + + // # Post the trigger phrase + cy.uiPostMessageQuickly('error detected red alert!'); + + // * Verify that the bot posts the expected prompt + // # Open the playbook run modal + cy.getLastPostId().then((postId) => { + cy.get(`#post_${postId}`).within(() => { + cy.contains('trigger for the Public Playbook').should('exist'); + cy.contains('Yes, run playbook').should('exist').click(); + }); + }); + + // # Enter a name and start the run + cy.findByTestId('playbookRunNameinput').type('run from trigger'); + cy.findByRole('button', {name: /start run/i}).click(); + + // * Verify text from the run channel description + cy.contains('start of the run').should('exist'); + }); + }); + + it('deletes the post and ignores the thread when clicking on No, ignore thread', () => { + // # Create a public playbook + cy.apiCreatePlaybook({ + teamId: testTeam.id, + title: 'Public Playbook', + memberIDs: [], + }); + + // # Login as the non-sysadmin user first + // # to do the channel & action creation. + // # In the 'Select a playbook' dropdown later in this test, + // # sysadmin users could potentially see many other playbooks + // # besides the one created directly above. `testUser` will not. + cy.apiLogin(testUser); + cy.apiCreateChannel( + testTeam.id, + 'action-channel', + 'Action Channel', + 'O', + ).then(({channel}) => { + // # Go to the test channel + cy.visit(`/${testTeam.name}/channels/${channel.name}`); + + // # Open Channel Header and the Channel Actions modal + cy.get('#channelHeaderTitle').click(); + cy.findByText('Channel Actions').click(); + + // # Set a keyword, enable the playbook trigger, + // # and select the Playbook to run + cy.contains('Type a keyword or phrase, then press Enter on your keyboard').click().type('red alert{enter}'); + cy.contains('Prompt to run a playbook').click(); + cy.contains('Select a playbook').click(); + cy.findByText('Public Playbook').click(); + + cy.get('#channel-actions-modal').within(() => { + // # Save action + cy.findByRole('button', {name: /save/i}).click(); + }); + + // # Post the trigger phrase + cy.uiPostMessageQuickly('error detected red alert!'); + + // * Verify that the bot posts the expected prompt + // # Click on No, ignore thread + cy.getLastPostId().then((postId) => { + cy.get(`#post_${postId}`).within(() => { + cy.contains('trigger for the Public Playbook').should('exist'); + cy.contains('No, ignore thread').should('exist').click(); + }); + }); + + // # Reload the channel + cy.visit(`/${testTeam.name}/channels/${channel.name}`); + + // * Verify that the prompt post is no longer there + cy.getLastPostId().then((postId) => { + cy.get(`#post_${postId}`).within(() => { + cy.contains('No, ignore thread').should('not.exist'); + }); + }); + + // # Reply to the last thread with the trigger phrase + cy.getLastPostId().then((postId) => { + cy.clickPostCommentIcon(postId); + cy.postMessageReplyInRHS('error detected red alert!'); + }); + + // * Verify that the bot did not post the prompt + cy.getLastPostId().then((postId) => { + cy.get(`#post_${postId}`).within(() => { + cy.contains('trigger for the Public Playbook').should('not.exist'); + }); + }); + }); + }); + + it('disabled triggers do not run even with a keyword set', () => { + // # Create a public playbook + cy.apiCreatePlaybook({ + teamId: testTeam.id, + title: 'Public Playbook', + memberIDs: [], + }); + + // # Login as the non-sysadmin user first + // # to do the channel & action creation. + // # In the 'Select a playbook' dropdown later in this test, + // # sysadmin users could potentially see many other playbooks + // # besides the one created directly above. `testUser` will not. + cy.apiLogin(testUser); + cy.apiCreateChannel( + testTeam.id, + 'action-channel', + 'Action Channel', + 'O', + ).then(({channel}) => { + // # Go to the test channel + cy.visit(`/${testTeam.name}/channels/${channel.name}`); + + // # Open Channel Header and the Channel Actions modal + cy.get('#channelHeaderTitle').click(); + cy.findByText('Channel Actions').click(); + + // # Set a keyword, enable the playbook trigger, + // # and select the playbook to run. Turn the + // # trigger back off but leave the keyword set. + cy.contains('Type a keyword or phrase, then press Enter on your keyboard').click().type('red alert{enter}'); + cy.contains('Prompt to run a playbook').click(); + cy.contains('Select a playbook').click(); + cy.findByText('Public Playbook').click(); + cy.contains('Prompt to run a playbook').click(); + + cy.get('#channel-actions-modal').within(() => { + // # Save action + cy.findByRole('button', {name: /save/i}).click(); + }); + + // # Post the trigger phrase + cy.uiPostMessageQuickly('error detected red alert!'); + + // * Verify that the bot _has not_ posted the expected prompt + cy.getLastPostId().then((postId) => { + cy.get(`#post_${postId}`).within(() => { + cy.contains('trigger for the Public Playbook').should('not.exist'); + cy.contains('Yes, run playbook').should('not.exist'); + }); + }); + }); + }); + }); + + it('action settings are disabled for non-channel admin', () => { + // # Login as non-channel admin + cy.apiLogin(testUser); + + // # Go to the test channel + cy.visit(`/${testTeam.name}/channels/${testChannel.name}`); + + // # Open Channel Header and the Channel Actions modal + cy.get('#channelHeaderTitle').click(); + cy.findByText('Channel Actions').click(); + + // * Verify the toggles are disabled + cy.findByRole('dialog', {name: /channel actions/i}).within(() => { + cy.get('input').should('be.disabled'); + }); + }); + + it('action settings are reset to the default when switching to a channel with no actions configured', () => { + // # Create an additional channel + const name = 'New channel ' + Date.now(); + cy.apiCreateChannel( + testTeam.id, + 'new-channel', + name, + 'O', + ).then(({channel}) => { + // # Visit the first channel + cy.visit(`/${testTeam.name}/channels/${testChannel.name}`); + + // # Open Channel Header and the Channel Actions modal + cy.get('#channelHeaderTitle').click(); + cy.findByText('Channel Actions').click(); + + // # Enable the categorization action and set the name + const categoryName = 'example category ' + Date.now(); + cy.contains('sidebar category').click(); + cy.contains('Enter category name').click().type(categoryName + '{enter}'); + + cy.get('#channel-actions-modal').within(() => { + // # Save action + cy.findByRole('button', {name: /save/i}).click(); + }); + + // # wait to avoid MM-45969 + cy.wait(5000); + + // # Switch to the additional channel + cy.get('#sidebarItem_' + channel.name).click(); + + // # Open Channel Header and the Channel Actions modal + cy.get('#channelHeaderTitle').click(); + cy.findByText('Channel Actions').click(); + + // * Verify that the categorization action is disabled + cy.findByText('Add the channel to a sidebar category for the user').parent().within(() => { + cy.get('input').should('not.be.checked'); + }); + + // * Verify that the category name is not there + cy.findByText(categoryName).should('not.exist'); + }); + }); +}); diff --git a/e2e/cypress/tests/integration/playbooks/channels/playbook_run_actions.js b/e2e/cypress/tests/integration/playbooks/channels/playbook_run_actions.js new file mode 100644 index 0000000000..5676f6381f --- /dev/null +++ b/e2e/cypress/tests/integration/playbooks/channels/playbook_run_actions.js @@ -0,0 +1,644 @@ +// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. + +// *************************************************************** +// - [#] indicates a test step (e.g. # Go to a page) +// - [*] indicates an assertion (e.g. * Check the title) +// *************************************************************** + +// Stage: @prod +// Group: @playbooks + +describe('channels > actions', () => { + let testTeam; + let testSysadmin; + let testUser; + let testPublicChannel; + const testUsers = []; + + before(() => { + cy.apiInitSetup({userPrefix: 'u'}).then(({team, user}) => { + testTeam = team; + testUser = user; + + cy.apiCreateCustomAdmin().then(({sysadmin}) => { + testSysadmin = sysadmin; + }); + + // # Create extra test users in this team + cy.apiCreateUser({prefix: 'u'}).then((payload) => { + cy.apiAddUserToTeam(testTeam.id, payload.user.id); + testUsers.push(payload.user); + }); + + cy.apiCreateUser({prefix: 'u'}).then((payload) => { + cy.apiAddUserToTeam(testTeam.id, payload.user.id); + testUsers.push(payload.user); + }); + + // # Create a public channel + cy.apiCreateChannel( + testTeam.id, + 'public-channel', + 'Public Channel', + 'O', + ).then(({channel}) => { + testPublicChannel = channel; + cy.apiAddUserToChannel(channel.id, testUser.id); + }); + }); + }); + + beforeEach(() => { + // # Login as testUser + cy.apiLogin(testUser); + + // # Size the viewport to show the RHS without covering posts. + cy.viewport('macbook-13'); + + // # Go to Town Square + cy.visit(`/${testTeam.name}/channels/town-square`); + }); + + describe(('when a playbook run starts'), () => { + describe('invite members setting', () => { + it('with no invited users and setting disabled', () => { + const playbookName = 'Playbook (' + Date.now() + ')'; + let playbookId; + + // # Create a playbook with the invite users disabled and no invited users + cy.apiCreatePlaybook({ + teamId: testTeam.id, + title: playbookName, + createPublicPlaybookRun: true, + memberIDs: [testUser.id], + invitedUserIds: [], + inviteUsersEnabled: false, + }).then((playbook) => { + playbookId = playbook.id; + }); + + // # Create a new playbook run with that playbook + const now = Date.now(); + const playbookRunName = `Run (${now})`; + const playbookRunChannelName = `run-${now}`; + cy.apiRunPlaybook({ + teamId: testTeam.id, + playbookId, + playbookRunName, + ownerUserId: testUser.id, + }); + + // # Navigate to the playbook run channel + cy.visit(`/${testTeam.name}/channels/${playbookRunChannelName}`); + + // * Verify that no users were invited + cy.getFirstPostId().then((id) => { + cy.get(`#postMessageText_${id}`). + contains('You were added to the channel by @playbooks.'). + should('not.contain', 'joined the channel'); + }); + }); + + it('with invited users and setting enabled', () => { + const playbookName = 'Playbook (' + Date.now() + ')'; + + // # Create a playbook with a couple of invited users and the setting enabled, and a playbook run with it + cy.apiCreatePlaybook({ + teamId: testTeam.id, + title: playbookName, + createPublicPlaybookRun: true, + memberIDs: [testUser.id], + invitedUserIds: [testUsers[0].id, testUsers[1].id], + inviteUsersEnabled: true, + }).then((playbook) => { + // # Create a new playbook run with that playbook + const now = Date.now(); + const playbookRunName = `Run (${now})`; + const playbookRunChannelName = `run-${now}`; + + cy.apiRunPlaybook({ + teamId: testTeam.id, + playbookId: playbook.id, + playbookRunName, + ownerUserId: testUser.id, + }); + + // # Navigate to the playbook run channel + cy.visit(`/${testTeam.name}/channels/${playbookRunChannelName}`); + + // * Verify that the users were invited + cy.getFirstPostId().then((id) => { + cy.get(`#postMessageText_${id}`).within(() => { + cy.findByText('2 others').click(); + }); + + cy.get(`#postMessageText_${id}`).contains(`@${testUsers[0].username}`); + cy.get(`#postMessageText_${id}`).contains(`@${testUsers[1].username}`); + cy.get(`#postMessageText_${id}`).contains('added to the channel by @playbooks.'); + }); + }); + }); + + it('with invited users and setting disabled', () => { + const playbookName = 'Playbook (' + Date.now() + ')'; + + // # Create a playbook with a couple of invited users and the setting enabled, and a playbook run with it + cy.apiCreatePlaybook({ + teamId: testTeam.id, + title: playbookName, + createPublicPlaybookRun: true, + memberIDs: [testUser.id], + invitedUserIds: [testUsers[0].id, testUsers[1].id], + inviteUsersEnabled: false, + }).then((playbook) => { + // # Create a new playbook run with that playbook + const now = Date.now(); + const playbookRunName = `Run (${now})`; + const playbookRunChannelName = `run-${now}`; + + cy.apiRunPlaybook({ + teamId: testTeam.id, + playbookId: playbook.id, + playbookRunName, + ownerUserId: testUser.id, + }); + + // # Navigate to the playbook run channel + cy.visit(`/${testTeam.name}/channels/${playbookRunChannelName}`); + + // * Verify that no users were invited + cy.getFirstPostId().then((id) => { + cy.get(`#postMessageText_${id}`). + contains('You were added to the channel by @playbooks.'). + should('not.contain', 'joined the channel'); + }); + }); + }); + + it('with non-existent users', () => { + let userToRemove; + let playbook; + + // # Create a playbook with a user that is later removed from the team + cy.apiLogin(testSysadmin).then(() => { + cy.apiCreateUser().then((result) => { + userToRemove = result.user; + cy.apiAddUserToTeam(testTeam.id, userToRemove.id); + + const playbookName = 'Playbook (' + Date.now() + ')'; + + // # Create a playbook with the user that will be removed from the team. + cy.apiCreatePlaybook({ + teamId: testTeam.id, + title: playbookName, + createPublicPlaybookRun: true, + memberIDs: [testUser.id, testSysadmin.id], + invitedUserIds: [userToRemove.id], + inviteUsersEnabled: true, + }).then((res) => { + playbook = res; + }); + + // # Remove user from the team + cy.apiDeleteUserFromTeam(testTeam.id, userToRemove.id); + }); + }).then(() => { + cy.apiLogin(testUser); + + // # Create a new playbook run with the playbook. + const now = Date.now(); + const playbookRunName = `Run (${now})`; + const playbookRunChannelName = `run-${now}`; + + cy.apiRunPlaybook({ + teamId: testTeam.id, + playbookId: playbook.id, + playbookRunName, + ownerUserId: testUser.id, + }); + + // # Navigate to the playbook run channel + cy.visit(`/${testTeam.name}/channels/${playbookRunChannelName}`); + + // * Verify that there is an error message from the bot + cy.getNthPostId(1).then((id) => { + cy.get(`#postMessageText_${id}`). + contains(`Failed to invite the following users: @${userToRemove.username}`); + }); + }); + }); + }); + + describe('default owner setting', () => { + it('defaults to the creator when no owner is specified', () => { + const playbookName = 'Playbook (' + Date.now() + ')'; + let playbookId; + + // # Create a playbook with the default owner setting set to false + // and no owner specified + cy.apiCreatePlaybook({ + teamId: testTeam.id, + title: playbookName, + createPublicPlaybookRun: true, + memberIDs: [testUser.id], + defaultOwnerId: '', + defaultOwnerEnabled: false, + }).then((playbook) => { + playbookId = playbook.id; + }); + + // # Create a new playbook run with that playbook + const now = Date.now(); + const playbookRunName = `Run (${now})`; + const playbookRunChannelName = `run-${now}`; + cy.apiRunPlaybook({ + teamId: testTeam.id, + playbookId, + playbookRunName, + ownerUserId: testUser.id, + }); + + // # Navigate to the playbook run channel + cy.visit(`/${testTeam.name}/channels/${playbookRunChannelName}`); + + // * Verify that the RHS shows the owner being the creator + cy.get('#rhsContainer').within(() => { + cy.findByText('Owner').parent().within(() => { + cy.findByText(`@${testUser.username}`); + }); + }); + }); + + it('defaults to the creator when no owner is specified, even if the setting is enabled', () => { + const playbookName = 'Playbook (' + Date.now() + ')'; + let playbookId; + + // # Create a playbook with the default owner setting set to false + // and no owner specified + cy.apiCreatePlaybook({ + teamId: testTeam.id, + title: playbookName, + createPublicPlaybookRun: true, + memberIDs: [testUser.id], + defaultOwnerId: '', + defaultOwnerEnabled: true, + }).then((playbook) => { + playbookId = playbook.id; + }); + + // # Create a new playbook run with that playbook + const now = Date.now(); + const playbookRunName = `Run (${now})`; + const playbookRunChannelName = `run-${now}`; + cy.apiRunPlaybook({ + teamId: testTeam.id, + playbookId, + playbookRunName, + ownerUserId: testUser.id, + }); + + // # Navigate to the playbook run channel + cy.visit(`/${testTeam.name}/channels/${playbookRunChannelName}`); + + // * Verify that the RHS shows the owner being the creator + cy.get('#rhsContainer').within(() => { + cy.findByText('Owner').parent().within(() => { + cy.findByText(`@${testUser.username}`); + }); + }); + }); + + it('assigns the owner when they are part of the invited members list', () => { + const playbookName = 'Playbook (' + Date.now() + ')'; + + // # Create a playbook with the owner being part of the invited users + cy.apiCreatePlaybook({ + teamId: testTeam.id, + title: playbookName, + createPublicPlaybookRun: true, + memberIDs: [testUser.id], + invitedUserIds: [testUsers[0].id], + inviteUsersEnabled: true, + defaultOwnerId: testUsers[0].id, + defaultOwnerEnabled: true, + }).then((playbook) => { + // # Create a new playbook run with that playbook + const now = Date.now(); + const playbookRunName = `Run (${now})`; + const playbookRunChannelName = `run-${now}`; + + cy.apiRunPlaybook({ + teamId: testTeam.id, + playbookId: playbook.id, + playbookRunName, + ownerUserId: testUser.id, + }); + + // # Navigate to the playbook run channel + cy.visit(`/${testTeam.name}/channels/${playbookRunChannelName}`); + + // * Verify that the RHS shows the owner being the invited user + cy.get('#rhsContainer').within(() => { + cy.findByText('Owner').parent().within(() => { + cy.findByText(`@${testUsers[0].username}`); + }); + }); + }); + }); + + it('assigns the owner even if they are not invited', () => { + const playbookName = 'Playbook (' + Date.now() + ')'; + + // # Create a playbook with the owner being part of the invited users + cy.apiCreatePlaybook({ + teamId: testTeam.id, + title: playbookName, + createPublicPlaybookRun: true, + memberIDs: [testUser.id], + invitedUserIds: [], + inviteUsersEnabled: false, + defaultOwnerId: testUsers[0].id, + defaultOwnerEnabled: true, + }).then((playbook) => { + // # Create a new playbook run with that playbook + const now = Date.now(); + const playbookRunName = `Run (${now})`; + const playbookRunChannelName = `run-${now}`; + + cy.apiRunPlaybook({ + teamId: testTeam.id, + playbookId: playbook.id, + playbookRunName, + ownerUserId: testUser.id, + }); + + // # Navigate to the playbook run channel + cy.visit(`/${testTeam.name}/channels/${playbookRunChannelName}`); + + // * Verify that the RHS shows the owner being the invited user + cy.get('#rhsContainer').within(() => { + cy.findByText('Owner').parent().within(() => { + cy.findByText(`@${testUsers[0].username}`); + }); + }); + }); + }); + + it('assigns the owner when they and the creator are the same', () => { + const playbookName = 'Playbook (' + Date.now() + ')'; + let playbookId; + + // # Create a playbook with the default owner setting set to false + // and no owner specified + cy.apiCreatePlaybook({ + teamId: testTeam.id, + title: playbookName, + createPublicPlaybookRun: true, + memberIDs: [testUser.id], + defaultOwnerId: testUser.id, + defaultOwnerEnabled: true, + }).then((playbook) => { + playbookId = playbook.id; + }); + + // # Create a new playbook run with that playbook + const now = Date.now(); + const playbookRunName = `Run (${now})`; + const playbookRunChannelName = `run-${now}`; + cy.apiRunPlaybook({ + teamId: testTeam.id, + playbookId, + playbookRunName, + ownerUserId: testUser.id, + }); + + // # Navigate to the playbook run channel + cy.visit(`/${testTeam.name}/channels/${playbookRunChannelName}`); + + // * Verify that the RHS shows the owner being the creator + cy.get('#rhsContainer').within(() => { + cy.findByText('Owner').parent().within(() => { + cy.findByText(`@${testUser.username}`); + }); + }); + }); + }); + + describe('broadcast channel setting', () => { + it('with channel configured and setting enabled', () => { + const playbookName = 'Playbook (' + Date.now() + ')'; + + // # Create a playbook with a couple of invited users and the setting enabled, and a playbook run with it + cy.apiCreatePlaybook({ + teamId: testTeam.id, + title: playbookName, + createPublicPlaybookRun: true, + memberIDs: [testUser.id], + broadcastChannelIds: [testPublicChannel.id], + broadcastEnabled: true, + }).then((playbook) => { + // # Create a new playbook run with that playbook + const now = Date.now(); + const playbookRunName = `Run (${now})`; + const playbookRunChannelName = `run-${now}`; + + cy.apiRunPlaybook({ + teamId: testTeam.id, + playbookId: playbook.id, + playbookRunName, + ownerUserId: testUser.id, + }); + + // # Navigate to the playbook run channel. + cy.visit(`/${testTeam.name}/channels/${playbookRunChannelName}`); + + // * Verify that the channel is created and that the first post exists. + cy.getFirstPostId().then((id) => { + cy.get(`#postMessageText_${id}`). + contains('You were added to the channel by @playbooks.'). + should('not.contain', 'joined the channel'); + }); + + // # Navigate to the broadcast channel + cy.visit(`/${testTeam.name}/channels/${testPublicChannel.name}`); + + cy.getLastPostId().then((lastPostId) => { + cy.get(`#postMessageText_${lastPostId}`).contains(`${playbookRunName}`); + cy.get(`#postMessageText_${lastPostId}`).contains(`@${testUser.username} ran the ${playbookName} playbook.`); + }); + }); + }); + + it('with channel configured and setting disabled', () => { + const playbookName = 'Playbook (' + Date.now() + ')'; + + // # Create a playbook with a couple of invited users and the setting enabled, and a playbook run with it + cy.apiCreatePlaybook({ + teamId: testTeam.id, + title: playbookName, + createPublicPlaybookRun: true, + memberIDs: [testUser.id], + broadcastChannelIds: [testPublicChannel.id], + broadcastEnabled: false, + }).then((playbook) => { + // # Create a new playbook run with that playbook + const now = Date.now(); + const playbookRunName = `Run (${now})`; + const playbookRunChannelName = `run-${now}`; + + cy.apiRunPlaybook({ + teamId: testTeam.id, + playbookId: playbook.id, + playbookRunName, + ownerUserId: testUser.id, + }); + + // # Navigate to the playbook run channel + cy.visit(`/${testTeam.name}/channels/${playbookRunChannelName}`); + + // * Verify that the channel is created and that the first post exists. + cy.getFirstPostId().then((id) => { + cy.get(`#postMessageText_${id}`). + contains('You were added to the channel by @playbooks.'). + should('not.contain', 'joined the channel'); + }); + + // # Navigate to the broadcast channel + cy.visit(`/${testTeam.name}/channels/${testPublicChannel.name}`); + + cy.getLastPostId().then((lastPostId) => { + cy.get(`#postMessageText_${lastPostId}`).should('not.contain', `New Run: ~${playbookRunName}`); + }); + }); + }); + + it('with non-existent channel', () => { + let playbookId; + + // # Create a playbook with a channel that is later deleted + cy.apiLogin(testSysadmin).then(() => { + const channelDisplayName = String('Channel to delete ' + Date.now()); + const channelName = channelDisplayName.replace(/ /g, '-').toLowerCase(); + cy.apiCreateChannel(testTeam.id, channelName, channelDisplayName).then(({channel}) => { + // # Create a playbook with the channel to be deleted as the announcement channel + cy.apiCreatePlaybook({ + teamId: testTeam.id, + title: 'Playbook (' + Date.now() + ')', + createPublicPlaybookRun: true, + memberIDs: [testUser.id, testSysadmin.id], + broadcastChannelIds: [channel.id], + broadcastEnabled: true, + }).then((playbook) => { + playbookId = playbook.id; + }); + + // # Delete channel + cy.apiDeleteChannel(channel.id); + }); + }).then(() => { + cy.apiLogin(testUser); + + // # Create a new playbook run with the playbook. + const now = Date.now(); + const playbookRunName = `Run (${now})`; + const playbookRunChannelName = `run-${now}`; + + cy.apiRunPlaybook({ + teamId: testTeam.id, + playbookId, + playbookRunName, + ownerUserId: testUser.id, + }); + + // # Navigate to the playbook run channel + cy.visit(`/${testTeam.name}/channels/${playbookRunChannelName}`); + + // * Verify that there is an error message from the bot + cy.getLastPostId().then((id) => { + cy.get(`#postMessageText_${id}`). + contains('Failed to broadcast run creation to the configured channel.'); + }); + }); + }); + }); + + describe('creation webhook setting', () => { + it('with webhook correctly configured and setting enabled', () => { + const playbookName = 'Playbook (' + Date.now() + ')'; + + // # Create a playbook with a correct webhook and the setting enabled + cy.apiCreatePlaybook({ + teamId: testTeam.id, + title: playbookName, + createPublicPlaybookRun: true, + memberIDs: [testUser.id], + webhookOnCreationURLs: ['https://httpbin.org/post'], + webhookOnCreationEnabled: true, + }).then((playbook) => { + // # Create a new playbook run with that playbook + const now = Date.now(); + const playbookRunName = `Run (${now})`; + const playbookRunChannelName = `run-${now}`; + + cy.apiRunPlaybook({ + teamId: testTeam.id, + playbookId: playbook.id, + playbookRunName, + ownerUserId: testUser.id, + description: 'Playbook run description.', + }); + + // # Navigate to the playbook run channel + cy.visit(`/${testTeam.name}/channels/${playbookRunChannelName}`); + + // * Verify that the bot has not posted a message informing of the failure to send the webhook + cy.getLastPostId().then((lastPostId) => { + cy.get(`#postMessageText_${lastPostId}`). + should('not.contain', 'Playbook run creation announcement through the outgoing webhook failed. Contact your System Admin for more information.'); + }); + }); + }); + }); + }); + + describe('when a playbook run is finished', () => { + it('retrospective is disabled', () => { + const playbookName = 'Playbook (' + Date.now() + ')'; + + // # Create a new playbook run with that playbook + const now = Date.now(); + const playbookRunName = `Run (${now})`; + const playbookRunChannelName = `run-${now}`; + + // # Create a playbook with the disabled retrospective functionality + cy.apiCreatePlaybook({ + teamId: testTeam.id, + title: playbookName, + createPublicPlaybookRun: true, + memberIDs: [testUser.id], + retrospectiveEnabled: false, + }).then((playbook) => { + // # Run playbook + cy.apiRunPlaybook({ + teamId: testTeam.id, + playbookId: playbook.id, + playbookRunName, + ownerUserId: testUser.id, + }); + }).then((playbookRun) => { + // # End the playbook run + cy.apiFinishRun(playbookRun.id); + }); + + // # Navigate to the playbook run channel + cy.visit(`/${testTeam.name}/channels/${playbookRunChannelName}`); + + // * Verify that playbook run finished message was posted + cy.findAllByTestId('postView').contains(`marked ${playbookName} as finished`); + + // * Verify that retrospective dialog was not posted + cy.findAllByTestId('retrospective-reminder').should('not.exist'); + }); + }); +}); diff --git a/e2e/cypress/tests/integration/playbooks/channels/post_type_components_spec.js b/e2e/cypress/tests/integration/playbooks/channels/post_type_components_spec.js new file mode 100644 index 0000000000..7a8873ffc5 --- /dev/null +++ b/e2e/cypress/tests/integration/playbooks/channels/post_type_components_spec.js @@ -0,0 +1,173 @@ +// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. + +// *************************************************************** +// - [#] indicates a test step (e.g. # Go to a page) +// - [*] indicates an assertion (e.g. * Check the title) +// *************************************************************** + +// Stage: @prod +// Group: @playbooks + +describe('channels > post type components', () => { + let testTeam; + let testUser; + let testChannel; + let testPlaybookRun; + + beforeEach(() => { + cy.apiAdminLogin(); + + cy.apiInitSetup({loginAfter: true}).then(({team, user}) => { + testTeam = team; + testUser = user; + + // # Create a public playbook + cy.apiCreatePlaybook({ + teamId: testTeam.id, + title: 'Playbook', + memberIDs: [], + createPublicPlaybookRun: true, + }).then((playbook) => { + cy.apiRunPlaybook({ + teamId: testTeam.id, + playbookId: playbook.id, + playbookRunName: 'Test Run', + ownerUserId: testUser.id, + }).then((playbookRun) => { + testPlaybookRun = playbookRun; + }); + }); + + cy.apiCreateChannel( + testTeam.id, + 'other-channel', + 'Other Channel', + 'O', + ).then(({channel}) => { + testChannel = channel; + }); + }); + }); + + describe('update post (custom_run_update)', () => { + it('displays in run channel', () => { + // # Go to the playbook run channel + cy.visit(`/${testTeam.name}/channels/test-run`); + + // # intercepts telemetry + cy.interceptTelemetry(); + + // # Post a status update + cy.apiUpdateStatus({ + playbookRunId: testPlaybookRun.id, + message: 'status update', + reminder: 60, + }); + + // Grab the post id + cy.getLastPostId().then((postId) => { + // * Assert telemetry data + cy.expectTelemetryToContain([ + { + name: 'run_status_update', + type: 'page', + properties: { + post_id: postId, + playbook_run_id: testPlaybookRun.id, + channel_type: 'O', + }, + }, + ]); + }); + }); + + it('displays when permalinked in a different channel', () => { + // # Go to the playbook run channel + cy.visit(`/${testTeam.name}/channels/test-run`); + + // # Post a status update + cy.apiUpdateStatus({ + playbookRunId: testPlaybookRun.id, + message: 'status update', + reminder: 60, + }); + + // Grab the post id + cy.getLastPostId().then((postId) => { + // # intercepts telemetry + cy.interceptTelemetry(); + + // # Go to the other channel + cy.visit(`/${testTeam.name}/channels/${testChannel.name}`); + + // # Post a permalink to the status update + cy.uiPostMessageQuickly(`${Cypress.config('baseUrl')}/${testTeam.name}/pl/${postId}`); + + // * Assert telemetry data + cy.expectTelemetryToContain([ + { + name: 'run_status_update', + type: 'page', + properties: { + post_id: postId, + playbook_run_id: testPlaybookRun.id, + channel_type: 'O', + }, + }, + ]); + + cy.getLastPost().then((element) => { + // # Verify the expected message text + cy.get(element).contains(`${testUser.username} posted an update for ${testPlaybookRun.name}`); + cy.get(element).contains('status update'); + }); + }); + }); + + it('displays when permalinked in a different channel, even if not a member of the original channel', () => { + // # Go to the playbook run channel + cy.visit(`/${testTeam.name}/channels/test-run`); + + // # Post a status update + cy.apiUpdateStatus({ + playbookRunId: testPlaybookRun.id, + message: 'status update', + reminder: 60, + }); + + cy.getLastPostId().then((postId) => { + // # intercepts telemetry + cy.interceptTelemetry(); + + // # Leave the playbook run channel + cy.uiLeaveChannel(); + + // # Go to the other channel + cy.visit(`/${testTeam.name}/channels/${testChannel.name}`); + + // # Post a permalink to the status update + cy.uiPostMessageQuickly(`${Cypress.config('baseUrl')}/${testTeam.name}/pl/${postId}`); + + // * Assert telemetry data + cy.expectTelemetryToContain([ + { + name: 'run_status_update', + type: 'page', + properties: { + post_id: postId, + playbook_run_id: testPlaybookRun.id, + channel_type: '', + }, + }, + ]); + + cy.getLastPost().then((element) => { + // # Verify the expected message text + cy.get(element).contains(`${testUser.username} posted an update for ${testPlaybookRun.name}`); + cy.get(element).contains('status update'); + }); + }); + }); + }); +}); diff --git a/e2e/cypress/tests/integration/playbooks/channels/retrospective_spec.js b/e2e/cypress/tests/integration/playbooks/channels/retrospective_spec.js new file mode 100644 index 0000000000..0defebd343 --- /dev/null +++ b/e2e/cypress/tests/integration/playbooks/channels/retrospective_spec.js @@ -0,0 +1,242 @@ +// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. + +// *************************************************************** +// - [#] indicates a test step (e.g. # Go to a page) +// - [*] indicates an assertion (e.g. * Check the title) +// *************************************************************** + +// Stage: @prod +// Group: @playbooks + +describe('runs > retrospective', () => { + let testTeam; + let testUser; + let testPlaybookWithMetrics; + + before(() => { + cy.apiInitSetup().then(({team, user}) => { + testTeam = team; + testUser = user; + + // # Login as testUser + cy.apiLogin(testUser); + }); + }); + + beforeEach(() => { + // # Login as testUser + cy.apiLogin(testUser); + + // # Create playbook with metrics + cy.apiCreatePlaybook({ + teamId: testTeam.id, + title: 'Playbook with metrics', + memberIDs: [], + createPublicPlaybookRun: true, + metrics: [ + { + title: 'Time to acknowledge', + description: 'some description text', + type: 'metric_duration', + target: 7200000, + }, + { + title: 'Cost', + description: 'Cost of some events', + type: 'metric_currency', + target: 400, + }, + { + title: 'Number of customers', + description: 'Number of customers who had issues', + type: 'metric_integer', + target: 30, + }, + { + title: 'Duration', + description: 'Duration of incident', + type: 'metric_duration', + }, + ], + }).then((playbook) => { + testPlaybookWithMetrics = playbook; + }); + }); + + describe('runs with metrics', () => { + let runId; + let runName; + let playbookRunChannelName; + + beforeEach(() => { + // # Create a new playbook run + const now = Date.now(); + runName = `Run (${now})`; + playbookRunChannelName = `run-${now}`; + + cy.apiRunPlaybook({ + teamId: testTeam.id, + playbookId: testPlaybookWithMetrics.id, + playbookRunName: runName, + ownerUserId: testUser.id, + createPublicPlaybookRun: true, + }).then((run) => { + runId = run.id; + }); + }); + + describe('publish retrospective', () => { + it('retrospective with 4 key metrics', () => { + // # Navigate directly to the retro tab + cy.visit(`/playbooks/runs/${runId}/retrospective`); + + // * Verify metrics number + cy.getStyledComponent('InputContainer').should('have.length', 4); + + // # Enter metrics values + cy.get('input[type=text]').eq(0).click(); + cy.get('input[type=text]').eq(0).type('00:11:10'). + tab().type('560'). + tab().type('12'). + tab().type('14:00:59'); + + // # Publish retrospective + publishRetro(); + + // # Navigate to the playbook run channel + cy.visit(`/${testTeam.name}/channels/${playbookRunChannelName}`); + + // * Verify channel retro post content + cy.findAllByTestId('postView').last().contains(`Retrospective for ${runName} has been published by`); + cy.getStyledComponent('MetricInfo').should('have.length', 4); + cy.getStyledComponent('MetricInfo').eq(0).contains('11 hours, 10 minutes'); + cy.getStyledComponent('MetricInfo').eq(1).contains('560'); + cy.getStyledComponent('MetricInfo').eq(2).contains('12'); + cy.getStyledComponent('MetricInfo').eq(3).contains('14 days, 59 minutes'); + }); + + it('retrospective with 3 key metrics', () => { + // # Remove first metric, leave only 3 + testPlaybookWithMetrics.metrics.splice(0, 1); + cy.apiUpdatePlaybook(testPlaybookWithMetrics).then(() => { + // # Navigate directly to the retro tab + cy.visit(`/playbooks/runs/${runId}/retrospective`); + + // * Verify metrics number + cy.getStyledComponent('InputContainer').should('have.length', 3); + + // # Enter metrics values + cy.get('input[type=text]').eq(0).click(); + cy.get('input[type=text]').eq(0).type('43'). + tab().type('121'). + tab().type('11:00:02'); + + // # Publish retrospective + publishRetro(); + + // # Navigate to the playbook run channel + cy.visit(`/${testTeam.name}/channels/${playbookRunChannelName}`); + + // * Verify channel retro post content + cy.findAllByTestId('postView').last().contains(`Retrospective for ${runName} has been published by`); + cy.getStyledComponent('MetricInfo').should('have.length', 3); + cy.getStyledComponent('MetricInfo').eq(0).contains('43'); + cy.getStyledComponent('MetricInfo').eq(1).contains('121'); + cy.getStyledComponent('MetricInfo').eq(2).contains('11 days, 2 minutes'); + }); + }); + + it('retrospective with 2 key metrics', () => { + // # Remove first two metrics, leave only 2 + testPlaybookWithMetrics.metrics.splice(0, 2); + cy.apiUpdatePlaybook(testPlaybookWithMetrics).then(() => { + // # Navigate directly to the retro tab + cy.visit(`/playbooks/runs/${runId}/retrospective`); + + // * Verify metrics number + cy.getStyledComponent('InputContainer').should('have.length', 2); + + // # Enter metrics values + cy.get('input[type=text]').eq(0).click(); + cy.get('input[type=text]').eq(0).type('0'). + tab().type('00:04:02'); + + // # Publish retrospective + publishRetro(); + + // # Navigate to the playbook run channel + cy.visit(`/${testTeam.name}/channels/${playbookRunChannelName}`); + + // * Verify channel retro post content + cy.findAllByTestId('postView').last().contains(`Retrospective for ${runName} has been published by`); + cy.getStyledComponent('MetricInfo').should('have.length', 2); + cy.getStyledComponent('MetricInfo').eq(0).contains('0'); + cy.getStyledComponent('MetricInfo').eq(1).contains('4 hours, 2 minutes'); + }); + }); + + it('retrospective with 1 key metrics', () => { + // # Remove first 3 metrics, leave only 1 + testPlaybookWithMetrics.metrics.splice(0, 3); + cy.apiUpdatePlaybook(testPlaybookWithMetrics).then(() => { + // # Navigate directly to the retro tab + cy.visit(`/playbooks/runs/${runId}/retrospective`); + + // * Verify metrics number + cy.getStyledComponent('InputContainer').should('have.length', 1); + + // # Enter metrics values + cy.get('input[type=text]').eq(0).click(); + cy.get('input[type=text]').eq(0).type('00:00:00'); + + // # Publish retrospective + publishRetro(); + + // # Navigate to the playbook run channel + cy.visit(`/${testTeam.name}/channels/${playbookRunChannelName}`); + + // * Verify channel retro post content + cy.findAllByTestId('postView').last().contains(`Retrospective for ${runName} has been published by`); + cy.getStyledComponent('MetricInfo').should('have.length', 1); + cy.getStyledComponent('MetricInfo').eq(0).contains('0 seconds'); + }); + }); + + it('retrospective with no metrics', () => { + // # Remove all metrics + testPlaybookWithMetrics.metrics.splice(0, 4); + cy.apiUpdatePlaybook(testPlaybookWithMetrics).then(() => { + // # Navigate directly to the retro tab + cy.visit(`/playbooks/runs/${runId}/retrospective`); + + // * Verify there are no metrics inputs + cy.getStyledComponent('InputContainer').should('not.exist'); + + // # Publish retrospective + publishRetro(); + + // # Navigate to the playbook run channel + cy.visit(`/${testTeam.name}/channels/${playbookRunChannelName}`); + + // * Verify channel retro post content + cy.findAllByTestId('postView').last().contains(`Retrospective for ${runName} has been published by`); + cy.getStyledComponent('MetricInfo').should('not.exist'); + }); + }); + }); + }); +}); + +const publishRetro = () => { + // # Publish + cy.findByRole('button', {name: 'Publish'}).click(); + + cy.get('#confirm-modal-light').within(() => { + // * Verify we're showing the publish retro confirmation modal + cy.findByText('Are you sure you want to publish?'); + + // # Publish + cy.findByRole('button', {name: 'Publish'}).click(); + }); +}; diff --git a/e2e/cypress/tests/integration/playbooks/channels/rhs/about_spec.js b/e2e/cypress/tests/integration/playbooks/channels/rhs/about_spec.js new file mode 100644 index 0000000000..45cf1137f4 --- /dev/null +++ b/e2e/cypress/tests/integration/playbooks/channels/rhs/about_spec.js @@ -0,0 +1,132 @@ +// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. + +// *************************************************************** +// - [#] indicates a test step (e.g. # Go to a page) +// - [*] indicates an assertion (e.g. * Check the title) +// *************************************************************** + +// Stage: @prod +// Group: @playbooks + +describe('channels > rhs > header', () => { + let testTeam; + let testUser; + let testPlaybook; + let testPlaybookRun; + let playbookRunChannelName; + let playbookRunName; + before(() => { + cy.apiInitSetup().then(({team, user}) => { + testTeam = team; + testUser = user; + + cy.apiLogin(testUser); + + // # Create a playbook + cy.apiCreateTestPlaybook({ + teamId: testTeam.id, + title: 'Playbook', + userId: testUser.id, + }).then((playbook) => { + testPlaybook = playbook; + }); + }); + }); + + beforeEach(() => { + // # Login as testUser + cy.apiLogin(testUser); + + // # Size the viewport to show the RHS without covering posts. + cy.viewport('macbook-13'); + + // # Run the playbook + const now = Date.now(); + playbookRunName = 'Playbook Run (' + now + ')'; + playbookRunChannelName = 'playbook-run-' + now; + cy.apiRunPlaybook({ + teamId: testTeam.id, + playbookId: testPlaybook.id, + playbookRunName, + ownerUserId: testUser.id, + }).then((run) => { + testPlaybookRun = run; + }); + + // # Navigate directly to the application and the playbook run channel + cy.visit(`/${testTeam.name}/channels/${playbookRunChannelName}`); + }); + + describe('shows name', () => { + it('of active playbook run', () => { + // * Verify the title is displayed + cy.get('#rhsContainer').contains(playbookRunName); + }); + + it('of renamed playbook run', () => { + // * Verify the existing title is displayed + cy.get('#rhsContainer').contains(playbookRunName); + + // # Rename the channel + cy.apiPatchChannel(testPlaybookRun.channel_id, { + id: testPlaybookRun.channel_id, + display_name: 'Updated', + }); + + // * Verify the updated title is displayed + cy.get('#rhsContainer').contains(playbookRunName); + }); + }); + + describe('edit run name', () => { + it('by clicking on name', () => { + cy.get('#rhsContainer').findByTestId('rendered-run-name').should('be.visible').click(); + + // # type text in textarea + cy.get('#rhsContainer').findByTestId('textarea-run-name').should('be.visible').clear().type('new run name{ctrl+enter}'); + + // * make sure the updated name is here + cy.get('#rhsContainer').findByTestId('rendered-run-name').should('be.visible').contains('new run name'); + + // * make sure the channel name remains unchanged + cy.get('#channelHeaderInfo').findByRole('heading').contains(playbookRunName); + }); + }); + + describe('edit summary', () => { + it('by clicking on placeholder', () => { + cy.get('#rhsContainer').findByTestId('rendered-description').should('be.visible').click(); + + // # type text in textarea + cy.get('#rhsContainer').findByTestId('textarea-description').should('be.visible').type('new summary{ctrl+enter}'); + + // * make sure the updated summary is here + cy.get('#rhsContainer').findByTestId('rendered-description').should('be.visible').contains('new summary'); + }); + + it('by clicking on dot menu item', () => { + // # click on the field + cy.get('#rhsContainer').within(() => { + cy.findByTestId('buttons-row').invoke('show').within(() => { + cy.findAllByRole('button').eq(1).click(); + }); + }); + + cy.findByText('Edit run summary').click({force: true}); + + // # type text in textarea + cy.focused().should('be.visible').type('new summary{ctrl+enter}'); + + // * make sure the updated summary is here + cy.get('#rhsContainer').findByTestId('rendered-description').should('be.visible').contains('new summary'); + }); + }); + + describe('participate', () => { + it('icon is not visible if I am a participant', () => { + // * assert icon is not visible if I'm participant + cy.get('#rhsContainer').findByTestId('rhs-participate-icon').should('not.exist'); + }); + }); +}); diff --git a/e2e/cypress/tests/integration/playbooks/channels/rhs/checklist_spec.js b/e2e/cypress/tests/integration/playbooks/channels/rhs/checklist_spec.js new file mode 100644 index 0000000000..4978072e1d --- /dev/null +++ b/e2e/cypress/tests/integration/playbooks/channels/rhs/checklist_spec.js @@ -0,0 +1,489 @@ +// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. + +// *************************************************************** +// - [#] indicates a test step (e.g. # Go to a page) +// - [*] indicates an assertion (e.g. * Check the title) +// *************************************************************** + +// Stage: @prod +// Group: @playbooks + +import {HALF_SEC, ONE_SEC} from '../../../../fixtures/timeouts'; + +describe('channels > rhs > checklist', () => { + let testTeam; + let testUser; + let testPlaybook; + + before(() => { + cy.apiInitSetup().then(({team, user}) => { + testTeam = team; + testUser = user; + + // # Login as testUser + cy.apiLogin(testUser); + + // # Create a playbook + cy.apiCreatePlaybook({ + teamId: team.id, + title: 'Playbook', + checklists: [ + { + title: 'Stage 1', + items: [ + {title: 'Step 1', command: '/invalid'}, + {title: 'Step 2', command: '/echo VALID'}, + {title: 'Step 3', command: '/playbook check 0 0'}, + {title: 'Step 4'}, + {title: 'Step 5'}, + {title: 'Step 6'}, + {title: 'Step 7'}, + {title: 'Step 8'}, + {title: 'Step 9'}, + {title: 'Step 10'}, + {title: 'Step 11'}, + {title: 'Step 12'}, + ], + }, + { + title: 'Stage 2', + items: [ + {title: 'Step 1', command: '/invalid'}, + {title: 'Step 2', command: '/echo VALID'}, + {title: 'Step 3'}, + {title: 'Step 4'}, + {title: 'Step 5'}, + {title: 'Step 6'}, + {title: 'Step 7'}, + {title: 'Step 8'}, + {title: 'Step 9'}, + {title: 'Step 10'}, + {title: 'Step 11'}, + {title: 'Step 12'}, + ], + }, + { + title: 'Stage 3', + items: [ + {title: 'Step 1', command: '/invalid'}, + {title: 'Step 2', command: '/echo VALID'}, + {title: 'Step 3'}, + {title: 'Step 4'}, + {title: 'Step 5'}, + {title: 'Step 6'}, + {title: 'Step 7'}, + {title: 'Step 8'}, + {title: 'Step 9'}, + {title: 'Step 10'}, + {title: 'Step 11'}, + {title: 'Step 12'}, + ], + }, + { + title: 'Stage 3', + items: [ + {title: 'Step 1', command: '/invalid'}, + {title: 'Step 2', command: '/echo VALID'}, + {title: 'Step 3'}, + {title: 'Step 4'}, + {title: 'Step 5'}, + {title: 'Step 6'}, + {title: 'Step 7'}, + {title: 'Step 8'}, + {title: 'Step 9'}, + {title: 'Step 10'}, + {title: 'Step 11'}, + {title: 'Step 12'}, + ], + }, + ], + memberIDs: [ + user.id, + ], + }).then((playbook) => { + testPlaybook = playbook; + }); + }); + }); + + // // # Switch to clean display mode + // cy.apiSaveMessageDisplayPreference('clean'); + + beforeEach(() => { + // # Login as testUser + cy.apiLogin(testUser); + + // # Size the viewport to task list without scrolling issues + cy.viewport('macbook-13'); + }); + + describe('rhs stuff', () => { + let playbookRunName; + let playbookRunChannelName; + + beforeEach(() => { + // # Run the playbook + const now = Date.now(); + playbookRunName = 'Playbook Run (' + now + ')'; + playbookRunChannelName = 'playbook-run-' + now; + cy.apiRunPlaybook({ + teamId: testTeam.id, + playbookId: testPlaybook.id, + playbookRunName, + ownerUserId: testUser.id, + }); + + // # Navigate directly to the application and the playbook run channel + cy.visit(`/${testTeam.name}/channels/${playbookRunChannelName}`); + + // * Verify the playbook run RHS is open. + cy.get('#rhsContainer').should('exist').within(() => { + cy.findByText(playbookRunName).should('exist'); + }); + }); + + describe('header', () => { + it('has title', () => { + cy.get('#rhsContainer').within(() => { + cy.findByText('Tasks').should('exist'); + }); + }); + }); + + it('shows an ephemeral error when running an invalid slash command', () => { + cy.get('#rhsContainer').should('exist').within(() => { + // * Verify the command has not yet been run. + cy.findAllByTestId('run').eq(0).should('have.text', 'Run'); + + // * Run the /invalid slash command + cy.findAllByTestId('run').eq(0).click(); + + // * Verify the command still has not yet been run. + cy.findAllByTestId('run').eq(0).should('have.text', 'Run'); + }); + + // * Verify the expected error message. + cy.verifyEphemeralMessage('Failed to execute slash command /invalid'); + }); + + it('successfully runs a valid slash command', () => { + cy.get('#rhsContainer').should('exist').within(() => { + // * Verify the command has not yet been run. + cy.findAllByTestId('run').eq(1).should('have.text', 'Run'); + + // * Run the /invalid slash command + cy.findAllByTestId('run').eq(1).click(); + + // * Verify the command has now been run. + cy.findAllByTestId('run').eq(1).should('have.text', 'Rerun'); + }); + + // # Verify the expected output. + cy.verifyPostedMessage('VALID'); + }); + + it('still shows slash commands as having been run after reload', () => { + cy.get('#rhsContainer').should('exist').within(() => { + // * Verify the command has not yet been run. + cy.findAllByTestId('run').eq(1).should('have.text', 'Run'); + + // * Run the /invalid slash command + cy.findAllByTestId('run').eq(1).click(); + + // * Verify the command has now been run. + cy.findAllByTestId('run').eq(1).should('have.text', 'Rerun'); + }); + + // # Verify the expected output. + cy.verifyPostedMessage('VALID'); + + // # Reload the page + cy.visit(`/${testTeam.name}/channels/${playbookRunChannelName}`); + + cy.get('#rhsContainer').should('exist').within(() => { + // * Verify the invalid command still has not yet been run. + cy.findAllByTestId('run').eq(0).should('have.text', 'Run'); + + // * Verify the valid command has been run. + cy.findAllByTestId('run').eq(1).should('have.text', 'Rerun'); + }); + }); + + it('runs /playbook slash commands', () => { + cy.get('#rhsContainer').should('exist').within(() => { + // * Verify the `/playbook check 0 0` command has not yet been run. + cy.findAllByTestId('run').eq(2).should('have.text', 'Run'); + + // * Run the slash command + cy.findAllByTestId('run').eq(2).click(); + + // * Verify the command has now been run. + cy.findAllByTestId('run').eq(2).should('have.text', 'Rerun'); + + // * Verify the first checklist item is checked + cy.findAllByTestId('checkbox-item-container').eq(0).within(() => { + // # Check the overdue task + cy.get('input').should('be.checked'); + }); + }); + + // # Reload the page + cy.visit(`/${testTeam.name}/channels/${playbookRunChannelName}`); + + cy.get('#rhsContainer').should('exist').within(() => { + // * Verify the command has still been run. + cy.findAllByTestId('run').eq(2).should('have.text', 'Rerun'); + + // * Verify the first checklist item is still checked + cy.findAllByTestId('checkbox-item-container').eq(0).within(() => { + // # Check the overdue task + cy.get('input').should('be.checked'); + }); + }); + }); + + it('can skip and restore task', () => { + // # Skip task and verify + skipTask(0); + + // # Hover over the checklist item + cy.findAllByTestId('checkbox-item-container').eq(0).trigger('mouseover'); + + // # Click dot menu + cy.findAllByTestId('checkbox-item-container').eq(0).within(() => { + cy.findByTitle('More').click(); + }); + + // # Click the restore button + cy.findByRole('button', {name: 'Restore task'}).click(); + + // * Verify the item has been restored + cy.findAllByTestId('checkbox-item-container').eq(0).within(() => { + cy.get('[data-cy=skipped]').should('not.exist'); + }); + }); + + it('add new task', () => { + const newTasktext = 'This is my new task' + Date.now(); + + cy.addNewTaskFromRHS(newTasktext); + + // Check that it was created + cy.findByText(newTasktext).should('exist'); + }); + + it('add new task slash command', () => { + const newTasktext = 'Task from slash command' + Date.now(); + + cy.executeSlashCommand(`/playbook checkadd 0 ${newTasktext}`); + + // Check that it was created + cy.findByText(newTasktext).should('exist'); + }); + + it('creates a new checklist', () => { + // # Click on the button to add a checklist + cy.get('#rhsContainer').within(() => { + cy.findByTestId('add-a-checklist-button').click(); + }); + + // # Type a title and click on the Add button + const title = 'Checklist - ' + Date.now(); + cy.findByTestId('checklist-title-input').type(title); + cy.findByTestId('checklist-item-save-button').click(); + + // # Click on the button to add a checklist + cy.get('#rhsContainer').within(() => { + cy.findByText(title).should('exist'); + }); + }); + + it('renames a checklist', () => { + const oldTitle = 'Stage 1'; + const newTitle = 'New title - ' + Date.now(); + + // # Open the dot menu and click on the rename button + cy.get('#rhsContainer').within(() => { + cy.findByText(oldTitle).trigger('mouseover'); + cy.findAllByTestId('checklistHeader').eq(0).within(() => { + cy.findByTitle('More').click(); + }); + }); + cy.findByTestId('dropdownmenu').findByText('Rename checklist').click(); + + // # Type the new title and click the confirm button + cy.findByTestId('checklist-title-input').type(newTitle); + cy.findByTestId('checklist-item-save-button').click(); + + // * Verify that the checklist changed its name + cy.get('#rhsContainer').within(() => { + cy.findByText(oldTitle).should('not.exist'); + cy.findByText(oldTitle + newTitle).should('exist'); + }); + }); + + it('can set due date, from hover menu', () => { + // # Set due date and verify + setTaskDueDate(6, 'in 10 minutes'); + }); + + it('can set due date, from edit mode', () => { + // # Hover over the checklist item + cy.findAllByTestId('checkbox-item-container').eq(6).trigger('mouseover'); + + // # Click the edit button + cy.findAllByTestId('hover-menu-edit-button').eq(0).click(); + + cy.findAllByTestId('due-date-info-button').eq(0).click(); + + // # Enter due date in 3 days + cy.get('.playbook-react-select__value-container').type('in 3 days'). + wait(HALF_SEC). + trigger('keydown', { + key: 'Enter', + }); + + // * Verify if Due in 3 days info is added + cy.findAllByTestId('due-date-info-button').eq(0).should('exist').within(() => { + cy.findByText('in 3 days').should('exist'); + cy.findByText('Due').should('exist'); + }); + }); + + it('filter overdue tasks', {retries: {runMode: 3}}, () => { + // # Set overdue date for several items + setTaskDueDate(2, '1 hour ago'); + + setTaskDueDate(3, '7 hours ago', 1); + setTaskDueDate(5, '3 hours ago', 2); + setTaskDueDate(6, '6 hours ago', 3); + + // # Skip task + skipTask(3); + + // # Mark a task as completed + cy.findAllByTestId('checkbox-item-container').eq(5).within(() => { + // # Check the overdue task + cy.get('input').click(); + }); + + // * Verify if overdue tasks info was added. Should not include skipped / completed tasks. + cy.findAllByTestId('overdue-tasks-filter').eq(0).should('exist').within(() => { + cy.findByText('2 tasks overdue').should('exist'); + }); + + // # Filter overdue tasks + cy.findAllByTestId('overdue-tasks-filter').eq(0).click(); + + // * Verify if filter works. Should not include skipped / completed tasks. + cy.findAllByTestId('checkbox-item-container').should('have.length', 2); + + // # Cancel filter overdue tasks + cy.findAllByTestId('overdue-tasks-filter').eq(0).click(); + + // * Verify if filter was canceled + cy.findAllByTestId('checkbox-item-container').should('have.length', 48); + }); + + it('filter overdue automatically disappear if we check all overdue items', () => { + // # Set due date + setTaskDueDate(2, '1 minute ago'); + + // * Verify if overdue tasks info was added + cy.findAllByTestId('overdue-tasks-filter').eq(0).should('exist').within(() => { + cy.findByText('1 task overdue').should('exist'); + }); + + // # Filter overdue tasks + cy.findAllByTestId('overdue-tasks-filter').eq(0).click(); + + // * Verify if filter works + cy.findAllByTestId('checkbox-item-container').should('have.length', 1); + + // # Mark a task as completed + cy.findAllByTestId('checkbox-item-container').within(() => { + // # Check the overdue task + cy.get('input').click(); + }); + + // * Verify there is no filter + cy.findAllByTestId('overdue-tasks-filter').should('not.exist'); + + // * Verify if filter was canceled + cy.findAllByTestId('checkbox-item-container').should('have.length', 48); + }); + + it('switching between runs with the same checklist', () => { + // # Create another run using the same playbook + const playbookRunName2 = 'RunWithSameChecklist'; + cy.apiRunPlaybook({ + teamId: testTeam.id, + playbookId: testPlaybook.id, + playbookRunName: playbookRunName2, + ownerUserId: testUser.id, + }); + + // # Set due date for the first channel's task + setTaskDueDate(2, 'in 2 hours'); + + // # Switch to the second run channel + cy.get('#sidebarItem_runwithsamechecklist').click(); + + // * Verify that tasks do not have due dates + cy.findAllByTestId('checkbox-item-container').eq(2).within(() => { + cy.findAllByTestId('due-date-info-button').should('not.exist'); + }); + }); + + it('scroll 2-3 pages and open due date selector- unexpected scroll issue', () => { + // # Hover over the checklist item that is ~3 pages down + cy.findAllByTestId('checkbox-item-container').eq(26).trigger('mouseover').within(() => { + // # Click the set due date button + cy.get('.icon-calendar-outline').click(); + }); + + // * Verify if date selector is visible + cy.get('.playbook-react-select').should('be.visible'); + }); + }); +}); + +const setTaskDueDate = (taskIndex, dateQuery, offset = 0) => { + // # Hover over the checklist item + cy.findAllByTestId('checkbox-item-container').eq(taskIndex).trigger('mouseover').within(() => { + // # Click the set due date button + cy.get('.icon-calendar-outline').click(); + }); + + // # Wait for react select to finish rendering. + cy.wait(ONE_SEC); + + // # Enter due date query + cy.get('.playbook-react-select').within(() => { + cy.get('input').type(dateQuery, {force: true}). + wait(HALF_SEC). + trigger('keydown', { + key: 'Enter', + }); + }); + + // * Verify if Due date info is added + cy.findAllByTestId('due-date-info-button').eq(offset).should('exist').within(() => { + cy.findByText(dateQuery).should('exist'); + cy.findByText('Due').should('exist'); + }); +}; + +const skipTask = (taskIndex) => { + // # Hover over the checklist item + cy.findAllByTestId('checkbox-item-container').eq(taskIndex).trigger('mouseover'); + + // # Click dot menu + cy.findAllByTestId('checkbox-item-container').eq(taskIndex).within(() => { + cy.findByTitle('More').click(); + }); + + // # Click the skip button + cy.findByRole('button', {name: 'Skip task'}).click(); +}; diff --git a/e2e/cypress/tests/integration/playbooks/channels/rhs/header_spec.js b/e2e/cypress/tests/integration/playbooks/channels/rhs/header_spec.js new file mode 100644 index 0000000000..00d2b66a19 --- /dev/null +++ b/e2e/cypress/tests/integration/playbooks/channels/rhs/header_spec.js @@ -0,0 +1,225 @@ +// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. + +// *************************************************************** +// - [#] indicates a test step (e.g. # Go to a page) +// - [*] indicates an assertion (e.g. * Check the title) +// *************************************************************** + +// Stage: @prod +// Group: @playbooks + +describe('channels > rhs > header', () => { + let testTeam; + let testUser; + let testPlaybook; + + before(() => { + cy.apiInitSetup().then(({team, user}) => { + testTeam = team; + testUser = user; + + cy.apiLogin(testUser); + + // # Create a playbook + cy.apiCreateTestPlaybook({ + teamId: testTeam.id, + title: 'Playbook', + userId: testUser.id, + }).then((playbook) => { + testPlaybook = playbook; + }); + }); + }); + + beforeEach(() => { + // # Login as testUser + cy.apiLogin(testUser); + + // # Size the viewport to show the RHS without covering posts. + cy.viewport('macbook-13'); + }); + + describe('shows name', () => { + it('of active playbook run', () => { + // # Run the playbook + const now = Date.now(); + const playbookRunName = 'Playbook Run (' + now + ')'; + const playbookRunChannelName = 'playbook-run-' + now; + cy.apiRunPlaybook({ + teamId: testTeam.id, + playbookId: testPlaybook.id, + playbookRunName, + ownerUserId: testUser.id, + }); + + // # Navigate directly to the application and the playbook run channel + cy.visit(`/${testTeam.name}/channels/${playbookRunChannelName}`); + + // * Verify the title is displayed + cy.get('#rhsContainer').contains(playbookRunName); + }); + + it('of renamed playbook run', () => { + // # Run the playbook + const now = Date.now(); + const playbookRunName = 'Playbook Run (' + now + ')'; + const playbookRunChannelName = 'playbook-run-' + now; + cy.apiRunPlaybook({ + teamId: testTeam.id, + playbookId: testPlaybook.id, + playbookRunName, + ownerUserId: testUser.id, + }).then((playbookRun) => { + // # Navigate directly to the application and the playbook run channel + cy.visit(`/${testTeam.name}/channels/${playbookRunChannelName}`); + + // * Verify the existing title is displayed + cy.get('#rhsContainer').contains(playbookRunName); + + // # Rename the channel + cy.apiPatchChannel(playbookRun.channel_id, { + id: playbookRun.channel_id, + display_name: 'Updated', + }); + + // * Verify the updated title is displayed + cy.get('#rhsContainer').contains(playbookRunName); + }); + }); + }); + + describe('edit summary', () => { + it('by clicking on placeholder', () => { + // # Run the playbook + const now = Date.now(); + const playbookRunName = 'Playbook Run (' + now + ')'; + const playbookRunChannelName = 'playbook-run-' + now; + cy.apiRunPlaybook({ + teamId: testTeam.id, + playbookId: testPlaybook.id, + playbookRunName, + ownerUserId: testUser.id, + }); + + // # Navigate directly to the application and the playbook run channel + cy.visit(`/${testTeam.name}/channels/${playbookRunChannelName}`); + + // # click on the field + cy.get('#rhsContainer').findByTestId('rendered-description').should('be.visible').click(); + + // # type text in textarea + cy.get('#rhsContainer').findByTestId('textarea-description').should('be.visible').type('new summary{ctrl+enter}'); + + // * make sure the updated summary is here + cy.get('#rhsContainer').findByTestId('rendered-description').should('be.visible').contains('new summary'); + + // * reload the page + cy.reload(); + + // * make sure the updated summary is still there + cy.get('#rhsContainer').findByTestId('rendered-description').should('be.visible').contains('new summary'); + }); + + it('by clicking on dot menu item', () => { + // # Run the playbook + const now = Date.now(); + const playbookRunName = 'Playbook Run (' + now + ')'; + const playbookRunChannelName = 'playbook-run-' + now; + cy.apiRunPlaybook({ + teamId: testTeam.id, + playbookId: testPlaybook.id, + playbookRunName, + ownerUserId: testUser.id, + }); + + // # Navigate directly to the application and the playbook run channel + cy.visit(`/${testTeam.name}/channels/${playbookRunChannelName}`); + + // # click on the field + cy.get('#rhsContainer').within(() => { + cy.findByTestId('buttons-row').invoke('show').within(() => { + cy.findAllByRole('button').eq(1).click(); + }); + }); + + cy.findByTestId('dropdownmenu').within(() => { + cy.get('span').should('have.length', 3); + cy.findByText('Edit run summary').click(); + }); + + // # type text in textarea + cy.focused().should('be.visible').type('new summary{ctrl+enter}'); + + // * make sure the updated summary is here + cy.get('#rhsContainer').findByTestId('rendered-description').should('be.visible').contains('new summary'); + }); + }); + + describe('edit summary of finished run', () => { + let playbookRunChannelName; + let finishedPlaybookRun; + + beforeEach(() => { + // # Run the playbook + const now = Date.now(); + const playbookRunName = 'Playbook Run (' + now + ')'; + playbookRunChannelName = 'playbook-run-' + now; + cy.apiRunPlaybook({ + teamId: testTeam.id, + playbookId: testPlaybook.id, + playbookRunName, + ownerUserId: testUser.id, + }).then((playbookRun) => { + finishedPlaybookRun = playbookRun; + }); + }); + + it('by clicking on placeholder', () => { + // # Navigate directly to the application and the playbook run channel + cy.visit(`/${testTeam.name}/channels/${playbookRunChannelName}`); + + // # Wait for the RHS to open + cy.get('#rhsContainer').should('be.visible'); + + // # Mark the run as finished + cy.apiFinishRun(finishedPlaybookRun.id); + + // # click on the field + cy.get('#rhsContainer').findByTestId('rendered-description').should('be.visible').click(); + + // * Verify textarea does not appear + cy.get('#rhsContainer').findByTestId('textarea-description').should('not.exist'); + + // * Verify no prompt to join appears (timeout ensures it fails right away before toast disappears) + cy.findByText('Become a participant to interact with this run', {timeout: 500}).should('not.exist'); + }); + + it('by clicking on dot menu item', () => { + // # Navigate directly to the application and the playbook run channel + cy.visit(`/${testTeam.name}/channels/${playbookRunChannelName}`); + + // # Wait for the RHS to open + cy.get('#rhsContainer').should('be.visible'); + + // # Mark the run as finished + cy.apiFinishRun(finishedPlaybookRun.id); + + // # click on the field + cy.get('#rhsContainer').within(() => { + cy.findByTestId('buttons-row').invoke('show').within(() => { + cy.findAllByRole('button').eq(1).click(); + }); + }); + + // * Verify the menu items + cy.findByTestId('dropdownmenu').within(() => { + cy.get('span').should('have.length', 2); + cy.findByText('Edit run summary').should('not.exist'); + }); + + // * Verify no prompt to join appears (timeout ensures it fails right away before toast disappears) + cy.findByText('Become a participant to interact with this run', {timeout: 500}).should('not.exist'); + }); + }); +}); diff --git a/e2e/cypress/tests/integration/playbooks/channels/rhs/home_spec.js b/e2e/cypress/tests/integration/playbooks/channels/rhs/home_spec.js new file mode 100644 index 0000000000..857a2907b4 --- /dev/null +++ b/e2e/cypress/tests/integration/playbooks/channels/rhs/home_spec.js @@ -0,0 +1,159 @@ +// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. + +// *************************************************************** +// - [#] indicates a test step (e.g. # Go to a page) +// - [*] indicates an assertion (e.g. * Check the title) +// *************************************************************** + +// Stage: @prod +// Group: @playbooks + +describe('channels > rhs > home', () => { + let testSysadmin; + let testTeam; + let testUser; + + before(() => { + cy.apiInitSetup().then(({team, user}) => { + testTeam = team; + testUser = user; + + cy.apiCreateCustomAdmin().then(({sysadmin}) => { + testSysadmin = sysadmin; + }); + }); + }); + + describe('default permission settings', () => { + beforeEach(() => { + // # Login as testUser + cy.apiLogin(testUser); + + // # Navigate to the application, starting in a non-run channel. + cy.visit(`/${testTeam.name}/`); + + // * Check time bar in the channel section + // * as an indicator of page stability / end of rendering + cy.findByText('Today').should('be.visible'); + }); + + describe('telemetry', () => { + it('track page view', () => { + // # intercepts telemetry + cy.interceptTelemetry(); + + // # Click the icon + cy.getPlaybooksAppBarIcon().should('be.visible').click(); + + // * Assert telemetry data + cy.expectTelemetryToContain([{name: 'channels_rhs_home', type: 'page'}]); + }); + }); + + describe('shows available', () => { + it('starter templates', () => { + // templates are defined in webapp/src/components/templates/template_data.tsx + const templates = [ + {name: 'Blank', checklists: '1 checklist', actions: '1 action'}, + {name: 'Product Release', checklists: '4 checklists', actions: '3 actions'}, + {name: 'Incident Resolution', checklists: '4 checklists', actions: '4 actions'}, + {name: 'Customer Onboarding', checklists: '4 checklists', actions: '3 actions'}, + {name: 'Employee Onboarding', checklists: '5 checklists', actions: '2 actions'}, + {name: 'Feature Lifecycle', checklists: '5 checklists', actions: '3 actions'}, + {name: 'Bug Bash', checklists: '5 checklists', actions: '3 actions'}, + {name: 'Learn how to use playbooks', checklists: '2 checklists', actions: '2 actions'}, + ]; + + // # Click the icon + cy.getPlaybooksAppBarIcon().should('be.visible').click(); + + // * Verify the templates are shown + cy.findByText('Playbook Templates'). + parent(). + next(). + within(() => { + cy.findAllByTestId('template-details').each(($templateElement, index) => { + cy.wrap($templateElement).within(() => { + cy.findByText(templates[index].name).should('exist'); + cy.findByText(templates[index].checklists).should('exist'); + cy.findByText(templates[index].actions).should('exist'); + }); + }); + }); + }); + }); + + describe('show zero case if there are playbooks', () => { + beforeEach(() => { + // # Create a public playbook + cy.apiCreatePlaybook({ + teamId: testTeam.id, + title: 'Team Playbook', + memberIDs: [], + }); + + // # Click the icon + cy.getPlaybooksAppBarIcon().should('be.visible').click(); + }); + + it('without pre-populated channel name template', () => { + // * Verify the templates are not shown + cy.findAllByTestId('template-details').should('not.exist'); + + // * Verify the zero case is shown + cy.get('#sidebar-right').findByText('There are no runs in progress linked to this channel').should('be.visible'); + }); + }); + }); + + let restrictedTestTeam; + let restrictedTestUser; + + describe('user is lacking permissions to create playbooks', () => { + before(() => { + cy.apiLogin(testSysadmin); + + cy.apiCreateUser().then(({user}) => { + restrictedTestUser = user; + }); + + cy.apiCreateTeam('restricted-team', 'Restricted Team').then(({team}) => { + restrictedTestTeam = team; + cy.apiAddUserToTeam(restrictedTestTeam.id, restrictedTestUser.id); + }); + + cy.apiCreateScheme('Restricted Team Scheme', 'team').then(({scheme}) => { + cy.apiSetTeamScheme(restrictedTestTeam.id, scheme.id); + cy.apiGetRolesByNames([scheme.default_team_user_role]).then(({roles}) => { + const role = roles[0]; + + // Remove permissions to create playbooks + const permissions = role.permissions.filter((perm) => !(/playbook_(private|public)_create/).test(perm)); + cy.apiPatchRole(role.id, {permissions}); + }); + }); + }); + + beforeEach(() => { + // # Login as user with restricted permissions + cy.apiLogin(restrictedTestUser); + + // # Navigate to the application, starting in a non-run channel. + cy.visit(`/${restrictedTestTeam.name}/`); + }); + + it('permission notice should be shown and no create button should exist', () => { + // # Click the icon + cy.getPlaybooksAppBarIcon().should('be.visible').click(); + + cy.get('#sidebar-right').within(() => { + // * Verify notice about missing permissions exists + cy.findByText('You don\'t have permission to create playbooks in this workspace.').should('be.visible'); + + // * Verify create playbook button does not exist + cy.findByText('Create playbook').should('not.exist'); + }); + }); + }); +}); diff --git a/e2e/cypress/tests/integration/playbooks/channels/rhs/list_spec.js b/e2e/cypress/tests/integration/playbooks/channels/rhs/list_spec.js new file mode 100644 index 0000000000..cc2b6e82b6 --- /dev/null +++ b/e2e/cypress/tests/integration/playbooks/channels/rhs/list_spec.js @@ -0,0 +1,263 @@ +// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. + +// *************************************************************** +// - [#] indicates a test step (e.g. # Go to a page) +// - [*] indicates an assertion (e.g. * Check the title) +// *************************************************************** + +// Stage: @prod +// Group: @playbooks + +describe('channels > rhs > runlist', () => { + let testTeam; + let testUser; + let testPlaybook; + let testChannel; + const numActiveRuns = 10; + const numFinishedRuns = 4; + + before(() => { + cy.apiInitSetup().then(({team, user}) => { + testTeam = team; + testUser = user; + + cy.apiLogin(testUser); + + // # Create a playbook + cy.apiCreateTestPlaybook({ + teamId: testTeam.id, + title: 'The playbook name', + userId: testUser.id, + }).then((playbook) => { + testPlaybook = playbook; + + // # Create a test channel + cy.apiCreateChannel(testTeam.id, 'channel', 'Channel').then(({channel}) => { + testChannel = channel; + + // # Run the playbook a few times in the existing channel + for (let i = 0; i < numActiveRuns; i++) { + const runName = 'playbook-run-' + i; + cy.apiRunPlaybook({ + teamId: testTeam.id, + playbookId: testPlaybook.id, + ownerUserId: testUser.id, + channelId: testChannel.id, + playbookRunName: runName, + }); + } + + // # Do it again but finished + for (let i = 0; i < numFinishedRuns; i++) { + const runName = 'playbook-run-' + i; + cy.apiRunPlaybook({ + teamId: testTeam.id, + playbookId: testPlaybook.id, + ownerUserId: testUser.id, + channelId: testChannel.id, + playbookRunName: runName, + }).then((run) => { + cy.apiFinishRun(run.id); + }); + } + }); + }); + }); + }); + + beforeEach(() => { + // # Login as testUser + cy.apiLogin(testUser); + + // # Size the viewport to show the RHS without covering posts. + cy.viewport('macbook-13'); + + // # Navigate directly to the application and the playbook run channel + cy.visit(`/${testTeam.name}/channels/${testChannel.name}`); + + // # Wait the RHS to load + cy.findByText('Runs in progress').should('be.visible'); + }); + + it('track page view', () => { + // # intercepts telemetry + cy.interceptTelemetry(); + + // # Navigate directly to the application and the playbook run channel + cy.visit(`/${testTeam.name}/channels/${testChannel.name}`); + + // * Assert telemetry data + cy.expectTelemetryToContain([{name: 'channels_rhs_runlist', type: 'page'}]); + }); + + it('can filter', () => { + // # Click the filter menu + cy.findByTestId('rhs-runs-filter-menu').click(); + + // * Verify displayed options + cy.get('[data-testid="dropdownmenu"] > :nth-child(1) > div').should('have.text', numActiveRuns); + cy.get('[data-testid="dropdownmenu"] > :nth-child(2) > div').should('have.text', numFinishedRuns); + + // # Click the filter + cy.get('[data-testid="dropdownmenu"] > :nth-child(2)').click(); + + // * Verify displayed options + cy.get('[data-testid="rhs-runs-list"]').children().should('have.length', numFinishedRuns); + }); + + it('can show more (pagination)', () => { + // * Verify we have the first page + cy.get('[data-testid="rhs-runs-list"] > div').should('have.length', 8); + + // # CLick in the show-more button + cy.get('[data-testid="rhs-runs-list"] > button').click(); + + // * Verify we have loaded the second page + cy.get('[data-testid="rhs-runs-list"] > div').should('have.length', 10); + }); + + it('card has the basic info', () => { + // # Click the first run + cy.get('[data-testid="rhs-runs-list"] > :nth-child(1)').within(() => { + cy.findByText('playbook-run-9').should('be.visible'); + cy.findByText('The playbook name').should('be.visible'); + cy.findByText(testUser.username).should('be.visible'); + }); + }); + + it('can click though', () => { + // # Click the first run + cy.get('[data-testid="rhs-runs-list"] > :nth-child(1)').click(); + + // * Verify we made it to the run details at Channels RHS + cy.get('#rhsContainer').contains('playbook-run-9'); + cy.get('#rhsContainer').contains('Tasks'); + }); + + it('can see give feedback button', () => { + // * Verify give feedback button exists and has the right URL + cy.get('#rhsContainer').findByText('Give feedback'). + should('exist'). + and('have.attr', 'href'). + and('include', 'https://mattermost.com/pl/playbooks-feedback'); + }); + + describe('dotmenu', () => { + it('can navigate to RDP', () => { + // # Click the first run's dotmenu + cy.get('[data-testid="rhs-runs-list"] > :nth-child(1)').findByRole('button').click(); + + // # Click on go to run + cy.findByText('Go to run overview').click(); + + // * Assert we are in the run details page + cy.url().should('include', '/playbooks/runs/'); + cy.url().should('include', '?from=channel_rhs_dotmenu'); + }); + + it('can navigate to PBE', () => { + // # Click the first run's dotmenu + cy.get('[data-testid="rhs-runs-list"] > :nth-child(1)').findByRole('button').click(); + + // # Click on go to polaybook + cy.findByText('Go to playbook').click(); + + // * Assert we are in the PBE page + cy.url().should('include', `/playbooks/${testPlaybook.id}`); + }); + + it('can change run name', () => { + // # Click on the kebab menu + cy.get('[data-testid="rhs-runs-list"] > :nth-child(1) .icon-dots-vertical').click(); + + // # Click on the rename run option + cy.findByText('Rename run').click(); + + // # type new name + cy.findByTestId('run-name-input').clear().type('My cool new run name'); + + // # click save + cy.findByTestId('modal-confirm-button').click(); + + // * Verify the name has changed + cy.get('[data-testid="rhs-runs-list"] > :nth-child(1)').contains('My cool new run name'); + }); + + it('can change linked channel', () => { + // # Click on the kebab menu + cy.get('[data-testid="rhs-runs-list"] > :nth-child(1) .icon-dots-vertical').click(); + + // # Click on the rename run option + cy.findByText('Link run to a different channel').click(); + + // # type new name + cy.get('.modal-body').within(() => { + // # select town square + cy.findByText(testChannel.display_name).click().type('Town Square{enter}'); + }); + + // # click save + cy.findByTestId('modal-confirm-button').click(); + + // Let the listing refresh + cy.wait(1000); + + // * Verify we have the first page + cy.get('[data-testid="rhs-runs-list"] > div').should('have.length', 8); + + // # CLick in the show-more button + cy.get('[data-testid="rhs-runs-list"] > button').click(); + + // * Verify the channel has changed, now one run less + cy.get('[data-testid="rhs-runs-list"] > div').should('have.length', 9); + }); + + describe('navigation', () => { + let testChannelWith2Runs; + before(() => { + cy.apiLogin(testUser); + + // # Create a test channel + cy.apiCreateChannel(testTeam.id, 'channel', 'Channel').then(({channel}) => { + testChannelWith2Runs = channel; + + // # Run the playbook a few times in the existing channel + for (let i = 0; i < 2; i++) { + const runName = 'playbook-run-' + i; + cy.apiRunPlaybook({ + teamId: testTeam.id, + playbookId: testPlaybook.id, + ownerUserId: testUser.id, + channelId: testChannelWith2Runs.id, + playbookRunName: runName, + }); + } + }); + }); + + it('stays at list even if one only linked run after moving run', () => { + // # Visit channel with 2 runs + cy.visit(`/${testTeam.name}/channels/${testChannelWith2Runs.name}`); + + // # Click on the kebab menu + cy.get('[data-testid="rhs-runs-list"] > :nth-child(1) .icon-dots-vertical').click(); + + // # Click on the rename run option + cy.findByText('Link run to a different channel').click(); + + // # type new name + cy.get('.modal-body').within(() => { + // # select town square + cy.findByText(testChannelWith2Runs.display_name).click().type('Town Square{enter}'); + }); + + // # click save + cy.findByTestId('modal-confirm-button').click(); + + // * Verify the run is not there, but we are still in the list (not rhs details) + cy.get('[data-testid="rhs-runs-list"] > div').should('have.length', 1); + }); + }); + }); +}); diff --git a/e2e/cypress/tests/integration/playbooks/channels/rhs/start_run_rhs_spec.js b/e2e/cypress/tests/integration/playbooks/channels/rhs/start_run_rhs_spec.js new file mode 100644 index 0000000000..464057d9a4 --- /dev/null +++ b/e2e/cypress/tests/integration/playbooks/channels/rhs/start_run_rhs_spec.js @@ -0,0 +1,590 @@ +// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. + +// *************************************************************** +// - [#] indicates a test step (e.g. # Go to a page) +// - [*] indicates an assertion (e.g. * Check the title) +// *************************************************************** + +// Stage: @prod +// Group: @playbooks + +describe('channels rhs > start a run', () => { + let testTeam; + let testUser; + let testChannel; + + before(() => { + cy.apiInitSetup().then(({team, user}) => { + testTeam = team; + testUser = user; + }); + }); + + beforeEach(() => { + // # Login as testUser + cy.apiLogin(testUser); + + cy.apiCreateChannel(testTeam.id, 'existing-channel', 'Existing Channel').then(({channel}) => { + testChannel = channel; + }); + }); + + const createPlaybook = ({channelNameTemplate, runSummaryTemplate, channelId, channelMode, title}) => { + const runSummaryTemplateEnabled = Boolean(runSummaryTemplate); + + // # Create a public playbook + return cy.apiCreatePlaybook({ + title: title || 'Public Playbook', + channelNameTemplate, + runSummaryTemplate, + runSummaryTemplateEnabled, + channelMode, + channelId, + teamId: testTeam.id, + makePublic: true, + memberIDs: [testUser.id], + createPublicPlaybookRun: true, + }).then((playbook) => { + cy.wrap(playbook); + }); + }; + + describe('From RHS run list > ', () => { + beforeEach(() => { + // # intercepts telemetry + cy.interceptTelemetry(); + }); + + describe('playbook configured as create new channel', () => { + it('defaults', () => { + // # Fill default values + createPlaybook({ + title: 'Playbook title' + Date.now(), + channelNameTemplate: 'Channel template', + runSummaryTemplate: 'run summary template', + channelMode: 'create_new_channel', + }).then((playbook) => { + // # Visit the selected playbook + cy.visit(`/${testTeam.name}/channels/town-square`); + + // # Open playbooks RHS. + cy.getPlaybooksAppBarIcon().should('be.visible').click(); + + // # Click start a run button + cy.findByTestId('rhs-runlist-start-run').click(); + + cy.get('#root-portal.modal-open').within(() => { + // # Wait the modal to render + cy.wait(500); + + // * Assert we are at playbooks tab + cy.findByText('Select a playbook').should('be.visible'); + + // # Click on the playbook + cy.findAllByText(playbook.title).eq(0).click(); + + // # Wait the modal to render + cy.wait(500); + + // * Assert template name is filled + cy.findByTestId('run-name-input').should('have.value', 'Channel template'); + + // * Assert summary template is filled + cy.findByTestId('run-summary-input').should('have.value', 'run summary template'); + + // # Click start button + cy.findByTestId('modal-confirm-button').click(); + }); + + // * Assert telemetry data + cy.expectTelemetryToContain([{ + name: 'playbookrun_create', + type: 'track', + properties: { + place: 'channels_rhs_runlist', + playbookId: playbook.id, + channelMode: 'create_new_channel', + public: true, + hasPlaybookChanged: true, + hasNameChanged: false, + hasSummaryChanged: false, + hasChannelModeChanged: false, + hasChannelIdChanged: false, + hasPublicChanged: false, + }}, + ], {waitForCalls: 2}); + + // * Verify we are on the channel just created + cy.url().should('include', `/${testTeam.name}/channels/channel-template`); + + // * Verify channel name + cy.get('h2').contains('Beginning of Channel template'); + + // * Verify run RHS + cy.get('#rhsContainer').should('exist').within(() => { + cy.contains('Channel template'); + cy.contains('run summary template'); + }); + }); + }); + + it('change title/summary', () => { + // # Fill default values + createPlaybook({ + title: 'Playbook title' + Date.now(), + channelNameTemplate: 'Channel template', + runSummaryTemplate: 'run summary template', + channelMode: 'create_new_channel', + }).then((playbook) => { + // # Visit the selected playbook + cy.visit(`/${testTeam.name}/channels/town-square`); + + // # Open playbooks RHS. + cy.getPlaybooksAppBarIcon().should('be.visible').click(); + + // # Click start a run button + cy.findByTestId('rhs-runlist-start-run').click(); + + cy.get('#root-portal.modal-open').within(() => { + // # Wait the modal to render + cy.wait(500); + + // * Assert we are at playbooks tab + cy.findByText('Select a playbook').should('be.visible'); + + // # Click on the playbook + cy.findAllByText(playbook.title).eq(0).click(); + + // # Wait the modal to render + cy.wait(500); + + // * Assert template are filled (and force wait to them) + cy.findByTestId('run-name-input').should('have.value', 'Channel template'); + + // * Assert summary template is filled + cy.findByTestId('run-summary-input').should('have.value', 'run summary template'); + + // # Fill run name + cy.findByTestId('run-name-input').clear().type('Test Run Name'); + + // # Fill run summary + cy.findByTestId('run-summary-input').clear().type('Test Run Summary'); + + // # Click start button + cy.findByTestId('modal-confirm-button').click(); + }); + + // * Assert telemetry data + cy.expectTelemetryToContain([{ + name: 'playbookrun_create', + type: 'track', + properties: { + place: 'channels_rhs_runlist', + playbookId: playbook.id, + channelMode: 'create_new_channel', + public: true, + hasPlaybookChanged: true, + hasNameChanged: true, + hasSummaryChanged: true, + hasChannelModeChanged: false, + hasChannelIdChanged: false, + hasPublicChanged: false, + }}, + ]); + + // * Verify we are on the channel just created + cy.url().should('include', `/${testTeam.name}/channels/test-run-name`); + + // * Verify channel name + cy.get('h2').contains('Beginning of Test Run Name'); + + // * Verify run RHS + cy.get('#rhsContainer').should('exist').within(() => { + cy.contains('Test Run Name'); + cy.contains('Test Run Summary'); + }); + }); + }); + + it('change to link to existing channel defaults to current channel', () => { + // # Fill default values + createPlaybook({ + title: 'Playbook title' + Date.now(), + channelNameTemplate: 'Channel template', + runSummaryTemplate: 'run summary template', + channelMode: 'create_new_channel', + }).then((playbook) => { + // # Visit the town square channel + cy.visit(`/${testTeam.name}/channels/town-square`); + + // # Open playbooks RHS. + cy.getPlaybooksAppBarIcon().should('be.visible').click(); + + // # Click start a run button + cy.findByTestId('rhs-runlist-start-run').click(); + + cy.get('#root-portal.modal-open').within(() => { + // # Wait the modal to render + cy.wait(500); + + // * Assert we are at playbooks tab + cy.findByText('Select a playbook').should('be.visible'); + + // # Click on the playbook + cy.findAllByText(playbook.title).eq(0).click(); + + // # Wait the modal to render + cy.wait(500); + + // # Change to link to existing channel + cy.findByTestId('link-existing-channel-radio').click(); + + // * Assert current channel is selected + cy.findByText('Town Square').should('be.visible'); + }); + }); + }); + + it('change to link to existing channel with already selected channel', () => { + // # Fill default values + createPlaybook({ + title: 'Playbook title' + Date.now(), + channelNameTemplate: 'Channel template', + runSummaryTemplate: 'run summary template', + channelMode: 'create_new_channel', + channelId: testChannel.id, + }).then((playbook) => { + // # Visit the town square channel + cy.visit(`/${testTeam.name}/channels/town-square`); + + // # Open playbooks RHS. + cy.getPlaybooksAppBarIcon().should('be.visible').click(); + + // # Click start a run button + cy.findByTestId('rhs-runlist-start-run').click(); + + cy.get('#root-portal.modal-open').within(() => { + // # Wait the modal to render + cy.wait(500); + + // * Assert we are at playbooks tab + cy.findByText('Select a playbook').should('be.visible'); + + // # Click on the playbook + cy.findAllByText(playbook.title).eq(0).click(); + + // # Wait the modal to render + cy.wait(500); + + // # Change to link to existing channel + cy.findByTestId('link-existing-channel-radio').click(); + + // * Assert selected channel is unchanged + cy.findByText(testChannel.display_name).should('be.visible'); + }); + }); + }); + + it('change to link to existing channel', () => { + // # Fill default values + createPlaybook({ + title: 'Playbook title' + Date.now(), + channelNameTemplate: 'Channel template', + runSummaryTemplate: 'run summary template', + channelMode: 'create_new_channel', + }).then((playbook) => { + // # Visit the selected playbook + cy.visit(`/${testTeam.name}/channels/town-square`); + + // # Open playbooks RHS. + cy.getPlaybooksAppBarIcon().should('be.visible').click(); + + // # Click start a run button + cy.findByTestId('rhs-runlist-start-run').click(); + + cy.get('#root-portal.modal-open').within(() => { + // # Wait the modal to render + cy.wait(500); + + // * Assert we are at playbooks tab + cy.findByText('Select a playbook').should('be.visible'); + + // # Click on the playbook + cy.findAllByText(playbook.title).eq(0).click(); + + // # Wait the modal to render + cy.wait(500); + + // # Change to link to existing channel + cy.findByTestId('link-existing-channel-radio').click(); + + // # Fill run name + cy.findByTestId('run-name-input').clear().type('Test Run Name'); + + // # Select test channel instead of current channel + cy.findByText('Town Square').click().type(`${testChannel.display_name}{enter}`); + + // # Click start button + cy.findByTestId('modal-confirm-button').click(); + }); + + // * Assert telemetry data + cy.expectTelemetryToContain([{ + name: 'playbookrun_create', + type: 'track', + properties: { + place: 'channels_rhs_runlist', + playbookId: playbook.id, + channelMode: 'link_existing_channel', + hasPlaybookChanged: true, + hasNameChanged: true, + hasSummaryChanged: false, + hasChannelModeChanged: true, + hasChannelIdChanged: true, + hasPublicChanged: false, + }}, + ]); + + // * Verify we are on the existing channel + cy.url().should('include', `/${testTeam.name}/channels/${testChannel.name}`); + + // * Verify channel name + cy.get('h2').contains(`Beginning of ${testChannel.display_name}`); + + // * Verify run RHS + cy.get('#rhsContainer').should('exist').within(() => { + cy.contains('Test Run Name'); + cy.contains('run summary template'); + }); + }); + }); + }); + + describe('playbook configured as linked to existing channel', () => { + it('defaults', () => { + // # Fill default values + createPlaybook({ + title: 'Playbook title' + Date.now(), + channelNameTemplate: 'Channel template', + runSummaryTemplate: 'run summary template', + channelMode: 'link_existing_channel', + channelId: testChannel.id, + }).then((playbook) => { + // # Visit the selected playbook + cy.visit(`/${testTeam.name}/channels/town-square`); + + // # Open playbooks RHS. + cy.getPlaybooksAppBarIcon().should('be.visible').click(); + + // # Click start a run button + cy.findByTestId('rhs-runlist-start-run').click(); + + cy.get('#root-portal.modal-open').within(() => { + // # Wait the modal to render + cy.wait(500); + + // * Assert we are at playbooks tab + cy.findByText('Select a playbook').should('be.visible'); + + // # Click on the playbook + cy.findAllByText(playbook.title).eq(0).click(); + + // # Wait the modal to render + cy.wait(500); + + // * Assert template name is empty + cy.findByTestId('run-name-input').should('be.empty'); + + // * Assert template summary is filled + cy.findByTestId('run-summary-input').should('have.value', 'run summary template'); + + // # Fill run name + cy.findByTestId('run-name-input').clear().type('Test Run Name'); + + // # Click start button + cy.findByTestId('modal-confirm-button').click(); + }); + + // * Assert telemetry data + cy.expectTelemetryToContain([{ + name: 'playbookrun_create', + type: 'track', + properties: { + place: 'channels_rhs_runlist', + playbookId: playbook.id, + channelMode: 'link_existing_channel', + hasPlaybookChanged: true, + hasNameChanged: true, + hasSummaryChanged: false, + hasChannelModeChanged: false, + hasChannelIdChanged: false, + hasPublicChanged: false, + }}, + ]); + + // * Verify we are on the existing channel + cy.url().should('include', `/${testTeam.name}/channels/${testChannel.name}`); + + // * Verify channel name + cy.get('h2').contains(`Beginning of ${testChannel.display_name}`); + + cy.get('#rhsContainer').should('exist').within(() => { + // * Verify run RHS + cy.contains('Test Run Name'); + cy.contains('run summary template'); + }); + }); + }); + + it('fill initially empty channel', () => { + // # Fill default values + createPlaybook({ + title: 'Playbook title' + Date.now(), + channelNameTemplate: 'Channel template', + runSummaryTemplate: 'run summary template', + channelMode: 'link_existing_channel', + }).then((playbook) => { + // # Visit the selected playbook + cy.visit(`/${testTeam.name}/channels/town-square`); + + // # Open playbooks RHS. + cy.getPlaybooksAppBarIcon().should('be.visible').click(); + + // # Click start a run button + cy.findByTestId('rhs-runlist-start-run').click(); + + cy.get('#root-portal.modal-open').within(() => { + // # Wait the modal to render + cy.wait(500); + + // * Assert we are at playbooks tab + cy.findByText('Select a playbook').should('be.visible'); + + // # Click on the playbook + cy.findAllByText(playbook.title).eq(0).click(); + + // # Wait the modal to render + cy.wait(500); + + // * Assert template name is empty + cy.findByTestId('run-name-input').should('be.empty'); + + // * Assert template summary is filled + cy.findByTestId('run-summary-input').should('have.value', 'run summary template'); + + // # Fill run name + cy.findByTestId('run-name-input').clear().type('Test Run Name'); + + // # Fill Town square as the channel to be linked + cy.findByText('Select a channel').click().type(`${testChannel.display_name}{enter}`); + + // # Click start button + cy.findByTestId('modal-confirm-button').click(); + }); + + // * Assert telemetry data + cy.expectTelemetryToContain([{ + name: 'playbookrun_create', + type: 'track', + properties: { + place: 'channels_rhs_runlist', + playbookId: playbook.id, + channelMode: 'link_existing_channel', + hasPlaybookChanged: true, + hasNameChanged: true, + hasSummaryChanged: false, + hasChannelModeChanged: false, + hasChannelIdChanged: true, + hasPublicChanged: false, + }}, + ]); + + // * Verify we are on the existing channel + cy.url().should('include', `/${testTeam.name}/channels/${testChannel.name}`); + + // * Verify channel name + cy.get('h2').contains(`Beginning of ${testChannel.display_name}`); + + cy.get('#rhsContainer').should('exist').within(() => { + // * Verify run RHS + cy.contains('Test Run Name'); + cy.contains('run summary template'); + }); + }); + }); + + it('change to create new channel', () => { + // # Fill default values + createPlaybook({ + title: 'Playbook title' + Date.now(), + channelNameTemplate: 'Channel template', + runSummaryTemplate: 'run summary template', + channelMode: 'link_existing_channel', + channelId: testChannel.id, + }).then((playbook) => { + // # Visit the selected playbook + cy.visit(`/${testTeam.name}/channels/town-square`); + + // # Open playbooks RHS. + cy.getPlaybooksAppBarIcon().should('be.visible').click(); + + // # Click start a run button + cy.findByTestId('rhs-runlist-start-run').click(); + + cy.get('#root-portal.modal-open').within(() => { + // # Wait the modal to render + cy.wait(500); + + // * Assert we are at playbooks tab + cy.findByText('Select a playbook').should('be.visible'); + + // # Click on the playbook + cy.findAllByText(playbook.title).eq(0).click(); + + // # Wait the modal to render + cy.wait(500); + + // # Change to create new channel + cy.findByTestId('create-channel-radio').click(); + + // # Fill run name + cy.findByTestId('run-name-input').clear().type('Test Run Name'); + + // # Click start button + cy.findByTestId('modal-confirm-button').click(); + }); + + // * Assert telemetry data + cy.expectTelemetryToContain([{ + name: 'playbookrun_create', + type: 'track', + properties: { + place: 'channels_rhs_runlist', + playbookId: playbook.id, + channelMode: 'create_new_channel', + hasPlaybookChanged: true, + hasNameChanged: true, + hasSummaryChanged: false, + hasChannelModeChanged: true, + hasChannelIdChanged: false, + hasPublicChanged: false, + }}, + ]); + + // * Verify we are on the channel just created + cy.url().should('include', `/${testTeam.name}/channels/test-run-name`); + + // * Verify channel name + cy.get('h2').contains('Beginning of Test Run Name'); + + cy.get('#rhsContainer').should('exist').within(() => { + // * Verify run RHS + cy.contains('Test Run Name'); + cy.contains('run summary template'); + }); + }); + }); + }); + }); +}); diff --git a/e2e/cypress/tests/integration/playbooks/channels/rhs/status_update_spec.js b/e2e/cypress/tests/integration/playbooks/channels/rhs/status_update_spec.js new file mode 100644 index 0000000000..63199d54e6 --- /dev/null +++ b/e2e/cypress/tests/integration/playbooks/channels/rhs/status_update_spec.js @@ -0,0 +1,498 @@ +// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. + +// *************************************************************** +// - [#] indicates a test step (e.g. # Go to a page) +// - [*] indicates an assertion (e.g. * Check the title) +// *************************************************************** + +// Stage: @prod +// Group: @playbooks + +/* eslint-disable no-only-tests/no-only-tests */ + +import * as TIMEOUTS from '../../../../fixtures/timeouts'; + +describe('channels > rhs > status update', () => { + const defaultReminderMessage = '# Default reminder message'; + let testTeam; + let testChannel; + let testUser; + let testPlaybook; + let testRun; + + before(() => { + cy.apiInitSetup().then(({team, channel, user}) => { + testTeam = team; + testChannel = channel; + testUser = user; + + // # Login as testUser + cy.apiLogin(testUser); + + // # Create a public playbook + cy.apiCreatePlaybook({ + teamId: testTeam.id, + title: 'Playbook', + userId: testUser, + broadcastChannelIds: [testChannel.id], + reminderTimerDefaultSeconds: 3600, + reminderMessageTemplate: defaultReminderMessage, + retrospectiveEnabled: false, + broadcastEnabled: true, + }).then((playbook) => { + testPlaybook = playbook; + }); + }); + }); + + beforeEach(() => { + // # Size the viewport to show the RHS without covering posts. + cy.viewport('macbook-13'); + + // # Login as testUser + cy.apiLogin(testUser); + + // # Create a new playbook run + const now = Date.now(); + const name = 'Playbook Run (' + now + ')'; + const channelName = 'playbook-run-' + now; + cy.apiRunPlaybook({ + teamId: testTeam.id, + playbookId: testPlaybook.id, + playbookRunName: name, + ownerUserId: testUser.id, + }).then((run) => { + testRun = run; + }); + + // # Navigate directly to the application and the playbook run channel + cy.visit(`/${testTeam.name}/channels/${channelName}`); + }); + + describe('post update dialog', () => { + it('renders description correctly', () => { + // # Run the `/playbook update` slash command. + cy.executeSlashCommand('/playbook update'); + + // # Get dialog modal. + cy.getStatusUpdateDialog().within(() => { + // * Check description + cy.findByTestId('update_run_status_description').contains(`This update for the run ${testRun.name} will be broadcasted to one channel and one direct message.`); + }); + }); + + it.skip('description link navigates to run overview', () => { + // # Run the `/playbook update` slash command. + cy.executeSlashCommand('/playbook update'); + + // # Get dialog modal. + cy.getStatusUpdateDialog().within(() => { + // # Click overview link + cy.findByTestId('run-overview-link').click(); + }); + + // * Check that we are now in run overview page + cy.url().should('include', `/playbooks/runs/${testRun.id}`); + + // * Check that the run actions modal is already opened + cy.findByRole('dialog', {name: /Run Actions/i}).should('exist'); + }); + + it('prevents posting an update message with only whitespace', () => { + // # Run the `/playbook update` slash command. + cy.executeSlashCommand('/playbook update'); + + // # Get dialog modal. + cy.getStatusUpdateDialog().within(() => { + // # Type the invalid data + cy.findByTestId('update_run_status_textbox').clear().type(' {enter} {enter} '); + + // * Verify submit is disabled. + cy.get('button.confirm').should('be.disabled'); + + // # Enter valid data + cy.findByTestId('update_run_status_textbox').type('valid update'); + + // # Submit the dialog. + cy.get('button.confirm').click(); + }); + + // * Verify that the Post update dialog has gone. + cy.getStatusUpdateDialog().should('not.exist'); + }); + + it('lets users with no access to the playbook post an update', () => { + let channelName; + const updateMessage = 'status update ' + Date.now(); + + // # Login as sysadmin and create a private playbook and a run + cy.apiAdminLogin().then(({user: sysadmin}) => { + // # Create a private playbook + cy.apiCreatePlaybook({ + teamId: testTeam.id, + title: 'Playbook - Private', + memberIDs: [sysadmin.id], // Make it accesible only to sysadmin + inviteUsersEnabled: true, + invitedUserIds: [testUser.id], // Invite the test user + }).then((playbook) => { + // # Create a new playbook run + const now = Date.now(); + const name = 'Playbook Run (' + now + ')'; + channelName = 'playbook-run-' + now; + cy.apiRunPlaybook({ + teamId: testTeam.id, + playbookId: playbook.id, + playbookRunName: name, + ownerUserId: sysadmin.id, + }).then((run) => { + cy.apiAddUsersToRun(run.id, [testUser.id]); + }); + }); + }).then(() => { + // # Login as the test user + cy.apiLogin(testUser); + + // # Navigate directly to the application and the playbook run channel + cy.visit(`/${testTeam.name}/channels/${channelName}`); + + // # Run the `/playbook update` slash command. + cy.executeSlashCommand('/playbook update'); + + // # Get dialog modal. + cy.getStatusUpdateDialog().within(() => { + // # Enter valid data + cy.findByTestId('update_run_status_textbox').type(updateMessage); + + // # Submit the dialog. + cy.get('button.confirm').click(); + }); + + // * Verify that the Post update dialog has gone. + cy.getStatusUpdateDialog().should('not.exist'); + + // * Verify that the status update was posted. + cy.getLastPost().within(() => { + cy.findByText(updateMessage).should('exist'); + }); + }); + }); + + it('confirms finishing the run, and remembers changes and reminder when canceled', () => { + const updateMessage = 'This is the update text to test with.'; + const reminderTime = '1 day'; + + // # Run the `/playbook update` slash command. + cy.executeSlashCommand('/playbook update'); + + // # Get the dialog modal. + cy.getStatusUpdateDialog().within(() => { + // * Verify the first message is there. + cy.findByTestId('update_run_status_textbox').within(() => { + cy.findByText(defaultReminderMessage).should('exist'); + }); + + // # Type text to test for later + cy.findByTestId('update_run_status_textbox').clear().type(updateMessage); + + // # Set a new reminder to test for later + cy.openReminderSelector(); + cy.selectReminderTime(reminderTime); + + // # Mark the run as finished + cy.findByTestId('mark-run-as-finished').click({force: true}); + + // # Submit the dialog. + cy.get('button.confirm').click(); + }); + + // * Confirmation should appear + cy.get('.modal-header').should('be.visible').contains('Confirm finish run'); + + // # Cancel + cy.get('#cancelModalButton').click({force: true}); + + // * Verify post update has the same information + cy.getStatusUpdateDialog().within(() => { + // * Verify the message was remembered + cy.findByTestId('update_run_status_textbox').within(() => { + cy.findByText(updateMessage).should('exist'); + }); + + // * Verify the reminder was remembered + cy.get('#reminder_timer_datetime').contains(reminderTime); + + // * Marked run is still checked + cy.findByTestId('mark-run-as-finished').within(() => { + cy.get('[type="checkbox"]').should('be.checked'); + }); + + // # Submit the dialog. + cy.get('button.confirm').click(); + }); + + // * Confirmation should appear + cy.get('.modal-header').should('be.visible').contains('Confirm finish run'); + + // # Submit + cy.get('#confirmModalButton').click({force: true}); + + // * Verify the status update was posted. + cy.getStyledComponent('CustomPostContent').within(() => { + cy.findByText(updateMessage).should('exist'); + }); + + // * Verify the run was finished. + cy.getLastPost().contains(`@${testUser.username} marked ${testRun.name} as finished.`); + }); + + describe('prevents user from losing changes', () => { + it('cancel, go back and save', () => { + // # Run the `/playbook update` slash command. + cy.executeSlashCommand('/playbook update'); + + // # Get dialog modal. + cy.getStatusUpdateDialog().within(() => { + // # Type the invalid data + cy.findByTestId('update_run_status_textbox').clear().type('My valid and important changes that I don\'t want to lose'); + + // * Click cancel + cy.findByTestId('modal-cancel-button').click(); + }); + + // * Go back from unsaved changes modal + cy.get('#confirm-modal-light').within(() => { + cy.findByTestId('modal-cancel-button').click(); + }); + + // # Delay in between the modal switch to ensure the + // # animation has fully happened + cy.wait(TIMEOUTS.TWO_SEC); + + // # Submit the dialog. + cy.get('button.confirm').click(); + + // * Verify that the Post update and unsaved changes modals have gone. + cy.getStatusUpdateDialog().should('not.exist'); + cy.get('#confirm-modal-light').should('not.exist'); + }); + + it('click overview link, go back and save', () => { + // # Run the `/playbook update` slash command. + cy.executeSlashCommand('/playbook update'); + + // # Get dialog modal. + cy.getStatusUpdateDialog().within(() => { + // # Type the invalid data + cy.findByTestId('update_run_status_textbox').clear().type('My valid and important changes that I don\'t want to lose'); + + // # Click overview link + cy.findByTestId('run-overview-link').click(); + }); + + // Verify that the confirmation modal is shown + cy.get('#confirm-modal-light').within(() => { + // * Go back from unsaved changes modal + cy.findByTestId('modal-cancel-button').click(); + }); + + // # Delay in between the modal switch to ensure the + // # animation has fully happened + cy.wait(TIMEOUTS.TWO_SEC); + + // # Submit the dialog. + cy.get('button.confirm').click(); + + // * Verify that the Post update and unsaved changes modals have gone. + cy.getStatusUpdateDialog().should('not.exist'); + cy.get('#confirm-modal-light').should('not.exist'); + }); + + it('cancel and discard explicitly', () => { + // # Run the `/playbook update` slash command. + cy.executeSlashCommand('/playbook update'); + + // # Get dialog modal. + cy.getStatusUpdateDialog().within(() => { + // # Type the invalid data + cy.findByTestId('update_run_status_textbox').clear().type('My valid and important changes that I don\'t want to lose'); + + // * Click cancel + cy.findByTestId('modal-cancel-button').click(); + }); + + // * Discard explicitly from unsaved changes + cy.get('#confirm-modal-light').within(() => { + cy.get('button.confirm').click(); + }); + + // * Verify that the Post update and unsaved changes modals have gone. + cy.getStatusUpdateDialog().should('not.exist'); + cy.get('#confirm-modal-light').should('not.exist'); + }); + + it('click overview link and discard explicitly', () => { + // # Run the `/playbook update` slash command. + cy.executeSlashCommand('/playbook update'); + + // # Get dialog modal. + cy.getStatusUpdateDialog().within(() => { + // # Type the invalid data + cy.findByTestId('update_run_status_textbox').clear().type('My valid and important changes that I don\'t want to lose'); + + // # Click overview link + cy.findByTestId('run-overview-link').click(); + }); + + // * Discard explicitly from unsaved changes + cy.get('#confirm-modal-light').within(() => { + cy.get('button.confirm').click(); + }); + + // * Assert that we are at run overview page. + cy.url().should('include', `/playbooks/runs/${testRun.id}`); + + // * Verify that the Post update and unsaved changes modals have gone. + cy.getStatusUpdateDialog().should('not.exist'); + cy.get('#confirm-modal-light').should('not.exist'); + + // * Verify that the run actions modal is opened. + cy.findByRole('dialog', {name: /Run Actions/i}).should('exist'); + }); + }); + + describe('shows the last update in update message', () => { + it('shows the default when we have not made an update before', () => { + // # Run the `/playbook update` slash command. + cy.executeSlashCommand('/playbook update'); + + // # Get the dialog modal. + cy.getStatusUpdateDialog().within(() => { + // * Verify the first message is there. + cy.findByTestId('update_run_status_textbox').within(() => { + cy.findByText(defaultReminderMessage).should('exist'); + }); + }); + }); + + it('when we have made a previous update', () => { + const now = Date.now(); + const firstMessage = 'Update - ' + now; + + // # Create a first status update + cy.updateStatus(firstMessage); + + // # Run the `/playbook update` slash command. + cy.executeSlashCommand('/playbook update'); + + // # Get the dialog modal. + cy.getStatusUpdateDialog().within(() => { + // * Verify the first message is there. + cy.findByTestId('update_run_status_textbox').within(() => { + cy.findByText(firstMessage).should('exist'); + }); + }); + }); + }); + }); + + describe('the default reminder', () => { + it('shows the configured default when we have not made a previous update', () => { + // # Run the `/playbook update` slash command. + cy.executeSlashCommand('/playbook update'); + + // # Get the dialog modal. + cy.getStatusUpdateDialog().within(() => { + // * Verify the default is as expected + cy.get('#reminder_timer_datetime').within(() => { + cy.get('[class$=singleValue]').should('have.text', '1 hour'); + }); + }); + }); + + it('shows the last reminder we typed in: 15 minutes', () => { + const now = Date.now(); + const firstMessage = 'Update - ' + now; + + // # Create a first status update + cy.updateStatus(firstMessage, '15 minutes'); + + // # Run the `/playbook update` slash command. + cy.executeSlashCommand('/playbook update'); + + // # Get the dialog modal. + cy.getStatusUpdateDialog().within(() => { + // * Verify the default is as expected + cy.get('#reminder_timer_datetime').within(() => { + cy.get('[class$=singleValue]').should('have.text', '15 minutes'); + }); + }); + }); + + it('shows the last reminder we typed in: 90 minutes', () => { + const now = Date.now(); + const firstMessage = 'Update - ' + now; + + // # Create a first status update + cy.updateStatus(firstMessage, '90 minutes'); + + // # Run the `/playbook update` slash command. + cy.executeSlashCommand('/playbook update'); + + // # Get the dialog modal. + cy.getStatusUpdateDialog().within(() => { + // * Verify the default is as expected + cy.get('#reminder_timer_datetime').within(() => { + cy.get('[class$=singleValue]').should('have.text', '1 hour, 30 minutes'); + }); + }); + }); + + it('shows the last reminder we typed in: 7 days', () => { + const now = Date.now(); + const firstMessage = 'Update - ' + now; + + // # Create a first status update + cy.updateStatus(firstMessage, '7 days'); + + // # Run the `/playbook update` slash command. + cy.executeSlashCommand('/playbook update'); + + // # Get the dialog modal. + cy.getStatusUpdateDialog().within(() => { + // * Verify the default is as expected + cy.get('#reminder_timer_datetime').within(() => { + cy.get('[class$=singleValue]').should('have.text', '7 days'); + }); + }); + }); + }); + + describe('playbook with disabled status updates', () => { + before(() => { + // # Login as testUser + cy.apiLogin(testUser); + + // # Create a public playbook + cy.apiCreatePlaybook({ + teamId: testTeam.id, + title: 'Playbook', + userId: testUser, + broadcastChannelId: testChannel.id, + statusUpdateEnabled: false, + }).then((playbook) => { + testPlaybook = playbook; + }); + }); + + describe('omit status update dialog when status updates are disabled', () => { + it('shows the default when we have not made an update before', () => { + // * Check if RHS section is loaded + cy.get('#rhs-about').should('exist'); + + // * Check if Post Update section is omitted + cy.get('#rhs-post-update').should('not.exist'); + }); + }); + }); +}); diff --git a/e2e/cypress/tests/integration/playbooks/channels/rhs/template_spec.js b/e2e/cypress/tests/integration/playbooks/channels/rhs/template_spec.js new file mode 100644 index 0000000000..3512a368ab --- /dev/null +++ b/e2e/cypress/tests/integration/playbooks/channels/rhs/template_spec.js @@ -0,0 +1,82 @@ +// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. + +// *************************************************************** +// - [#] indicates a test step (e.g. # Go to a page) +// - [*] indicates an assertion (e.g. * Check the title) +// *************************************************************** + +// Stage: @prod +// Group: @playbooks + +describe('channels > rhs > template', () => { + let team1; + let testUser; + + beforeEach(() => { + cy.apiAdminLogin().then(() => { + cy.apiInitSetup().then(({team, user}) => { + team1 = team; + testUser = user; + + // # Size the viewport to show the RHS without covering posts. + cy.viewport('macbook-13'); + + // # Login as testUser + cy.apiLogin(testUser); + }); + }); + }); + + describe('create playbook', () => { + describe('open new playbook creation modal and navigates to playbooks', () => { + it('after clicking on Use', () => { + // # Switch to playbooks DM channel + cy.visit(`/${team1.name}/messages/@playbooks`); + + // * Checking the bot badge as an indicator of page + // * stability / rendering finished + cy.findByText('BOT').should('be.visible'); + + // # Open playbooks RHS. + cy.getPlaybooksAppBarIcon().should('be.visible').click(); + + // # Return first template (Blank) + cy.contains('Blank').click(); + + // * Assert playbooks creation modal is shown. + cy.get('#playbooks_create').should('exist'); + + // # Click create playbook button. + cy.get('button[data-testid=modal-confirm-button]').click(); + + // * Assert expected playbook template title in outline. + cy.findByTestId('playbook-editor-title').contains('Blank'); + }); + + it('after clicking on title', () => { + // # Switch to playbooks DM channel + cy.visit(`/${team1.name}/messages/@playbooks`); + + // * Checking the bot badge as an indicator of page + // * stability / rendering finished + cy.findByText('BOT').should('be.visible'); + + // # Open playbooks RHS. + cy.getPlaybooksAppBarIcon().should('be.visible').click(); + + // # Return first template (Blank) + cy.contains('Use').click(); + + // * Assert playbooks creation modal is shown. + cy.get('#playbooks_create').should('exist'); + + // # Click create playbook button. + cy.get('button[data-testid=modal-confirm-button]').click(); + + // * Assert expected playbook template title in outline. + cy.findByTestId('playbook-editor-title').contains('Blank'); + }); + }); + }); +}); diff --git a/e2e/cypress/tests/integration/playbooks/channels/rhs/title_spec.js b/e2e/cypress/tests/integration/playbooks/channels/rhs/title_spec.js new file mode 100644 index 0000000000..c78c1655a8 --- /dev/null +++ b/e2e/cypress/tests/integration/playbooks/channels/rhs/title_spec.js @@ -0,0 +1,94 @@ +// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. + +// *************************************************************** +// - [#] indicates a test step (e.g. # Go to a page) +// - [*] indicates an assertion (e.g. * Check the title) +// *************************************************************** + +// Stage: @prod +// Group: @playbooks + +describe('channels > rhs > title', () => { + let testTeam; + let testUser; + let testPlaybook; + let playbookRunChannelName; + let testPlaybookRun; + + const getHeaderTitle = () => cy.get('#rhsContainer').find('.sidebar--right__title'); + + before(() => { + cy.apiInitSetup().then(({team, user}) => { + testTeam = team; + testUser = user; + + cy.apiLogin(testUser); + + // # Create a playbook + cy.apiCreateTestPlaybook({ + teamId: testTeam.id, + title: 'Playbook', + userId: testUser.id, + }).then((playbook) => { + testPlaybook = playbook; + }); + }); + }); + + beforeEach(() => { + // # Login as testUser + cy.apiLogin(testUser); + + // # Size the viewport to show the RHS without covering posts. + cy.viewport('macbook-13'); + + // # Run the playbook + const now = Date.now(); + const playbookRunName = 'Playbook Run (' + now + ')'; + playbookRunChannelName = 'playbook-run-' + now; + cy.apiRunPlaybook({ + teamId: testTeam.id, + playbookId: testPlaybook.id, + playbookRunName, + ownerUserId: testUser.id, + }).then((run) => { + testPlaybookRun = run; + }); + + // # Navigate directly to the application and the playbook run channel + cy.visit(`/${testTeam.name}/channels/${playbookRunChannelName}`); + }); + + it('has title', () => { + // * Verify the title is displayed + getHeaderTitle().contains('Run details'); + }); + + it('has following button', () => { + // * Verify the following button is displayed + getHeaderTitle().find('button.unfollowButton').contains('Following'); + + // * Verify the follow button is not displayed + getHeaderTitle().find('button.followButton').should('not.exist'); + }); + + it('can stop following', () => { + // # Click the following button + getHeaderTitle().find('button.unfollowButton').click(); + + // * Verify the following button is not displayed + getHeaderTitle().find('button.unfollowButton').should('not.exist'); + + // * Verify the follow button is displayed + getHeaderTitle().find('button.followButton').contains('Follow'); + }); + + it('can navigate to RDP', () => { + // # Click the title + getHeaderTitle().findByTestId('rhs-title').click(); + + // * assert url is RDP + cy.url().should('include', `/playbooks/runs/${testPlaybookRun.id}`); + }); +}); diff --git a/e2e/cypress/tests/integration/playbooks/channels/rhs_spec.js b/e2e/cypress/tests/integration/playbooks/channels/rhs_spec.js new file mode 100644 index 0000000000..d82d30453c --- /dev/null +++ b/e2e/cypress/tests/integration/playbooks/channels/rhs_spec.js @@ -0,0 +1,417 @@ +// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. + +// *************************************************************** +// - [#] indicates a test step (e.g. # Go to a page) +// - [*] indicates an assertion (e.g. * Check the title) +// *************************************************************** + +// Stage: @prod +// Group: @playbooks + +import * as TIMEOUTS from '../../../fixtures/timeouts'; + +describe('channels > rhs', () => { + let testTeam; + let testUser; + let testPlaybook; + + before(() => { + cy.apiInitSetup().then(({team, user}) => { + testTeam = team; + testUser = user; + + // # Login as testUser + cy.apiLogin(testUser); + + // # Create a public playbook + cy.apiCreatePlaybook({ + teamId: testTeam.id, + title: 'Playbook', + memberIDs: [], + }).then((playbook) => { + testPlaybook = playbook; + }); + }); + }); + + beforeEach(() => { + // # Login as testUser + cy.apiLogin(testUser); + }); + + describe('does not open', () => { + it('when navigating to a non-playbook run channel', () => { + // # Navigate to the application + cy.visit(`/${testTeam.name}/`); + + // # Select a channel without a playbook run. + cy.get('#sidebarItem_off-topic').click({force: true}); + + // # Wait until the channel loads enough to show the post textbox. + cy.get('#post-create').should('exist'); + + // # Wait a bit longer to be confident. + cy.wait(TIMEOUTS.TWO_SEC); + + // * Verify the playbook run RHS is not open. + cy.get('#rhsContainer').should('not.exist'); + }); + + it('when navigating to a playbook run channel with the RHS already open', () => { + // # Navigate to the application. + cy.visit(`/${testTeam.name}/`); + + // # Select a channel without a playbook run. + cy.get('#sidebarItem_off-topic').click({force: true}); + + // # Run the playbook after loading the application + const now = Date.now(); + const playbookRunName = 'Playbook Run (' + now + ')'; + const playbookRunChannelName = 'playbook-run-' + now; + cy.apiRunPlaybook({ + teamId: testTeam.id, + playbookId: testPlaybook.id, + playbookRunName, + ownerUserId: testUser.id, + }); + + // # Open the flagged posts RHS + cy.get('body').then(($body) => { + if ($body.find('#channelHeaderFlagButton').length > 0) { + cy.get('#channelHeaderFlagButton').click({force: true}); + } else { + cy.findByRole('button', {name: 'Saved posts'}). + click({force: true}); + } + }); + + // # Open the playbook run channel from the LHS. + cy.get(`#sidebarItem_${playbookRunChannelName}`).click({force: true}); + + // # Wait until the channel loads enough to show the post textbox. + cy.get('#post-create').should('exist'); + + // # Wait a bit longer to be confident. + cy.wait(TIMEOUTS.TWO_SEC); + + // * Verify the playbook run RHS is not open. + cy.get('#rhsContainer').should('not.exist'); + }); + + it('when navigating directly to a finished playbook run channel', () => { + // # Run the playbook + const now = Date.now(); + const playbookRunName = 'Playbook Run (' + now + ')'; + const playbookRunChannelName = 'playbook-run-' + now; + cy.apiRunPlaybook({ + teamId: testTeam.id, + playbookId: testPlaybook.id, + playbookRunName, + ownerUserId: testUser.id, + }).then((playbookRun) => { + // # End the playbook run + cy.apiFinishRun(playbookRun.id); + }); + + // # Navigate directly to the application and the playbook run channel + cy.visit(`/${testTeam.name}/channels/${playbookRunChannelName}`); + + // # Wait a bit longer to be confident. + cy.wait(TIMEOUTS.TWO_SEC); + + // * Verify the playbook run RHS is not open. + cy.get('#rhsContainer').should('not.exist'); + }); + + it('for an existing, finished playbook run channel opened from the lhs', () => { + // # Run the playbook before loading the application + const now = Date.now(); + const playbookRunName = 'Playbook Run (' + now + ')'; + const playbookRunChannelName = 'playbook-run-' + now; + + cy.apiRunPlaybook({ + teamId: testTeam.id, + playbookId: testPlaybook.id, + playbookRunName, + ownerUserId: testUser.id, + }).then((playbookRun) => { + // # End the playbook run + cy.apiFinishRun(playbookRun.id); + }); + + // # Navigate to a channel without a playbook run. + cy.visit(`/${testTeam.name}/channels/off-topic`); + + // # Ensure the channel is loaded before continuing (allows redux to sync). + cy.findByTestId('post_textbox').should('exist'); + + // # Open the playbook run channel from the LHS. + cy.get(`#sidebarItem_${playbookRunChannelName}`).click({force: true}); + + // # Wait a bit longer to be confident. + cy.wait(TIMEOUTS.TWO_SEC); + + // * Verify the playbook run RHS is not open. + cy.get('#rhsContainer').should('not.exist'); + }); + + it('for a new, finished playbook run channel opened from the lhs', () => { + // # Navigate to the application. + cy.visit(`/${testTeam.name}/`); + + // # Ensure the channel is loaded before continuing (allows redux to sync). + cy.findByTestId('post_textbox').should('exist'); + + // # Select a channel without a playbook run. + cy.get('#sidebarItem_off-topic').click({force: true}); + + // * Verify the playbook run RHS is not open. + cy.get('#rhsContainer').should('not.exist'); + + // # Run the playbook after loading the application + const now = Date.now(); + const playbookRunName = 'Playbook Run (' + now + ')'; + const playbookRunChannelName = 'playbook-run-' + now; + cy.apiRunPlaybook({ + teamId: testTeam.id, + playbookId: testPlaybook.id, + playbookRunName, + ownerUserId: testUser.id, + }).then((playbookRun) => { + // # Wait a bit longer to avoid websocket events potentially being out-of-order. + cy.wait(TIMEOUTS.TWO_SEC); + + // # End the playbook run + cy.apiFinishRun(playbookRun.id); + }); + + // # Wait because this test is flaky if we move too quickly + cy.wait(TIMEOUTS.FIVE_SEC); + + // # Open the playbook run channel from the LHS. + cy.get(`#sidebarItem_${playbookRunChannelName}`).click({force: true}); + + // # Wait a bit longer to be confident. + cy.wait(TIMEOUTS.FIVE_SEC); + + // * Verify the playbook run RHS is not open. + cy.get('#rhsContainer').should('not.exist'); + }); + + it('when starting a new run of a newly-created playbook created from RHS in a newly-created channel', () => { + // # Create a new channel + const channelName = 'playbook-test-' + Date.now(); + cy.apiCreateChannel(testTeam.id, channelName, channelName, 'O').then(({channel}) => { + // # Navigate to the new channel + cy.visit(`/${testTeam.name}/channels/${channel.name}`); + + // # Open RHS + cy.getPlaybooksAppBarIcon().click(); + + // # Wait a bit + cy.wait(TIMEOUTS.TWO_SEC); + + // # open start run dialog + cy.findByTestId('rhs-runlist-start-run').click(); + + // # Create a new playbook + cy.findByText('Create new playbook').click(); + + // # confirm new playbook creation (with defaults) + cy.findByTestId('modal-confirm-button').click(); + + // * Verify we're in the playbook edit screen + cy.findByTestId('playbook-members'); + + // # Run the playbook + cy.findByTestId('run-playbook').click(); + cy.findByTestId('run-name-input').type('Playbook Run'); + + // # Link to the new channel + cy.findByTestId('link-existing-channel-radio').click(); + cy.get('#link-existing-channel-selector input').type(`${channel.name}{enter}`, {force: true}); + + cy.findByTestId('modal-confirm-button').click(); + + // # Wait a bit + cy.wait(TIMEOUTS.FIVE_SEC); + + // * Verify the playbook run RHS is not open. + cy.get('#rhsContainer').should('not.exist'); + }); + }); + }); + + describe('opens', () => { + it('when navigating directly to an ongoing playbook run channel', () => { + // # Run the playbook + const now = Date.now(); + const playbookRunName = 'Playbook Run (' + now + ')'; + const playbookRunChannelName = 'playbook-run-' + now; + cy.apiRunPlaybook({ + teamId: testTeam.id, + playbookId: testPlaybook.id, + playbookRunName, + ownerUserId: testUser.id, + }); + + // # Navigate directly to the application and the playbook run channel + cy.visit(`/${testTeam.name}/channels/${playbookRunChannelName}`); + + // * Verify the playbook run RHS is open. + cy.get('#rhsContainer').should('exist').within(() => { + cy.findByText(playbookRunName).should('exist'); + }); + }); + + it('for a new, ongoing playbook run channel opened from the lhs', () => { + // # Navigate to the application. + cy.visit(`/${testTeam.name}/`); + + // # Ensure the channel is loaded before continuing (allows redux to sync). + cy.findByTestId('post_textbox').should('exist'); + + // # Select a channel without a playbook run. + cy.get('#sidebarItem_off-topic').click({force: true}); + + // # Run the playbook after loading the application + const now = Date.now(); + const playbookRunName = 'Playbook Run (' + now + ')'; + const playbookRunChannelName = 'playbook-run-' + now; + cy.apiRunPlaybook({ + teamId: testTeam.id, + playbookId: testPlaybook.id, + playbookRunName, + ownerUserId: testUser.id, + }); + + // # Open the playbook run channel from the LHS. + cy.get(`#sidebarItem_${playbookRunChannelName}`).click({force: true}); + + // * Verify the playbook run RHS is open. + cy.get('#rhsContainer').should('exist').within(() => { + cy.findByText(playbookRunName).should('exist'); + }); + }); + + it('for an existing, ongoing playbook run channel opened from the lhs', () => { + // # Run the playbook before loading the application + const now = Date.now(); + const playbookRunName = 'Playbook Run (' + now + ')'; + const playbookRunChannelName = 'playbook-run-' + now; + cy.apiRunPlaybook({ + teamId: testTeam.id, + playbookId: testPlaybook.id, + playbookRunName, + ownerUserId: testUser.id, + }); + + // # Navigate to a channel without a playbook run. + cy.visit(`/${testTeam.name}/channels/off-topic`); + + // # Ensure the channel is loaded before continuing (allows redux to sync). + cy.findByTestId('post_textbox').should('exist'); + + // # Open the playbook run channel from the LHS. + cy.get(`#sidebarItem_${playbookRunChannelName}`).click({force: true}); + + // * Verify the playbook run RHS is open. + cy.get('#rhsContainer').should('exist').within(() => { + cy.findByText(playbookRunName).should('exist'); + }); + }); + + it('when starting a playbook run', () => { + // # Navigate to the application and a channel without a playbook run + cy.visit(`/${testTeam.name}/channels/off-topic`); + + // # Start a playbook run with a slash command + const now = Date.now(); + const playbookRunName = 'Playbook Run (' + now + ')'; + + cy.startPlaybookRunWithSlashCommand('Playbook', playbookRunName); + + // * Verify the playbook run RHS is open. + cy.get('#rhsContainer').should('exist').within(() => { + cy.findByText(playbookRunName).should('exist'); + }); + }); + + it('when starting a playbook run when rhs is already open', () => { + // # Navigate to the application and a channel without a playbook run + cy.visit(`/${testTeam.name}/channels/off-topic`); + + // # Wait until the channel loads enough to show the post textbox. + cy.get('#post-create').should('exist'); + + // # Open the saved posts RHS + cy.findByRole('button', {name: 'Saved posts'}). + click({force: true}); + + // * Verify Saved Posts is open + cy.get('.sidebar--right__title').should('contain.text', 'Saved Posts'); + + // # Start a playbook run with a slash command + const now = Date.now(); + const playbookRunName = 'Playbook Run (' + now + ')'; + cy.startPlaybookRunWithSlashCommand('Playbook', playbookRunName); + + // * Verify the playbook run RHS is open. + cy.get('#rhsContainer').should('exist').within(() => { + cy.findByText(playbookRunName).should('exist'); + }); + }); + + it('when navigating directly to a finished playbook run channel and clicking on the button', () => { + // # Run the playbook + const now = Date.now(); + const playbookRunName = 'Playbook Run (' + now + ')'; + const playbookRunChannelName = 'playbook-run-' + now; + cy.apiRunPlaybook({ + teamId: testTeam.id, + playbookId: testPlaybook.id, + playbookRunName, + ownerUserId: testUser.id, + }).then((playbookRun) => { + // # End the playbook run + cy.apiFinishRun(playbookRun.id); + }); + + // # Navigate directly to the application and the playbook run channel + cy.visit(`/${testTeam.name}/channels/${playbookRunChannelName}`); + + // # Click the icon + cy.getPlaybooksAppBarIcon().should('be.visible').click(); + + // * Verify no active runs screen shows + cy.get('#rhsContainer').should('exist').within(() => { + cy.findByTestId('no-active-runs').should('exist'); + }); + }); + }); + + describe('is toggled', () => { + it('by icon in channel header', () => { + // # Size the viewport to show plugin icons even when RHS is open + cy.viewport('macbook-13'); + + // # Navigate to the application and a channel without a playbook run + cy.visit(`/${testTeam.name}/channels/off-topic`); + + // # Click the icon + cy.getPlaybooksAppBarIcon().should('be.visible').click(); + + // * Verify RHS Home is open. + cy.get('#rhsContainer').should('exist').within(() => { + cy.findByText('Playbooks').should('exist'); + }); + + // # Click the icon + cy.getPlaybooksAppBarIcon().should('be.visible').click(); + + // * Verify the playbook run RHS is no longer open. + cy.get('#rhsContainer').should('not.exist'); + }); + }); +}); diff --git a/e2e/cypress/tests/integration/playbooks/channels/run_dialog_spec.js b/e2e/cypress/tests/integration/playbooks/channels/run_dialog_spec.js new file mode 100644 index 0000000000..bead72f4cc --- /dev/null +++ b/e2e/cypress/tests/integration/playbooks/channels/run_dialog_spec.js @@ -0,0 +1,132 @@ +// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. + +// *************************************************************** +// - [#] indicates a test step (e.g. # Go to a page) +// - [*] indicates an assertion (e.g. * Check the title) +// *************************************************************** + +// Stage: @prod +// Group: @playbooks + +describe('channels > run dialog', () => { + let testTeam; + let testUser; + + before(() => { + cy.apiInitSetup().then(({team, user}) => { + testTeam = team; + testUser = user; + + // # Login as testUser + cy.apiLogin(testUser); + + // # Create a public playbook + cy.apiCreatePlaybook({ + teamId: testTeam.id, + title: 'Playbook', + memberIDs: [], + createPublicPlaybookRun: true, + }); + + // # Create a second playbook, so as to force dropdown. + cy.apiCreatePlaybook({ + teamId: testTeam.id, + title: 'Second Playbook', + memberIDs: [], + createPublicPlaybookRun: true, + }); + }); + }); + + beforeEach(() => { + // # Login as testUser + cy.apiLogin(testUser); + + // # Navigate to the application + cy.visit(`${testTeam.name}`); + + // # Trigger the playbook run creation dialog + cy.openPlaybookRunDialogFromSlashCommand(); + + // * Verify the playbook run creation dialog has opened + cy.get('#interactiveDialogModal').should('exist').within(() => { + cy.findByText('Start run').should('exist'); + }); + }); + + it('cannot create a playbook run without filling required fields', () => { + cy.get('#interactiveDialogModal').within(() => { + cy.findByText('Start run').should('exist'); + + // # Attempt to submit + cy.get('#interactiveDialogSubmit').click(); + }); + + // * Verify it didn't submit + cy.get('#interactiveDialogModal').should('exist'); + + // * Verify required fields + cy.findByTestId('autoCompleteSelector').contains('Playbook'); + cy.findByTestId('autoCompleteSelector').contains('This field is required.'); + cy.findByTestId('playbookRunName').contains('This field is required.'); + }); + + it('rejects invalid channel names', () => { + cy.selectPlaybookFromDropdown('Playbook'); + + const invalidPlaybookRunName = ' '; + cy.get('#interactiveDialogModal').within(() => { + cy.findByTestId('playbookRunNameinput').type(invalidPlaybookRunName, {force: true}); + }); + + cy.get('#interactiveDialogModal').within(() => { + cy.findByText('Start run').should('exist'); + + // # Attempt to submit + cy.get('#interactiveDialogSubmit').click(); + }); + + // * Verify it didn't submit + cy.get('#interactiveDialogModal').should('exist'); + + // * Verify error message + cy.get('#interactiveDialogModal').within(() => { + cy.get('div.error-text').contains('unable to create playbook run'); + }); + }); + + it('shows expected metadata', () => { + cy.get('#interactiveDialogModal').within(() => { + // * Shows current user as owner. + cy.findByText(`${testUser.first_name} ${testUser.last_name}`).should('exist'); + + // * Verify playbook dropdown prompt + cy.findByText('Playbook').should('exist'); + + // * Verify playbook run name prompt + cy.findByText('Run name').should('exist'); + }); + }); + + it('is canceled when cancel is clicked', () => { + // # Populate the interactive dialog + const playbookRunName = 'New Run' + Date.now(); + cy.get('#interactiveDialogModal').within(() => { + cy.findByTestId('playbookRunNameinput').type('Playbook', {force: true}); + }); + + // # Cancel the interactive dialog + cy.get('#interactiveDialogCancel').click(); + + // * Verify the modal is no longer displayed + cy.get('#interactiveDialogModal').should('not.exist'); + + // * Verify the playbook run did not get created + cy.apiGetAllPlaybookRuns(testTeam.id).then((response) => { + const allPlaybookRuns = response.body; + const playbookRun = allPlaybookRuns.items.find((inc) => inc.name === playbookRunName); + expect(playbookRun).to.be.undefined; + }); + }); +}); diff --git a/e2e/cypress/tests/integration/playbooks/channels/run_spec.js b/e2e/cypress/tests/integration/playbooks/channels/run_spec.js new file mode 100644 index 0000000000..051b28be0a --- /dev/null +++ b/e2e/cypress/tests/integration/playbooks/channels/run_spec.js @@ -0,0 +1,111 @@ +// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. + +// *************************************************************** +// - [#] indicates a test step (e.g. # Go to a page) +// - [*] indicates an assertion (e.g. * Check the title) +// *************************************************************** + +// Stage: @prod +// Group: @playbooks + +describe('channels > run', () => { + let testTeam; + let testUser; + let testPrivateChannel; + + before(() => { + cy.apiInitSetup().then(({team, user}) => { + testTeam = team; + testUser = user; + + // # Login as testUser + cy.apiLogin(testUser); + + // # Create a playbook + cy.apiCreatePlaybook({ + teamId: team.id, + title: 'Playbook', + memberIDs: [user.id], + }); + + // # Create a private channel + cy.apiCreateChannel( + testTeam.id, + 'private-channel', + 'Private Channel', + 'P', + ).then(({channel}) => { + testPrivateChannel = channel; + }); + }); + }); + + beforeEach(() => { + // # Login as testUser + cy.apiLogin(testUser); + + // # Size the viewport to show plugin icons even when RHS is open + cy.viewport('macbook-13'); + }); + + describe('via slash command', () => { + it('while viewing a public channel', () => { + // # Visit a public channel + cy.visit(`/${testTeam.name}/channels/off-topic`); + + // * Verify that playbook run can be started with slash command + const playbookRunName = 'Public ' + Date.now(); + cy.startPlaybookRunWithSlashCommand('Playbook', playbookRunName); + cy.verifyPlaybookRunActive(testTeam.id, playbookRunName); + }); + + it('while viewing a private channel', () => { + // # Visit a private channel + cy.visit(`/${testTeam.name}/channels/${testPrivateChannel.name}`); + + // * Verify that playbook run can be started with slash command + const playbookRunName = 'Private ' + Date.now(); + cy.startPlaybookRunWithSlashCommand('Playbook', playbookRunName); + cy.verifyPlaybookRunActive(testTeam.id, playbookRunName); + }); + }); + + describe('via post menu', () => { + it('while viewing a public channel', () => { + // # Visit a public channel + cy.visit(`/${testTeam.name}/channels/off-topic`); + + // * Verify that playbook run can be started from post menu + const playbookRunName = 'Public - ' + Date.now(); + cy.startPlaybookRunFromPostMenu('Playbook', playbookRunName); + cy.verifyPlaybookRunActive(testTeam.id, playbookRunName); + }); + + it('while viewing a private channel', () => { + // # Visit a private channel + cy.visit(`/${testTeam.name}/channels/${testPrivateChannel.name}`); + + // * Verify that playbook run can be started from post menu + const playbookRunName = 'Private - ' + Date.now(); + cy.startPlaybookRunFromPostMenu('Playbook', playbookRunName); + cy.verifyPlaybookRunActive(testTeam.id, playbookRunName); + }); + }); + + it('always as channel admin', () => { + // # Visit a public channel + cy.visit(`/${testTeam.name}/channels/off-topic`); + + // # Start a playbook run with a slash command + const playbookRunName = 'Public ' + Date.now(); + cy.startPlaybookRunWithSlashCommand('Playbook', playbookRunName); + cy.verifyPlaybookRunActive(testTeam.id, playbookRunName); + + // # Open the channel header + cy.get('#channelHeaderTitle').click(); + + // * Verify the ability to edit the channel header exists + cy.get('#channelEditHeader').should('exist'); + }); +}); diff --git a/e2e/cypress/tests/integration/playbooks/channels/slash_command/commands_spec.js b/e2e/cypress/tests/integration/playbooks/channels/slash_command/commands_spec.js new file mode 100644 index 0000000000..eb36e00817 --- /dev/null +++ b/e2e/cypress/tests/integration/playbooks/channels/slash_command/commands_spec.js @@ -0,0 +1,558 @@ +// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. + +// *************************************************************** +// - [#] indicates a test step (e.g. # Go to a page) +// - [*] indicates an assertion (e.g. * Check the title) +// *************************************************************** + +// Stage: @prod +// Group: @playbooks + +import {switchToChannel} from '../../../channels/mark_as_unread/helpers'; + +describe('channels > slash command > owner', () => { + let testTeam; + let testUser; + let testUser2; + let testPlaybook; + let playbookRunName; + let playbookRunChannelName; + + before(() => { + cy.apiInitSetup().then(({team, user}) => { + testTeam = team; + testUser = user; + + cy.apiCreateUser().then(({user: user2}) => { + testUser2 = user2; + cy.apiAddUserToTeam(testTeam.id, testUser2.id); + }); + + cy.apiLogin(testUser); + + cy.apiCreatePlaybook({ + teamId: testTeam.id, + title: 'Playbook', + checklists: [ + { + title: 'Stage 1', + items: [ + {title: 'Step 1'}, + {title: 'Step 2'}, + ], + }, + { + title: 'Stage 2', + items: [ + {title: 'Step 1'}, + {title: 'Step 2'}, + ], + }, + ], + memberIDs: [testUser.id], + }).then((playbook) => { + testPlaybook = playbook; + const now = Date.now(); + playbookRunName = `Playbook Run (${now})`; + playbookRunChannelName = `playbook-run-${now}`; + + cy.apiRunPlaybook({ + teamId: testTeam.id, + playbookId: testPlaybook.id, + playbookRunName, + ownerUserId: testUser.id, + }); + }); + }); + }); + + beforeEach(() => { + // # Login as testUser + cy.apiLogin(testUser); + + // # Size the viewport to show the RHS without covering posts. + cy.viewport('macbook-13'); + + // # Navigate directly to the application and the playbook run channel + cy.visit(`/${testTeam.name}/channels/${playbookRunChannelName}`); + }); + + describe('single run channel', () => { + it('check', () => { + // # Type a command + cy.findByTestId('post_textbox').clear().type('/playbook check '); + + // * Verify suggestions number: a single run with 4 tasks + 1 title + cy.get('.slash-command').should('have.length', 5); + + // # Clear input + cy.findByTestId('post_textbox').clear(); + + // # Run a slash command with correct parameters + cy.executeSlashCommand('/playbook check 1 1'); + + // * Verify the task is checked + cy.get('[data-rbd-droppable-id="1"]').find('.checkbox').eq(1).should('be.checked'); + }); + + it('check add', () => { + // # Run a slash command with correct parameters + cy.executeSlashCommand('/playbook checkadd 1 new-task'); + + // * Verify the task was added + cy.get('[data-rbd-droppable-id="1"]').contains('new-task'); + }); + + it('check remove', () => { + // # Run a slash command with correct parameters + cy.executeSlashCommand('/playbook checkremove 1 1'); + + // * Verify the task was added + cy.get('[data-rbd-droppable-id="1"]').contains('Step 2').should('not.exist'); + }); + + it('owner', () => { + // # Run a slash command + cy.executeSlashCommand('/playbook owner'); + + // * Verify the message. + cy.verifyEphemeralMessage(`@${testUser.username} is the current owner for this playbook run.`); + + // # Run a slash command + cy.executeSlashCommand(`/playbook owner @${testUser2.username}`); + + // * Verify that the owner was set. + cy.executeSlashCommand('/playbook owner'); + cy.verifyEphemeralMessage(`@${testUser2.username} is the current owner for this playbook run.`); + }); + + it('timeline', () => { + // # Run a slash command on a run with view access + cy.executeSlashCommand('/playbook timeline'); + + // * Verify the message. + cy.verifyEphemeralMessage(`Timeline for ${playbookRunName}`); + }); + + it('finish', () => { + // # Run a slash command with correct parameters + cy.executeSlashCommand('/playbook finish'); + + // * Verify confirm modal is visible. + cy.get('#interactiveDialogModalLabel').should('exist'); + + // # Confirm finish + cy.get('#interactiveDialogSubmit').click(); + + // * Verify that the run is finished. + cy.get('#rhsContainer').findByTestId('badge').contains('Finished'); + }); + }); + + describe('multiple runs in the channel', () => { + let playbookRuns; + let testPrivatePlaybook; + let testPublicPlaybook; + let testPublicChannel; + let channelName; + + before(() => { + // # Login as testUser + cy.apiLogin(testUser); + + // # Create private playbook, channel mode set to link existing channel + cy.apiCreatePlaybook({ + makePublic: false, + createPublicPlaybookRun: false, + teamId: testTeam.id, + title: 'Playbook private', + checklists: [ + { + title: 'Stage 1', + items: [ + {title: 'Step 1'}, + {title: 'Step 2'}, + ], + }, + { + title: 'Stage 2', + items: [ + {title: 'Step 1'}, + {title: 'Step 2'}, + ], + }, + ], + memberIDs: [testUser.id], + channelMode: 'link_existing_channel', + }).then((playbook) => { + testPrivatePlaybook = playbook; + }); + + // # Create public playbook, channel mode set to link existing channel + cy.apiCreatePlaybook({ + makePublic: true, + teamId: testTeam.id, + title: 'Playbook public', + checklists: [ + { + title: 'Stage 1', + items: [ + {title: 'Step 1'}, + {title: 'Step 2'}, + ], + }, + { + title: 'Stage 2', + items: [ + {title: 'Step 1'}, + {title: 'Step 2'}, + ], + }, + ], + memberIDs: [testUser.id], + channelMode: 'link_existing_channel', + }).then((playbook) => { + testPublicPlaybook = playbook; + }); + }); + + beforeEach(() => { + playbookRuns = []; + const now = Date.now(); + channelName = 'public-channel-' + now; + + // # Create channel for runs + cy.apiCreateChannel( + testTeam.id, + channelName, + 'public channel', + 'O', + ).then(({channel: publicChannel}) => { + testPublicChannel = publicChannel; + + cy.apiRunPlaybook({ + teamId: testTeam.id, + playbookId: testPrivatePlaybook.id, + playbookRunName: 'run write access ' + now, + ownerUserId: testUser.id, + channelId: testPublicChannel.id, + }).then((playbookRun) => { + cy.apiAddUsersToRun(playbookRun.id, [testUser2.id]);// add test user to participants list + playbookRuns.push(playbookRun); + cy.apiRunPlaybook({ + teamId: testTeam.id, + playbookId: testPublicPlaybook.id, + playbookRunName: 'run view access' + now, + ownerUserId: testUser.id, + channelId: testPublicChannel.id, + }).then((playbookRun2) => { + playbookRuns.push(playbookRun2); + cy.apiRunPlaybook({ + teamId: testTeam.id, + playbookId: testPrivatePlaybook.id, + playbookRunName: 'run no access' + now, + ownerUserId: testUser.id, + channelId: testPublicChannel.id, + }).then((playbookRun3) => { + playbookRuns.push(playbookRun3); + + // # Add testUser2 to the channel + cy.apiAddUserToChannel(testPublicChannel.id, testUser2.id); + + // # Login as testUser2 + cy.apiLogin(testUser2); + + // # Navigate directly to the playbook run channel + cy.visit(`/${testTeam.name}/channels/${testPublicChannel.name}`); + switchToChannel(testPublicChannel); + }); + }); + }); + }); + }); + + it('check', () => { + // # Run a slash command with not enough parameters + cy.executeSlashCommand('/playbook check 1 1'); + + // * Verify the expected error message. + cy.verifyEphemeralMessage('Command expects three arguments: the run number, the checklist number and the item number.'); + + // # Run a slash command wrong run number + cy.executeSlashCommand('/playbook check 2 1 1'); + + // * Verify the expected error message. + cy.verifyEphemeralMessage('Invalid run number'); + + // # Run a slash command on a run with view access + cy.executeSlashCommand('/playbook check 0 1 1'); + + // * Verify the expected error message. + cy.verifyEphemeralMessage('Become a participant to interact with this run'); + + // # Type a command + cy.findByTestId('post_textbox').clear().type('/playbook check '); + + // * Verify suggestions number: 2 runs * 4 tasks + 1 title + cy.get('.slash-command').should('have.length', 9); + + // # Clear input + cy.findByTestId('post_textbox').clear(); + + // # Run a slash command with correct parameters + cy.executeSlashCommand('/playbook check 1 1 1'); + cy.get('#rhsContainer').within(() => { + // * Verify number of runs + cy.get('[data-testid="run-list-card"]').should('have.length', 2); + + // # Open run details view + cy.findByText(playbookRuns[0].name).click({force: true}); + }); + + // * Verify the task is checked + cy.get('[data-rbd-droppable-id="1"]').find('.checkbox').eq(1).should('be.checked'); + }); + + it('check add', () => { + // # Run a slash command with not enough parameters + cy.executeSlashCommand('/playbook checkadd 1'); + + // * Verify the expected error message. + cy.verifyEphemeralMessage('Command expects two arguments: the run number and the checklist number.'); + + // # Run a slash command wrong run number + cy.executeSlashCommand('/playbook checkadd 2 1 1'); + + // * Verify the expected error message. + cy.verifyEphemeralMessage('Invalid run number'); + + // # Run a slash command on a run with view access + cy.executeSlashCommand('/playbook checkadd 0 1 new-task'); + + // * Verify the expected error message. + cy.verifyEphemeralMessage('Become a participant to interact with this run'); + + // # Type a command + cy.findByTestId('post_textbox').clear().type('/playbook checkadd '); + + // * Verify suggestions number: 2 runs * 2 checklists + 1 title + cy.get('.slash-command').should('have.length', 5); + + // # Clear input + cy.findByTestId('post_textbox').clear(); + + // # Run a slash command with correct parameters + cy.executeSlashCommand('/playbook checkadd 1 1 new-task'); + + cy.get('#rhsContainer').within(() => { + // * Verify number of runs + cy.get('[data-testid="run-list-card"]').should('have.length', 2); + + // # Open run details view + cy.findByText(playbookRuns[0].name).click({force: true}); + }); + + // * Verify the task was added + cy.get('[data-rbd-droppable-id="1"]').contains('new-task'); + }); + + it('check remove', () => { + // # Run a slash command with not enough parameters + cy.executeSlashCommand('/playbook checkremove 1 1'); + + // * Verify the expected error message. + cy.verifyEphemeralMessage('Command expects three arguments: the run number, the checklist number and the item number.'); + + // # Run a slash command wrong run number + cy.executeSlashCommand('/playbook checkremove 2 0 1'); + + // * Verify the expected error message. + cy.verifyEphemeralMessage('Invalid run number'); + + // # Run a slash command on a run with view access + cy.executeSlashCommand('/playbook checkremove 0 1 0'); + + // * Verify the expected error message. + cy.verifyEphemeralMessage('Become a participant to interact with this run'); + + // # Type a command + cy.findByTestId('post_textbox').clear().type('/playbook checkremove '); + + // * Verify suggestions number: 2 runs * 4 tasks + 1 title + cy.get('.slash-command').should('have.length', 9); + + // # Clear input + cy.findByTestId('post_textbox').clear(); + + // # Run a slash command with correct parameters + cy.executeSlashCommand('/playbook checkremove 1 1 1'); + + cy.get('#rhsContainer').within(() => { + // * Verify number of runs + cy.get('[data-testid="run-list-card"]').should('have.length', 2); + + // # Open run details view + cy.findByText(playbookRuns[0].name).click({force: true}); + }); + + // * Verify the task was added + cy.get('[data-rbd-droppable-id="1"]').contains('Step 2').should('not.exist'); + }); + + it('owner', () => { + // # Run a slash command with not enough parameters + cy.executeSlashCommand('/playbook owner'); + + // * Verify the expected error message. + cy.verifyEphemeralMessage('/playbook owner expects at most one argument.'); + + // # Run a slash command wrong run number + cy.executeSlashCommand('/playbook owner 2'); + + // * Verify the expected error message. + cy.verifyEphemeralMessage('Invalid run number'); + + // # Run a slash command on a run with view access + cy.executeSlashCommand('/playbook owner 0'); + + // * Verify the message. + cy.verifyEphemeralMessage(`@${testUser.username} is the current owner for this playbook run.`); + + // # Type a command + cy.findByTestId('post_textbox').clear().type('/playbook owner '); + + // * Verify suggestions number: 2 runs + 1 title + cy.get('.slash-command').should('have.length', 3); + + // # Clear input + cy.findByTestId('post_textbox').clear(); + + // # Run a slash command on a run with view access + cy.executeSlashCommand(`/playbook owner 0 @${testUser2.username}`); + + // * Verify the expected error message. + cy.verifyEphemeralMessage('Become a participant to interact with this run'); + + // # Run a slash command on a run with write access + cy.executeSlashCommand(`/playbook owner 1 @${testUser2.username}`); + + // * Verify that the owner was set. + cy.executeSlashCommand('/playbook owner 1'); + cy.verifyEphemeralMessage(`@${testUser2.username} is the current owner for this playbook run.`); + }); + + it('finish', () => { + // # Run a slash command with not enough parameters + cy.executeSlashCommand('/playbook finish'); + + // * Verify the expected error message. + cy.verifyEphemeralMessage('Command expects one argument: the run number.'); + + // # Run a slash command wrong run number + cy.executeSlashCommand('/playbook finish 2'); + + // * Verify the expected error message. + cy.verifyEphemeralMessage('Invalid run number'); + + // # Run a slash command on a run with view access + cy.executeSlashCommand('/playbook finish 0'); + + // * Verify the message. + cy.verifyEphemeralMessage(`userID ${testUser2.id} is not an admin or channel member`); + + // # Type a command + cy.findByTestId('post_textbox').clear().type('/playbook finish '); + + // * Verify suggestions number: 2 runs + 1 title + cy.get('.slash-command').should('have.length', 3); + + // # Clear input + cy.findByTestId('post_textbox').clear(); + + cy.get('#rhsContainer').within(() => { + // * Verify number of runs + cy.get('[data-testid="run-list-card"]').should('have.length', 2); + + // # Open run details view + cy.findByText(playbookRuns[0].name).click({force: true}); + }); + + // # Run a slash command with correct parameters + cy.executeSlashCommand('/playbook finish 1'); + + // * Verify confirm modal is visible. + cy.get('#interactiveDialogModalLabel').should('exist'); + + // # Confirm finish + cy.get('#interactiveDialogSubmit').click(); + + // * Verify that the run is finished. + cy.get('#rhsContainer').findByTestId('badge').contains('Finished'); + }); + + it('timeline', () => { + // # Run a slash command with not enough parameters + cy.executeSlashCommand('/playbook timeline'); + + // * Verify the expected error message. + cy.verifyEphemeralMessage('Command expects one argument: the run number.'); + + // # Run a slash command wrong run number + cy.executeSlashCommand('/playbook timeline 2'); + + // * Verify the expected error message. + cy.verifyEphemeralMessage('Invalid run number'); + + // # Run a slash command on a run with view access + cy.executeSlashCommand('/playbook timeline 0'); + + // * Verify the message. + cy.verifyEphemeralMessage(`Timeline for ${playbookRuns[1].name}`); + }); + + it('update', () => { + // # Run a slash command with not enough parameters + cy.executeSlashCommand('/playbook update'); + + // * Verify the expected error message. + cy.verifyEphemeralMessage('Command expects one argument: the run number.'); + + // # Run a slash command wrong run number + cy.executeSlashCommand('/playbook update 2'); + + // * Verify the expected error message. + cy.verifyEphemeralMessage('Invalid run number'); + + // # Type a command + cy.findByTestId('post_textbox').clear().type('/playbook update '); + + // * Verify suggestions number: 2 runs + 1 title + cy.get('.slash-command').should('have.length', 3); + + // # Clear input + cy.findByTestId('post_textbox').clear(); + + // # Run a slash command with correct parameters + cy.executeSlashCommand('/playbook update 1'); + + // # Get dialog modal. + cy.getStatusUpdateDialog().within(() => { + // # Enter valid data + cy.findByTestId('update_run_status_textbox').type('valid update'); + + // # Submit the dialog. + cy.get('button.confirm').click(); + }); + + // * Verify that the Post update dialog has gone. + cy.getStatusUpdateDialog().should('not.exist'); + + // * Verify that the status update was posted. + cy.getLastPost().within(() => { + cy.findByText('posted an update for').should('exist'); + }); + }); + }); +}); + diff --git a/e2e/cypress/tests/integration/playbooks/channels/slash_command/info_spec.js b/e2e/cypress/tests/integration/playbooks/channels/slash_command/info_spec.js new file mode 100644 index 0000000000..004c17da11 --- /dev/null +++ b/e2e/cypress/tests/integration/playbooks/channels/slash_command/info_spec.js @@ -0,0 +1,120 @@ +// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. + +// *************************************************************** +// - [#] indicates a test step (e.g. # Go to a page) +// - [*] indicates an assertion (e.g. * Check the title) +// *************************************************************** + +// Stage: @prod +// Group: @playbooks + +describe('channels > slash command > info', () => { + let testTeam; + let testUser; + let testUser2; + let testPlaybook; + let testPlaybookRun; + + before(() => { + cy.apiInitSetup().then(({team, user}) => { + testTeam = team; + testUser = user; + + cy.apiCreateUser().then(({user: user2}) => { + testUser2 = user2; + cy.apiAddUserToTeam(testTeam.id, testUser2.id); + }); + + cy.apiLogin(testUser); + + cy.apiCreatePlaybook({ + teamId: testTeam.id, + title: 'Playbook', + checklists: [ + { + title: 'Stage 1', + items: [ + {title: 'Step 1'}, + {title: 'Step 2'}, + ], + }, + { + title: 'Stage 2', + items: [ + {title: 'Step 1'}, + {title: 'Step 2'}, + ], + }, + ], + memberIDs: [testUser.id], + }).then((playbook) => { + testPlaybook = playbook; + + cy.apiRunPlaybook({ + teamId: testTeam.id, + playbookId: testPlaybook.id, + playbookRunName: 'Playbook Run', + ownerUserId: testUser.id, + }).then((playbookRun) => { + testPlaybookRun = playbookRun; + }); + }); + }); + }); + + beforeEach(() => { + // # Login as testUser + cy.apiLogin(testUser); + + // # Size the viewport to show the RHS without covering posts. + cy.viewport('macbook-13'); + + // # Reset the owner back to testUser as necessary. + cy.apiChangePlaybookRunOwner(testPlaybookRun.id, testUser.id); + }); + + describe('/playbook info', () => { + it('should show an error when not in a playbook run channel', () => { + // # Navigate to a non-playbook run channel. + cy.visit(`/${testTeam.name}/channels/town-square`); + + // # Run a slash command to show the playbook run's info. + cy.executeSlashCommand('/playbook info'); + + // * Verify the expected error message. + cy.verifyEphemeralMessage('This command only works when run from a playbook run channel.'); + }); + + it('should open the RHS when it is not open', () => { + // # Navigate directly to the application and the playbook run channel. + cy.visit(`/${testTeam.name}/channels/playbook-run`); + + // # Close the RHS, which is opened by default when navigating to a playbook run channel. + cy.get('#searchResultsCloseButton').click(); + + // * Verify that the RHS is indeed closed. + cy.get('#rhsContainer').should('not.exist'); + + // # Run a slash command to show the playbook run's info. + cy.executeSlashCommand('/playbook info'); + + // * Verify that the RHS is now open. + cy.get('#rhsContainer').should('be.visible'); + }); + + it('should show an ephemeral post when the RHS is already open', () => { + // # Navigate directly to the application and the playbook run channel. + cy.visit(`/${testTeam.name}/channels/playbook-run`); + + // * Verify that the RHS is open. + cy.get('#rhsContainer').should('be.visible'); + + // # Run a slash command to show the playbook run's info. + cy.executeSlashCommand('/playbook info'); + + // * Verify the expected error message. + cy.verifyEphemeralMessage('Your playbook run details are already open in the right hand side of the channel.'); + }); + }); +}); diff --git a/e2e/cypress/tests/integration/playbooks/channels/slash_command/owner_spec.js b/e2e/cypress/tests/integration/playbooks/channels/slash_command/owner_spec.js new file mode 100644 index 0000000000..b82a76bd7b --- /dev/null +++ b/e2e/cypress/tests/integration/playbooks/channels/slash_command/owner_spec.js @@ -0,0 +1,222 @@ +// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. + +// *************************************************************** +// - [#] indicates a test step (e.g. # Go to a page) +// - [*] indicates an assertion (e.g. * Check the title) +// *************************************************************** + +// Stage: @prod +// Group: @playbooks + +describe('channels > slash command > owner', () => { + let testTeam; + let testUser; + let testUser2; + let testPlaybook; + let testPlaybookRun; + + before(() => { + cy.apiInitSetup().then(({team, user}) => { + testTeam = team; + testUser = user; + + cy.apiCreateUser().then(({user: user2}) => { + testUser2 = user2; + cy.apiAddUserToTeam(testTeam.id, testUser2.id); + }); + + cy.apiLogin(testUser); + + cy.apiCreatePlaybook({ + teamId: testTeam.id, + title: 'Playbook', + checklists: [ + { + title: 'Stage 1', + items: [ + {title: 'Step 1'}, + {title: 'Step 2'}, + ], + }, + { + title: 'Stage 2', + items: [ + {title: 'Step 1'}, + {title: 'Step 2'}, + ], + }, + ], + memberIDs: [testUser.id], + }).then((playbook) => { + testPlaybook = playbook; + + cy.apiRunPlaybook({ + teamId: testTeam.id, + playbookId: testPlaybook.id, + playbookRunName: 'Playbook Run', + ownerUserId: testUser.id, + }).then((playbookRun) => { + testPlaybookRun = playbookRun; + }); + }); + }); + }); + + beforeEach(() => { + // # Login as testUser + cy.apiLogin(testUser); + + // # Size the viewport to show the RHS without covering posts. + cy.viewport('macbook-13'); + + // # Reset the owner back to testUser as necessary. + cy.apiChangePlaybookRunOwner(testPlaybookRun.id, testUser.id); + }); + + describe('/playbook owner', () => { + it('should show an error when not in a playbook run channel', () => { + // # Navigate to a non-playbook run channel + cy.visit(`/${testTeam.name}/channels/town-square`); + + // # Run a slash command to show the current owner + cy.executeSlashCommand('/playbook owner'); + + // * Verify the expected error message. + cy.verifyEphemeralMessage('This command only works when run from a playbook run channel.'); + }); + + it('should show the current owner', () => { + // # Navigate directly to the application and the playbook run channel + cy.visit(`/${testTeam.name}/channels/playbook-run`); + + // # Run a slash command to show the current owner + cy.executeSlashCommand('/playbook owner'); + + // * Verify the expected owner. + cy.verifyEphemeralMessage(`@${testUser.username} is the current owner for this playbook run.`); + }); + }); + + describe('/playbook owner @username', () => { + it('should show an error when not in a playbook run channel', () => { + // # Navigate to a non-playbook run channel + cy.visit(`/${testTeam.name}/channels/town-square`); + + // # Run a slash command to change the current owner + cy.executeSlashCommand(`/playbook owner ${testUser2.username}`); + + // * Verify the expected error message. + cy.verifyEphemeralMessage('This command only works when run from a playbook run channel.'); + }); + + describe('should show an error when the user is not found', () => { + beforeEach(() => { + // # Navigate directly to the application and the playbook run channel + cy.visit(`/${testTeam.name}/channels/playbook-run`); + }); + + it('when the username has no @-prefix', () => { + // # Run a slash command to change the current owner + cy.executeSlashCommand('/playbook owner unknown'); + + // * Verify the expected error message. + cy.verifyEphemeralMessage('Unable to find user @unknown'); + }); + + it('when the username has an @-prefix', () => { + // # Run a slash command to change the current owner + cy.executeSlashCommand('/playbook owner @unknown'); + + // * Verify the expected error message. + cy.verifyEphemeralMessage('Unable to find user @unknown'); + }); + }); + + describe('should not show an error when the user is not in the channel', () => { + beforeEach(() => { + // # Navigate directly to the application and the playbook run channel + cy.visit(`/${testTeam.name}/channels/playbook-run`); + + // # Ensure the user3 is not part of the channel. + cy.executeSlashCommand(`/kick ${testUser2.username}`); + }); + + it('when the username has no @-prefix', () => { + // # Run a slash command to change the current owner + cy.executeSlashCommand(`/playbook owner ${testUser2.username}`); + + // * Verify the owner has changed. + cy.findByTestId('owner-profile-selector').contains(testUser2.username); + }); + + it('when the username has an @-prefix', () => { + // # Run a slash command to change the current owner + cy.executeSlashCommand(`/playbook owner @${testUser2.username}`); + + // * Verify the owner has changed. + cy.findByTestId('owner-profile-selector').contains(testUser2.username); + }); + }); + + describe('should show a message when the user is already the owner', () => { + beforeEach(() => { + // # Navigate directly to the application and the playbook run channel + cy.visit(`/${testTeam.name}/channels/playbook-run`); + }); + + it('when the username has no @-prefix', () => { + // # Run a slash command to change the current owner + cy.executeSlashCommand(`/playbook owner ${testUser.username}`); + + // * Verify the expected error message. + cy.verifyEphemeralMessage(`User @${testUser.username} is already owner of this playbook run.`); + }); + + it('when the username has an @-prefix', () => { + // # Run a slash command to change the current owner + cy.executeSlashCommand(`/playbook owner @${testUser.username}`); + + // * Verify the expected error message. + cy.verifyEphemeralMessage(`User @${testUser.username} is already owner of this playbook run.`); + }); + }); + + describe('should change the current owner', () => { + beforeEach(() => { + // # Navigate directly to the application and the playbook run channel + cy.visit(`/${testTeam.name}/channels/playbook-run`); + + // # Ensure the testUser2 is part of the channel. + cy.executeSlashCommand(`/invite ${testUser2.username}`); + }); + + it('when the username has no @-prefix', () => { + // # Run a slash command to change the current owner + cy.executeSlashCommand(`/playbook owner ${testUser2.username}`); + + // # Verify the owner has changed. + cy.findByTestId('owner-profile-selector').contains(testUser2.username); + }); + + it('when the username has an @-prefix', () => { + // # Run a slash command to change the current owner + cy.executeSlashCommand(`/playbook owner @${testUser2.username}`); + + // # Verify the owner has changed. + cy.findByTestId('owner-profile-selector').contains(testUser2.username); + }); + }); + + it('should show an error when specifying more than one username', () => { + // # Navigate directly to the application and the playbook run channel + cy.visit(`/${testTeam.name}/channels/playbook-run`); + + // # Run a slash command with too many parameters + cy.executeSlashCommand(`/playbook owner ${testUser.username} ${testUser2.username}`); + + // * Verify the expected error message. + cy.verifyEphemeralMessage('/playbook owner expects at most one argument.'); + }); + }); +}); diff --git a/e2e/cypress/tests/integration/playbooks/channels/slash_command/test_spec.js b/e2e/cypress/tests/integration/playbooks/channels/slash_command/test_spec.js new file mode 100644 index 0000000000..a8bd806474 --- /dev/null +++ b/e2e/cypress/tests/integration/playbooks/channels/slash_command/test_spec.js @@ -0,0 +1,255 @@ +// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. + +// *************************************************************** +// - [#] indicates a test step (e.g. # Go to a page) +// - [*] indicates an assertion (e.g. * Check the title) +// *************************************************************** + +// Stage: @prod +// Group: @playbooks + +describe('channels > slash command > test', () => { + let testTeam; + let testUser; + let testUser2; + let testPlaybook; + let testPlaybookRun; + + before(() => { + cy.apiInitSetup().then(({team, user}) => { + testTeam = team; + testUser = user; + + cy.apiCreateUser().then(({user: user2}) => { + testUser2 = user2; + cy.apiAddUserToTeam(testTeam.id, testUser2.id); + }); + + cy.apiLogin(testUser); + + cy.apiCreatePlaybook({ + teamId: testTeam.id, + title: 'Playbook', + checklists: [ + { + title: 'Stage 1', + items: [ + {title: 'Step 1'}, + {title: 'Step 2'}, + ], + }, + { + title: 'Stage 2', + items: [ + {title: 'Step 1'}, + {title: 'Step 2'}, + ], + }, + ], + memberIDs: [testUser.id], + }).then((playbook) => { + testPlaybook = playbook; + + cy.apiRunPlaybook({ + teamId: testTeam.id, + playbookId: testPlaybook.id, + playbookRunName: 'Playbook Run', + ownerUserId: testUser.id, + }).then((playbookRun) => { + testPlaybookRun = playbookRun; + }); + }); + }); + }); + + beforeEach(() => { + // # Login as testUser + cy.apiLogin(testUser); + + // # Size the viewport to show the RHS without covering posts. + cy.viewport('macbook-13'); + + // # Reset the owner back to testUser as necessary. + cy.apiChangePlaybookRunOwner(testPlaybookRun.id, testUser.id); + }); + + describe('as a regular user', () => { + before(() => { + // # Login as sysadmin. + cy.apiAdminLogin(); + + // # Set EnableTesting to true. + cy.apiUpdateConfig({ + ServiceSettings: { + EnableTesting: true, + }, + }); + }); + + beforeEach(() => { + // # Login as user-1 + cy.apiLogin(testUser); + + // # Navigate to a channel. + cy.visit(`/${testTeam.name}/channels/town-square`); + }); + + it('fails to run subcommand bulk-data', () => { + // # Execute the bulk-data command. + cy.executeSlashCommand('/playbook test bulk-data'); + + // * Verify the ephemeral message warns that the user is not admin. + cy.verifyEphemeralMessage('Running the test command is restricted to system administrators.'); + }); + + it('fails to run subcommand create-playbook-run', () => { + // # Execute the create-playbook-run command. + cy.executeSlashCommand('/playbook test create-playbook-run'); + + // * Verify the ephemeral message warns that the user is not admin. + cy.verifyEphemeralMessage('Running the test command is restricted to system administrators.'); + }); + + it('fails to run subcommand self', () => { + // # Execute the self command. + cy.executeSlashCommand('/playbook test self'); + + // * Verify the ephemeral message warns that the user is not admin. + cy.verifyEphemeralMessage('Running the test command is restricted to system administrators.'); + }); + }); + + describe('as an admin', () => { + describe('with EnableTesting set to false', () => { + before(() => { + // # Login as sysadmin. + cy.apiAdminLogin(); + + // # Set EnableTesting to false. + cy.apiUpdateConfig({ + ServiceSettings: { + EnableTesting: false, + }, + }); + }); + + beforeEach(() => { + // # Login as sysadmin. + cy.apiAdminLogin(); + + // # Navigate to a channel. + cy.visit(`/${testTeam.name}/channels/town-square`); + }); + + it('fails to run subcommand bulk-data', () => { + // # Execute the bulk-data command. + cy.executeSlashCommand('/playbook test bulk-data'); + + // * Verify the ephemeral message warns that the user is not admin. + cy.verifyEphemeralMessage('Setting EnableTesting must be set to true to run the test command.'); + }); + + it('fails to run subcommand create-playbook-run', () => { + // # Execute the create-playbook-run command. + cy.executeSlashCommand('/playbook test create-playbook-run'); + + // * Verify the ephemeral message warns that the user is not admin. + cy.verifyEphemeralMessage('Setting EnableTesting must be set to true to run the test command.'); + }); + + it('fails to run subcommand self', () => { + // # Execute the self command. + cy.executeSlashCommand('/playbook test self'); + + // * Verify the ephemeral message warns that the user is not admin. + cy.verifyEphemeralMessage('Setting EnableTesting must be set to true to run the test command.'); + }); + }); + + describe('with EnableTesting set to true', () => { + before(() => { + // # Login as sysadmin. + cy.apiAdminLogin(); + + // # Set EnableTesting to true. + cy.apiUpdateConfig({ + ServiceSettings: { + EnableTesting: true, + }, + }); + }); + + beforeEach(() => { + // # Login as sysadmin. + cy.apiAdminLogin(); + + // # Size the viewport to show the RHS without covering posts. + cy.viewport('macbook-13'); + + // # Navigate to a channel. + cy.visit(`/${testTeam.name}/channels/town-square`); + }); + + describe('with subcommand self', () => { + it('asks for confirmation', () => { + // # Execute the self command. + cy.executeSlashCommand('/playbook test self'); + + // * Verify the ephemeral message asks for the confirmation keywords. + cy.verifyEphemeralMessage('Are you sure you want to self-test (which will nuke the database and delete all data -- instances, configuration)? All data will be lost. To self-test, type /playbook test self CONFIRM TEST SELF'); + }); + }); + + describe('with subcommand create', () => { + it('fails to run with no arguments', () => { + // # Execute the create-playbook-run command with no arguments. + cy.executeSlashCommand('/playbook test create-playbook-run'); + + // * Verify the ephemeral message warns about the parameters. + cy.verifyEphemeralMessage('The command expects three parameters: '); + }); + + it('fails to run with one argument', () => { + // # Execute the create-playbook-run command with one argument. + cy.executeSlashCommand(`/playbook test create-playbook-run ${testPlaybook.id}`); + + // * Verify the ephemeral message warns about the parameters. + cy.verifyEphemeralMessage('The command expects three parameters: '); + }); + + it('fails to run with two arguments', () => { + // # Execute the create-playbook-run command with two arguments. + cy.executeSlashCommand(`/playbook test create-playbook-run ${testPlaybook.id} 2020-01-01`); + + // * Verify the ephemeral message warns about the parameters. + cy.verifyEphemeralMessage('The command expects three parameters: '); + }); + + it('fails to run with a malformed playbook ID', () => { + // # Execute the create-playbook-run command with all arguments, but a malformed plabook ID. + cy.executeSlashCommand('/playbook test create-playbook-run unknownID 2020-01-01 The playbook run name'); + + // * Verify the ephemeral message warns about the ID. + cy.verifyEphemeralMessage('The first parameter, , must be a valid ID.'); + }); + + it('fails to run with a valid, but unknown playbook ID', () => { + // # Execute the create-playbook-run command with all arguments, but an unknown plabook ID. + cy.executeSlashCommand('/playbook test create-playbook-run abcdefghijklmnopqrstuvwxyz 2020-01-01 The playbook run name'); + + // * Verify the ephemeral message warns about the parameter. + cy.verifyEphemeralMessage('The playbook with ID \'abcdefghijklmnopqrstuvwxyz\' does not exist.'); + }); + + it('fails to run with a malformed date', () => { + // # Execute the create-playbook-run command with all arguments, but a malformed creation timestamp. + cy.executeSlashCommand(`/playbook test create-playbook-run ${testPlaybook.id} 2020-1-1 The playbook run name`); + + // * Verify the ephemeral message warns about the parameter. + cy.verifyEphemeralMessage('Timestamp \'2020-1-1\' could not be parsed as a date. If you want the playbook run to start on January 2, 2006, the timestamp should be \'2006-01-02\'.'); + }); + }); + }); + }); +}); diff --git a/e2e/cypress/tests/integration/playbooks/channels/slash_command/todo_spec.js b/e2e/cypress/tests/integration/playbooks/channels/slash_command/todo_spec.js new file mode 100644 index 0000000000..dac5c4397c --- /dev/null +++ b/e2e/cypress/tests/integration/playbooks/channels/slash_command/todo_spec.js @@ -0,0 +1,322 @@ +// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. + +// *************************************************************** +// - [#] indicates a test step (e.g. # Go to a page) +// - [*] indicates an assertion (e.g. * Check the title) +// *************************************************************** + +// Stage: @prod +// Group: @playbooks + +describe('channels > slash command > todo', () => { + let team1; + let team2; + let testUser; + let testOtherUser; + let run1; + let run2; + let run3; + let run4; + + before(() => { + cy.apiInitSetup().then(({team, user}) => { + team1 = team; + testUser = user; + + cy.apiCreateUser().then(({user: otherUser}) => { + testOtherUser = otherUser; + + // # Add this new user to the team + cy.apiAddUserToTeam(team1.id, testOtherUser.id); + + // # Login as testUser + cy.apiLogin(testUser); + + // # Create a public playbook + cy.apiCreatePlaybook({ + teamId: team1.id, + title: 'Playbook One', + memberIDs: [], + createPublicPlaybookRun: true, + checklists: [ + { + title: 'Playbook One - Stage 1', + items: [ + {title: 'Step 1'}, + {title: 'Step 2'}, + ], + }, + { + title: 'Playbook One - Stage 2', + items: [ + {title: 'Step 1'}, + {title: 'Step 2'}, + ], + }, + ], + }).then(({id: playbookId}) => { + // # Create two runs in team 1. + const now = Date.now(); + cy.apiRunPlaybook({ + teamId: team1.id, + playbookId, + playbookRunName: 'Playbook Run (' + now + ')', + ownerUserId: testUser.id, + }).then((run) => { + run1 = run; + }); + + const now2 = Date.now() + 100; + cy.apiRunPlaybook({ + teamId: team1.id, + playbookId, + playbookRunName: 'Playbook Run (' + now2 + ')', + ownerUserId: testUser.id, + }).then((run) => { + run2 = run; + }); + }); + + // # Create a second team to test cross-team notifications + cy.apiCreateTeam('team2', 'Team 2').then(({team: secondTeam}) => { + team2 = secondTeam; + + cy.apiAdminLogin(); + cy.apiAddUserToTeam(team2.id, testUser.id); + cy.apiLogin(testUser); + + // # Create a public playbook + cy.apiCreatePlaybook({ + teamId: team2.id, + title: 'Playbook Two', + memberIDs: [], + createPublicPlaybookRun: true, + checklists: [ + { + title: 'Playbook Two - Stage 1', + items: [ + {title: 'Step 1'}, + {title: 'Step 2'}, + ], + }, + { + title: 'Playbook Two - Stage 2', + items: [ + {title: 'Step 1'}, + {title: 'Step 2'}, + ], + }, + ], + }).then(({id: playbookId}) => { + // # Create one run in team 2. + const now = Date.now() + 200; + cy.apiRunPlaybook({ + teamId: team2.id, + playbookId, + playbookRunName: 'Playbook Run (' + now + ')', + ownerUserId: testUser.id, + }).then((run) => { + run3 = run; + }); + }); + }); + + // # Create another playbook with runs owned by another user + cy.apiCreatePlaybook({ + teamId: team1.id, + title: 'Playbook Other', + memberIDs: [], + createPublicPlaybookRun: true, + checklists: [ + { + title: 'Playbook Other - Stage 1', + items: [ + {title: 'Step 1'}, + {title: 'Step 2'}, + ], + }, + { + title: 'Playbook Other - Stage 2', + items: [ + {title: 'Step 1'}, + {title: 'Step 2'}, + ], + }, + ], + }).then(({id: playbookId}) => { + // # Login as testOtherUser + cy.apiLogin(testOtherUser); + + // # Create a run in team 1, with testOtherUser as owner and inviting testUser + const now = Date.now(); + cy.apiRunPlaybook({ + teamId: team1.id, + playbookId, + playbookRunName: 'Other Playbook Run (' + now + ')', + ownerUserId: testOtherUser.id, + }).then((run) => { + run4 = run; + + // # Invite testUser to the channel + // cy.apiAddUserToChannel(run.channel_id, testUser.id); + cy.apiAddUsersToRun(run.id, [testUser.id]); + + // # Force this run to be overdue + cy.apiUpdateStatus({ + playbookRunId: run4.id, + message: 'no message 4', + reminder: 1, + }); + }); + + // # Create a run in team 1, with testOtherUser as owner but not inviting testUser + const now2 = Date.now() + 100; + cy.apiRunPlaybook({ + teamId: team1.id, + playbookId, + playbookRunName: 'Other Playbook Run (' + now2 + ')', + ownerUserId: testOtherUser.id, + }).then((run) => { + // # Force this run to be overdue + cy.apiUpdateStatus({ + playbookRunId: run.id, + message: 'no message 5', + reminder: 1, + }); + }); + }); + }); + }); + }); + + beforeEach(() => { + // # Size the viewport to show the RHS without covering posts. + cy.viewport('macbook-13'); + + // # Login as testUser + cy.apiLogin(testUser); + }); + + describe('/playbook todo should show', () => { + it('three runs', () => { + // # Navigate to a non-playbook run channel. + cy.visit(`/${team2.name}/channels/town-square`); + + // # Run a slash command to show the to-do list. + cy.executeSlashCommand('/playbook todo'); + + cy.getLastPost().within((post) => { + // * Should show titles + cy.wrap(post).contains('You have 0 runs overdue.'); + cy.wrap(post).contains('You have 0 assigned tasks.'); + cy.wrap(post).contains('You have 4 runs currently in progress:'); + + // * Should show four active runs + cy.get('li').then((liItems) => { + expect(liItems[0]).to.contain.text(run4.name); + expect(liItems[1]).to.contain.text(run1.name); + expect(liItems[2]).to.contain.text(run2.name); + expect(liItems[3]).to.contain.text(run3.name); + }); + }); + }); + + it('four assigned tasks', () => { + // # assign self four tasks + cy.apiChangeChecklistItemAssignee(run1.id, 0, 0, testUser.id); + cy.apiChangeChecklistItemAssignee(run1.id, 1, 1, testUser.id); + cy.apiChangeChecklistItemAssignee(run2.id, 0, 1, testUser.id); + cy.apiChangeChecklistItemAssignee(run3.id, 1, 0, testUser.id); + + // # Navigate to a non-playbook run channel. + cy.visit(`/${team2.name}/channels/town-square`); + + // # Run a slash command to show the to-do list. + cy.executeSlashCommand('/playbook todo'); + + cy.getLastPost().within((post) => { + // * Should show titles + cy.wrap(post).contains('You have 0 runs overdue.'); + cy.wrap(post).contains('You have 4 total assigned tasks:'); + + // * Should show 3 runs w/ tasks + cy.get('.post__body a').then((links) => { + expect(links[0]).to.contain.text(run1.name); + expect(links[1]).to.contain.text(run2.name); + expect(links[2]).to.contain.text(run3.name); + }); + + cy.get('.post__body li').then((items) => { + // * first run + expect(items[0]).to.contain.text('Playbook One - Stage 1: Step 1'); + expect(items[1]).to.contain.text('Playbook One - Stage 2: Step 2'); + + // * second run + expect(items[2]).to.contain.text('Playbook One - Stage 1: Step 2'); + + // * third run + expect(items[3]).to.contain.text('Playbook Two - Stage 2: Step 1'); + }); + }); + + // # check two of the items via API + cy.apiSetChecklistItemState(run1.id, 0, 0, 'closed'); + cy.apiSetChecklistItemState(run3.id, 1, 0, 'closed'); + + // # Show the to-do list. + cy.executeSlashCommand('/playbook todo'); + + // * Should show 2 tasks + cy.getLastPost().within((post) => { + // * Should show titles + cy.wrap(post).contains('You have 0 runs overdue.'); + cy.wrap(post).contains('You have 2 total assigned tasks:'); + + // * Should show 2 runs w/ tasks + cy.get('.post__body a').then((links) => { + expect(links[0]).to.contain.text(run1.name); + expect(links[1]).to.contain.text(run2.name); + }); + + cy.get('.post__body li').then((items) => { + // * first run + expect(items[0]).to.contain.text('Playbook One - Stage 2: Step 2'); + + // * second run + expect(items[1]).to.contain.text('Playbook One - Stage 1: Step 2'); + }); + }); + }); + + it('two overdue status updates', () => { + // # set two updates with short timers + cy.apiUpdateStatus({ + playbookRunId: run1.id, + message: 'no message 1', + reminder: 1, + }); + cy.apiUpdateStatus({ + playbookRunId: run3.id, + message: 'no message 3', + reminder: 1, + }); + + cy.wait(1100); + + // # Switch to playbooks DM channel + cy.visit(`/${team2.name}/messages/@playbooks`); + + // # Run a slash command to show the to-do list. + cy.executeSlashCommand('/playbook todo'); + + // # Should show two runs overdue -- ignoring the rest + cy.getLastPost().within(() => { + cy.get('.post__body li').then((liItems) => { + expect(liItems[0]).to.contain.text(run1.name); + expect(liItems[1]).to.contain.text(run3.name); + }); + }); + }); + }); +}); diff --git a/e2e/cypress/tests/integration/playbooks/channels/update_request_post_spec.js b/e2e/cypress/tests/integration/playbooks/channels/update_request_post_spec.js new file mode 100644 index 0000000000..2471654824 --- /dev/null +++ b/e2e/cypress/tests/integration/playbooks/channels/update_request_post_spec.js @@ -0,0 +1,192 @@ +// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. + +// *************************************************************** +// - [#] indicates a test step (e.g. # Go to a page) +// - [*] indicates an assertion (e.g. * Check the title) +// *************************************************************** + +// Stage: @prod +// Group: @playbooks + +import * as TIMEOUTS from '../../../fixtures/timeouts'; + +describe('channels > update request post', () => { + let testTeam; + let testParticipant; + let testChannelMemberOnly; + let testPlaybookRun; + let testPlaybookRun2; + + before(() => { + cy.apiInitSetup().then(({team, user}) => { + testTeam = team; + testParticipant = user; + + cy.apiCreateUser().then(({user: channelMemberOnly}) => { + testChannelMemberOnly = channelMemberOnly; + + // # Add testChannelMemberOnly to the testTeam + cy.apiAddUserToTeam(testTeam.id, testChannelMemberOnly.id); + + // # Login as testChannelMemberOnly + cy.apiLogin(testChannelMemberOnly); + + // # Enable threads view + cy.apiSaveCRTPreference(testChannelMemberOnly.id, 'on'); + }); + + // # Login as testParticipant + cy.apiLogin(testParticipant); + + // # Enable threads view + cy.apiSaveCRTPreference(testParticipant.id, 'on'); + + // # Create a public playbook with 2 runs in the same channel + cy.apiCreatePlaybook({ + teamId: testTeam.id, + title: 'Playbook', + memberIDs: [], + createPublicPlaybookRun: true, + }).then((playbook) => { + cy.apiRunPlaybook({ + teamId: testTeam.id, + playbookId: playbook.id, + playbookRunName: 'Test Run', + ownerUserId: testParticipant.id, + }).then((playbookRun) => { + testPlaybookRun = playbookRun; + + // # Add testChannelMemberOnly to the channel, but not the run. + cy.apiAddUserToChannel(playbookRun.channel_id, testChannelMemberOnly.id); + cy.apiRunPlaybook({ + teamId: testTeam.id, + playbookId: playbook.id, + playbookRunName: 'Test Run 2', + ownerUserId: testParticipant.id, + channelId: testPlaybookRun.channel_id, + }).then((playbookRun2) => { + testPlaybookRun2 = playbookRun2; + }); + }); + }); + }); + }); + + describe('displays interactive post', () => { + beforeEach(() => { + // # Login as testUser + cy.apiLogin(testParticipant); + + // # Post a status update, with a reminder in 1 second. + cy.apiUpdateStatus({ + playbookRunId: testPlaybookRun2.id, + message: 'status update 2', + reminder: 1, + }); + + // # Post a status update, with a reminder in 2 second. + cy.apiUpdateStatus({ + playbookRunId: testPlaybookRun.id, + message: 'status update', + reminder: 2, + }); + + // Ensure the status update reminder gets posted + cy.wait(TIMEOUTS.TWO_SEC); + }); + + describe('as a participant', () => { + beforeEach(() => { + // # Navigate to the application + cy.visit(`${testTeam.name}/channels/test-run`); + }); + + it('in the run channel', () => { + cy.getLastPost().then((element) => { + // # Verify the expected message text + cy.get(element).contains(`@${testParticipant.username}, please provide a status update for ${testPlaybookRun.name}.`); + + // # Verify interactive message button to post an update + cy.get(element).find('button').contains('Post update'); + }); + }); + + it('reset reminder', () => { + cy.getLastPost().within(() => { + // * Snooze reminder + cy.getStyledComponent('StyledSelect').click().type('{downArrow}{downArrow}{enter}'); + + // # Verify interactive message button to post an update has dissapeared + cy.findByText('(message deleted)').should('be.visible'); + }); + }); + + it('in threads view', () => { + // # Find the update request post and post a reply to make it show up in threads view + cy.getLastPostId().then((lastPostId) => { + // Open RHS + cy.clickPostCommentIcon(lastPostId); + + // Post a reply message + cy.postMessageReplyInRHS('test reply'); + + // # Navigate to the threads view + cy.get('#sidebarItem_threads').click(); + + // # Verify the expected text in the list view + cy.get('.ThreadItem').first().contains(`@${testParticipant.username}, please provide a status update for ${testPlaybookRun.name}.`); + + // # Click to open details + cy.get('.ThreadItem').first().click(); + + // # Verify post still rendered + cy.get(`#rhsPost_${lastPostId}`).contains(`@${testParticipant.username}, please provide a status update for ${testPlaybookRun.name}.`); + + // # Verify interactive message button to post an update + cy.get(`#rhsPost_${lastPostId}`).find('button').contains('Post update'); + }); + }); + }); + + describe('as a channel member only', () => { + beforeEach(() => { + // # Login as testChannelMemberOnly + cy.apiLogin(testChannelMemberOnly); + + // # Navigate to the application + cy.visit(`${testTeam.name}/channels/test-run`); + }); + + it('in the run channel', () => { + cy.getLastPost().then((element) => { + // # Verify the expected message text + cy.get(element).contains(`@${testParticipant.username}, please provide a status update for ${testPlaybookRun.name}.`); + }); + }); + + it('in threads view', () => { + // # Find the update request post and post a reply to make it show up in threads view + cy.getLastPostId().then((lastPostId) => { + // Open RHS + cy.clickPostCommentIcon(lastPostId); + + // Post a reply message + cy.postMessageReplyInRHS('test reply'); + + // # Navigate to the threads view + cy.get('#sidebarItem_threads').click(); + + // # Verify the expected text in the list view + cy.get('.ThreadItem').first().contains(`@${testParticipant.username}, please provide a status update for ${testPlaybookRun.name}.`); + + // # Click to open details + cy.get('.ThreadItem').first().click(); + + // # Verify post still rendered + cy.get(`#rhsPost_${lastPostId}`).contains(`@${testParticipant.username}, please provide a status update for ${testPlaybookRun.name}.`); + }); + }); + }); + }); +}); diff --git a/e2e/cypress/tests/integration/playbooks/digest_spec.js b/e2e/cypress/tests/integration/playbooks/digest_spec.js new file mode 100644 index 0000000000..07d181582e --- /dev/null +++ b/e2e/cypress/tests/integration/playbooks/digest_spec.js @@ -0,0 +1,178 @@ +// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. + +// *************************************************************** +// - [#] indicates a test step (e.g. # Go to a page) +// - [*] indicates an assertion (e.g. * Check the title) +// *************************************************************** + +// Stage: @prod +// Group: @playbooks + +describe('digest messages', () => { + let testTeam; + let testUser; + let testPlaybook; + + before(() => { + cy.apiInitSetup().then(({team, user}) => { + testTeam = team; + testUser = user; + + // # Login as testUser + cy.apiLogin(testUser); + + // # Create a public playbook + cy.apiCreatePlaybook({ + teamId: testTeam.id, + title: 'Playbook', + memberIDs: [], + checklists: [ + { + title: 'Stage 1', + items: [ + {title: 'Step 1', command: '/invalid'}, + {title: 'Step 2', command: '/echo VALID'}, + {title: 'Step 3', command: '/playbook check 0 0'}, + {title: 'Step 4'}, + ], + }, + ], + }).then((playbook) => { + testPlaybook = playbook; + }); + }); + }); + + beforeEach(() => { + // # intercepts telemetry + cy.interceptTelemetry(); + + // # Login as testUser + cy.apiLogin(testUser); + }); + + describe('digest message >', () => { + let testRun; + before(() => { + const runName = 'Playbook Run (' + Date.now() + ')'; + + // # Start a run + cy.apiRunPlaybook({ + teamId: testTeam.id, + playbookId: testPlaybook.id, + playbookRunName: runName, + ownerUserId: testUser.id, + }).then((run) => { + testRun = run; + + // # Set a timer that will expire. + cy.apiUpdateStatus({ + playbookRunId: run.id, + message: 'no message 1', + reminder: 1, + }); + cy.apiChangeChecklistItemAssignee(run.id, 0, 0, testUser.id); + }); + }); + + it('has one run overdue and links to RDP', () => { + // # Switch to playbooks DM channel + cy.visit(`/${testTeam.name}/messages/@playbooks`); + + // # Wait until the channel loads enough to show the post textbox. + cy.get('#post-create').should('exist'); + + // # Run a slash command to show the to-do list. + cy.executeSlashCommand('/playbook todo'); + + cy.getLastPost().within(() => { + // # assert two blocks: inprogress+overdue + cy.get('ul').should('have.length', 3); + + // * CLick the first link - overdue status + cy.get('ul a').eq(0).click(); + }); + + // # assert url is RDP + cy.url().should('contain', '/playbooks/runs/' + testRun.id + '?from=digest_overduestatus'); + + // # assert telemetry tracks correctly the origin + cy.expectTelemetryToContain([ + { + name: 'run_details', + type: 'page', + properties: { + from: 'digest_overduestatus', + }, + }, + ]); + }); + + it('has one run in progress and links to RDP', () => { + // # Switch to playbooks DM channel + cy.visit(`/${testTeam.name}/messages/@playbooks`); + + // # Wait until the channel loads enough to show the post textbox. + cy.get('#post-create').should('exist'); + + // # Run a slash command to show the to-do list. + cy.executeSlashCommand('/playbook todo'); + + cy.getLastPost().within(() => { + // # assert two blocks: inprogress+overdue + cy.get('ul').should('have.length', 3); + + // * CLick the second link - inprogress + cy.get('ul a').eq(1).click(); + }); + + // # assert url is RDP + cy.url().should('contain', '/playbooks/runs/' + testRun.id + '?from=digest_runsinprogress'); + + // # assert telemetry tracks correctly the origin + cy.expectTelemetryToContain([ + { + name: 'run_details', + type: 'page', + properties: { + from: 'digest_runsinprogress', + }, + }, + ]); + }); + + it('has one run with one assigned task and links to RDP', () => { + // # Switch to playbooks DM channel + cy.visit(`/${testTeam.name}/messages/@playbooks`); + + // # Wait until the channel loads enough to show the post textbox. + cy.get('#post-create').should('exist'); + + // # Run a slash command to show the to-do list. + cy.executeSlashCommand('/playbook todo'); + + cy.getLastPost().within(() => { + // # assert two blocks: inprogress+overdue + cy.get('ul').should('have.length', 3); + + // * CLick link - assigned task + cy.get('p a').click(); + }); + + // # assert url is RDP + cy.url().should('contain', '/playbooks/runs/' + testRun.id + '?from=digest_assignedtask'); + + // # assert telemetry tracks correctly the origin + cy.expectTelemetryToContain([ + { + name: 'run_details', + type: 'page', + properties: { + from: 'digest_assignedtask', + }, + }, + ]); + }); + }); +}); diff --git a/e2e/cypress/tests/integration/playbooks/lhs_spec.js b/e2e/cypress/tests/integration/playbooks/lhs_spec.js new file mode 100644 index 0000000000..05916d345f --- /dev/null +++ b/e2e/cypress/tests/integration/playbooks/lhs_spec.js @@ -0,0 +1,450 @@ +// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. + +// *************************************************************** +// - [#] indicates a test step (e.g. # Go to a page) +// - [*] indicates an assertion (e.g. * Check the title) +// *************************************************************** + +// Stage: @prod +// Group: @playbooks + +/* eslint-disable no-only-tests/no-only-tests */ + +import * as TIMEOUTS from '../../fixtures/timeouts'; +import {stubClipboard} from '../../utils'; + +describe('lhs', () => { + let testTeam; + let testUser; + let testPublicPlaybook; + let testPrivatePlaybook; + let playbookRun; + let testViewerUser; + + before(() => { + cy.apiInitSetup().then(({team, user}) => { + testTeam = team; + testUser = user; + + // # Create another user in the same team + cy.apiCreateUser().then(({user: viewer}) => { + testViewerUser = viewer; + cy.apiAddUserToTeam(testTeam.id, testViewerUser.id); + }); + + // # Login as testUser + cy.apiLogin(testUser); + + // # Create a public playbook + cy.apiCreatePlaybook({ + teamId: testTeam.id, + title: 'Public Playbook', + memberIDs: [], + }).then((playbook) => { + testPublicPlaybook = playbook; + }); + + // # Create a private playbook + cy.apiCreatePlaybook({ + teamId: testTeam.id, + title: 'Private Playbook', + memberIDs: [], + public: false, + }).then((playbook) => { + testPrivatePlaybook = playbook; + }); + }); + }); + + beforeEach(() => { + // # Intercepts telemetry + cy.interceptTelemetry(); + }); + + const getRunDropdownItemByText = (groupName, runName, itemName) => { + cy.findByTestId(groupName).should('exist'). + findByTestId(runName).should('exist'). + findByTestId('menuButton'). + click({force: true}); + return cy.findByTestId('dropdownmenu'). + should('be.visible'). + findByText(itemName). + should('be.visible'); + }; + + describe('navigate', () => { + beforeEach(() => { + // # Size the viewport to show the RHS without covering posts. + cy.viewport('macbook-13'); + + // # Login as testUser + cy.apiLogin(testUser); + + cy.apiRunPlaybook({ + teamId: testTeam.id, + playbookId: testPublicPlaybook.id, + playbookRunName: 'the run name(' + Date.now() + ')', + ownerUserId: testUser.id, + }).then((run) => { + playbookRun = run; + + // # Visit the playbook run + cy.visit('/playbooks/runs'); + cy.findByTestId('lhs-navigation').findByText(playbookRun.name).should('be.visible'); + }); + + cy.wait; + }); + + it('click run', () => { + // # Click on run at LHS + cy.findByTestId('Runs').findByTestId(playbookRun.name).click(); + + // * assert telemetry + cy.expectTelemetryToContain([ + { + type: 'page', + name: 'run_details', + properties: { + from: 'playbooks_lhs', + role: 'participant', + playbookrun_id: playbookRun.id, + playbook_id: testPublicPlaybook.id, + }, + }, + ]); + }); + }); + + describe('run dot menu', () => { + beforeEach(() => { + // # Size the viewport to show the RHS without covering posts. + cy.viewport('macbook-13'); + + // # Login as testUser + cy.apiLogin(testUser); + + cy.apiRunPlaybook({ + teamId: testTeam.id, + playbookId: testPublicPlaybook.id, + playbookRunName: 'the run name(' + Date.now() + ')', + ownerUserId: testUser.id, + }).then((run) => { + playbookRun = run; + + // # Intercept these requests for later wait()'s to help ensure rendering is done. + cy.gqlInterceptQuery('PlaybookLHS'); + cy.intercept('GET', `/plugins/playbooks/api/v0/runs/${playbookRun.id}`).as('fetchRun'); + }); + }); + + it('shows on click', () => { + // # Visit the playbook run + cy.visit(`/playbooks/runs/${playbookRun.id}`); + + // # Wait for loading to finish + cy.wait('@fetchRun'); + cy.wait('@gqlPlaybookLHS'); + + // # Click dot menu + cy.findByTestId('Runs'). + findByTestId(playbookRun.name). + findByTestId('menuButton'). + click({force: true}); + + // * Assert context menu is opened + cy.findByTestId('dropdownmenu').should('be.visible'); + }); + + it.skip('can copy link', () => { + // # Visit the playbook run + cy.visit(`/playbooks/runs/${playbookRun.id}`); + + // # Wait for loading to finish + cy.wait('@fetchRun'); + cy.wait('@gqlPlaybookLHS'); + + stubClipboard().as('clipboard'); + + // # Click on Copy link menu item + getRunDropdownItemByText('Runs', playbookRun.name, 'Copy link').click().then(() => { + // * Verify clipboard content + cy.get('@clipboard').its('contents').should('contain', `/playbooks/runs/${playbookRun.id}`); + }); + }); + + it('can favorite / unfavorite', () => { + // # Visit the playbook run + cy.visit(`/playbooks/runs/${playbookRun.id}`); + + // # Wait for loading to finish + cy.wait('@fetchRun'); + cy.wait('@gqlPlaybookLHS'); + + // # Click on favorite menu item + getRunDropdownItemByText('Runs', playbookRun.name, 'Favorite').click().then(() => { + cy.wait('@gqlPlaybookLHS'); + + // * Verify the run is added to favorites + cy.findByTestId('Favorite').findByTestId(playbookRun.name).should('exist'); + + // # Click on unfavorite menu item + getRunDropdownItemByText('Favorite', playbookRun.name, 'Unfavorite').click().then(() => { + cy.wait('@gqlPlaybookLHS'); + + // * Verify the run is removed from favorites + cy.findByTestId('Favorite').should('not.exist'); + }); + }); + }); + + it('lhs refresh on follow/unfollow', () => { + cy.apiLogin(testViewerUser); + + // # Visit the playbook run + cy.visit(`/playbooks/runs/${playbookRun.id}`); + + // # Wait for loading to finish + cy.wait('@fetchRun'); + cy.wait('@gqlPlaybookLHS'); + + // # The assertions here guard against the click() on 194 + // # happening on a detached element. + cy.assertRunDetailsPageRenderComplete(testUser.username); + cy.findByTestId('runinfo-following').should('be.visible').within(() => { + // # Verify follower icon + cy.findAllByTestId('profile-option', {exact: false}).should('have.length', 1); + cy.findByText('Follow').should('be.visible').click(); + + // # Verify icons update + cy.wait('@gqlPlaybookLHS'); + cy.findAllByTestId('profile-option', {exact: false}).should('have.length', 2); + }); + + // * Verify that the run was added to the lhs + cy.findByTestId('lhs-navigation').findByText(playbookRun.name).should('exist'); + + // # Click on unfollow menu item + getRunDropdownItemByText('Runs', playbookRun.name, 'Unfollow').click().then(() => { + cy.wait('@gqlPlaybookLHS'); + + // * Verify that the run is removed lhs + cy.findByTestId('Runs').findByTestId(playbookRun.name).should('not.exist'); + }); + + // # assert telemetry data + cy.expectTelemetryToContain([ + { + type: 'track', + name: 'playbookrun_follow', + properties: { + from: 'run_details', + playbookrun_id: playbookRun.id, + }, + }, + { + type: 'track', + name: 'playbookrun_unfollow', + properties: { + from: 'playbooks_lhs', + playbookrun_id: playbookRun.id, + }, + }, + ]); + }); + + it('leave run', () => { + // # Add viewer user to the channel + cy.apiAddUsersToRun(playbookRun.id, [testViewerUser.id]); + + // # Visit the playbook run + cy.visit(`/playbooks/runs/${playbookRun.id}`); + + // # Wait for loading to finish + cy.wait('@fetchRun'); + cy.wait('@gqlPlaybookLHS'); + + // # Click on leave menu item + getRunDropdownItemByText('Runs', playbookRun.name, 'Leave and unfollow run').click(); + + // * Verify that owner can't leave. + cy.get('#confirmModal').should('not.exist'); + + // # Change the owner to testViewerUser + cy.findByTestId('runinfo-owner').findByTestId('assignee-profile-selector').click(); + cy.get('.playbook-react-select').findByText('@' + testViewerUser.username).click(); + + // # Wait for owner to change + cy.wait(TIMEOUTS.HALF_SEC); + + // # Click on leave menu item + getRunDropdownItemByText('Runs', playbookRun.name, 'Leave and unfollow run').click(); + + // * Click leave confirmation + cy.get('#confirmModalButton').click(); + + // # assert telemetry data + cy.expectTelemetryToContain([ + { + type: 'track', + name: 'playbookrun_leave', + properties: { + from: 'playbooks_lhs', + playbookrun_id: playbookRun.id, + }, + }, + ]); + }); + }); + + describe('leave run - no permanent access', () => { + beforeEach(() => { + // # Size the viewport to show the RHS without covering posts. + cy.viewport('macbook-13'); + + // # Login as testUser + cy.apiLogin(testUser); + + cy.apiRunPlaybook({ + teamId: testTeam.id, + playbookId: testPrivatePlaybook.id, + playbookRunName: 'the run name(' + Date.now() + ')', + ownerUserId: testUser.id, + }).then((run) => { + playbookRun = run; + + cy.apiAddUsersToRun(playbookRun.id, [testViewerUser.id]); + + cy.apiLogin(testViewerUser).then(() => { + // # Visit the playbook run + cy.visit(`/playbooks/runs/${playbookRun.id}`); + + // # Intercept these graphQL requests for wait()'s + // # that help ensure rendering has finished. + cy.gqlInterceptQuery('PlaybookLHS'); + }); + }); + }); + + it.skip('leave run, when on rdp of the same run', () => { + cy.wait('@gqlPlaybookLHS'); + + // # Click on leave menu item + getRunDropdownItemByText('Runs', playbookRun.name, 'Leave and unfollow run').click(); + + // # confirm modal + cy.get('#confirmModal').should('be.visible').within(() => { + cy.get('#confirmModalButton').click(); + cy.wait('@gqlPlaybookLHS'); + }); + + // * Verify that user was redirected to the run list page + cy.url().should('include', 'playbooks/runs?sort='); + }); + + it('leave run, when not on rdp of the same run', () => { + // # Visit playbooks list page + cy.visit('/playbooks/playbooks'); + cy.wait('@gqlPlaybookLHS'); + + // # Click on leave menu item + getRunDropdownItemByText('Runs', playbookRun.name, 'Leave and unfollow run').click(); + + // # confirm modal + cy.get('#confirmModal').should('be.visible').within(() => { + cy.get('#confirmModalButton').click(); + cy.wait('@gqlPlaybookLHS'); + }); + + // * Verify that user was not redirected to the run list page + cy.url().should('not.include', 'playbooks/runs?sort='); + }); + }); + + describe('playbook dot menu', () => { + beforeEach(() => { + // # Size the viewport to show the RHS without covering posts. + cy.viewport('macbook-13'); + + // # Login as testUser + cy.apiLogin(testUser); + + // # Create a public playbook + cy.apiCreatePlaybook({ + teamId: testTeam.id, + title: 'the run name(' + Date.now() + ')', + memberIDs: [], + }).then((playbook) => { + testPublicPlaybook = playbook; + + // # Visit the playbooks page + cy.visit('/playbooks/playbooks'); + + // # Intercept these graphQL requests for wait()'s + // # that help ensure rendering has finished. + cy.gqlInterceptQuery('PlaybookLHS'); + }); + }); + + it('shows on click', () => { + cy.wait('@gqlPlaybookLHS'); + + // # Click dot menu + cy.findByTestId('Playbooks'). + findByTestId(testPublicPlaybook.title). + findByTestId('menuButton'). + click({force: true}); + + // * Assert context menu is opened + cy.findByTestId('dropdownmenu').should('be.visible'); + }); + + it('can copy link', () => { + cy.wait('@gqlPlaybookLHS'); + stubClipboard().as('clipboard'); + + // # Click on Copy link menu item + getRunDropdownItemByText('Playbooks', testPublicPlaybook.title, 'Copy link').click().then(() => { + // * Verify clipboard content + cy.get('@clipboard'). + its('contents'). + should('contain', `/playbooks/playbooks/${testPublicPlaybook.id}`); + }); + }); + + it('can favorite / unfavorite', () => { + cy.wait('@gqlPlaybookLHS'); + + // # Click on favorite menu item + getRunDropdownItemByText('Playbooks', testPublicPlaybook.title, 'Favorite').click().then(() => { + cy.wait('@gqlPlaybookLHS'); + + // * Verify the playbook is added to favorites + cy.findByTestId('Favorite').findByTestId(testPublicPlaybook.title).should('exist'); + + // # Click on unfavorite menu item + getRunDropdownItemByText('Favorite', testPublicPlaybook.title, 'Unfavorite').click().then(() => { + cy.wait('@gqlPlaybookLHS'); + + // * Verify the playbook is removed from favorites + cy.findByTestId('Playbooks').findByTestId(testPublicPlaybook.title).should('exist'); + }); + }); + }); + + it('can leave', () => { + cy.wait('@gqlPlaybookLHS'); + + stubClipboard().as('clipboard'); + + // # Click on Leave menu item + getRunDropdownItemByText('Playbooks', testPublicPlaybook.title, 'Leave').click().then(() => { + cy.wait('@gqlPlaybookLHS'); + + // * Verify the playbook is removed from the list + cy.findByTestId('Playbooks').findByTestId(testPublicPlaybook.title).should('not.exist'); + }); + }); + }); +}); diff --git a/e2e/cypress/tests/integration/playbooks/navigation_spec.js b/e2e/cypress/tests/integration/playbooks/navigation_spec.js new file mode 100644 index 0000000000..355b74aff4 --- /dev/null +++ b/e2e/cypress/tests/integration/playbooks/navigation_spec.js @@ -0,0 +1,72 @@ +// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. + +// *************************************************************** +// - [#] indicates a test step (e.g. # Go to a page) +// - [*] indicates an assertion (e.g. * Check the title) +// *************************************************************** + +// Stage: @prod +// Group: @playbooks + +describe('navigation', () => { + let testTeam; + let testUser; + + before(() => { + cy.apiInitSetup().then(({team, user}) => { + testTeam = team; + testUser = user; + + // # Login as user-1 + cy.apiLogin(testUser); + + // # Create a public playbook + cy.apiCreatePlaybook({ + teamId: testTeam.id, + title: 'Playbook', + memberIDs: [], + }).then((playbook) => { + cy.apiRunPlaybook({ + teamId: team.id, + playbookId: playbook.id, + playbookRunName: 'Playbook Run', + ownerUserId: user.id, + }); + }); + }); + }); + + beforeEach(() => { + // # Login as testUser + cy.apiLogin(testUser); + + // # Navigate to the application + cy.visit(`/${testTeam.name}/`); + }); + + it('switches to playbooks list view via sidebar view all button', () => { + // # Open the product + cy.visit('/playbooks'); + + // # Switch to playbooks + cy.findByTestId('playbooksLHSButton').click(); + + // * Verify that playbooks are shown + cy.findByTestId('titlePlaybook').should('exist').contains('Playbooks'); + }); + + it('switches to playbook runs list view via sidebar view all button', () => { + // # Open the product + cy.visit('/playbooks'); + + // # Switch to playbooks + cy.findByTestId('playbooksLHSButton').click(); + + // # Switch to playbook runs + cy.findByTestId('playbookRunsLHSButton').click(); + + // * Verify that playbook runs are shown + cy.findByTestId('titlePlaybookRun').should('exist').contains('Runs'); + }); +}); diff --git a/e2e/cypress/tests/integration/playbooks/playbooks/access_spec.js b/e2e/cypress/tests/integration/playbooks/playbooks/access_spec.js new file mode 100644 index 0000000000..839502e01d --- /dev/null +++ b/e2e/cypress/tests/integration/playbooks/playbooks/access_spec.js @@ -0,0 +1,114 @@ +// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. + +// *************************************************************** +// - [#] indicates a test step (e.g. # Go to a page) +// - [*] indicates an assertion (e.g. * Check the title) +// *************************************************************** + +// Stage: @prod +// Group: @playbooks + +describe('playbooks > edit', () => { + let testTeam; + let testUser; + let testUser2; + + before(() => { + cy.apiInitSetup().then(({team, user}) => { + testTeam = team; + testUser = user; + + // # Create a second test user in this team + cy.apiCreateUser().then((payload) => { + testUser2 = payload.user; + cy.apiAddUserToTeam(testTeam.id, payload.user.id); + }); + + // # Login as testUser + cy.apiLogin(testUser); + }); + }); + + beforeEach(() => { + // # Login as testUser + cy.apiLogin(testUser); + }); + + describe('rdp information refresh', () => { + let testPlaybook; + + beforeEach(() => { + // # Create a playbook + cy.apiCreateTestPlaybook({ + teamId: testTeam.id, + title: 'Playbook (' + Date.now() + ')', + userId: testUser.id, + public: true, + }).then((playbook) => { + testPlaybook = playbook; + + // Navigate to the playbook page + cy.visit(`/playbooks/playbooks/${testPlaybook.id}/outline`); + }); + }); + + it('add / remove a member', () => { + // # Open playbook access modal + cy.findByTestId('playbook-members').click(); + + // # Add a new member + cy.findByTestId('add-people-input').type(testUser2.username); + cy.wait(500); + cy.findByTestId('profile-option-' + testUser2.username).click({force: true}); + + // * Verify that user was added + cy.findByTestId('members-list').findByText(testUser2.username).should('exist'); + + // # Close playbook access modal + cy.get('.close > [aria-hidden="true"]').click(); + + // * Verify members number + cy.findByTestId('playbook-members').findByText('2').should('exist'); + + // # Open playbook access modal + cy.findByTestId('playbook-members').click(); + + // # Open dropdown and remove user + cy.findByText('Playbook Member').click(); + cy.findByTestId('dropdownmenu').findByText('Remove').click(); + + // * Verify that user was removed + cy.findByTestId('members-list').findByText(testUser2.username).should('not.exist'); + + // # Close playbook access modal + cy.get('.close > [aria-hidden="true"]').click(); + + // * Verify members number + cy.findByTestId('playbook-members').findByText('1').should('exist'); + }); + + it('change to private', () => { + // # Open playbook access modal + cy.findByTestId('playbook-members').click(); + + // # Click on convert to private + cy.findByText('Convert to private playbook').click(); + + // * Check that confirm modal is open + cy.get('#confirmModal').should('be.visible'); + + // # Confirm convert to private + cy.get('#confirmModal').get('#confirmModalButton').click(); + + // * Verify that playbook is private + cy.findByText('Convert to private playbook').should('not.exist'); + + // # Close playbook access modal + cy.get('.close > [aria-hidden="true"]').click(); + + // * Verify lock icon is visible + cy.findByTestId('playbook-editor-header').get('.icon-lock-outline').should('be.visible'); + }); + }); +}); diff --git a/e2e/cypress/tests/integration/playbooks/playbooks/creation_button_spec.js b/e2e/cypress/tests/integration/playbooks/playbooks/creation_button_spec.js new file mode 100644 index 0000000000..3e1fffe459 --- /dev/null +++ b/e2e/cypress/tests/integration/playbooks/playbooks/creation_button_spec.js @@ -0,0 +1,201 @@ +// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. + +// *************************************************************** +// - [#] indicates a test step (e.g. # Go to a page) +// - [*] indicates an assertion (e.g. * Check the title) +// *************************************************************** + +// Stage: @prod +// Group: @playbooks + +describe('playbooks > creation button', () => { + let testSysadmin; + let testTeam; + let testUser; + + before(() => { + cy.apiInitSetup().then(({team, user}) => { + testTeam = team; + testUser = user; + + cy.apiCreateCustomAdmin().then(({sysadmin}) => { + testSysadmin = sysadmin; + }); + + // # Login as testUser + cy.apiLogin(testUser); + + // # Create a public playbook + // # Creating this playbook ensures the list view + // # specifically is shown in the backstage content section. + // # Without it there is a brief flicker from the list view + // # to the no content view, which causes some flake + // # on clicking the 'Create playbook' button + cy.apiCreatePlaybook({ + teamId: testTeam.id, + title: 'Playbook', + memberIDs: [], + }); + }); + }); + + beforeEach(() => { + // # Login as user-1 + cy.apiLogin(testUser); + + // # Size the viewport to show playbooks without weird scrolling issues + cy.viewport('macbook-13'); + }); + + it('opens playbook creation page with New Playbook button', () => { + const playbookName = 'Untitled Playbook'; + + // # Open the product + cy.visit('/playbooks'); + + // # Switch to playbooks + cy.findByTestId('playbooksLHSButton').click(); + + // # Click 'New Playbook' button + cy.findByTestId('titlePlaybook').findByText('Create playbook').click(); + cy.get('#playbooks_create').findByText('Create playbook').click(); + + // * Verify playbook outline page opened + verifyPlaybookOutlineOpened(playbookName); + + // * Verify playbook was added to the LHS + cy.findByTestId('lhs-navigation').findByText(playbookName).should('exist'); + }); + + it('auto creates a playbook with "Blank" template option', () => { + // # Open the product + cy.visit('/playbooks'); + + // # Switch to playbooks + cy.findByTestId('playbooksLHSButton').click(); + + // # Click 'Blank' + cy.findByText('Blank').click(); + + const playbookName = `@${testUser.username}'s Blank`; + + // * Verify playbook outline opened + verifyPlaybookOutlineOpened(playbookName); + + // * Verify playbook was added to the LHS + cy.findByTestId('lhs-navigation').findByText(playbookName).should('exist'); + }); + + it('opens Service Outage Incident page from its template option (multiple teams)', () => { + cy.apiCreateTeam('second-team', 'Second Team').then(() => { + // # Open the product + cy.visit('/playbooks'); + + // # Switch to playbooks + cy.findByTestId('playbooksLHSButton').click(); + + // # Click 'Incident Resolution' + cy.findByText('Incident Resolution').click(); + + const playbookName = `@${testUser.username}'s Incident Resolution`; + + // * Verify playbook outline opened + verifyPlaybookOutlineOpened(playbookName); + + // * Verify the playbook was added to the lhs of current team + cy.findByTestId('lhs-navigation').findByText(playbookName).should('exist'); + }); + }); + + let restrictedTestTeam; + let restrictedTestUser; + + describe('user is lacking permissions to create playbooks', () => { + before(() => { + cy.apiLogin(testSysadmin); + + cy.apiCreateUser().then(({user: createdUser}) => { + restrictedTestUser = createdUser; + }); + + cy.apiCreateTeam('restricted-team', 'Restricted Team').then(({team: createdTeam}) => { + restrictedTestTeam = createdTeam; + cy.apiAddUserToTeam(restrictedTestTeam.id, restrictedTestUser.id); + }); + + cy.apiCreateScheme('Restricted Team Scheme', 'team').then(({scheme}) => { + cy.apiSetTeamScheme(restrictedTestTeam.id, scheme.id); + cy.apiGetRolesByNames([scheme.default_team_user_role]).then(({roles}) => { + const role = roles[0]; + + // Remove permissions to create playbooks + const permissions = role.permissions.filter((perm) => !(/playbook_(private|public)_create/).test(perm)); + cy.apiPatchRole(role.id, {permissions}); + }); + }); + }); + + beforeEach(() => { + // # Login as user with restricted permissions + cy.apiLogin(restrictedTestUser); + }); + + it('create playbook entry in LHS dropdown should not exist', () => { + // # Open the product + cy.visit('/playbooks'); + + // # Open menu dropdown + cy.findByTestId('create-playbook-dropdown-toggle').click(); + + cy.get('#CreatePlaybookDropdown').within(() => { + // * Verify create playbook entry is missing + cy.findByText('Create New Playbook').should('not.exist'); + }); + }); + + it('permission notice should be shown if no playbooks exist', () => { + // # Open the product + cy.visit('/playbooks'); + + // # Switch to playbooks + cy.findByTestId('playbooksLHSButton').click(); + + // * Verify notice about missing permissions and no playbooks is shown + cy.findByText('There are no playbooks to view. You don\'t have permission to create playbooks in this workspace.').should('exist'); + }); + + it('create playbook button should not exist if playbooks exist', () => { + // # Create a playbook for the team + cy.apiLogin(testSysadmin).then(() => { + cy.apiCreatePlaybook({ + teamId: restrictedTestTeam.id, + title: 'Playbook', + memberIDs: [], + }); + }); + + // # Login as user with restricted permissions + cy.apiLogin(restrictedTestUser); + + // # Open the product + cy.visit('/playbooks'); + + // # Switch to playbooks + cy.findByTestId('playbooksLHSButton').click(); + + // * Verify create playbook button is missing + cy.findByTestId('titlePlaybook').findByText('Create playbook').should('not.exist'); + }); + }); +}); + +function verifyPlaybookOutlineOpened(playbookName) { + // * Verify the page url contains 'playbooks/playbooks/new' + cy.url().should('contain', '/outline'); + + // * Verify the playbook name matches the one provided + cy.findByTestId('playbook-editor-title').within(() => { + cy.findByText(playbookName).should('be.visible'); + }); +} diff --git a/e2e/cypress/tests/integration/playbooks/playbooks/edit/task_actions_spec.js b/e2e/cypress/tests/integration/playbooks/playbooks/edit/task_actions_spec.js new file mode 100644 index 0000000000..c884d4ae73 --- /dev/null +++ b/e2e/cypress/tests/integration/playbooks/playbooks/edit/task_actions_spec.js @@ -0,0 +1,470 @@ +// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. + +// *************************************************************** +// - [#] indicates a test step (e.g. # Go to a page) +// - [*] indicates an assertion (e.g. * Check the title) +// *************************************************************** + +// Stage: @prod +// Group: @playbooks +// +import * as TIMEOUTS from '../../../../fixtures/timeouts'; + +describe('playbooks > edit > task actions', () => { + let testTeam; + let testUser; + let testUser2; + + before(() => { + cy.apiInitSetup().then(({team, user}) => { + testTeam = team; + testUser = user; + + cy.apiCreateUser().then(({user: user2}) => { + testUser2 = user2; + + // # Add this new user to the team + cy.apiAddUserToTeam(team.id, testUser2.id); + }); + }); + }); + + beforeEach(() => { + // # Login as testUser + cy.apiLogin(testUser); + }); + + describe('modal', () => { + let testPlaybook; + + beforeEach(() => { + // # Create a playbook + cy.apiCreatePlaybook({ + teamId: testTeam.id, + title: 'Playbook (' + Date.now() + ')', + checklists: [{ + title: 'Test Checklist', + items: [ + {title: 'Test Task'}, + ], + }], + memberIDs: [ + testUser.id, + ], + }).then((playbook) => { + testPlaybook = playbook; + + // # Visit the selected playbook + cy.visit(`/playbooks/playbooks/${testPlaybook.id}/outline`); + }); + }); + + const editTask = () => { + cy.findByTestId('checkbox-item-container').within(() => { + cy.findByText('Test Task').trigger('mouseover'); + cy.findByTestId('hover-menu-edit-button').click(); + }); + }; + + it('disallows no keywords', () => { + // Open the task actions modal + editTask(); + cy.findByText('Task Actions').click(); + + // Attempt to enable the trigger + cy.findByText('Mark the task as done').click(); + + // Save the dialog + cy.findByTestId('modal-confirm-button').click(); + + // Verify no actions are configured + cy.findByText('Task Actions').should('exist'); + cy.apiGetPlaybook(testPlaybook.id).then((playbook) => { + const trigger = JSON.parse(playbook.checklists[0].items[0].task_actions[0].trigger.payload); + const actions = JSON.parse(playbook.checklists[0].items[0].task_actions[0].actions[0].payload); + + assert.deepEqual(trigger.keywords, []); + assert.deepEqual(trigger.user_ids, []); + assert.isFalse(actions.enabled); + }); + }); + + it('allows a single keyword', () => { + // # intercepts telemetry + cy.interceptTelemetry(); + + // Open the task actions modal + editTask(); + cy.findByText('Task Actions').click(); + + // Add a keyword + cy.get('.modal-body').within(() => { + cy.get('input').eq(0).type('keyword1{enter}', {force: true}); + }); + + // Enable the trigger + cy.findByText('Mark the task as done').click(); + + // Save the dialog + cy.findByTestId('modal-confirm-button').click(); + + // Verify configured actions + cy.findByText('1 action'); + cy.apiGetPlaybook(testPlaybook.id).then((playbook) => { + const trigger = JSON.parse(playbook.checklists[0].items[0].task_actions[0].trigger.payload); + const actions = JSON.parse(playbook.checklists[0].items[0].task_actions[0].actions[0].payload); + + assert.deepEqual(trigger.keywords, ['keyword1']); + assert.deepEqual(trigger.user_ids, []); + assert.isTrue(actions.enabled); + }); + + // # assert telemetry data + cy.expectTelemetryToContain([ + { + name: 'taskactions_updated', + type: 'track', + properties: { + playbook_id: testPlaybook.id, + }, + }, + ]); + }); + + it('allows multiple keywords', () => { + // Open the task actions modal + editTask(); + cy.findByText('Task Actions').click(); + + // Add multiple keywords + cy.get('.modal-body').within(() => { + cy.get('input').eq(0).type('keyword1{enter}', {force: true}); + cy.get('input').eq(0).type('keyword2{enter}', {force: true}); + }); + + // Enable the trigger + cy.findByText('Mark the task as done').click(); + + // Save the dialog + cy.findByTestId('modal-confirm-button').click(); + + // Verify configured actions + cy.findByText('1 action'); + cy.apiGetPlaybook(testPlaybook.id).then((playbook) => { + const trigger = JSON.parse(playbook.checklists[0].items[0].task_actions[0].trigger.payload); + const actions = JSON.parse(playbook.checklists[0].items[0].task_actions[0].actions[0].payload); + + assert.deepEqual(trigger.keywords, ['keyword1', 'keyword2']); + assert.deepEqual(trigger.user_ids, []); + assert.isTrue(actions.enabled); + }); + }); + + it('allows multi-word phrases', () => { + // Open the task actions modal + editTask(); + cy.findByText('Task Actions').click(); + + // Add a phrase + cy.get('.modal-body').within(() => { + cy.get('input').eq(0).type('a phrase with multiple words{enter}', {force: true}); + }); + + // Enable the trigger + cy.findByText('Mark the task as done').click(); + + // Save the dialog + cy.findByTestId('modal-confirm-button').click(); + + // Verify configured actions + cy.findByText('1 action'); + cy.apiGetPlaybook(testPlaybook.id).then((playbook) => { + const trigger = JSON.parse(playbook.checklists[0].items[0].task_actions[0].trigger.payload); + const actions = JSON.parse(playbook.checklists[0].items[0].task_actions[0].actions[0].payload); + + assert.deepEqual(trigger.keywords, ['a phrase with multiple words']); + assert.deepEqual(trigger.user_ids, []); + assert.isTrue(actions.enabled); + }); + }); + + it('allows removing previously configured keywords', () => { + // Open the task actions modal + editTask(); + cy.findByText('Task Actions').click(); + + // Add multiple keywords + cy.get('.modal-body').within(() => { + cy.get('input').eq(0).type('keyword1{enter}', {force: true}); + cy.get('input').eq(0).type('keyword2{enter}', {force: true}); + }); + + // Enable the trigger + cy.findByText('Mark the task as done').click(); + + // Save the dialog + cy.findByTestId('modal-confirm-button').click(); + + // Re-open the dialog + cy.findByText('1 action').click(); + + // Remove one trigger keyword + cy.get('.modal-body').within(() => { + cy.findByText('keyword1').next().click(); + }); + + // Save the dialog + cy.findByTestId('modal-confirm-button').click(); + + // Verify configured actions + cy.findByText('1 action'); + cy.apiGetPlaybook(testPlaybook.id).then((playbook) => { + const trigger = JSON.parse(playbook.checklists[0].items[0].task_actions[0].trigger.payload); + const actions = JSON.parse(playbook.checklists[0].items[0].task_actions[0].actions[0].payload); + + assert.deepEqual(trigger.keywords, ['keyword2']); + assert.deepEqual(trigger.user_ids, []); + assert.isTrue(actions.enabled); + }); + }); + + it('disables when all keywords removed', () => { + // Open the task actions modal + editTask(); + cy.findByText('Task Actions').click(); + + // Add multiple keywords + cy.get('.modal-body').within(() => { + cy.get('input').eq(0).type('keyword1{enter}', {force: true}); + cy.get('input').eq(0).type('keyword2{enter}', {force: true}); + }); + + // Enable the trigger + cy.findByText('Mark the task as done').click(); + + // Save the dialog + cy.findByTestId('modal-confirm-button').click(); + + // Re-open the dialog + cy.findByText('1 action').click(); + + // Remove all trigger keywords + cy.get('.modal-body').within(() => { + cy.findByText('keyword1').next().click(); + cy.findByText('keyword2').next().click(); + }); + + // Save the dialog + cy.findByTestId('modal-confirm-button').click(); + + // Verify configured actions + cy.findByText('Task Actions'); + cy.apiGetPlaybook(testPlaybook.id).then((playbook) => { + const trigger = JSON.parse(playbook.checklists[0].items[0].task_actions[0].trigger.payload); + const actions = JSON.parse(playbook.checklists[0].items[0].task_actions[0].actions[0].payload); + + assert.deepEqual(trigger.keywords, []); + assert.deepEqual(trigger.user_ids, []); + assert.isFalse(actions.enabled); + }); + }); + + it('disallows a user without keywords', () => { + // Open the task actions modal + editTask(); + cy.findByText('Task Actions').click(); + + // Add a user + cy.get('.modal-body').within(() => { + cy.get('input').eq(1). + type('@' + testUser.username, {force: true}). + wait(TIMEOUTS.ONE_SEC). + type('{enter}', {force: true}); + }); + + // Attempt to enable the trigger + cy.findByText('Mark the task as done').click(); + + // Save the dialog + cy.findByTestId('modal-confirm-button').click(); + + // Verify no actions are configured + cy.findByText('Task Actions').should('exist'); + cy.apiGetPlaybook(testPlaybook.id).then((playbook) => { + const trigger = JSON.parse(playbook.checklists[0].items[0].task_actions[0].trigger.payload); + const actions = JSON.parse(playbook.checklists[0].items[0].task_actions[0].actions[0].payload); + + assert.deepEqual(trigger.keywords, []); + assert.deepEqual(trigger.user_ids, [testUser.id]); + assert.isFalse(actions.enabled); + }); + }); + + it('allows a single user', () => { + // Open the task actions modal + editTask(); + cy.findByText('Task Actions').click(); + + // Add a keyword + cy.get('.modal-body').within(() => { + cy.get('input').eq(0).type('keyword1{enter}', {force: true}); + }); + + // Add a user + cy.get('.modal-body').within(() => { + cy.get('input').eq(1). + type('@' + testUser.username, {force: true}). + wait(TIMEOUTS.ONE_SEC). + type('{enter}', {force: true}); + }); + + // Attempt to enable the trigger + cy.findByText('Mark the task as done').click(); + + // Save the dialog + cy.findByTestId('modal-confirm-button').click(); + + // Verify configured actions and user + cy.findByText('1 action'); + cy.apiGetPlaybook(testPlaybook.id).then((playbook) => { + const trigger = JSON.parse(playbook.checklists[0].items[0].task_actions[0].trigger.payload); + const actions = JSON.parse(playbook.checklists[0].items[0].task_actions[0].actions[0].payload); + + assert.deepEqual(trigger.keywords, ['keyword1']); + assert.deepEqual(trigger.user_ids, [testUser.id]); + assert.isTrue(actions.enabled); + }); + }); + + it('allows configuring multiple users', () => { + // Open the task actions modal + editTask(); + cy.findByText('Task Actions').click(); + + // Add a keyword + cy.get('.modal-body').within(() => { + cy.get('input').eq(0).type('keyword1{enter}', {force: true}); + }); + + // Add two users + cy.get('.modal-body').within(() => { + cy.get('input').eq(1). + type('@' + testUser.username, {force: true}). + wait(TIMEOUTS.ONE_SEC). + type('{enter}', {force: true}); + cy.get('input').eq(1). + type('@' + testUser2.username, {force: true}). + wait(TIMEOUTS.ONE_SEC). + type('{enter}', {force: true}); + }); + + // Attempt to enable the trigger + cy.findByText('Mark the task as done').click(); + + // Save the dialog + cy.findByTestId('modal-confirm-button').click(); + + // Verify configured actions and user + cy.findByText('1 action'); + cy.apiGetPlaybook(testPlaybook.id).then((playbook) => { + const trigger = JSON.parse(playbook.checklists[0].items[0].task_actions[0].trigger.payload); + const actions = JSON.parse(playbook.checklists[0].items[0].task_actions[0].actions[0].payload); + + assert.deepEqual(trigger.keywords, ['keyword1']); + assert.deepEqual(trigger.user_ids, [testUser.id, testUser2.id]); + assert.isTrue(actions.enabled); + }); + }); + + it('rejects unknown user', () => { + // Open the task actions modal + editTask(); + cy.findByText('Task Actions').click(); + + // Add a keyword + cy.get('.modal-body').within(() => { + cy.get('input').eq(0).type('keyword1{enter}', {force: true}); + }); + + // Type an unknown user + cy.get('.modal-body').within(() => { + cy.get('input').eq(1). + type('@unknown', {force: true}). + wait(TIMEOUTS.ONE_SEC). + type('{enter}', {force: true}); + }); + + // Click away + cy.get('.modal-body').click(); + + // Attempt to enable the trigger + cy.findByText('Mark the task as done').click(); + + // Save the dialog + cy.findByTestId('modal-confirm-button').click(); + + // Verify configured actions and user + cy.findByText('1 action'); + cy.apiGetPlaybook(testPlaybook.id).then((playbook) => { + const trigger = JSON.parse(playbook.checklists[0].items[0].task_actions[0].trigger.payload); + const actions = JSON.parse(playbook.checklists[0].items[0].task_actions[0].actions[0].payload); + + assert.deepEqual(trigger.keywords, ['keyword1']); + assert.deepEqual(trigger.user_ids, []); + assert.isTrue(actions.enabled); + }); + }); + + it('allows removing previously configured users', () => { + // Open the task actions modal + editTask(); + cy.findByText('Task Actions').click(); + + // Add a keyword + cy.get('.modal-body').within(() => { + cy.get('input').eq(0).type('keyword1{enter}', {force: true}); + }); + + // Add two users + cy.get('.modal-body').within(() => { + cy.get('input').eq(1). + type('@' + testUser.username, {force: true}). + wait(TIMEOUTS.ONE_SEC). + type('{enter}', {force: true}); + cy.get('input').eq(1). + type('@' + testUser2.username, {force: true}). + wait(TIMEOUTS.ONE_SEC). + type('{enter}', {force: true}); + }); + + // Attempt to enable the trigger + cy.findByText('Mark the task as done').click(); + + // Save the dialog + cy.findByTestId('modal-confirm-button').click(); + + // Re-open the dialog + cy.findByText('1 action').click(); + + // Remove one user keyword + cy.get('.modal-body').within(() => { + cy.findByText(testUser.username).parent().parent().next().click(); + }); + + // Save the dialog + cy.findByTestId('modal-confirm-button').click(); + + // Verify configured actions + cy.findByText('1 action'); + cy.apiGetPlaybook(testPlaybook.id).then((playbook) => { + const trigger = JSON.parse(playbook.checklists[0].items[0].task_actions[0].trigger.payload); + const actions = JSON.parse(playbook.checklists[0].items[0].task_actions[0].actions[0].payload); + + assert.deepEqual(trigger.keywords, ['keyword1']); + assert.deepEqual(trigger.user_ids, [testUser2.id]); + assert.isTrue(actions.enabled); + }); + }); + }); +}); diff --git a/e2e/cypress/tests/integration/playbooks/playbooks/edit_metrics_spec.js b/e2e/cypress/tests/integration/playbooks/playbooks/edit_metrics_spec.js new file mode 100644 index 0000000000..d573e5b898 --- /dev/null +++ b/e2e/cypress/tests/integration/playbooks/playbooks/edit_metrics_spec.js @@ -0,0 +1,570 @@ +// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. + +// *************************************************************** +// - [#] indicates a test step (e.g. # Go to a page) +// - [*] indicates an assertion (e.g. * Check the title) +// *************************************************************** + +// Stage: @prod +// Group: @playbooks + +/* eslint-disable no-only-tests/no-only-tests */ + +describe('playbooks > edit_metrics', () => { + let testTeam; + let testUser; + + before(() => { + cy.apiInitSetup().then(({team, user}) => { + testTeam = team; + testUser = user; + }); + }); + + describe('actions', () => { + let testPlaybook; + + beforeEach(() => { + // # Login as testUser + cy.apiLogin(testUser); + + // # Create a playbook + cy.apiCreateTestPlaybook({ + teamId: testTeam.id, + title: 'Playbook (' + Date.now() + ')', + userId: testUser.id, + }).then((playbook) => { + testPlaybook = playbook; + }); + + // # Set a bigger viewport so the action don't scroll out of view + cy.viewport('macbook-16'); + cy.intercept('PUT', '/plugins/playbooks/api/v0/playbooks/**').as('addMetric'); + }); + + describe('adding and editing metrics', () => { + it('can add 4, but not 5 metrics; can save and re-edit with metrics saved', () => { + // # Visit the selected playbook + cy.visit(`/playbooks/playbooks/${testPlaybook.id}`); + + // # Switch to Outline tab and focus retro section + cy.findByText('Outline').click(); + cy.get('#retrospective').scrollIntoView(); + + // # Add and verify metric + addMetric('Duration', 'test duration', '0:0:1', 'test description'); + verifyViewMetric(0, 'test duration', '1 minute per run', 'test description'); + + // # Add and verify metric + addMetric('Cost', 'test dollars', '2', 'test description 2'); + verifyViewMetric(1, 'test dollars', '2 per run', 'test description 2'); + + // # Add and verify metric + addMetric('Integer', 'test integer', '4', 'test descr 3'); + verifyViewMetric(2, 'test integer', '4 per run', 'test descr 3'); + + // # Add and verify metric + addMetric('Duration', 'test duration 2', '0:0:2', 'test description 4'); + verifyViewMetric(3, 'test duration 2', '2 minutes per run', 'test description 4'); + + // * Verify Add Metric button is inactive + cy.findByRole('button', {name: 'Add Metric'}).should('be.disabled'); + + // * Verify we have four valid metrics and are editing none. + verifyViewsAndEdits(4, 0); + + // Refresh the page + cy.reload(); + + // * Verify we saved the metrics + verifyViewMetric(0, 'test duration', '1 minute per run', 'test description'); + verifyViewMetric(1, 'test dollars', '2 per run', 'test description 2'); + verifyViewMetric(2, 'test integer', '4 per run', 'test descr 3'); + verifyViewMetric(3, 'test duration 2', '2 minutes per run', 'test description 4'); + + // # Edit all 4 metrics and repeat the test + cy.findAllByTestId('edit-metric').eq(0).click(); + cy.get('input[type=text]').eq(2).clear().type('12:8:97'); + saveMetric(); + cy.findAllByTestId('edit-metric').eq(1).click(); + cy.get('textarea').eq(0).clear().type('a new description'); + saveMetric(); + cy.findAllByTestId('edit-metric').eq(2).click(); + cy.get('input[type=text]').eq(2).clear().type('7777777'); + saveMetric(); + cy.findAllByTestId('edit-metric').eq(3).click(); + cy.get('input[type=text]').eq(1).clear().type('test duration 2!!!'); + saveMetric(); + + // # Refresh the page + cy.reload(); + + // * Verify we saved the metrics + verifyViewMetric(0, 'test duration', '12 days, 9 hours, 37 minutes per run', 'test description'); + verifyViewMetric(1, 'test dollars', '2 per run', 'a new description'); + verifyViewMetric(2, 'test integer', '7777777 per run', 'test descr 3'); + verifyViewMetric(3, 'test duration 2!!!', '2 minutes per run', 'test description 4'); + + // # Now test: verifies when clicking "Add", for duration type + // # (using the previous state) + + // # Edit the first metric + cy.findAllByTestId('edit-metric').eq(0).click(); + + // * Metrics need a title + cy.get('input[type=text]').eq(1).clear(); + saveMetric(); + cy.getStyledComponent('ErrorText').contains('Please add a title for your metric.'); + + // * Metrics need a unique title + cy.get('input[type=text]').eq(1).type('test dollars'); + saveMetric(); + cy.getStyledComponent('ErrorText'). + contains('A metric with the same name already exists. Please add a unique name for each metric.'); + + // * A duration target needs to be in the correct format (no letters) + cy.get('input[type=text]').eq(1).clear().wait(100).type('test duration again'); + cy.get('input[type=text]').eq(2).clear().type('a'); + saveMetric(); + cy.getStyledComponent('ErrorText'). + contains('Please enter a duration in the format: dd:hh:mm (e.g., 12:00:00), or leave the target blank.'); + + // * A duration target needs to be in the correct format (mm:dd:ss) + cy.get('input[type=text]').eq(2).clear().type('0:123:0'); + saveMetric(); + cy.getStyledComponent('ErrorText'). + contains('Please enter a duration in the format: dd:hh:mm (e.g., 12:00:00), or leave the target blank.'); + + // # A duration can have 1 or 2 numbers in each position + cy.get('input[type=text]').eq(2).clear().type('2:12:1'); + saveMetric(); + verifyViewMetric(0, 'test duration again', '2 days, 12 hours, 1 minute per run', 'test description'); + + // * Verify we have four valid metrics and are editing none. + verifyViewsAndEdits(4, 0); + + // # Now test: on clicking edit, closes & saves current editing metric, and switches + // # (using the previous state) + + // # Edit the second metric + cy.findAllByTestId('edit-metric').eq(1).click(); + + // * Verify editing correct metric, and only this metric + cy.getStyledComponent('EditContainer').should('have.length', 1).within(() => { + cy.get('input[type=text]').eq(0).should('have.value', 'test dollars'); + }); + cy.getStyledComponent('ViewContainer').should('have.length', 3); + + // # Switch to editing third metric (second is in edit mode, so this is the third:) + cy.findAllByTestId('edit-metric').eq(1).click(); + + // * Verify editing correct metric, and only this metric + cy.getStyledComponent('EditContainer').should('have.length', 1).within(() => { + cy.get('input[type=text]').eq(0).should('have.value', 'test integer'); + }); + cy.getStyledComponent('ViewContainer').should('have.length', 3); + + // # Edit third metric's title, switch to another metric + cy.getStyledComponent('EditContainer').should('have.length', 1).within(() => { + cy.get('input[type=text]').eq(0).clear().type('test integer222'); + }); + cy.findAllByTestId('edit-metric').eq(0).click(); + + // * Verify the title on the third metric (the second in view mode) was saved on switching + verifyViewMetric(1, 'test integer222', '7777777 per run', 'test descr 3'); + + // * Verify we have three valid metrics and are editing one. + verifyViewsAndEdits(3, 1); + }); + }); + + describe('adding and editing metrics (new playbook)', () => { + it('verifies when clicking "Add Metric", for Currency type, and switches to new edit', () => { + // # Visit the selected playbook + cy.visit(`/playbooks/playbooks/${testPlaybook.id}`); + + // # Switch to Outline tab and focus retro section + cy.findByText('Outline').click(); + cy.get('#retrospective').scrollIntoView(); + + // # Add and verify 1st metric + addMetric('Integer', 'test integer!', '12314123', 'test description'); + verifyViewMetric(0, 'test integer!', '12314123 per run', 'test description'); + + // # Add metric + cy.findByRole('button', {name: 'Add Metric'}).click(); + cy.findByTestId('dropdownmenu').within(() => { + cy.findByText('Cost').click(); + }); + + // # Don't fill in the metric's details + cy.get('input[type=text]').eq(1).clear(); + + // * Metrics need a title + cy.get('input[type=text]').eq(1).clear(); + cy.findByRole('button', {name: 'Add Metric'}).click(); + cy.findByTestId('dropdownmenu').within(() => { + cy.findByText('Integer').click(); + }); + cy.getStyledComponent('ErrorText').contains('Please add a title for your metric.'); + + // * Metrics need a unique title + cy.get('input[type=text]').eq(1).type('test integer!'); + cy.findByRole('button', {name: 'Add Metric'}).click(); + cy.findByTestId('dropdownmenu').within(() => { + cy.findByText('Integer').click(); + }); + cy.getStyledComponent('ErrorText'). + contains('A metric with the same name already exists. Please add a unique name for each metric.'); + + // # Fill in title + cy.get('input[type=text]').eq(1).clear().type('test currency!'); + + // * A Currency target cannot be text + cy.get('input[type=text]').eq(2).clear().type('z'); + cy.findByRole('button', {name: 'Add Metric'}).click(); + cy.findByTestId('dropdownmenu').within(() => { + cy.findByText('Integer').click(); + }); + cy.getStyledComponent('ErrorText').contains('Please enter a number, or leave the target blank.'); + + // * A Currency target /can/ be blank, so can the description, and Add next Integer metric + cy.get('input[type=text]').eq(2).clear(); + cy.findByRole('button', {name: 'Add Metric'}).click(); + cy.findByTestId('dropdownmenu').within(() => { + cy.findByText('Integer').click(); + }); + cy.getStyledComponent('EditContainer').should('be.visible'); + + // * Verify metric was added without target or description. + verifyViewMetric(1, 'test currency!', '', ''); + + // * Verify we have two valid metrics and are editing next one. + verifyViewsAndEdits(2, 1); + + // # Now test: verifies when clicking edit button, for Currency type, and switches to next edit + // # (using the previous state) + + // # Don't fill in the metric's details + cy.get('input[type=text]').eq(1).clear(); + + // * Metrics need a title + cy.get('input[type=text]').eq(1).clear(); + cy.findAllByTestId('edit-metric').eq(0).click(); + cy.getStyledComponent('ErrorText').contains('Please add a title for your metric.'); + + // * Metrics need a unique title + cy.get('input[type=text]').eq(1).type('test currency!'); + cy.findAllByTestId('edit-metric').eq(0).click(); + cy.getStyledComponent('ErrorText'). + contains('A metric with the same name already exists. Please add a unique name for each metric.'); + + // # Fill in title + cy.get('input[type=text]').eq(1).clear().type('test integer #2!!'); + + // * An Integer target cannot be text + cy.get('input[type=text]').eq(2).clear().type('arsoton'); + cy.findAllByTestId('edit-metric').eq(0).click(); + cy.getStyledComponent('ErrorText').contains('Please enter a number, or leave the target blank.'); + + // * An Integer target /can/ be blank, so can the description, and edit first metric + cy.get('input[type=text]').eq(2).clear(); + cy.findAllByTestId('edit-metric').eq(0).click(); + + // * Verify we're editing the first metric, and only this metric + cy.getStyledComponent('EditContainer').should('have.length', 1).within(() => { + cy.get('input[type=text]').eq(0).should('have.value', 'test integer!'); + }); + cy.getStyledComponent('ViewContainer').should('have.length', 2); + + // # Stop editing + saveMetric(); + + // * Verify metric was added without target or description. + verifyViewMetric(2, 'test integer #2!!', '', ''); + + // * Verify we have three valid metrics and are editing none. + verifyViewsAndEdits(3, 0); + }); + }); + + describe('delete metric', () => { + it.skip('verifies when clicking delete button; saved metrics have different confirmation text; deleted metrics are deleted', () => { + // # Visit the selected playbook + cy.visit(`/playbooks/playbooks/${testPlaybook.id}`); + + // # Switch to Outline tab and focus retro section + cy.findByText('Outline').click(); + cy.get('#retrospective').scrollIntoView(); + + // # Add and verify 1st metric + addMetric('Integer', 'test integer!', '12314123', 'test description'); + verifyViewMetric(0, 'test integer!', '12314123 per run', 'test description'); + + // # Add metric + cy.findByRole('button', {name: 'Add Metric'}).click(); + cy.findByTestId('dropdownmenu').within(() => { + cy.findByText('Cost').click(); + }); + + // # Don't fill in the metric's details + cy.get('input[type=text]').eq(1).clear(); + + // * Metrics need a title + cy.get('input[type=text]').eq(1).clear(); + cy.findAllByTestId('delete-metric').eq(0).click(); + cy.getStyledComponent('ErrorText').contains('Please add a title for your metric.'); + + // * Metrics need a unique title + cy.get('input[type=text]').eq(1).type('test integer!'); + cy.findAllByTestId('delete-metric').eq(0).click(); + cy.getStyledComponent('ErrorText'). + contains('A metric with the same name already exists. Please add a unique name for each metric.'); + + // # Fill in title + cy.get('input[type=text]').eq(1).clear().type('test currency!'); + + // * A Currency target cannot be text + cy.get('input[type=text]').eq(2).clear().type('z'); + cy.findAllByTestId('delete-metric').eq(0).click(); + cy.getStyledComponent('ErrorText').contains('Please enter a number, or leave the target blank.'); + + // # Remove error text and type another invalid entry + cy.get('input[type=text]').eq(2).clear().type('invalid'); + + // * Verify that we're allowed to delete a metric we are currently editing (even if it's invalid) + cy.findAllByTestId('delete-metric').eq(1).click(); + cy.get('#confirm-modal-light').should('be.visible').contains('Are you sure you want to delete?'); + + // # Should see the confirmation /without/ extra text because we haven't saved this metric yet + cy.get('#confirm-modal-light'). + should('not.contain.text', 'You will still be able to access historical data for this metric.'); + + // # Dismiss + cy.findByRole('button', {name: 'Cancel'}).click(); + + // * A Currency target /can/ be blank, so can the description, try to delete first metric + cy.get('input[type=text]').eq(2).clear(); + cy.findAllByTestId('delete-metric').eq(0).click(); + + cy.get('#confirm-modal-light'). + should('contain.text', 'If you delete this metric, the values for it will not be collected for any future runs.'); + + // # Delete first metric + cy.findByRole('button', {name: 'Delete metric'}).click(); + + // * Verify metric + verifyViewsAndEdits(1, 0); + verifyViewMetric(0, 'test currency!', '', ''); + + // # Make sure we can still edit and add a metric after deleting one (testing that the metrics + // component's state isn't broken) + addMetric('Integer', 'test integer 2!', '123', 'test description'); + verifyViewMetric(1, 'test integer 2!', '123 per run', 'test description'); + cy.findAllByTestId('delete-metric').eq(1).click(); + cy.findByRole('button', {name: 'Delete metric'}).click(); + cy.findAllByTestId('edit-metric').eq(0).click(); + cy.get('input[type=text]').eq(1).clear().type('test currency 2!'); + saveMetric(); + verifyViewsAndEdits(1, 0); + verifyViewMetric(0, 'test currency 2!', '', ''); + + // # Make sure we can add a metric and then delete it, then can keep editing + cy.findByRole('button', {name: 'Add Metric'}).click(); + cy.findByTestId('dropdownmenu').within(() => { + cy.findByText('Cost').click(); + }); + cy.findAllByTestId('delete-metric').eq(1).click(); + cy.findByRole('button', {name: 'Delete metric'}).click(); + cy.findAllByTestId('edit-metric').eq(0).click(); + cy.get('input[type=text]').eq(1).clear().type('test currency 3!'); + saveMetric(); + verifyViewsAndEdits(1, 0); + verifyViewMetric(0, 'test currency 3!', '', ''); + + // # Make sure we can add a metric and then delete it, then can keep adding + cy.findByRole('button', {name: 'Add Metric'}).click(); + cy.findByTestId('dropdownmenu').within(() => { + cy.findByText('Cost').click(); + }); + cy.findAllByTestId('delete-metric').eq(1).click(); + cy.findByRole('button', {name: 'Delete metric'}).click(); + cy.findByRole('button', {name: 'Add Metric'}).click(); + cy.findByTestId('dropdownmenu').within(() => { + cy.findByText('Cost').click(); + }); + cy.findAllByTestId('delete-metric').eq(1).click(); + cy.findByRole('button', {name: 'Delete metric'}).click(); + verifyViewsAndEdits(1, 0); + verifyViewMetric(0, 'test currency 3!', '', ''); + + // # Refresh and verify one is saved + cy.reload(); + verifyViewsAndEdits(1, 0); + verifyViewMetric(0, 'test currency 3!', '', ''); + + // # Delete metric + cy.findAllByTestId('delete-metric').eq(0).click(); + + // # Should see the confirmation /with/ extra text + cy.get('#confirm-modal-light'). + should('contain.text', 'If you delete this metric, the values for it will not be collected for any future runs. You will still be able to access historical data for this metric.'); + + // # Delete first metric + cy.findByRole('button', {name: 'Delete metric'}).click(); + + // * Verify + verifyViewsAndEdits(0, 0); + + // # Refresh and verify deleted + cy.reload(); + verifyViewsAndEdits(0, 0); + }); + }); + + describe('nullable and 0-able targets', () => { + it('can add 0 targets and no (null) targets', () => { + // # Visit the selected playbook + cy.visit(`/playbooks/playbooks/${testPlaybook.id}`); + + // # Switch to Outline tab and focus retro section + cy.findByText('Outline').click(); + cy.get('#retrospective').scrollIntoView(); + + // # Add and verify duration + addMetric('Duration', 'test duration', '0:0:0', 'test description'); + verifyViewMetric(0, 'test duration', '0 seconds per run', 'test description'); + + // # Verify it shows 0:0:0, then turn it into null. + cy.findAllByTestId('edit-metric').eq(0).click(); + cy.get('input[type=text]').eq(2).should('have.value', '00:00:00'). + clear(); + saveMetric(); + + // # Verify that the 'Target' section is gone + cy.getStyledComponent('ViewContainer'). + getStyledComponent('DetailDiv'). + should('have.length', 1); + + verifyViewMetric(0, 'test duration', '', 'test description'); + + // * Verify it has null value when editing again. + cy.findAllByTestId('edit-metric').eq(0).click(); + cy.get('input[type=text]').eq(2).should('have.value', ''); + saveMetric(); + + // # Add and verify currency + addMetric('Cost', 'test money', '0', 'test description 2'); + cy.wait('@addMetric'); + verifyViewMetric(1, 'test money', '0', 'test description 2'); + + // # Verify it shows 0, then turn it into null. + cy.findAllByTestId('edit-metric').eq(1).click(); + cy.get('input[type=text]').eq(2).should('have.value', '0'). + clear(); + saveMetric(); + cy.getStyledComponent('ViewContainer').should('have.length', 2).eq(1).within(() => { + // # Verify that the 'Target' section is gone + cy.getStyledComponent('DetailDiv'). + should('have.length', 1); + }); + + verifyViewMetric(1, 'test money', '', 'test description 2'); + + // * Verify it has null value when editing again. + cy.findAllByTestId('edit-metric').eq(1).click(); + cy.get('input[type=text]').eq(2).should('have.value', ''); + saveMetric(); + + // # Add and verify Integer + addMetric('Integer', 'test number', '0', 'test description 3'); + cy.wait('@addMetric'); + verifyViewMetric(2, 'test number', '0', 'test description 3'); + + // # Verify it shows 0, then turn it into null. + cy.findAllByTestId('edit-metric').eq(2).click(); + cy.get('input[type=text]').eq(2).should('have.value', '0'). + clear(); + saveMetric(); + cy.getStyledComponent('ViewContainer').should('have.length', 3).eq(2).within(() => { + // # Verify that the 'Target' section is gone + cy.getStyledComponent('DetailDiv'). + should('have.length', 1); + }); + + verifyViewMetric(2, 'test number', '', 'test description 3'); + + // * Verify it has null value when editing again. + cy.findAllByTestId('edit-metric').eq(2).click(); + cy.get('input[type=text]').eq(2).should('have.value', ''); + saveMetric(); + + // * Verify we have three valid metrics and are editing none. + verifyViewsAndEdits(3, 0); + + // # Refresh + cy.reload(); + + // * Verify we saved the metrics + verifyViewMetric(0, 'test duration', '', 'test description'); + verifyViewMetric(1, 'test money', '', 'test description 2'); + verifyViewMetric(2, 'test number', '', 'test description 3'); + }); + }); + }); +}); + +const addMetric = (type, title, target, description) => { + const fullType = type === 'Duration' ? 'Duration (in dd:hh:mm)' : type; + + // # Add the requested metric + cy.findByRole('button', {name: 'Add Metric'}).click(); + cy.findByTestId('dropdownmenu').within(() => { + cy.findByText(fullType).click(); + }); + + // # Fill in the metric's details + cy.get('input[type=text]').eq(1).type(title). + tab().type(target). + tab().type(description); + + // # Add the metric + saveMetric(); + cy.wait('@addMetric'); +}; + +const verifyViewMetric = (index, title, target, description) => { + cy.getStyledComponent('ViewContainer').should('have.length.of.at.least', index + 1).eq(index).within(() => { + cy.getStyledComponent('Title').should('have.text', title); + + if (target) { + cy.getStyledComponent('DetailDiv').eq(0).contains(target); + } + + if (description) { + const idx = target ? 1 : 0; + cy.getStyledComponent('DetailDiv').eq(idx).contains(description); + } + }); +}; + +const verifyViewsAndEdits = (numViews, numEdits) => { + if (numViews === 0) { + cy.getStyledComponent('ViewContainer').should('not.exist'); + } else { + cy.getStyledComponent('ViewContainer').should('have.length', numViews); + } + + if (numEdits === 0) { + cy.getStyledComponent('EditContainer').should('not.exist'); + } else { + cy.getStyledComponent('EditContainer').should('have.length', numEdits); + } +}; + +function saveMetric() { + cy.get('#retrospective-metrics').within(() => { + cy.findByRole('button', {name: 'Save'}).click(); + }); +} diff --git a/e2e/cypress/tests/integration/playbooks/playbooks/edit_spec.js b/e2e/cypress/tests/integration/playbooks/playbooks/edit_spec.js new file mode 100644 index 0000000000..41fb3ece6b --- /dev/null +++ b/e2e/cypress/tests/integration/playbooks/playbooks/edit_spec.js @@ -0,0 +1,1708 @@ +// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. + +// *************************************************************** +// - [#] indicates a test step (e.g. # Go to a page) +// - [*] indicates an assertion (e.g. * Check the title) +// *************************************************************** + +// Stage: @prod +// Group: @playbooks + +/* eslint-disable no-only-tests/no-only-tests */ + +import * as TIMEOUTS from '../../../fixtures/timeouts'; + +describe('playbooks > edit', () => { + let testTeam; + let testSysadmin; + let testUser; + let testUser2; + let testUser3; + + const openCategorySelector = () => { + cy.get('.channel-selector__control input').click({force: true}); + }; + const selectCategory = (name) => { + cy.get('.channel-selector__menu').findByText(name).click({force: true}); + }; + + before(() => { + cy.apiInitSetup().then(({team, user}) => { + testTeam = team; + testUser = user; + + cy.apiCreateCustomAdmin().then(({sysadmin}) => { + testSysadmin = sysadmin; + }); + + // # Create a second test user in this team + cy.apiCreateUser().then((payload) => { + testUser2 = payload.user; + cy.apiAddUserToTeam(testTeam.id, payload.user.id); + }); + + // # Create a third test user in this team + cy.apiCreateUser().then((payload) => { + testUser3 = payload.user; + cy.apiAddUserToTeam(testTeam.id, payload.user.id); + }); + }); + }); + + beforeEach(() => { + // # Login as testUser + cy.apiLogin(testUser); + }); + + describe('checklists', () => { + describe('pre-assignee', () => { + it('user gets pre-assigned, added to invite user list, and invitations become enabled', () => { + // # Open Playbooks + cy.visit('/playbooks/playbooks'); + + // # Start a blank playbook + cy.findByText('Blank').click(); + cy.findByText('Outline').click(); + + cy.get('#actions').within(() => { + cy.get('#invite-users').within(() => { + // * Verify invitations are disabled and no invited user exists + cy.get('label input').should('not.be.checked'); + cy.get('.invite-users-selector__control'). + after('content'). + should('eq', ''); + }); + }); + + // # Pre-assign the user + cy.get('#checklists').within(() => { + // # Trigger assignee select menu + cy.findByText('Untitled task').trigger('mouseover'); + cy.findByTestId('hover-menu-edit-button').click(); + cy.findByText('Assignee...').click(); + + // * Verify that the assignee input is focused now + cy.focused(). + should('have.attr', 'type', 'text'). + should('have.attr', 'id'); + + // * Verify that the root of the assignee select menu exists + cy.focused().parents('.playbook-react-select'). + should('exist'). + within(() => { + // # Select the test user + cy.findByText('@' + testUser.username).click({force: true}); + }); + }); + + cy.reload(); + + cy.get('#checklists').within(() => { + // # Trigger assignee select menu + cy.findByText('Untitled task').trigger('mouseover'); + cy.findByTestId('hover-menu-edit-button').click(); + cy.findByText('@' + testUser.username).click(); + + // * Verify that the assignee input is focused now + cy.focused(). + should('have.attr', 'type', 'text'). + should('have.attr', 'id'); + + // * Verify that the root of the assignee select menu exists + cy.focused(). + parents('.playbook-react-select'). + should('exist'); + }); + + cy.get('#actions').within(() => { + cy.get('#invite-users').within(() => { + // * Verify invitations are enabled and a single user is invited + cy.get('label input').should('be.checked'); + cy.get('.invite-users-selector__control'). + after('content'). + should('eq', '1 SELECTED'); + }); + }); + }); + }); + + describe('slash command', () => { + it('autocompletes after clicking Command...', () => { + // # Open Playbooks + cy.visit('/playbooks/playbooks'); + + // # Start a blank playbook + cy.findByText('Blank').click(); + cy.findByText('Outline').click(); + + cy.get('#checklists').within(() => { + // # Open the slash command input on a step + cy.findByText('Untitled task').trigger('mouseover'); + cy.findByTestId('hover-menu-edit-button').click(); + cy.findByText('Command...').click(); + + // * Verify the slash command input field now has focus + // * and starts with a slash prefix. + cy.focused(). + should('have.attr', 'placeholder', 'Slash Command'). + should('have.value', '/'); + }); + + // * Verify the autocomplete prompt is open + cy.get('#suggestionList').should('exist'); + }); + + // current regression in BPE + // MM-44606 + it.skip('removes the input prompt when blurring with an empty slash command', () => { + // # Open Playbooks + cy.visit('/playbooks/playbooks'); + + // # Start a blank playbook + cy.findByText('Blank').click(); + cy.findByText('Outline').click(); + + cy.get('#checklists').within(() => { + // # Open the slash command input on a step + cy.findByText('Untitled task').trigger('mouseover'); + cy.findByTestId('hover-menu-edit-button').click(); + cy.findByText('Add slash command').click(); + + // * Verify the slash command input field now has focus + // * and starts with a slash prefix. + cy.findByPlaceholderText('Slash Command').should('have.focus'); + cy.findByPlaceholderText('Slash Command').should('have.value', '/'); + + cy.findByPlaceholderText('Slash Command').type('{backspace}'); + cy.findByPlaceholderText('Slash Command').blur(); + + cy.findByText('Add slash command').should('be.visible'); + }); + }); + + // current regression in BPE + // MM-44606 + it.skip('removes the input prompt when blurring with an invalid slash command', () => { + // # Open Playbooks + cy.visit('/playbooks/playbooks'); + + // # Start a blank playbook + cy.findByText('Blank').click(); + cy.findByText('Outline').click(); + + cy.get('#checklists').within(() => { + // # Open the slash command input on a step + cy.findByText('Untitled task').trigger('mouseover'); + cy.findByTestId('hover-menu-edit-button').click(); + cy.findByText('Add slash command').click(); + + // * Verify the slash command input field now has focus + // * and starts with a slash prefix. + cy.findByPlaceholderText('Slash Command').should('have.focus'); + cy.findByPlaceholderText('Slash Command').should('have.value', '/'); + + // # Blur the slash command without having typed anything more + cy.findByPlaceholderText('Slash Command').blur(); + + cy.findByText('Add slash command').should('be.visible'); + }); + }); + }); + }); + + const commonActionTests = () => { + describe('when a playbook run starts', () => { + let testPlaybook; + beforeEach(() => { + // # Create a playbook + cy.apiCreateTestPlaybook({ + teamId: testTeam.id, + title: 'Playbook (' + Date.now() + ')', + userId: testUser.id, + }).then((playbook) => { + testPlaybook = playbook; + }); + }); + + describe('create channel setting', () => { + it('is enabled by default in a new playbook', () => { + // # Visit the selected playbook + cy.visit(`/playbooks/playbooks/${testPlaybook.id}/outline`); + + // # select the actions section. + cy.get('#actions').within(() => { + // * Verify that the toggle is checked + cy.get('#create-new-channel label input').should('be.checked'); + }); + }); + }); + + describe('invite members setting', () => { + it('is disabled in a new playbook', () => { + // # Visit the selected playbook + cy.visit(`/playbooks/playbooks/${testPlaybook.id}/outline`); + + // # select the actions section + cy.get('#actions').within(() => { + // * Verify that the toggle is unchecked + cy.get('#invite-users label input').should('not.be.checked'); + }); + }); + + it('can be enabled', () => { + // # Visit the selected playbook + cy.visit(`/playbooks/playbooks/${testPlaybook.id}/outline`); + + // # select the actions section + cy.get('#actions').within(() => { + cy.get('#invite-users').within(() => { + // * Verify that the toggle is unchecked + cy.get('label input').should('not.be.checked'); + + // # Click on the toggle to enable the setting + cy.get('label input').click({force: true}); + + // * Verify that the toggle is unchecked + cy.get('label input').should('be.checked'); + }); + }); + }); + + it('does not let add users when disabled', () => { + // # Visit the selected playbook + cy.visit(`/playbooks/playbooks/${testPlaybook.id}/outline`); + + // # select the actions section + cy.get('#actions').within(() => { + // * Verify that the toggle is unchecked + cy.get('#invite-users label input').should('not.be.checked'); + + // * Verify that the menu is disabled + cy.get('#invite-users').within(() => { + cy.getStyledComponent('StyledReactSelect').should( + 'have.class', + 'invite-users-selector--is-disabled', + ); + }); + }); + }); + + it('allows adding users when enabled', () => { + // # Visit the selected playbook + cy.visit(`/playbooks/playbooks/${testPlaybook.id}/outline`); + + // # select the actions section + cy.get('#actions').within(() => { + cy.get('#invite-users').within(() => { + // * Verify that the toggle is unchecked + cy.get('label input').should('not.be.checked'); + + // # Click on the toggle to enable the setting + cy.get('label input').click({force: true}); + + // * Verify that the toggle is checked + cy.get('label input').should('be.checked'); + + // # Open the invited users selector + cy.openSelector(); + + // # Add one user + cy.addInvitedUser(testUser2.username); + cy.wait(TIMEOUTS.ONE_SEC); + + // * Verify that the badge in the selector shows the correct number of members + cy.get('.invite-users-selector__control'). + after('content'). + should('eq', '1 SELECTED'); + + // * Verify that the user shows in the group of invited members + cy.findByText('SELECTED'). + parent(). + within(() => { + cy.findByText(testUser2.username); + }); + }); + }); + }); + + it('allows adding new users to an already populated list', () => { + // # Visit the selected playbook + cy.visit(`/playbooks/playbooks/${testPlaybook.id}/outline`); + + // # select the actions section + cy.get('#actions').within(() => { + cy.get('#invite-users').within(() => { + // * Verify that the toggle is unchecked + cy.get('label input').should('not.be.checked'); + + // # Click on the toggle to enable the setting + cy.get('label input').click({force: true}); + + // * Verify that the toggle is checked + cy.get('label input').should('be.checked'); + + // # Open the invited users selector + cy.openSelector(); + + // # Add one user + cy.addInvitedUser(testUser2.username); + + // * Verify that the user shows in the group of invited members + cy.findByText('SELECTED'). + parent(). + within(() => { + cy.findByText(testUser2.username); + }); + + // # Add a new user + cy.addInvitedUser(testUser3.username); + cy.wait(TIMEOUTS.ONE_SEC); + + cy.get('.invite-users-selector__control'). + after('content'). + should('eq', '2 SELECTED'); + + // * Verify that the user shows in the group of invited members + cy.findByText('SELECTED'). + parent(). + within(() => { + cy.findByText(testUser2.username); + cy.findByText(testUser3.username); + }); + }); + }); + }); + + it('allows removing users', () => { + // # Visit the selected playbook + cy.visit(`/playbooks/playbooks/${testPlaybook.id}/outline`); + + // # select the actions section + cy.get('#actions').within(() => { + cy.get('#invite-users').within(() => { + // * Verify that the toggle is unchecked + cy.get('label input').should('not.be.checked'); + + // # Click on the toggle to enable the setting + cy.get('label input').click({force: true}); + + // * Verify that the toggle is checked + cy.get('label input').should('be.checked'); + + // # Open the invited users selector + cy.openSelector(); + + // # Add a couple of users + cy.addInvitedUser(testUser2.username); + cy.wait(TIMEOUTS.ONE_SEC); + cy.addInvitedUser(testUser3.username); + cy.wait(TIMEOUTS.ONE_SEC); + + // * Verify that the badge in the selector shows the correct number of members + cy.get('.invite-users-selector__control'). + after('content'). + should('eq', '2 SELECTED'); + + // # Remove the first users added + cy.get('.invite-users-selector__option'). + eq(0). + within(() => { + cy.findByText('Remove').click(); + }); + cy.wait(TIMEOUTS.ONE_SEC); + + // * Verify that there is only one user, the one not removed + cy.get('.invite-users-selector__control'). + after('content'). + should('eq', '1 SELECTED'); + + cy.findByText('SELECTED'). + parent(). + within(() => { + cy.get('.invite-users-selector__option'). + should('have.length', 1). + contains(testUser3.username); + }); + }); + }); + }); + + it('persists the list of users even if the toggle is off', () => { + // # Visit the selected playbook + cy.visit(`/playbooks/playbooks/${testPlaybook.id}/outline`); + + // # select the actions section + cy.get('#actions').within(() => { + cy.get('#invite-users').within(() => { + // * Verify that the toggle is unchecked + cy.get('label input').should('not.be.checked'); + + // # Click on the toggle to enable the setting + cy.get('label input').click({force: true}); + + // * Verify that the toggle is checked + cy.get('label input').should('be.checked'); + + // # Open the invited users selector + cy.openSelector(); + + // # Add a couple of users + cy.addInvitedUser(testUser2.username); + cy.wait(TIMEOUTS.ONE_SEC); + cy.addInvitedUser(testUser3.username); + cy.wait(TIMEOUTS.ONE_SEC); + + // * Verify that the badge in the selector shows the correct number of members + cy.get('.invite-users-selector__control'). + after('content'). + should('eq', '2 SELECTED'); + + // # Click on the toggle to disable the setting + cy.get('label input').click({force: true}); + + // * Verify that the toggle is unchecked + cy.get('label input').should('not.be.checked'); + }); + }); + + cy.reload(); + + cy.get('#actions').within(() => { + cy.get('#invite-users').within(() => { + // * Verify that the toggle is unchecked + cy.get('label input').should('not.be.checked'); + + // # Click on the toggle to enable the setting + cy.get('label input').click({force: true}); + + // * Verify that the toggle is checked + cy.get('label input').should('be.checked'); + + // * Verify that the badge in the selector shows the correct number of members + cy.get('.invite-users-selector__control'). + after('content'). + should('eq', '2 SELECTED'); + + // # Open the invited users selector + cy.openSelector(); + + // * Verify that the user shows in the group of invited members + cy.findByText('SELECTED'). + parent(). + within(() => { + cy.findByText(testUser2.username); + cy.findByText(testUser2.username); + }); + }); + }); + }); + + describe('allow removing pre-assigned users with confirmation', () => { + beforeEach(() => { + // # Create a playbook + cy.apiCreateTestPlaybook({ + teamId: testTeam.id, + title: 'Playbook (' + Date.now() + ')', + userId: testUser.id, + checklists: [{ + title: 'Example', + items: [ + { + title: 'Untitled task', + assignee_id: testUser.id, + }, + ], + }], + invitedUserIds: [testUser.id], + inviteUsersEnabled: true, + }).then((playbook) => { + testPlaybook = playbook; + }); + }); + + it('when removing an invited user', () => { + // # Visit the selected playbook + cy.visit(`/playbooks/playbooks/${testPlaybook.id}/outline`); + + cy.get('#checklists').within(() => { + // * Verify user is pre-assigned + cy.findByText('Untitled task').trigger('mouseover'); + cy.findByTestId('hover-menu-edit-button').click(); + cy.findByText(`@${testUser.username}`).should('exist'); + }); + + cy.get('#actions').within(() => { + cy.get('#invite-users').within(() => { + // * Verify invitations enabled and user is invited + cy.get('label input').should('be.checked'); + cy.get('.invite-users-selector__control'). + after('content'). + should('eq', '1 SELECTED'); + + cy.openSelector(); + + cy.get('.invite-users-selector__menu').within(() => { + // # Trigger remove for pre-assigned user + cy.findByText('Remove').click({force: true}); + }); + }); + }); + + // * Verify that confirmation dialog is open + cy.get('#confirmModal').should('be.visible'); + + // * Verify that confirmation dialog contains correct text + cy.get('#confirmModal').should('contain', 'Are you sure you want to stop inviting this user as a member of the run?'); + + // * Verify that the confirmation button is focused and click + cy.focused(). + should('have.id', 'confirmModalButton'). + click({force: true}); + + // * Verify that the confirmation dialog is closed + cy.get('#confirmModal').should('not.exist'); + + cy.reload(); + + cy.get('#checklists').within(() => { + // * Verify that user is not pre-assigned anymore + cy.findByText('Untitled task').trigger('mouseover'); + cy.findByTestId('hover-menu-edit-button').click(); + cy.findByText('Assignee...').should('exist'); + }); + + cy.get('#actions').within(() => { + cy.get('#invite-users').within(() => { + // * Verify that user is not invited anymore + cy.get('.invite-users-selector__control'). + after('content'). + should('eq', ''); + }); + }); + }); + + it('when disabling invitations', () => { + // # Visit the selected playbook + cy.visit(`/playbooks/playbooks/${testPlaybook.id}/outline`); + + cy.get('#checklists').within(() => { + // * Verify user is pre-assigned + cy.findByText('Untitled task').trigger('mouseover'); + cy.findByTestId('hover-menu-edit-button').click(); + cy.findByText(`@${testUser.username}`).should('exist'); + }); + + cy.get('#actions').within(() => { + cy.get('#invite-users').within(() => { + // * Verify invitations are enabled and user is invited + cy.get('label input').should('be.checked'); + cy.get('.invite-users-selector__control'). + after('content'). + should('eq', '1 SELECTED'); + + // # Disable invitations + cy.get('label input').click({force: true}); + }); + }); + + // * Verify that confirmation dialog is open + cy.get('#confirmModal').should('be.visible'); + + // * Verify that confirmation dialog contains correct text + cy.get('#confirmModal').should('contain', 'Are you sure you want to disable invitations?'); + + // * Verify that the confirmation button is focused and click + cy.focused(). + should('have.id', 'confirmModalButton'). + click({force: true}); + + // * Verify that confirmation dialog is closed + cy.get('#confirmModal').should('not.exist'); + + cy.reload(); + + cy.get('#checklists').within(() => { + // * Verify that user is not pre-assigned + cy.findByText('Untitled task').trigger('mouseover'); + cy.findByTestId('hover-menu-edit-button').click(); + cy.findByText('Assignee...').should('exist'); + }); + + cy.get('#actions').within(() => { + cy.get('#invite-users').within(() => { + // * Verify that invitations are disabled and no user is invited + cy.get('label input').should('not.be.checked'); + cy.get('.invite-users-selector__control'). + after('content'). + should('eq', ''); + }); + }); + }); + }); + + // BPE regression + // user is still shown in the selector + // with a 1 MEMBER badge + // MM-44635 + it.skip('removes invitation from users that are no longer in the team', () => { + let userToRemove; + let playbookId; + + // # Create a playbook with a user that is later removed from the team + cy.apiLogin(testSysadmin). + then(() => { + cy.apiCreateUser().then((result) => { + userToRemove = result.user; + cy.apiAddUserToTeam( + testTeam.id, + userToRemove.id, + ); + + // # Create a playbook with the user that will be removed from the team. + cy.apiCreatePlaybook({ + teamId: testTeam.id, + title: 'Playbook (' + Date.now() + ')', + createPublicPlaybookRun: true, + memberIDs: [testUser.id, testSysadmin.id], + invitedUserIds: [userToRemove.id], + inviteUsersEnabled: true, + }).then((playbook) => { + playbookId = playbook.id; + }); + + // # Remove user from the team + cy.apiDeleteUserFromTeam( + testTeam.id, + userToRemove.id, + ); + }); + }). + then(() => { + cy.apiLogin(testUser); + + // # Visit the selected playbook + cy.visit(`/playbooks/playbooks/${playbookId}/outline`); + + // # select the actions section + cy.contains('run summary template').dblclick(); + cy.findByRole('button', {name: /save/i}); + cy.reload(); + + cy.get('#actions').within(() => { + // # Open the invited users selector + cy.get('#invite-users').within(() => { + cy.openSelector(); + + // * Verify there is no member badge + cy.get('.invite-users-selector__control'). + after('content'). + should('eq', ''); + }); + }); + }); + }); + }); + + describe('assign owner setting', () => { + it('is disabled in a new playbook', () => { + // # Visit the selected playbook + cy.visit(`/playbooks/playbooks/${testPlaybook.id}/outline`); + + // # select the actions section + cy.get('#actions').within(() => { + // * Verify that the toggle is unchecked + cy.get('#assign-owner label input').should( + 'not.be.checked', + ); + }); + }); + + it('can be enabled', () => { + // # Visit the selected playbook + cy.visit(`/playbooks/playbooks/${testPlaybook.id}/outline`); + + // # select the actions section + cy.get('#actions').within(() => { + cy.get('#assign-owner').within(() => { + // * Verify that the toggle is unchecked + cy.get('label input').should('not.be.checked'); + + // # Click on the toggle to enable the setting + cy.get('label input').click({force: true}); + + // * Verify that the toggle is checked + cy.get('label input').should('be.checked'); + }); + }); + }); + + it('does not allow adding an owner when disabled', () => { + // # Visit the selected playbook + cy.visit(`/playbooks/playbooks/${testPlaybook.id}/outline`); + + // # select the actions section + cy.get('#actions').within(() => { + cy.get('#assign-owner').within(() => { + // * Verify that the toggle is unchecked + cy.get('input').should( + 'not.be.checked', + ); + + // * Verify that the menu is disabled + cy.getStyledComponent('StyledReactSelect').should( + 'have.class', + 'assign-owner-selector--is-disabled', + ); + }); + }); + }); + + it('allows adding users when enabled', () => { + // # Visit the selected playbook + cy.visit(`/playbooks/playbooks/${testPlaybook.id}/outline`); + + // # select the actions section + cy.get('#actions').within(() => { + cy.get('#assign-owner').within(() => { + // * Verify that the toggle is unchecked + cy.get('label input').should('not.be.checked'); + + // # Click on the toggle to enable the setting + cy.get('label input').click({force: true}); + + // * Verify that the toggle is checked + cy.get('label input').should('be.checked'); + + // # Open the owner selector + cy.openSelector(); + + // # Select a owner + cy.selectOwner(testUser2.username); + + // * Verify that the control shows the selected owner + cy.get('.assign-owner-selector__control').contains( + testUser2.username, + ); + }); + }); + }); + + it('allows changing the owner', () => { + // # Visit the selected playbook + cy.visit(`/playbooks/playbooks/${testPlaybook.id}/outline`); + + // # select the actions section + cy.get('#actions').within(() => { + cy.get('#assign-owner').within(() => { + // * Verify that the toggle is unchecked + cy.get('label input').should('not.be.checked'); + + // # Click on the toggle to enable the setting + cy.get('label input').click({force: true}); + + // * Verify that the toggle is checked + cy.get('label input').should('be.checked'); + + // # Open the owner selector + cy.openSelector(); + + // # Select a owner + cy.selectOwner(testUser2.username); + + // * Verify that the control shows the selected owner + cy.get('.assign-owner-selector__control').contains( + testUser2.username, + ); + + // # Open the owner selector + cy.get('.assign-owner-selector__control').click({ + force: true, + }); + + // # Select a new owner + cy.selectOwner(testUser3.username); + + // * Verify that the control shows the selected owner + cy.get('.assign-owner-selector__control').contains( + testUser3.username, + ); + }); + }); + }); + + // BPE regression, + // owner assignment does not save + // MM-44647 + it.skip('persists the assigned owner even if the toggle is off', () => { + // # Visit the selected playbook + cy.visit(`/playbooks/playbooks/${testPlaybook.id}/outline`); + + // # select the actions section + cy.get('#assign-owner').within(() => { + // * Verify that the toggle is unchecked + cy.get('label input').should('not.be.checked'); + + // # Click on the toggle to enable the setting + cy.get('label input').click({force: true}); + + // * Verify that the toggle is checked + cy.get('label input').should('be.checked'); + + // # Open the owner selector + cy.openSelector(); + + // # Select a owner + cy.selectOwner(testUser2.username); + + // * Verify that the control shows the selected owner + cy.get('.assign-owner-selector__control').contains( + testUser2.username, + ); + + // # Click on the toggle to disable the setting + cy.get('label input').click({force: true}); + + // * Verify that the toggle is unchecked + cy.get('label input').should('not.be.checked'); + }); + + // # The toggle click above should have saved, + // # reload to check the outcome. + cy.reload(); + + cy.get('#assign-owner').within(() => { + // * Verify that the toggle is unchecked + cy.get('label input').should('not.be.checked'); + + // # Click on the toggle to enable the setting + cy.get('label input').click({force: true}); + + // * Verify that the toggle is checked + cy.get('label input').should('be.checked'); + + // * Verify that the control shows the selected owner + cy.get('.assign-owner-selector__control').contains( + testUser2.username, + ); + }); + }); + + // BPE regression + // removed user is not shown in the owner selector + // but the toggle remains on + // MM-44678 + it.skip('removes the owner and disables the setting if the user is no longer in the team', () => { + let userToRemove; + + // # Create a playbook with a user that is later removed from the team + cy.apiLogin(testSysadmin). + then(() => { + // # We need to increase the maximum number of users per team; otherwise, + // adding a new member to the team fails in CI + cy.apiCreateUser().then((result) => { + userToRemove = result.user; + cy.apiAddUserToTeam( + testTeam.id, + userToRemove.id, + ); + + // # Create a playbook with the user that will be removed from the team as + // the default owner + cy.apiCreatePlaybook({ + teamId: testTeam.id, + title: 'Playbook (' + Date.now() + ')', + createPublicPlaybookRun: true, + memberIDs: [testUser.id, testSysadmin.id], + defaultOwnerId: userToRemove.id, + defaultOwnerEnabled: true, + }); + + // # Remove user from the team + cy.apiDeleteUserFromTeam( + testTeam.id, + userToRemove.id, + ); + }); + }). + then(() => { + cy.apiLogin(testUser); + + // # Visit the selected playbook + cy.visit(`/playbooks/playbooks/${testPlaybook.id}/outline`); + + // # select the actions section + cy.contains('run summary template').dblclick(); + cy.findByRole('button', {name: /save/i}); + cy.reload(); + + cy.get('#assign-owner').within(() => { + // * Verify that the toggle is unchecked + cy.get('label input').should('not.be.checked'); + + // # Click on the toggle to enable the setting + cy.get('label input').click({force: true}); + + // * Verify that the control shows the selected owner + cy.get( + '.assign-owner-selector__control', + ).within(() => { + cy.findByText('Search for people'); + }); + }); + }); + }); + }); + }); + }; + + describe('actions toggled', () => { + let testPlaybook; + + before(() => { + // # Login as testUser + cy.apiLogin(testUser); + + // # Create a playbook + cy.apiCreateTestPlaybook({ + teamId: testTeam.id, + title: 'Playbook (' + Date.now() + ')', + userId: testUser.id, + }).then((playbook) => { + testPlaybook = playbook; + }); + }); + + commonActionTests(); + + describe('link to an existing channel setting', () => { + beforeEach(() => { + // # Visit the selected playbook + cy.visit(`/playbooks/playbooks/${testPlaybook.id}/outline`); + }); + + it('can be checked', () => { + // # select the action section. + cy.get('#actions #link-existing-channel').within(() => { + // * Verify that the toggle is unchecked and input is disabled + cy.get('input[type=radio]').should('not.be.checked'); + cy.get('input[type=text]').should('be.disabled'); + + // # click radio + cy.get('input[type=radio]').click(); + + // * Verify that the toggle is checked and input is enabled + cy.get('input[type=radio]').should('be.checked'); + cy.get('input[type=text]').should('not.be.disabled'); + }); + }); + + it('create channel choices are disabled when is checked', () => { + // # select the action section. + cy.get('#actions #link-existing-channel').within(() => { + // # click radio + cy.get('input[type=radio]').click(); + }); + + // # select the action section. + cy.get('#actions #create-new-channel').within(() => { + // * Verify that the toggle is unchecked and inputs are disabled + cy.get('input[type=radio]').eq(0).should('not.be.checked'); + cy.get('label input[type=radio]').should('be.disabled'); + cy.get('button').should('be.disabled'); + }); + }); + + it.skip('can fill a channel and is persisted', () => { + cy.get('#actions #link-existing-channel').within(() => { + // # click radio + cy.get('input[type=radio]').click(); + + cy.findByText('Select a channel').click().type('Town{enter}'); + }); + + cy.reload(); + + // * wait for page to load + cy.get('h1').should('be.visible'); + + cy.get('#actions #create-new-channel').within(() => { + // * Verify that the toggle is unchecked and inputs are disabled + cy.get('input[type=radio]').eq(0).should('not.be.checked'); + cy.get('label input[type=radio]').should('be.disabled'); + cy.get('button').should('be.disabled'); + }); + + cy.get('#actions #link-existing-channel').within(() => { + // * Verify that the toggle is checked and input is enabled + cy.get('input[type=radio]').should('be.checked'); + cy.get('input[type=text]').should('not.be.disabled'); + cy.findByText('Town Square').should('exist'); + }); + }); + }); + }); + + describe('actions', () => { + let testPrivateChannel; + let testPlaybook; + + before(() => { + // # Login as testUser + cy.apiLogin(testUser); + + // # Create a public channel + cy.apiCreateChannel( + testTeam.id, + 'public-channel', + 'Public Channel', + 'O', + ); + + // # Create a private channel + cy.apiCreateChannel( + testTeam.id, + 'private-channel', + 'Private Channel', + 'P', + ).then(({channel}) => { + testPrivateChannel = channel; + }); + }); + + beforeEach(() => { + // # Create a playbook + cy.apiCreateTestPlaybook({ + teamId: testTeam.id, + title: 'Playbook (' + Date.now() + ')', + userId: testUser.id, + }).then((playbook) => { + testPlaybook = playbook; + }); + }); + + describe('when an update is posted', () => { + describe('broadcast channel setting', () => { + it('none configured in a new playbook', () => { + // # Visit the selected playbook + cy.visit(`/playbooks/playbooks/${testPlaybook.id}/outline`); + + cy.get('#status-updates').within(() => { + cy.findByText('no channels').should('be.visible'); + }); + }); + + it('can change channel and edit is saved immediately', () => { + // # Visit the selected playbook + cy.visit(`/playbooks/playbooks/${testPlaybook.id}/outline`); + + cy.get('#status-updates').within(() => { + cy.findByText('no channels').click(); + }); + cy.findByText(/off-topic/i).click(); + + cy.reload(); + + cy.get('#status-updates').within(() => { + cy.findByText('1 channel').should('be.visible'); + }); + }); + + it('persists selected channels when status update toggle is off', () => { + // # Visit the selected playbook + cy.visit(`/playbooks/playbooks/${testPlaybook.id}/outline`); + + // # Add a channel and turn off the + // # status updates toggle + cy.get('#status-updates').within(() => { + cy.findByText('no channels').click(); + }); + cy.findByText(/off-topic/i).click(); + + // # Close the channel selector + cy.findByText(/search for a channel/i).type('{esc}'); + + cy.get('#status-updates').trigger('mouseenter').within(() => { + // # Click on the toggle to disable the setting + cy.get('label').click(); + + // * Verify that the toggle off + cy.get('label input').should('not.be.checked'); + }); + + // * Verify disabled status updates text + cy.findByText(/status updates are not expected/i).should('exist'); + cy.reload(); + + // # Turn the status update toggle back on + // * Verify there's still 1 channel selected + cy.get('#status-updates').trigger('mouseenter').within(() => { + cy.get('label').click(); + cy.findByText('1 channel').should('be.visible'); + }); + }); + + it('removes the channel and disables the setting if the channel no longer exists', () => { + // # Create a playbook with a user that is later removed from the team + cy.apiLogin(testSysadmin). + then(() => { + const channelDisplayName = String( + 'Channel to delete ' + Date.now(), + ); + const channelName = channelDisplayName. + replace(/ /g, '-'). + toLowerCase(); + cy.apiCreateChannel( + testTeam.id, + channelName, + channelDisplayName, + ).then(({channel}) => { + // # Create a playbook with the channel to be deleted as the announcement channel + cy.apiCreatePlaybook({ + teamId: testTeam.id, + title: 'Playbook (' + Date.now() + ')', + createPublicPlaybookRun: true, + memberIDs: [testUser.id, testSysadmin.id], + announcementChannelId: channel.id, + announcementChannelEnabled: true, + }); + + // # Delete channel + cy.apiDeleteChannel(channel.id); + }); + }). + then(() => { + cy.apiLogin(testUser); + + // # Navigate again to the playbook + cy.visit(`/playbooks/playbooks/${testPlaybook.id}/outline`); + + cy.get('#status-updates').within(() => { + cy.findByText('no channels').should('be.visible'); + }); + }); + }); + + it.skip('shows channel name when private broadcast channel configured and user is a member', () => { + // # Visit the selected playbook + cy.visit('/playbooks/playbooks/' + testPlaybook.id + '/edit'); + + // # Switch to Status updates tab + cy.get('#root').findByText('Status updates').click(); + + // # Click on the toggle to enable the setting + cy.get('#broadcast-channels').within(() => { + cy.get('label input').click({force: true}); + }); + + // # Open the broadcast channel widget and select a public channel + cy.get('#playbook-automation-broadcast'). + click(). + type(testPrivateChannel.display_name + '{enter}', {delay: 200}); + + // # Save the playbook + cy.findByTestId('save_playbook').click(); + + // # Visit the selected playbook + cy.visit('/playbooks/playbooks/' + testPlaybook.id + '/edit'); + + // # Switch to Status updates tab + cy.get('#root').findByText('Status updates').click(); + + // * Verify placeholder text is present + cy.get('#playbook-automation-broadcast').should( + 'have.text', + testPrivateChannel.display_name, + ); + }); + + it.skip('shows "Unknown channel" when private broadcast channel configured and user is not a member', () => { + // # Visit the selected playbook + cy.visit('/playbooks/playbooks/' + testPlaybook.id + '/edit'); + + // # Switch to Status updates tab + cy.get('#root').findByText('Status updates').click(); + + // # Click on the toggle to enable the setting + cy.get('#broadcast-channels').within(() => { + cy.get('label input').click({force: true}); + }); + + // # Open the broadcast channel widget and select the private channel + cy.get('#playbook-automation-broadcast'). + click(). + type(testPrivateChannel.display_name + '{enter}', {delay: 200}); + + // # Save the playbook + cy.findByTestId('save_playbook').click(); + + // # Browse to the private channel + cy.visit(`/${testTeam.name}/channels/${testPrivateChannel.name}`); + + // # Leave the private channel + cy.executeSlashCommand('/leave'); + cy.get('#confirmModalButton').click(); + + // # Visit the selected playbook + cy.visit('/playbooks/playbooks/' + testPlaybook.id + '/edit'); + + // # Switch to Status updates tab + cy.get('#root').findByText('Status updates').click(); + + // * Verify placeholder text is present + cy.get('#playbook-automation-broadcast').should( + 'have.text', + 'Unknown Channel', + ); + }); + }); + }); + + describe('when a new member joins the channel', () => { + beforeEach(() => { + // # Visit the selected playbook + cy.visit(`/playbooks/playbooks/${testPlaybook.id}/outline`); + cy.findByTestId('playbook-channel-actions-button').click(); + }); + + describe('add the channel to a sidebar category', () => { + it('is disabled in a new playbook', () => { + cy.findByTestId('user-joins-channel-categorize').within(() => { + // * Verify that the toggle is unchecked + cy.get('label input').should('not.be.checked'); + }); + }); + + it('can be enabled', () => { + cy.findByTestId('user-joins-channel-categorize').within(() => { + // * Verify that the toggle is unchecked + cy.get('label input').should('not.be.checked'); + + // # Click on the toggle to enable the setting + cy.get('label').eq(1).click(); + + // * Verify that the toggle is unchecked + cy.get('label input').should('be.checked'); + }); + }); + + it('prevents category selection when disabled', () => { + // * Verify that the toggle is unchecked + cy.findByTestId('user-joins-channel-categorize').within(() => { + cy.get('label input').should('not.be.checked'); + cy.getStyledComponent('StyledCreatable').should('not.exist'); + }); + }); + + it.skip('allows selecting a category when enabled', () => { + cy.findByTestId('user-joins-channel-categorize').within(() => { + // * Verify that the toggle is unchecked + cy.get('label input').should('not.be.checked'); + + // # Click on the toggle to enable the setting + cy.get('label input').click({force: true}); + + // * Verify that the toggle is checked + cy.get('label input').should('be.checked'); + + // # Open the category selector + openCategorySelector(); + + // # Select a category + selectCategory('Favorites'); + + // * Verify that the control shows the selected category + cy.get('.channel-selector__control').contains('Favorites'); + }); + }); + + it.skip('allows changing the category', () => { + cy.findByTestId('user-joins-channel-categorize').within(() => { + // * Verify that the toggle is unchecked + cy.get('label input').should('not.be.checked'); + + // # Click on the toggle to enable the setting + cy.get('label').eq(1).click(); + + // * Verify that the toggle is checked + cy.get('label input').should('be.checked'); + + // # Open the channel selector + openCategorySelector(); + + // # Select a category + selectCategory('Favorites'); + + // * Verify that the control shows the selected category + cy.get('#playbook-automation-categorize-playbook-run .channel-selector__control').contains( + 'Favorites', + ); + + // # Open the channel selector + cy.get('#playbook-automation-categorize-playbook-run .channel-selector__control').click({ + force: true, + }); + + // # Select a new channel + selectCategory('Channels'); + + // * Verify that the control shows the selected channel + cy.get('#playbook-automation-categorize-playbook-run .channel-selector__control').contains( + 'Channels', + ); + }); + }); + + it('persists the category even if the toggle is off', () => { + cy.findByTestId('user-joins-channel-categorize').within(() => { + // * Verify that the toggle is unchecked + cy.get('label input').should('not.be.checked'); + + // # Click on the toggle to enable the setting + cy.getStyledComponent('Container').click(); + + // * Verify that the toggle is checked + cy.get('label input').should('be.checked'); + + // # Open the channel selector + openCategorySelector(); + + // # Select a channel + selectCategory('Favorites'); + + // * Verify that the control shows the selected category + cy.get('.channel-selector__control').contains('Favorites'); + + // # Click on the toggle to disable the setting + cy.getStyledComponent('Container').click(); + + // * Verify that the toggle is unchecked + cy.get('label input').should('not.be.checked'); + }); + cy.findByTestId('modal-confirm-button').click(); + cy.reload(); + + cy.findByTestId('playbook-channel-actions-button').click(); + + cy.findByTestId('user-joins-channel-categorize').within(() => { + // * Verify that the toggle is unchecked + cy.get('label input').should('not.be.checked'); + + // # Click on the toggle to enable the setting + cy.getStyledComponent('Container').click(); + + // * Verify that the toggle is checked + cy.get('label input').should('be.checked'); + + // * Verify that the control still shows the selected category + cy.get('.channel-selector__control').contains('Favorites'); + }); + }); + + it('shows new category name when category was created', () => { + cy.findByTestId('user-joins-channel-categorize').within(() => { + // * Verify that the toggle is unchecked + cy.get('label input').should('not.be.checked'); + + // # Click on the toggle to enable the setting + cy.get('label').eq(1).click(); + + // * Verify that the toggle is checked + cy.get('label input').should('be.checked'); + }); + + // # Type name to use new custom category + cy.get('.channel-selector__control').click().type('Custom category{enter}', {delay: 200}); + + // # click save modal + cy.findByTestId('modal-confirm-button').click(); + + // # reload to check that changes aren't local + cy.reload(); + + // # Open the channel modal + cy.findByTestId('playbook-channel-actions-button').click(); + + cy.findByTestId('user-joins-channel-categorize').within(() => { + // * Verify that the toggle is checked + cy.get('label input').should('be.checked'); + + // * Verify that the control still shows the new category + cy.get('.channel-selector__control').should( + 'have.text', + 'Custom category', + ); + }); + }); + }); + }); + + describe('status updates enable / disabled', () => { + beforeEach(() => { + // # Visit the selected playbook + cy.visit(`/playbooks/playbooks/${testPlaybook.id}/outline`); + }); + + it('is enabled in a new playbook', () => { + // * Verify that the toggle is checked + cy.get('#status-updates label input').should('be.checked'); + }); + + it('can be disabled', () => { + // * Verify that toggle can be disabled + cy.get('#status-updates').within(() => { + // * Verify that the toggle is checked + cy.get('label input').should('be.checked'); + + // # Click on the toggle to enable the setting + cy.get('label input').click({force: true}); + + // * Verify that the toggle is unchecked + cy.get('label input').should('not.be.checked'); + }); + + // * Verify disabled status updates text + cy.findByText(/status updates are not expected/i).should('be.visible'); + cy.reload(); + cy.findByText(/status updates are not expected/i).should('be.visible'); + }); + }); + + describe('retrospective enable / disable', () => { + beforeEach(() => { + // # Visit the selected playbook + cy.visit(`/playbooks/playbooks/${testPlaybook.id}/outline`); + }); + + it('is enabled in a new playbook', () => { + cy.get('#retrospective').within(() => { + // * Verify that the toggle is checked + cy.get('input[type=checkbox]').should('be.checked'); + }); + }); + + it('can be disabled', () => { + cy.get('#retrospective').within(() => { + // * Verify that the toggle is checked + cy.get('label input').should('be.checked'); + + // # Click on the toggle to disable the setting + cy.get('label input').click({force: true}); + + // * Verify that the toggle is unchecked + cy.get('label input').should('not.be.checked'); + + cy.findByText(/a retrospective is not expected/i).should('exist'); + }); + }); + + it('saves on toggle', () => { + cy.get('#retrospective').within(() => { + // # Uncheck toggle + cy.get('label input').click({force: true}); + }); + + cy.reload(); + + cy.get('#retrospective').within(() => { + // * Verify that the toggle is unchecked + cy.get('label input').should('not.be.checked'); + }); + }); + }); + }); + + describe('Edit playbook name', () => { + it('can be updated', () => { + // # Open Playbooks + cy.visit('/playbooks/playbooks'); + + // # Start a blank playbook + cy.findByText('Blank').click(); + + // # Open the title dropdown and Rename + cy.findByTestId('playbook-editor-title').click(); + cy.findByText('Rename').click(); + + // # Change the name and save + cy.findByTestId('rendered-editable-text').type('{selectAll}{del}renamed playbook'); + cy.findByRole('button', {name: /save/i}).click(); + + cy.reload(); + + // * Verify the modified name persists + cy.findByRole('button', {name: /renamed playbook/i}).should('exist'); + }); + + // BPE regression? + // no more unsaved changes modal + it.skip('update, leave and discard', () => { + // # Open Playbooks + cy.visit('/playbooks/playbooks'); + + // # Start a blank playbook + cy.findByText('Blank').click(); + cy.get('#edit-playbook').click(); + + // * edit + cy.findByTestId('playbook-title-description').click(); + cy.get('#playbook-edit-name-and-description-modal').should('exist'); + cy.get('#confirm-modal-light').should('not.exist'); + cy.findByTestId('playbook-edit-name-input').clear().type('playbook updated name'); + + // * leave without save, show confirm modal and discard + cy.findByTestId('modal-cancel-button').click(); + cy.get('#playbook-edit-name-and-description-modal').should('not.exist'); + cy.get('#confirm-modal-light').should('exist'); + cy.findByTestId('modal-confirm-button').click(); + + // * check modals are hidden and name is not changed + cy.get('#playbook-edit-name-and-description-modal').should('not.exist'); + cy.get('#confirm-modal-light').should('not.exist'); + cy.findByText('playbook updated name').should('not.exist'); + }); + + // BPE regression? + // no more unsaved changes modal + it.skip('update, leave and go back to edit', () => { + // # Open Playbooks + cy.visit('/playbooks/playbooks'); + + // # Start a blank playbook + cy.findByText('Blank').click(); + cy.get('#edit-playbook').click(); + + // * edit + cy.findByTestId('playbook-title-description').click(); + cy.get('#playbook-edit-name-and-description-modal').should('exist'); + cy.get('#confirm-modal-light').should('not.exist'); + cy.findByTestId('playbook-edit-name-input').clear().type('playbook updated name'); + + // * leave without save, show confirm modal and cancel + cy.findByTestId('modal-cancel-button').click(); + cy.get('#playbook-edit-name-and-description-modal').should('not.exist'); + cy.get('#confirm-modal-light').should('exist'); + cy.findByTestId('modal-cancel-button').click(); + + // * check modals are hidden and name is not changed + cy.get('#playbook-edit-name-and-description-modal').should('exist'); + cy.get('#confirm-modal-light').should('not.exist'); + cy.findByTestId('modal-confirm-button').click(); + + // * modals are hidden and text is changed + cy.get('#playbook-edit-name-and-description-modal').should('not.exist'); + cy.get('#confirm-modal-light').should('not.exist'); + cy.findByText('playbook updated name').should('exist'); + }); + }); + + describe('Edit playbook description', () => { + it.skip('can be updated', () => { + // # Open Playbooks + cy.visit('/playbooks/playbooks'); + + // # Start a blank playbook + cy.findByText('Blank').click(); + cy.findByText(/customize this playbook's description/i).dblclick(); + cy.focused().type('{selectAll}{del}some new description{esc}'); + cy.findByRole('button', {name: /save/i}).click(); + + cy.reload(); + + cy.findByText('some new description').should('exist'); + }); + + // BPE regression? + // no more unsaved changes modal + it.skip('update, leave and discard', () => { + // # Open Playbooks + cy.visit('/playbooks/playbooks'); + + // # Start a blank playbook + cy.findByText('Blank').click(); + cy.get('#edit-playbook').click(); + + // * edit + cy.findByTestId('playbook-title-description').click(); + cy.get('#playbook-edit-name-and-description-modal').should('exist'); + cy.get('#confirm-modal-light').should('not.exist'); + cy.findByTestId('playbook-edit-name-and-description-modal-description-textbox').clear().type('playbook updated desc'); + + // * leave without save, show confirm modal and discard + cy.findByTestId('modal-cancel-button').click(); + cy.get('#playbook-edit-name-and-description-modal').should('not.exist'); + cy.get('#confirm-modal-light').should('exist'); + cy.findByTestId('modal-confirm-button').click(); + + // * check modals are hidden and name is not changed + cy.get('#playbook-edit-name-and-description-modal').should('not.exist'); + cy.get('#confirm-modal-light').should('not.exist'); + cy.findByText('playbook updated desc').should('not.exist'); + }); + + // BPE regression? + // no more unsaved changes modal + it.skip('update, leave and go back to edit', () => { + // # Open Playbooks + cy.visit('/playbooks/playbooks'); + + // # Start a blank playbook + cy.findByText('Blank').click(); + cy.get('#edit-playbook').click(); + + // * edit + cy.findByTestId('playbook-title-description').click(); + cy.get('#playbook-edit-name-and-description-modal').should('exist'); + cy.get('#confirm-modal-light').should('not.exist'); + cy.findByTestId('playbook-edit-name-and-description-modal-description-textbox').clear().type('playbook updated desc'); + + // * leave without save, show confirm modal and cancel + cy.findByTestId('modal-cancel-button').click(); + cy.get('#playbook-edit-name-and-description-modal').should('not.exist'); + cy.get('#confirm-modal-light').should('exist'); + cy.findByTestId('modal-cancel-button').click(); + + // * check modals are hidden and name is not changed + cy.get('#playbook-edit-name-and-description-modal').should('exist'); + cy.get('#confirm-modal-light').should('not.exist'); + cy.findByTestId('modal-confirm-button').click(); + + // * modals are hidden and text is changed + cy.get('#playbook-edit-name-and-description-modal').should('not.exist'); + cy.get('#confirm-modal-light').should('not.exist'); + cy.findByText('playbook updated desc').should('exist'); + }); + }); + + describe('Duplicate', () => { + let testPlaybook; + beforeEach(() => { + cy.apiCreateTestPlaybook({ + teamId: testTeam.id, + title: 'Playbook (' + Date.now() + ')', + userId: testUser.id, + }).then((playbook) => { + testPlaybook = playbook; + }); + }); + + it('can be duplicated', () => { + // # Visit the selected playbook + cy.visit(`/playbooks/playbooks/${testPlaybook.id}/outline`); + + // # Open the title dropdown and Duplicate + cy.findByTestId('playbook-editor-title').click(); + cy.findByText('Duplicate').click(); + + // * Verify that playbook got duplicated + cy.findByTestId('playbook-editor-header').within(() => { + cy.findByText('Copy of ' + testPlaybook.title).should('exist'); + }); + + // * Verify that the duplicated playbook is shown in the LHS + cy.findByTestId('Playbooks').within(() => { + cy.findByText('Copy of ' + testPlaybook.title).should('be.visible'); + }); + }); + }); +}); diff --git a/e2e/cypress/tests/integration/playbooks/playbooks/feedback_spec.js b/e2e/cypress/tests/integration/playbooks/playbooks/feedback_spec.js new file mode 100644 index 0000000000..6277532b17 --- /dev/null +++ b/e2e/cypress/tests/integration/playbooks/playbooks/feedback_spec.js @@ -0,0 +1,102 @@ +// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. + +// *************************************************************** +// - [#] indicates a test step (e.g. # Go to a page) +// - [*] indicates an assertion (e.g. * Check the title) +// *************************************************************** + +// Stage: @prod +// Group: @playbooks + +describe('playbooks > feedback', () => { + let testTeam; + let testUser; + let testPlaybook; + + beforeEach(() => { + // # Size the viewport to show the RHS without covering posts. + cy.viewport('macbook-13'); + + // # Login as admin to create team and user below. + cy.apiAdminLogin(); + + // # Setup a team, user and playbook for each test. + cy.apiInitSetup().then(({team, user}) => { + testTeam = team; + testUser = user; + + // # Create a public playbook + cy.apiCreatePlaybook({ + teamId: testTeam.id, + title: 'Test Playbook', + memberIDs: [], + }).then((playbook) => { + testPlaybook = playbook; + }); + + // # Login as the newly created testUser + cy.apiLogin(testUser); + }); + }); + + it('playbooks shows prompt in global header, with experimental feature flag', () => { + // # Enable experimental feature flag + cy.apiAdminLogin().then(() => { + cy.apiEnsureFeatureFlag('enableexperimentalfeatures', true); + + // # Login as testUser + cy.apiLogin(testUser); + }); + + // # Visit the playbooks product + cy.visit('/playbooks'); + + // # Verify Give Feedback link is configured to open in a new tab. + cy.findByText('Give feedback').invoke('attr', 'target').should('eq', '_blank'); + + // # Verify Give Feedback link href + cy.findByText('Give feedback').invoke('attr', 'href').should('match', /playbooks-feedback/); + }); + + it('playbooks shows prompt in global header, without experimental feature flag', () => { + // # Disable experimental feature flag + cy.apiAdminLogin().then(() => { + cy.apiEnsureFeatureFlag('enableexperimentalfeatures', false); + + // # Login as testUser + cy.apiLogin(testUser); + }); + + // # Visit the playbooks product + cy.visit('/playbooks'); + + // # Verify Give Feedback link is configured to open in a new tab. + cy.findByText('Give feedback').invoke('attr', 'target').should('eq', '_blank'); + + // # Verify Give Feedback link href + cy.findByText('Give feedback').invoke('attr', 'href').should('match', /playbooks-feedback/); + }); + + it('playbooks shows prompt in rhs header', () => { + // # Run the playbook + const now = Date.now(); + const playbookRunName = 'Playbook Run (' + now + ')'; + const playbookRunChannelName = 'playbook-run-' + now; + cy.apiRunPlaybook({ + teamId: testTeam.id, + playbookId: testPlaybook.id, + playbookRunName, + ownerUserId: testUser.id, + }); + + // # Navigate directly to the application and the playbook run channel + cy.visit(`/${testTeam.name}/channels/${playbookRunChannelName}`); + + // # Verify Give Feedback link is configured to open in a new tab. + cy.findByText('Give feedback').invoke('attr', 'target').should('eq', '_blank'); + + // # Verify Give Feedback link href + cy.findByText('Give feedback').invoke('attr', 'href').should('match', /playbooks-feedback/); + }); +}); diff --git a/e2e/cypress/tests/integration/playbooks/playbooks/list_spec.js b/e2e/cypress/tests/integration/playbooks/playbooks/list_spec.js new file mode 100644 index 0000000000..494e095172 --- /dev/null +++ b/e2e/cypress/tests/integration/playbooks/playbooks/list_spec.js @@ -0,0 +1,216 @@ +// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. + +// *************************************************************** +// - [#] indicates a test step (e.g. # Go to a page) +// - [*] indicates an assertion (e.g. * Check the title) +// *************************************************************** + +// Stage: @prod +// Group: @playbooks + +describe('playbooks > list', () => { + const playbookTitle = 'The Playbook Name'; + let testTeam; + let testUser; + let testUser2; + + before(() => { + cy.apiInitSetup().then(({team, user}) => { + testTeam = team; + testUser = user; + + // Create another user in the same team + cy.apiCreateUser().then(({user: user2}) => { + testUser2 = user2; + cy.apiAddUserToTeam(testTeam.id, testUser2.id); + }); + + // # Login as user-1 + cy.apiLogin(testUser); + + // # Create a public playbook + cy.apiCreatePlaybook({ + teamId: testTeam.id, + title: playbookTitle, + memberIDs: [], + }); + + // # Create an archived public playbook + cy.apiCreatePlaybook({ + teamId: testTeam.id, + title: 'Playbook archived', + memberIDs: [], + }).then(({id}) => cy.apiArchivePlaybook(id)); + }); + }); + + beforeEach(() => { + // # Login as testUser + cy.apiLogin(testUser); + }); + + it('has "Playbooks" in heading', () => { + // # Open the product + cy.visit('/playbooks'); + + // # Switch to Playbooks + cy.findByTestId('playbooksLHSButton').click(); + + // * Assert contents of heading. + cy.findByTestId('titlePlaybook').should('exist').contains('Playbooks'); + }); + + it('join/leave playbook', () => { + // # Open the product + cy.visit('/playbooks'); + + // # Switch to Playbooks + cy.findByTestId('playbooksLHSButton').click(); + + // # Click on the dot menu + cy.findByTestId('menuButtonActions').click(); + + // # Click on leave + cy.findByText('Leave').click(); + + // * Verify it has disappeared from the LHS + cy.findByTestId('lhs-navigation').findByText(playbookTitle).should('not.exist'); + + // # Join a playbook + cy.findByTestId('join-playbook').click(); + + // * Verify it has appeared in LHS + cy.findByTestId('lhs-navigation').findByText(playbookTitle).should('exist'); + }); + + it('can duplicate playbook', () => { + // # Login as testUser2 + cy.apiLogin(testUser2); + + // # Open the product + cy.visit('/playbooks'); + + // # Switch to Playbooks + cy.findByTestId('playbooksLHSButton').click(); + + // # Click on the dot menu + cy.findByTestId('menuButtonActions').click(); + + // # Click on duplicate + cy.findByText('Duplicate').click(); + + // * Verify that playbook got duplicated + cy.findByText('Copy of ' + playbookTitle).should('exist'); + + // * Verify that the current user is a member and can run the playbook. + cy.findByText('Copy of ' + playbookTitle).closest('[data-testid="playbook-item"]').within(() => { + cy.findByTestId('run-playbook').should('exist'); + cy.findByTestId('join-playbook').should('not.exist'); + }); + + // * Verify that the duplicated playbook is shown in the LHS + cy.findByTestId('Playbooks').within(() => { + cy.findByText('Copy of ' + playbookTitle).should('be.visible'); + }); + }); + + context('archived playbooks', () => { + it('does not show them by default', () => { + // # Open the product + cy.visit('/playbooks'); + + // # Switch to Playbooks + cy.findByTestId('playbooksLHSButton').click(); + + // * Assert the archived playbook is not there. + cy.findAllByTestId('playbook-title').should((titles) => { + expect(titles).to.have.length(2); + }); + }); + it('shows them upon click on the filter', () => { + // # Open the product + cy.visit('/playbooks'); + + // # Switch to Playbooks + cy.findByTestId('playbooksLHSButton').click(); + + // # Click the With Archived button + cy.findByTestId('with-archived').click(); + + // * Assert the archived playbook is there. + cy.findAllByTestId('playbook-title').should((titles) => { + expect(titles).to.have.length(3); + }); + }); + }); + + describe('can import playbook', () => { + let validPlaybookExport; + let invalidTypePlaybookExport; + + const bufferToCypressFile = (fileName, fileData, fileType) => ({ + fileName, + contents: fileData, + mimeType: fileType, + }); + + before(() => { + // # Load fixtures and convert to File + cy.fixture('playbook-export.json', null).then((buffer) => { + validPlaybookExport = bufferToCypressFile('export.json', buffer, 'application/json'); + }); + cy.fixture('mp3-audio-file.mp3', null).then((buffer) => { + invalidTypePlaybookExport = bufferToCypressFile('audio.mp3', buffer, 'audio/mpeg'); + }); + }); + + it('triggered by drag and drop', () => { + // # Open the product + cy.visit('/playbooks'); + + // # Switch to Playbooks + cy.findByTestId('playbooksLHSButton').click(); + + // # Drop loaded fixture onto playbook list + cy.findByTestId('playbook-list-scroll-container').selectFile(validPlaybookExport, { + action: 'drag-drop', + }); + + // * Verify that a new playbook was created. + cy.findByTestId('playbook-editor-title').should('contain', 'Example Playbook'); + }); + + it('triggered by using button/input', () => { + // # Open the product + cy.visit('/playbooks'); + + // # Switch to Playbooks + cy.findByTestId('playbooksLHSButton').click(); + + cy.findByTestId('titlePlaybook').within(() => { + // # Select loaded fixture for upload + cy.findByTestId('playbook-import-input').selectFile(validPlaybookExport, {force: true}); + }); + + // * Verify that a new playbook was created. + cy.findByTestId('playbook-editor-title').should('contain', 'Example Playbook'); + }); + + it('fails to import invalid file type', () => { + // # Open the product + cy.visit('/playbooks'); + + // # Switch to Playbooks + cy.findByTestId('playbooksLHSButton').click(); + + cy.findByTestId('titlePlaybook').within(() => { + // # Select loaded fixture for upload + cy.findByTestId('playbook-import-input').selectFile(invalidTypePlaybookExport, {force: true}); + }); + + // * Verify that an error message is displayed. + cy.findByText('The file must be a valid JSON playbook template.').should('be.visible'); + }); + }); +}); diff --git a/e2e/cypress/tests/integration/playbooks/playbooks/overview_spec.js b/e2e/cypress/tests/integration/playbooks/playbooks/overview_spec.js new file mode 100644 index 0000000000..50bab4fb04 --- /dev/null +++ b/e2e/cypress/tests/integration/playbooks/playbooks/overview_spec.js @@ -0,0 +1,471 @@ +// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. + +// *************************************************************** +// - [#] indicates a test step (e.g. # Go to a page) +// - [*] indicates an assertion (e.g. * Check the title) +// *************************************************************** + +// Stage: @prod +// Group: @playbooks +import {stubClipboard} from '../../../utils'; + +describe('playbooks > overview', () => { + let testTeam; + let testOtherTeam; + let testUser; + let testUser2; + let testPublicPlaybook; + let testPlaybookOnTeamForSwitching; + let testPlaybookOnOtherTeamForSwitching; + + before(() => { + cy.apiInitSetup().then(({team, user}) => { + testTeam = team; + testUser = user; + + // Create another user in the same team + cy.apiCreateUser().then(({user: user2}) => { + testUser2 = user2; + cy.apiAddUserToTeam(testTeam.id, testUser2.id); + }); + + // # Create another team + cy.apiCreateTeam('second-team', 'Second Team').then(({team: createdTeam}) => { + testOtherTeam = createdTeam; + cy.apiAddUserToTeam(testOtherTeam.id, testUser.id); + + // # Create a dedicated run follower + cy.apiCreateUser().then(({user: createdUser}) => { + cy.apiAddUserToTeam(testTeam.id, createdUser.id); + cy.apiAddUserToTeam(testOtherTeam.id, createdUser.id); + }); + + // # Create another user + cy.apiCreateUser().then(({user: anotherUser}) => { + // # Login as testUser + cy.apiLogin(testUser); + + // # Create a public playbook + cy.apiCreatePlaybook({ + teamId: testTeam.id, + title: 'Public Playbook', + memberIDs: [], + retrospectiveTemplate: 'Retro template text', + retrospectiveReminderIntervalSeconds: 60 * 60 * 24 * 7, // 7 days + }).then((playbook) => { + testPublicPlaybook = playbook; + }); + + // # Create a private playbook with only the current user + cy.apiCreatePlaybook({ + teamId: testTeam.id, + title: 'Private Only Mine Playbook', + memberIDs: [testUser.id], + }); + + // # Create a private playbook with multiple users + cy.apiCreatePlaybook({ + teamId: testTeam.id, + title: 'Private Shared Playbook', + memberIDs: [testUser.id, anotherUser.id], + }); + + // # Create a public playbook + cy.apiCreatePlaybook({ + teamId: testTeam.id, + title: 'Switch A', + memberIDs: [], + retrospectiveTemplate: 'Retro template text', + retrospectiveReminderIntervalSeconds: 60 * 60 * 24 * 7, // 7 days + }).then((playbook) => { + testPlaybookOnTeamForSwitching = playbook; + }); + + // # Create a public playbook on another team + cy.apiCreatePlaybook({ + teamId: testOtherTeam.id, + title: 'Switch B', + memberIDs: [], + }).then((playbook) => { + testPlaybookOnOtherTeamForSwitching = playbook; + }); + }); + }); + }); + }); + + beforeEach(() => { + // # Size the viewport to show the RHS without covering posts. + cy.viewport('macbook-13'); + + // # Login as testUser + cy.apiLogin(testUser); + }); + + it('redirects to not found error if the playbook is unknown', () => { + // # Visit the URL of a non-existing playbook + cy.visit('/playbooks/playbooks/an_unknown_id'); + + // * Verify that the user has been redirected to the playbooks not found error page + cy.url().should('include', '/playbooks/error?type=playbooks'); + }); + + describe('should switch to channels and prompt to run when clicking run', () => { + const openAndRunPlaybook = (team) => { + // # Navigate directly to town square on the team + cy.visit(`${team.name}/channels/town-square`); + + // # Open Playbooks + cy.get('[aria-label="Product switch menu"]').click({force: true}); + cy.get('a[href="/playbooks"]').click({force: true}); + + // Click through to open the playbook + cy.findByTestId('playbooksLHSButton').click({force: true}); + cy.get('[placeholder="Search for a playbook"]').type(testPlaybookOnTeamForSwitching.title); + cy.findByTestId('playbook-title').click({force: true}); + + // # Click Run Playbook + cy.findByTestId('run-playbook').click({force: true}); + + // * Verify the playbook run creation dialog has opened + cy.get('#playbooks_run_playbook_dialog').should('exist').within(() => { + cy.findByText('Start run').should('exist'); + }); + }; + + it('for testPlaybookOnTeamForSwitching from its own team', () => { + openAndRunPlaybook(testTeam, testPlaybookOnTeamForSwitching); + }); + + it('for testPlaybookOnTeamForSwitching from another team', () => { + openAndRunPlaybook(testOtherTeam, testPlaybookOnTeamForSwitching); + }); + + it('for testPlaybookOnOtherTeamForSwitching from its own team', () => { + openAndRunPlaybook(testTeam, testPlaybookOnOtherTeamForSwitching); + }); + + it('for testPlaybookOnOtherTeamForSwitchingOnOtherTeam from another team', () => { + openAndRunPlaybook(testOtherTeam, testPlaybookOnOtherTeamForSwitching); + }); + + it('on direct navigation to a playbook', () => { + // # Navigate directly to the playbook + cy.visit(`/playbooks/playbooks/${testPlaybookOnTeamForSwitching.id}`); + + // # Click Run Playbook + cy.findByTestId('run-playbook').click(); + + // * Verify the playbook run creation dialog has opened + cy.get('#playbooks_run_playbook_dialog').should('exist').within(() => { + cy.findByText('Start run').should('exist'); + }); + }); + }); + + it('should copy playbook link', () => { + // # Navigate directly to the playbook + cy.visit(`/playbooks/playbooks/${testPublicPlaybook.id}`); + + // # trigger the tooltip + cy.get('.icon-link-variant').trigger('mouseover', {force: true}); + + // * Verify tooltip text + cy.get('#copy-playbook-link-tooltip').should('contain', 'Copy link to'); + + stubClipboard().as('clipboard'); + + // # click on copy button + cy.get('.icon-link-variant').click({force: true}).then(() => { + // * Verify that tooltip text changed + cy.get('#copy-playbook-link-tooltip').should('contain', 'Copied!'); + + // * Verify clipboard content + cy.get('@clipboard').its('contents').should('contain', `/playbooks/playbooks/${testPublicPlaybook.id}`); + }); + }); + + it('should duplicate playbook', () => { + // # Login as testUser2 + cy.apiLogin(testUser2); + + // # Navigate directly to the playbook + cy.visit(`/playbooks/playbooks/${testPublicPlaybook.id}`); + + // # Click on playbook title + cy.findByTestId('playbook-editor-title').click(); + + // # Click on duplicate + cy.findByText('Duplicate').click(); + + // * Verify that playbook got duplicated + cy.findByTestId('playbook-editor-title').should('contain', `Copy of ${testPublicPlaybook.title}`); + + // * Verify that the current user is a member and can run the playbook. + cy.findByTestId('run-playbook').should('exist'); + cy.findByTestId('join-playbook').should('not.exist'); + + // * Verify that the current user is the only member. + cy.findByTestId('playbook-members').should('contain', '1'); + }); + + describe('checklists', () => { + describe('header', () => { + beforeEach(() => { + cy.apiCreatePlaybook({ + teamId: testTeam.id, + title: 'Playbook', + description: 'Cypress Playbook', + memberIDs: [], + checklists: [ + { + title: 'Stage 1', + items: [ + {title: 'Step 1'}, + {title: 'Step 2'}, + ], + }, + ], + retrospectiveTemplate: 'Cypress test template', + }).then((playbook) => { + cy.visit(`/playbooks/playbooks/${playbook.id}/outline`); + }); + }); + + it('has title', () => { + cy.get('#checklists').within(() => { + cy.findByText('Tasks').should('exist'); + }); + }); + }); + + it('shows checklists', () => { + cy.apiCreatePlaybook({ + teamId: testTeam.id, + title: 'Playbook', + description: 'Cypress Playbook', + memberIDs: [], + checklists: [ + { + title: 'Stage 1', + items: [ + {title: 'Step 1'}, + {title: 'Step 2'}, + ], + }, + ], + retrospectiveTemplate: 'Cypress test template', + }).then((playbook) => { + cy.visit(`/playbooks/playbooks/${playbook.id}`); + }); + + // # Switch to Outline section + cy.findByText('Outline').click(); + + // * Verify checklist and associated steps + cy.get('#checklists').within(() => { + cy.findByText('Stage 1').should('exist'); + cy.findByText('Step 1').should('exist'); + cy.findByText('Step 2').should('exist'); + }); + }); + }); + + it('shows correct retrospective timer and template text', () => { + cy.visit(`/playbooks/playbooks/${testPublicPlaybook.id}`); + cy.findByText('Outline').click(); + + cy.get('#retrospective').within(() => { + cy.findByText('7 days').should('exist'); + cy.findByText('Retro template text').should('exist'); + }); + }); + + it('shows statistics in usage tab', () => { + // # Start playbook run. + const now = Date.now(); + const playbookRunName = `Run (${now})`; + cy.apiRunPlaybook({ + teamId: testTeam.id, + playbookId: testPublicPlaybook.id, + playbookRunName, + ownerUserId: testUser.id, + }).then((playbookRun) => { + // # Go to usage view + cy.visit(`/playbooks/playbooks/${testPublicPlaybook.id}`); + + // * Verify basic information. + cy.findByText('Runs currently in progress').next().should('contain', '1'); + cy.findByText('Participants currently active').next().should('contain', '1'); + cy.findByText('Runs finished in the last 30 days').next().should('contain', '0'); + + // # End the run so those metrics change. + cy.apiFinishRun(playbookRun.id).then(() => { + cy.reload(); + + // * Verify changes. + cy.findByText('Runs currently in progress').next().should('contain', '0'); + cy.findByText('Participants currently active').next().should('contain', '0'); + cy.findByText('Runs finished in the last 30 days').next().should('contain', '1'); + }); + }); + }); + + it('start a run', () => { + // # Visit playbook page + cy.visit(`/playbooks/playbooks/${testPublicPlaybook.id}`); + + // # Click Run Playbook + cy.findByTestId('run-playbook').click(); + + // # Enter the run name + cy.findByTestId('run-name-input').clear().type('run1234567'); + + // # Click start run button + cy.get('button[data-testid=modal-confirm-button]').click(); + + // * Verify the run is added to lhs + cy.findByTestId('Runs').findByTestId('run1234567').should('exist'); + }); + + describe('archiving', () => { + const playbookTitle = 'Playbook (' + Date.now() + ')'; + let testPlaybook; + + before(() => { + // # Login as testUser + cy.apiLogin(testUser); + + cy.apiCreateTestPlaybook({ + teamId: testTeam.id, + title: playbookTitle, + userId: testUser.id, + }).then((playbook) => { + testPlaybook = playbook; + }); + }); + + it('shows intended UI and disallows further updates', () => { + // # Programmatically archive it + cy.apiArchivePlaybook(testPlaybook.id); + + // # Visit the selected playbook + cy.visit(`/playbooks/playbooks/${testPlaybook.id}`); + + // * Verify we're on the right playbook + cy.get('[class^="Title-"]').contains(playbookTitle); + + // * Verify we can see the archived badge + cy.get('.icon-archive-outline').should('be.visible'); + + // * Verify the run button is disabled + cy.findByTestId('run-playbook').should('be.disabled'); + + // # Attempt to edit the playbook + cy.apiGetPlaybook(testPlaybook.id).then((playbook) => { + // # New title + playbook.title = 'new Title!!!'; + + // * Verify update fails + cy.apiUpdatePlaybook(playbook, 400); + }); + }); + }); + + describe('start a run', () => { + let testPlaybook; + + before(() => { + // # Login as testUser + cy.apiLogin(testUser); + }); + + after(() => { + // # Login as testUser + cy.apiLogin(testUser); + }); + + beforeEach(() => { + // # Create a playbook + cy.apiCreateTestPlaybook({ + teamId: testTeam.id, + title: 'Playbook (' + Date.now() + ')', + userId: testUser.id, + }).then((playbook) => { + testPlaybook = playbook; + }); + }); + + it('start a run, create a new channel', () => { + // # Visit playbook page + cy.visit(`/playbooks/playbooks/${testPlaybook.id}`); + + // # Click Run Playbook + cy.findByTestId('run-playbook').click(); + + // * Verify that channel configuration matches playbook config + cy.findByTestId('link-existing-channel-radio').should('not.be.checked'); + cy.get('#link-existing-channel-selector').should('not.exist'); + cy.findByTestId('create-channel-radio').should('be.checked'); + cy.findByTestId('create-private-channel-radio').should('be.checked'); + + // # Enter the run name + const runName = 'run' + Date.now(); + cy.findByTestId('run-name-input').clear().type(runName); + + // # Click start run button + cy.get('button[data-testid=modal-confirm-button]').click(); + + // * Verify the run is added to lhs + cy.findByTestId('Runs').findByTestId(runName).should('exist'); + + // * Verify the channel is created + cy.findByTestId('runinfo-channel-link').contains(runName); + }); + + it('start a run in existing channel', () => { + // # Visit the selected playbook + cy.visit(`/playbooks/playbooks/${testPlaybook.id}/outline`); + + // # Select the action section. + cy.get('#actions #link-existing-channel').within(() => { + // # Enable link to existing channel + cy.get('input[type=radio]').click(); + + // * Verify that the toggle is checked and input is enabled + cy.get('input[type=radio]').should('be.checked'); + cy.get('input[type=text]').should('not.be.disabled'); + + // # Select channel + cy.findByText('Select a channel').click().type('Town{enter}'); + }); + + // # Wait updated playbook to be fetched + cy.gqlInterceptQuery('Playbook'); + cy.wait('@gqlPlaybook'); + + // # Click Run Playbook + cy.findByTestId('run-playbook').click({force: true}); + + // # Enter the run name + const runName = 'run' + Date.now(); + cy.findByTestId('run-name-input').clear().type(runName); + + // * Verify that channel configuration matches playbook config + cy.findByTestId('link-existing-channel-radio').should('be.checked'); + cy.get('#link-existing-channel-selector').get('input[type=text]').should('be.enabled'); + cy.findByTestId('create-channel-radio').should('not.be.checked'); + cy.findByTestId('create-private-channel-radio').should('not.exist'); + + // # Click start run button + cy.get('button[data-testid=modal-confirm-button]').click(); + + // * Verify the run is added to lhs + cy.findByTestId('Runs').findByTestId(runName).should('exist'); + + // * Verify the channel is created + cy.findByTestId('runinfo-channel-link').contains('Town'); + }); + }); +}); diff --git a/e2e/cypress/tests/integration/playbooks/playbooks/pagination_spec.js b/e2e/cypress/tests/integration/playbooks/playbooks/pagination_spec.js new file mode 100644 index 0000000000..b60731ad22 --- /dev/null +++ b/e2e/cypress/tests/integration/playbooks/playbooks/pagination_spec.js @@ -0,0 +1,68 @@ +// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. + +// *************************************************************** +// - [#] indicates a test step (e.g. # Go to a page) +// - [*] indicates an assertion (e.g. * Check the title) +// *************************************************************** + +// Stage: @prod +// Group: @playbooks + +describe('playbooks > list pagination', () => { + let testTeam; + let testUser; + const ExtraPlaybooks = 20; + + before(() => { + cy.apiInitSetup().then(({team, user}) => { + testTeam = team; + testUser = user; + + // # Login as user-1 + cy.apiLogin(testUser); + + // # Create a public playbook + cy.apiCreatePlaybook({ + teamId: testTeam.id, + title: 'Playbook', + memberIDs: [], + }); + + // # Populate the DB with more elements to force the pagination + for (let i = 0; i < ExtraPlaybooks; i++) { + cy.apiCreatePlaybook({ + teamId: testTeam.id, + title: 'Elements before', + memberIDs: [], + }); + } + }); + }); + + beforeEach(() => { + // # Login as testUser + cy.apiLogin(testUser); + }); + + it('reset page to 0 after search for an name with one value', () => { + // # Open the product + cy.visit('/playbooks'); + + // # Switch to Playbooks + cy.findByTestId('playbooksLHSButton').click(); + + // # Click on next page + cy.findByText('Next').click(); + + // # Click on Search input + cy.get('input[placeholder="Search for a playbook"]').type('Playbook'); + + // * Verify the page display the first page + cy.findByText('1–1 of 1 total'); + + // * Verify that previous isn't exist + cy.findByText('Previous').should('not.exist'); + }); +}); + diff --git a/e2e/cypress/tests/integration/playbooks/playbooks/start_run_spec.js b/e2e/cypress/tests/integration/playbooks/playbooks/start_run_spec.js new file mode 100644 index 0000000000..e29545e053 --- /dev/null +++ b/e2e/cypress/tests/integration/playbooks/playbooks/start_run_spec.js @@ -0,0 +1,578 @@ +// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. + +// *************************************************************** +// - [#] indicates a test step (e.g. # Go to a page) +// - [*] indicates an assertion (e.g. * Check the title) +// *************************************************************** + +// Stage: @prod +// Group: @playbooks + +const RUN_NAME_MAX_LENGTH = 64; + +describe('playbooks > start a run', () => { + let testTeam; + let testUser; + let testPlaybook; + + before(() => { + cy.apiInitSetup().then(({team, user}) => { + testTeam = team; + testUser = user; + }); + }); + + beforeEach(() => { + // # intercepts telemetry + cy.interceptTelemetry(); + + // # Login as testUser + cy.apiLogin(testUser); + + // # Create a public playbook + cy.apiCreatePlaybook({ + teamId: testTeam.id, + title: 'Public Playbook', + makePublic: true, + memberIDs: [testUser.id], + createPublicPlaybookRun: true, + }).then((playbook) => { + testPlaybook = playbook; + }); + }); + + // This data is intentionally changed here instead of via api + const fillPBE = ({name, summary, channelMode, channelNameToLink, defaultOwnerEnabled}) => { + // # fill channel name temaplte + if (name) { + cy.get('#create-new-channel input[type="text"]').clear().type('Channel template'); + } + + // # fill summary template + if (summary) { + cy.contains('run summary template').dblclick(); + cy.focused().type('run summary template'); + cy.findByRole('button', {name: /save/i}).click(); + } + if (channelMode === 'create_new_channel') { + cy.get('#create-new-channel input[type="radio"]').eq(0).click(); + } else if (channelMode === 'link_to_existing_channel') { + cy.get('#link-existing-channel input[type="radio"]').click(); + } + + if (channelNameToLink) { + cy.get('#link-existing-channel').within(() => { + cy.findByText('Select a channel').click().type(`${channelNameToLink}{enter}`); + }); + } + + if (defaultOwnerEnabled) { + cy.get('#assign-owner').within(() => { + // * Verify that the toggle is unchecked + cy.get('label input').should('not.be.checked'); + + // # Click on the toggle to enable the setting + cy.get('label input').click({force: true}); + + // * Verify that the toggle is checked + cy.get('label input').should('be.checked'); + }); + } + }; + describe('from playbook list', () => { + it('defaults', () => { + // # Visit playbook list + cy.visit('/playbooks/playbooks'); + + // # Click "Run" button on the first playbook + cy.findAllByTestId('playbook-item').first().within(() => { + cy.findByText('Run').click(); + }); + + cy.get('#root-portal.modal-open').within(() => { + // # Wait the modal to render + cy.wait(500); + + // * Assert template name is filled + cy.findByTestId('run-name-input').clear().type('Run name'); + + // # Click start button + cy.findByTestId('modal-confirm-button').click(); + }); + + // * Assert telemetry data + cy.expectTelemetryToContain([ + { + name: 'playbookrun_create', + type: 'track', + properties: { + place: 'backstage_playbook_list', + playbookId: testPlaybook.id, + channelMode: 'create_new_channel', + hasPlaybookChanged: false, + hasNameChanged: true, + hasSummaryChanged: false, + hasChannelModeChanged: false, + hasChannelIdChanged: false, + hasPublicChanged: false, + }, + }, + ]); + + // * Verify we are on RDP + cy.url().should('include', '/playbooks/runs/'); + cy.url().should('include', '?from=run_modal'); + + // * Verify run name + cy.get('h1').contains('Run name'); + }); + }); + + describe('from playbook editor', () => { + describe('pbe configured as create new channel', () => { + it('defaults', () => { + // # Visit the selected playbook + cy.visit(`/playbooks/playbooks/${testPlaybook.id}/outline`); + + // Fill default values + fillPBE({name: 'Channel template', summary: 'run summary template', channelMode: 'create_new_channel', defaultOwnerEnabled: true}); + + // # Click start a run button + cy.findByTestId('run-playbook').click(); + + cy.get('#root-portal.modal-open').within(() => { + // # Wait the modal to render + cy.wait(500); + + // * Assert template name is filled + cy.findByTestId('run-name-input').should('have.value', 'Channel template'); + + // * Assert template summary is filled + cy.findByTestId('run-summary-input').should('have.value', 'run summary template'); + + // # Click start button + cy.findByTestId('modal-confirm-button').click(); + }); + + // * Assert telemetry data + cy.expectTelemetryToContain([ + { + name: 'playbookrun_create', + type: 'track', + properties: { + place: 'backstage_playbook_editor', + playbookId: testPlaybook.id, + channelMode: 'create_new_channel', + hasPlaybookChanged: false, + hasNameChanged: false, + hasSummaryChanged: false, + hasChannelModeChanged: false, + hasChannelIdChanged: false, + hasPublicChanged: false, + }, + }, + ]); + + // * Verify we are on RDP + cy.url().should('include', '/playbooks/runs/'); + cy.url().should('include', '?from=run_modal'); + + // * Verify run name + cy.get('h1').contains('Channel template'); + + // * Verify run summary + cy.findByTestId('run-summary-section').contains('run summary template'); + }); + + it('change title/summary', () => { + // # Visit the selected playbook + cy.visit(`/playbooks/playbooks/${testPlaybook.id}/outline`); + + // # Fill default values + fillPBE({name: 'Channel template', summary: 'run summary template', channelMode: 'create_new_channel'}); + + // # Click start a run button + cy.findByTestId('run-playbook').click(); + + cy.get('#root-portal.modal-open').within(() => { + // # Wait the modal to render + cy.wait(500); + + // * Assert template are filled (and force wait to them) + cy.findByTestId('run-name-input').should('have.value', 'Channel template'); + cy.findByTestId('run-summary-input').should('have.value', 'run summary template'); + + // # Fill run name + cy.findByTestId('run-name-input').clear().type('Test Run Name'); + + // # Fill run summary + cy.findByTestId('run-summary-input').clear().type('Test Run Summary'); + + // # Click start button + cy.findByTestId('modal-confirm-button').click(); + }); + + // * Assert telemetry data + cy.expectTelemetryToContain([ + { + name: 'playbookrun_create', + type: 'track', + properties: { + place: 'backstage_playbook_editor', + playbookId: testPlaybook.id, + channelMode: 'create_new_channel', + hasPlaybookChanged: false, + hasNameChanged: true, + hasSummaryChanged: true, + hasChannelModeChanged: false, + hasChannelIdChanged: false, + hasPublicChanged: false, + }, + }, + ]); + + // * Verify we are on RDP + cy.url().should('include', '/playbooks/runs/'); + cy.url().should('include', '?from=run_modal'); + + // * Verify run name + cy.get('h1').contains('Test Run Name'); + + // * Verify run summary + cy.findByTestId('run-summary-section').contains('Test Run Summary'); + }); + + it('change to link to existing channel does not default to current channel', () => { + // # Visit the selected playbook + cy.visit(`/playbooks/playbooks/${testPlaybook.id}/outline`); + + // # Fill default values + fillPBE({name: 'Channel template', summary: 'run summary template', channelMode: 'create_new_channel', defaultOwnerEnabled: true}); + + // # Click start a run button + cy.findByTestId('run-playbook').click(); + + cy.get('#root-portal.modal-open').within(() => { + // # Wait the modal to render + cy.wait(500); + + // # Change to link to existing channel + cy.findByTestId('link-existing-channel-radio').click(); + + // * Assert selected channel is unchanged + cy.findByText('Select a channel').should('be.visible'); + }); + }); + + it('change to link to existing channel', () => { + // # Visit the selected playbook + cy.visit(`/playbooks/playbooks/${testPlaybook.id}/outline`); + + // # Fill default values + fillPBE({name: 'Channel template', summary: 'run summary template', channelMode: 'create_new_channel', defaultOwnerEnabled: true}); + + // # Click start a run button + cy.findByTestId('run-playbook').click(); + + cy.get('#root-portal.modal-open').within(() => { + // # Wait the modal to render + cy.wait(500); + + // # Change to link to existing channel + cy.findByTestId('link-existing-channel-radio').click(); + + // # Fill run name + cy.findByTestId('run-name-input').clear().type('Test Run Name'); + + // * Assert cta is disabled + cy.findByTestId('modal-confirm-button').should('be.disabled'); + + // # Fill Town square as the channel to be linked + cy.findByText('Select a channel').click().type('Town{enter}'); + + // # Click start button + cy.findByTestId('modal-confirm-button').click(); + }); + + // * Assert telemetry data + cy.expectTelemetryToContain([ + { + name: 'playbookrun_create', + type: 'track', + properties: { + place: 'backstage_playbook_editor', + playbookId: testPlaybook.id, + channelMode: 'link_existing_channel', + hasPlaybookChanged: false, + hasNameChanged: true, + hasSummaryChanged: false, + hasChannelModeChanged: true, + hasChannelIdChanged: true, + hasPublicChanged: false, + }, + }, + ]); + + // * Verify we are on RDP + cy.url().should('include', '/playbooks/runs/'); + cy.url().should('include', '?from=run_modal'); + + // * Verify run name + cy.get('h1').contains('Test Run Name'); + + // # Click channel link + cy.findByTestId('runinfo-channel-link').click(); + + // * Verify we are on town square + cy.url().should('include', `/${testTeam.name}/channels/town-square`); + }); + }); + + describe('pbe configured as linked to existing channel', () => { + it('defaults', () => { + // # Visit the selected playbook + cy.visit(`/playbooks/playbooks/${testPlaybook.id}/outline`); + + // # Fill default values + fillPBE({summary: 'run summary template', channelMode: 'link_to_existing_channel', channelNameToLink: 'Town'}); + + // # Click start a run button + cy.findByTestId('run-playbook').click(); + + cy.get('#root-portal.modal-open').within(() => { + // # Wait the modal to render + cy.wait(500); + + // * Assert template name is empty + cy.findByTestId('run-name-input').should('be.empty'); + + // * Assert template summary is filled + cy.findByTestId('run-summary-input').should('have.value', 'run summary template'); + + // * Assert button is still disabled + cy.findByTestId('modal-confirm-button').should('be.disabled'); + + // # Fill run name + cy.findByTestId('run-name-input').clear().type('Test Run Name'); + + // # Click start button + cy.findByTestId('modal-confirm-button').click(); + }); + + // * Assert telemetry data + cy.expectTelemetryToContain([ + { + name: 'playbookrun_create', + type: 'track', + properties: { + place: 'backstage_playbook_editor', + playbookId: testPlaybook.id, + channelMode: 'link_existing_channel', + hasPlaybookChanged: false, + hasNameChanged: true, + hasSummaryChanged: false, + hasChannelModeChanged: false, + hasChannelIdChanged: false, + hasPublicChanged: false, + }, + }, + ]); + + // * Verify we are on RDP + cy.url().should('include', '/playbooks/runs/'); + cy.url().should('include', '?from=run_modal'); + + // * Verify run name + cy.get('h1').contains('Test Run Name'); + + // * Verify run summary + cy.findByTestId('run-summary-section').contains('run summary template'); + + // # Click channel link + cy.findByTestId('runinfo-channel-link').click(); + + // * Verify we are on town square + cy.url().should('include', `/${testTeam.name}/channels/town-square`); + }); + + it('fill initially empty channel', () => { + // # Visit the selected playbook + cy.visit(`/playbooks/playbooks/${testPlaybook.id}/outline`); + + // # Fill default values + fillPBE({summary: 'run summary template', channelMode: 'link_to_existing_channel'}); + + // # Click start a run button + cy.findByTestId('run-playbook').click(); + + cy.get('#root-portal.modal-open').within(() => { + // # Wait the modal to render + cy.wait(500); + + // * Assert template name is empty + cy.findByTestId('run-name-input').should('be.empty'); + + // * Assert template summary is filled + cy.findByTestId('run-summary-input').should('have.value', 'run summary template'); + + // # Fill run name + cy.findByTestId('run-name-input').clear().type('Test Run Name'); + + // * Assert button is still disabled + cy.findByTestId('modal-confirm-button').should('be.disabled'); + + // # Fill Town square as the channel to be linked + cy.findByText('Select a channel').click().type('Town{enter}'); + + // # Click start button + cy.findByTestId('modal-confirm-button').click(); + }); + + // * Assert telemetry data + cy.expectTelemetryToContain([ + { + name: 'playbookrun_create', + type: 'track', + properties: { + place: 'backstage_playbook_editor', + playbookId: testPlaybook.id, + channelMode: 'link_existing_channel', + hasPlaybookChanged: false, + hasNameChanged: true, + hasSummaryChanged: false, + hasChannelModeChanged: false, + hasChannelIdChanged: true, + hasPublicChanged: false, + }, + }, + ]); + + // * Verify we are on RDP + cy.url().should('include', '/playbooks/runs/'); + cy.url().should('include', '?from=run_modal'); + + // * Verify run name + cy.get('h1').contains('Test Run Name'); + + // * Verify run summary + cy.findByTestId('run-summary-section').contains('run summary template'); + + // # Click channel link + cy.findByTestId('runinfo-channel-link').click(); + + // * Verify we are on town square + cy.url().should('include', `/${testTeam.name}/channels/town-square`); + }); + + it('change to create new channel', () => { + // # Visit the selected playbook + cy.visit(`/playbooks/playbooks/${testPlaybook.id}/outline`); + + // Fill default values + fillPBE({name: 'Channel template', summary: 'run summary template', channelMode: 'link_to_existing_channel', channelNameToLink: 'Town'}); + + // # Click start a run button + cy.findByTestId('run-playbook').click(); + + cy.get('#root-portal.modal-open').within(() => { + // # Wait the modal to render + cy.wait(500); + + // * Change to create new channel + cy.findByTestId('create-channel-radio').click(); + + // # Fill run name + cy.findByTestId('run-name-input').clear().type('Test Run Name'); + + // # Click start button + cy.findByTestId('modal-confirm-button').click(); + }); + + // * Assert telemetry data + cy.expectTelemetryToContain([ + { + name: 'playbookrun_create', + type: 'track', + properties: { + place: 'backstage_playbook_editor', + playbookId: testPlaybook.id, + channelMode: 'create_new_channel', + hasPlaybookChanged: false, + hasNameChanged: true, + hasSummaryChanged: false, + hasChannelModeChanged: true, + hasChannelIdChanged: false, + hasPublicChanged: false, + }, + }, + ]); + + // * Verify we are on RDP + cy.url().should('include', '/playbooks/runs/'); + cy.url().should('include', '?from=run_modal'); + + // * Verify run name + cy.get('h1').contains('Test Run Name'); + + // # Click channel link + cy.findByTestId('runinfo-channel-link').click(); + + // * Verify we are on channel Test Run Name + cy.url().should('include', `/${testTeam.name}/channels/test-run-name`); + }); + }); + }); + + describe('start run modal > invalid user input', () => { + it('submit button is disabled when run name is empty', () => { + // # Visit the selected playbook + cy.visit(`/playbooks/playbooks/${testPlaybook.id}/outline`); + + // # Click start a run button + cy.findByTestId('run-playbook').click(); + + cy.get('#root-portal.modal-open').within(() => { + // # Wait the modal to render + cy.wait(500); + + // * Assert template name is empty + cy.findByTestId('run-name-input').should('have.value', ''); + + // * Assert start button is disabled + cy.findByTestId('modal-confirm-button').should('have.attr', 'disabled'); + }); + }); + + it('error is shown when maximum length of run name is exceeded', () => { + // # Visit the selected playbook + cy.visit(`/playbooks/playbooks/${testPlaybook.id}/outline`); + + // # Click start a run button + cy.findByTestId('run-playbook').click(); + + cy.get('#root-portal.modal-open').within(() => { + // # Wait the modal to render + cy.wait(500); + + // * Assert template name is empty + cy.findByTestId('run-name-input').should('have.value', ''); + + // # Type run name that exceeds maximum length + cy.findByTestId('run-name-input').type('a'.repeat(RUN_NAME_MAX_LENGTH + 1)); + + // * Assert error shown and contains maximum length in message + cy.findByTestId('run-name-error').should('contain', RUN_NAME_MAX_LENGTH); + + // * Assert start button is disabled + cy.findByTestId('modal-confirm-button').should('have.attr', 'disabled'); + + // # Delete last character via backspace + cy.findByTestId('run-name-input').type('{backspace}'); + + // * Assert that error is not shown anymore + cy.findByTestId('run-name-error').should('not.exist'); + }); + }); + }); +}); diff --git a/e2e/cypress/tests/integration/playbooks/playbooks/status_update_spec.js b/e2e/cypress/tests/integration/playbooks/playbooks/status_update_spec.js new file mode 100644 index 0000000000..73730ca693 --- /dev/null +++ b/e2e/cypress/tests/integration/playbooks/playbooks/status_update_spec.js @@ -0,0 +1,196 @@ +// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. + +// *************************************************************** +// - [#] indicates a test step (e.g. # Go to a page) +// - [*] indicates an assertion (e.g. * Check the title) +// *************************************************************** + +// Stage: @prod +// Group: @playbooks + +describe('playbooks > edit status update', () => { + let testTeam; + let testUser; + let testPlaybook; + let testChannel; + + before(() => { + cy.apiInitSetup().then(({team, user}) => { + testTeam = team; + testUser = user; + + // # Login as testUser + cy.apiLogin(testUser); + + // # Create a public channel + cy.apiCreateChannel( + testTeam.id, + 'public-channel', + 'Public Channel', + 'O', + ).then(({channel}) => { + testChannel = channel; + }); + }); + }); + + beforeEach(() => { + // # Login as testUser + cy.apiLogin(testUser); + + // # Create a playbook + cy.apiCreateTestPlaybook({ + teamId: testTeam.id, + title: 'Playbook (' + Date.now() + ')', + userId: testUser.id, + }).then((playbook) => { + testPlaybook = playbook; + }); + + // # Set a bigger viewport so the action don't scroll out of view + cy.viewport('macbook-16'); + }); + + describe('status update enable/disable', () => { + it('can enable/disable status update', () => { + // # Visit the selected playbook outline tab + cy.visit(`/playbooks/playbooks/${testPlaybook.id}/outline`); + + // * Verify status update message + cy.findAllByTestId('status-update-section').should('exist').within(() => { + cy.contains('A status update is expected every'); + cy.contains('1 day'); + cy.contains('no channels'); + cy.contains('no outgoing webhooks'); + }); + + // # Disable status update + cy.findAllByTestId('status-update-toggle').eq(0).click(); + + // * Verify status update message + cy.findAllByTestId('status-update-section').should('exist').within(() => { + cy.contains('Status updates are not expected.'); + cy.contains('A status update is expected every').should('not.exist'); + }); + }); + }); + + describe('edit channels and webhooks', () => { + it('can enable/disable status update', () => { + // # Visit the selected playbook outline tab + cy.visit(`/playbooks/playbooks/${testPlaybook.id}/outline`); + + // # Select a channel + cy.findAllByTestId('status-update-broadcast-channels').click(); + cy.get('#playbook-automation-broadcast').contains('Town Square').click({force: true}); + cy.findAllByTestId('status-update-broadcast-channels').click(); + + // # Refresh the page + cy.visit(`/playbooks/playbooks/${testPlaybook.id}/outline`); + + // # Add webhooks + cy.findAllByTestId('status-update-webhooks').click(); + cy.findAllByTestId('webhooks-input').type('http://hook1.com{enter}http://hook2.com{enter}http://hook3.com{enter}'); + cy.findAllByTestId('checklist-item-save-button').click(); + + // # Refresh the page + cy.visit(`/playbooks/playbooks/${testPlaybook.id}/outline`); + + // * Verify status update message + cy.findAllByTestId('status-update-section').should('exist').within(() => { + cy.contains('1 channel'); + cy.contains('3 outgoing webhooks'); + }); + + // # Disable status update + cy.findAllByTestId('status-update-toggle').eq(0).click(); + + // * Verify status update message + cy.get('#status-updates').within(() => { + cy.findByText('Status updates are not expected.').should('exist'); + }); + + // # Re-enable status update + cy.findAllByTestId('status-update-toggle').eq(0).click(); + + // # Refresh the page + cy.visit(`/playbooks/playbooks/${testPlaybook.id}/outline`); + + // * Verify that channels and webhooks persist + cy.get('#status-updates').within(() => { + cy.contains('1 channel').should('exist'); + cy.contains('3 outgoing webhooks').should('exist'); + }); + }); + }); + + describe('status enabled, broadcasts disabled, but channels and webhooks specified', () => { + it('can enable/disable status update', () => { + const broadcastChannelIds = [testChannel.id]; + const webhookOnStatusUpdateURLs = ['https://one.com', 'https://two.com']; + + // # Create a playbook + cy.apiCreatePlaybook({ + teamId: testTeam.id, + title: 'Playbook #### (' + Date.now() + ')', + userId: testUser.id, + broadcastChannelIds, + webhookOnStatusUpdateURLs, + }).then((playbook) => { + // # Visit the selected playbook outline tab + cy.visit(`/playbooks/playbooks/${playbook.id}/outline`); + + // * Verify status update message. Status update should be enabled, but message should say `updates will be posted to no channels and no outgoing webhooks` + cy.findAllByTestId('status-update-section').should('exist').within(() => { + cy.contains('A status update is expected every'); + cy.contains('no channels'); + cy.contains('no outgoing webhooks'); + }); + + // * Verify selected channels style + cy.findAllByTestId('status-update-broadcast-channels').click(); + cy.get('.playbook-react-select__option').contains('Public Channel'). + invoke('css', 'text-decoration'). + should('equal', 'line-through solid rgba(63, 67, 80, 0.48)'); + + // # Close select options + cy.findAllByTestId('status-update-broadcast-channels').click(); + + // # Open webhooks text area + cy.findAllByTestId('status-update-webhooks').click(); + + // * Verify webhooks text style + cy.findAllByTestId('webhooks-input'). + invoke('css', 'text-decoration'). + should('equal', 'line-through solid rgba(63, 67, 80, 0.48)'); + + // # Edit webhooks + cy.findAllByTestId('webhooks-input').type('http://hook1.com{enter}http://hook2.com{enter}http://hook3.com{enter}'); + cy.findAllByTestId('checklist-item-save-button').click(); + + // # Select a channel + cy.findAllByTestId('status-update-broadcast-channels').click(); + cy.get('#playbook-automation-broadcast').contains('Town Square').click({force: true}); + cy.findAllByTestId('status-update-broadcast-channels').click(); + + // * Verify status update message. + cy.findAllByTestId('status-update-section').should('exist').within(() => { + cy.contains('A status update is expected every'); + cy.contains('2 channels'); + cy.contains('4 outgoing webhooks'); + }); + + // # Refresh the page + cy.visit(`/playbooks/playbooks/${playbook.id}/outline`); + + // * Verify status update message. + cy.findAllByTestId('status-update-section').should('exist').within(() => { + cy.contains('A status update is expected every'); + cy.contains('2 channels'); + cy.contains('4 outgoing webhooks'); + }); + }); + }); + }); +}); diff --git a/e2e/cypress/tests/integration/playbooks/runs/list_spec.js b/e2e/cypress/tests/integration/playbooks/runs/list_spec.js new file mode 100644 index 0000000000..9e20b61c15 --- /dev/null +++ b/e2e/cypress/tests/integration/playbooks/runs/list_spec.js @@ -0,0 +1,262 @@ +// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. + +// *************************************************************** +// - [#] indicates a test step (e.g. # Go to a page) +// - [*] indicates an assertion (e.g. * Check the title) +// *************************************************************** + +// Stage: @prod +// Group: @playbooks + +describe('runs > list', () => { + let testTeam; + let testUser; + let testAnotherUser; + let testPlaybook; + + before(() => { + cy.apiInitSetup().then(({team, user}) => { + // # Create another user + cy.apiCreateUser().then(({user: anotherUser}) => { + testTeam = team; + testUser = user; + testAnotherUser = anotherUser; + cy.apiAddUserToTeam(testTeam.id, anotherUser.id); + + // # Login as testUser + cy.apiLogin(testUser); + + // # Create a public playbook + cy.apiCreatePlaybook({ + teamId: testTeam.id, + title: 'Public Playbook', + makePublic: true, + memberIDs: [testUser.id, testAnotherUser.id], + createPublicPlaybookRun: true, + }).then((playbook) => { + testPlaybook = playbook; + }); + }); + }); + }); + + beforeEach(() => { + // # Size the viewport to show all + cy.viewport('macbook-13'); + + // # Login as testUser + cy.apiLogin(testUser); + }); + + it('has "Runs" and team name in heading', () => { + // # Run the playbook + const now = Date.now(); + const playbookRunName = 'Playbook Run (' + now + ')'; + cy.apiRunPlaybook({ + teamId: testTeam.id, + playbookId: testPlaybook.id, + playbookRunName, + ownerUserId: testUser.id, + }); + + // # Open the product + cy.visit('/playbooks'); + + // # Switch to playbook runs + cy.findByTestId('playbookRunsLHSButton').click(); + + // * Assert contents of heading. + cy.findByTestId('titlePlaybookRun').should('exist').contains('Runs'); + }); + + it('loads playbook run details page when clicking on a playbook run', () => { + // # Run the playbook + const now = Date.now(); + const playbookRunName = 'Playbook Run (' + now + ')'; + cy.apiRunPlaybook({ + teamId: testTeam.id, + playbookId: testPlaybook.id, + playbookRunName, + ownerUserId: testUser.id, + }); + + // # Open the product + cy.visit('/playbooks'); + + // # Switch to runs + cy.findByTestId('playbookRunsLHSButton').click(); + + // # Find the playbook run and click to open details view + cy.get('#playbookRunList').within(() => { + cy.findByText(playbookRunName).click(); + }); + + // * Verify that the header contains the playbook run name + cy.findByTestId('run-header-section').get('h1').contains(playbookRunName); + }); + + describe('filters my runs only', () => { + before(() => { + // # Login as testUser + cy.apiLogin(testUser); + + // # Run a playbook with testUser as a participant + cy.apiRunPlaybook({ + teamId: testTeam.id, + playbookId: testPlaybook.id, + playbookRunName: 'testUsers Run', + ownerUserId: testUser.id, + }); + + // # Login as testAnotherUser + cy.apiLogin(testAnotherUser); + + // # Run a playbook with testAnotherUser as a participant + cy.apiRunPlaybook({ + teamId: testTeam.id, + playbookId: testPlaybook.id, + playbookRunName: 'testAnotherUsers Run', + + // ownerUserId: testUser.id, + ownerUserId: testAnotherUser.id, + }); + }); + + it('for testUser', () => { + // # Login as testUser + cy.apiLogin(testUser); + + // # Open the product + cy.visit('/playbooks/runs'); + + cy.get('#playbookRunList').within(() => { + // # Make sure both runs are visible by default + cy.findByText('testUsers Run').should('be.visible'); + cy.findByText('testAnotherUsers Run').should('be.visible'); + + // # Filter to only my runs + cy.findByTestId('my-runs-only').click(); + + // # Verify runs by testAnotherUser are not visible + cy.findByText('testAnotherUsers Run').should('not.exist'); + + // # Verify runs by testUser remain visible + cy.findByText('testUsers Run').should('be.visible'); + }); + }); + + it('for testAnotherUser', () => { + // # Login as testAnotherUser + cy.apiLogin(testAnotherUser); + + // # Open the product + cy.visit('/playbooks'); + cy.get('#playbookRunList').within(() => { + // Make sure both runs are visible by default + cy.findByText('testUsers Run').should('be.visible'); + cy.findByText('testAnotherUsers Run').should('be.visible'); + + // # Filter to only my runs + cy.findByTestId('my-runs-only').click(); + + // # Verify runs by testUser are not visible + cy.findByText('testUsers Run').should('not.exist'); + + // # Verify runs by testAnotherUser remain visible + cy.findByText('testAnotherUsers Run').should('be.visible'); + }); + }); + }); + + describe('filters Finished runs correctly', () => { + before(() => { + // # Login as testUser + cy.apiLogin(testUser); + + // # Run a playbook with testUser as a participant + cy.apiRunPlaybook({ + teamId: testTeam.id, + playbookId: testPlaybook.id, + playbookRunName: 'testUsers Run to be finished', + ownerUserId: testUser.id, + }).then((playbook) => { + cy.apiFinishRun(playbook.id); + }); + }); + + it('shows finished runs', () => { + // # Login as testUser + cy.apiLogin(testUser); + + // # Open the product + cy.visit('/playbooks'); + + cy.get('#playbookRunList').within(() => { + // # Make sure runs are visible by default, and finished is not + cy.findByText('testUsers Run').should('be.visible'); + cy.findByText('testAnotherUsers Run').should('be.visible'); + cy.findByText('testUsers Run to be finished').should('not.exist'); + + // # Filter to finished runs as well + cy.findByTestId('finished-runs').click(); + + // # Verify runs remain visible + cy.findByText('testUsers Run').should('be.visible'); + cy.findByText('testAnotherUsers Run').should('be.visible'); + + // # Verify finished run is visible + cy.findByText('testUsers Run to be finished').should('be.visible'); + }); + }); + }); + + describe('LHS run list', () => { + before(() => { + // # Login as testUser + cy.apiLogin(testUser); + + const runs = [ + { + teamId: testTeam.id, + playbookId: testPlaybook.id, + playbookRunName: 'run-sort-check 0', + ownerUserId: testUser.id, + }, + { + teamId: testTeam.id, + playbookId: testPlaybook.id, + playbookRunName: 'run-sort-check 1', + ownerUserId: testUser.id, + }, + { + teamId: testTeam.id, + playbookId: testPlaybook.id, + playbookRunName: 'run-sort-check 2', + ownerUserId: testUser.id, + }, + { + teamId: testTeam.id, + playbookId: testPlaybook.id, + playbookRunName: 'run-sort-check 3', + ownerUserId: testUser.id, + }, + ]; + + Promise.all(runs.map((run) => { + return new Promise((resolve) => cy.apiRunPlaybook(run).then(resolve)); + })).then(() => { + cy.visit('/playbooks'); + }); + }); + + it('lhs run list sorted by name', () => { + cy.findByTestId('lhs-navigation').within(() => { + cy.get('li:contains(run-sort-check)').each((item, index) => { + // * Verify run list order + cy.wrap(item).should('have.text', 'run-sort-check ' + index); + }); + }); + }); + }); +}); diff --git a/e2e/cypress/tests/integration/playbooks/runs/permissions_spec.js b/e2e/cypress/tests/integration/playbooks/runs/permissions_spec.js new file mode 100644 index 0000000000..a6426d7bdc --- /dev/null +++ b/e2e/cypress/tests/integration/playbooks/runs/permissions_spec.js @@ -0,0 +1,506 @@ +// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. + +// *************************************************************** +// - [#] indicates a test step (e.g. # Go to a page) +// - [*] indicates an assertion (e.g. * Check the title) +// *************************************************************** + +// Stage: @prod +// Group: @playbooks + +/* eslint-disable no-only-tests/no-only-tests */ + +import {getRandomId} from '../../../utils'; + +describe('runs > permissions', () => { + let testTeam; + let testUser; + let testOtherTeam; + + let playbookMember; + let runParticipant; + let runFollower; + let teamMember; + let nonTeamMember; + let sysadminInTeam; + let sysadminNotInTeam; + + before(() => { + cy.apiInitSetup().then(({team, user}) => { + testTeam = team; + testUser = user; + + // # Create a dedicated playbook member + cy.apiCreateUser().then(({user: createdUser}) => { + playbookMember = createdUser; + + cy.apiAddUserToTeam(testTeam.id, createdUser.id); + }); + + // # Create a dedicated run participant + cy.apiCreateUser().then(({user: createdUser}) => { + runParticipant = createdUser; + + cy.apiAddUserToTeam(testTeam.id, createdUser.id); + }); + + // # Create a dedicated run follower + cy.apiCreateUser().then(({user: createdUser}) => { + runFollower = createdUser; + + cy.apiAddUserToTeam(testTeam.id, createdUser.id); + }); + + // # Create a dedicated member in team 1 + cy.apiCreateUser().then(({user: createdUser}) => { + teamMember = createdUser; + + cy.apiAddUserToTeam(testTeam.id, createdUser.id); + }); + + // # Create a dedicated sysadmin in team 1 + cy.apiCreateCustomAdmin().then(({sysadmin: createdUser}) => { + sysadminInTeam = createdUser; + + cy.apiAddUserToTeam(testTeam.id, createdUser.id); + }); + + // # Create a public playbook and corresponding run with a public channel in + // team 1. This is to ensure the list isn't empty for users who can't access the + // run under test. + cy.apiCreatePlaybook({ + teamId: testTeam.id, + title: 'Playbook (Team 1)', + memberIDs: [], + createPublicPlaybookRun: true, + }).then((createdPlaybook) => { + // Create a run + cy.apiRunPlaybook({ + teamId: testTeam.id, + playbookId: createdPlaybook.id, + playbookRunName: getRandomId(), + ownerUserId: testUser.id, + }); + }); + + // # Create another team + cy.apiCreateTeam('second-team', 'Second Team').then(({team: createdTeam}) => { + testOtherTeam = createdTeam; + + // # Create a dedicated member not in team 1 + cy.apiCreateUser().then(({user: createdUser}) => { + nonTeamMember = createdUser; + + cy.apiAddUserToTeam(testOtherTeam.id, createdUser.id); + }); + + // # Create a dedicated sysadmin not in team 1 + cy.apiCreateCustomAdmin().then(({sysadmin: createdUser}) => { + sysadminNotInTeam = createdUser; + + cy.apiAddUserToTeam(testOtherTeam.id, createdUser.id); + }); + + // # Create a public playbook and corresponding run with a public channel in + // team 2. This is to ensure the list isn't empty for users who can't access the + // run under test. + cy.apiCreatePlaybook({ + teamId: testOtherTeam.id, + title: 'Playbook (Team 2)', + memberIDs: [], + createPublicPlaybookRun: true, + }).then((createdPlaybook) => { + // Create a run + cy.apiRunPlaybook({ + teamId: testOtherTeam.id, + playbookId: createdPlaybook.id, + playbookRunName: getRandomId(), + ownerUserId: nonTeamMember.id, + }); + }); + }); + }); + }); + + describe('run with private channel from a public playbook', () => { + let playbook; + let run; + + before(() => { + // # Login as the user setup during initialization. + cy.apiLogin(testUser); + + // # Create a public playbook, configured to create private channels for runs + cy.apiCreatePlaybook({ + teamId: testTeam.id, + title: 'Playbook', + memberIDs: [], + createPublicPlaybookRun: false, + }).then((createdPlaybook) => { + playbook = createdPlaybook; + + // Create a run + cy.apiRunPlaybook({ + teamId: testTeam.id, + playbookId: playbook.id, + playbookRunName: getRandomId(), + ownerUserId: runParticipant.id, + }).then((createdRun) => { + run = createdRun; + + // Have the dedicated participant join the run + cy.apiAddUsersToRun(run.id, [runParticipant.id]); + + // # Have the dedicated follower follow this playbook run + cy.apiLogin(runFollower); + cy.apiFollowPlaybookRun(run.id); + }); + }); + }); + + describe('should be visible', () => { + // XXX: Skipping this test, since public playbooks currently have no members. This will + // likely change in the future, so keeping the skeleton. + it.skip('to playbook members', () => { + assertRunIsVisible(run, playbookMember); + }); + + it('to run participants', () => { + assertRunIsVisible(run, runParticipant); + }); + + it('to run followers', () => { + assertRunIsVisible(run, runFollower); + }); + + it('to team members', () => { + assertRunIsVisible(run, teamMember); + }); + + it('to admins in the team', () => { + assertRunIsVisible(run, sysadminInTeam); + }); + + // XXX: The following asserts that while sysadmins don't see runs from other teams in + // the list, they still have access to view the overview directly. Once we support + // sudo-admins, we should change this behaviour to be consistent with normal users. + it('to admins not in the team (overview only)', () => { + cy.apiLogin(sysadminNotInTeam); + + assertRunOverviewIsVisible(run); + }); + }); + + describe('should not be visible', () => { + it('to non-team members', () => { + assertRunIsNotVisible(run, nonTeamMember); + }); + + it('to admins not in the team (list only)', () => { + cy.apiLogin(sysadminNotInTeam); + + assertRunIsNotVisibleInList(run); + }); + }); + }); + + describe('run with public channel from a public playbook', () => { + let playbook; + let run; + + before(() => { + // # Login as the user setup during initialization. + cy.apiLogin(testUser); + + // # Create a public playbook, configured to create public channels for runs + cy.apiCreatePlaybook({ + teamId: testTeam.id, + title: 'Playbook', + memberIDs: [], + createPublicPlaybookRun: true, + }).then((createdPlaybook) => { + playbook = createdPlaybook; + + // Create a run + cy.apiRunPlaybook({ + teamId: testTeam.id, + playbookId: playbook.id, + playbookRunName: getRandomId(), + ownerUserId: runParticipant.id, + }).then((createdRun) => { + run = createdRun; + + // Have the dedicated participant join the run + cy.apiAddUsersToRun(run.id, [runParticipant.id]); + + // # Have the dedicated follower follow this playbook run + cy.apiLogin(runFollower); + cy.apiFollowPlaybookRun(run.id); + }); + }); + }); + + describe('should be visible', () => { + // XXX: Skipping this test, since public playbooks currently have no members. This will + // likely change in the future. + it.skip('to playbook members', () => { + assertRunIsVisible(run, playbookMember); + }); + + it('to run participants', () => { + assertRunIsVisible(run, runParticipant); + }); + + it('to run followers', () => { + assertRunIsVisible(run, runFollower); + }); + + it('to team members', () => { + assertRunIsVisible(run, teamMember); + }); + + it('to admins in the team', () => { + assertRunIsVisible(run, sysadminInTeam); + }); + + // XXX: The following asserts that while sysadmins don't see runs from other teams in + // the list, they still have access to view the overview directly. Once we support + // sudo-admins, we should change this behaviour to be consistent with normal users. + it('to admins not in the team (overview only)', () => { + cy.apiLogin(sysadminNotInTeam); + + assertRunOverviewIsVisible(run); + }); + }); + + describe('should not be visible', () => { + it('to non-team members', () => { + assertRunIsNotVisible(run, nonTeamMember); + }); + + it('to admins not in the team (list only)', () => { + cy.apiLogin(sysadminNotInTeam); + + assertRunIsNotVisibleInList(run); + }); + }); + }); + + describe('run with private channel from a private playbook', () => { + let playbook; + let run; + + before(() => { + // # Login as the user setup during initialization. + cy.apiLogin(testUser); + + // # Create private playbook, configured to create private channels for runs + cy.apiCreatePlaybook({ + teamId: testTeam.id, + title: 'Playbook', + makePublic: false, + memberIDs: [testUser.id, playbookMember.id], + createPublicPlaybookRun: false, + }).then((createdPlaybook) => { + playbook = createdPlaybook; + + // Login as the playbook member authorized to start a run + cy.apiLogin(playbookMember); + + // Create a run + cy.apiRunPlaybook({ + teamId: testTeam.id, + playbookId: playbook.id, + playbookRunName: getRandomId(), + ownerUserId: runParticipant.id, + }).then((createdRun) => { + run = createdRun; + + // Have the dedicated participant join the run + cy.apiAddUsersToRun(run.id, [runParticipant.id]); + }); + }); + }); + + describe('should be visible', () => { + it('to playbook members', () => { + assertRunIsVisible(run, playbookMember); + }); + + it('to run participants', () => { + assertRunIsVisible(run, runParticipant); + }); + + // Skipping this test, since followers cannot follow a run with a private channel from + // a private playbook. (But leaving it for clarity in the code.) + it.skip('to run followers', () => { + assertRunIsVisible(run, runFollower); + }); + + it('to admins in the team', () => { + assertRunIsVisible(run, sysadminInTeam); + }); + + // XXX: The following asserts that while sysadmins don't see runs from other teams in + // the list, they still have access to view the run directly. Once we support + // sudo-admins, we should change this behaviour to be consistent with normal users. + it('to admins not in the team (run directly)', () => { + cy.apiLogin(sysadminNotInTeam); + + assertRunOverviewIsVisible(run); + }); + }); + + describe('should not be visible', () => { + it('to team members', () => { + assertRunIsNotVisible(run, teamMember); + }); + + it('to non-team members', () => { + assertRunIsNotVisible(run, nonTeamMember); + }); + + it('to admins not in the team (list only)', () => { + cy.apiLogin(sysadminNotInTeam); + + assertRunIsNotVisibleInList(run); + }); + }); + }); + + describe('run with public channel from a private playbook', () => { + let playbook; + let run; + + before(() => { + // # Login as the user setup during initialization. + cy.apiLogin(testUser); + + // # Create private playbook, configured to create private channels for runs + cy.apiCreatePlaybook({ + teamId: testTeam.id, + title: 'Playbook', + memberIDs: [testUser.id, playbookMember.id], + makePublic: false, + createPublicPlaybookRun: true, + }).then((createdPlaybook) => { + playbook = createdPlaybook; + + // Login as the playbook member authorized to start a run + cy.apiLogin(playbookMember); + + // Create a run + cy.apiRunPlaybook({ + teamId: testTeam.id, + playbookId: playbook.id, + playbookRunName: getRandomId(), + ownerUserId: runParticipant.id, + }).then((createdRun) => { + run = createdRun; + + // Have the dedicated participant join the run + cy.apiAddUsersToRun(run.id, [runParticipant.id]); + }); + }); + }); + + describe('should be visible', () => { + it('to playbook members', () => { + assertRunIsVisible(run, playbookMember); + }); + + it('to run participants', () => { + assertRunIsVisible(run, runParticipant); + }); + + // Skipping this test, since followers cannot follow a run with a private channel from + // a private playbook. (But leaving it for clarity in the code.) + it.skip('to run followers', () => { + assertRunIsVisible(run, runFollower); + }); + + it('to admins in the team', () => { + assertRunIsVisible(run, sysadminInTeam); + }); + + // XXX: The following asserts that while sysadmins don't see runs from other teams in + // the list, they still have access to view the run directly. Once we support + // sudo-admins, we should change this behaviour to be consistent with normal users. + it('to admins not in the team (run directly)', () => { + cy.apiLogin(sysadminNotInTeam); + + assertRunOverviewIsVisible(run); + }); + }); + + describe('should not be visible', () => { + it('to team members', () => { + assertRunIsNotVisible(run, teamMember); + }); + + it('to non-team members', () => { + assertRunIsNotVisible(run, nonTeamMember); + }); + + it('to admins not in the team (list only)', () => { + cy.apiLogin(sysadminNotInTeam); + + assertRunIsNotVisibleInList(run); + }); + }); + }); +}); + +const assertRunIsVisible = (run, user) => { + // # Login as the user in question + cy.apiLogin(user); + + // # Open Runs + cy.visit('/playbooks/runs'); + + // # Find the playbook run and click to open details view + cy.get('#playbookRunList').within(() => { + cy.findByText(run.name).click(); + }); + + // * Verify that the details loaded + cy.findByTestId('run-header-section').get('h1').contains(run.name); +}; + +const assertRunOverviewIsVisible = (run) => { + // # Opening the playbook run directly + cy.visit(`/playbooks/runs/${run.id}`); + + // * Verify that the details loaded + cy.findByTestId('run-header-section').get('h1').contains(run.name); +}; + +const assertRunIsNotVisible = (run, user) => { + // # Login as the user in question + cy.apiLogin(user); + + assertRunIsNotVisibleInList(run, user); + assertRunOverviewIsNotVisible(run, user); +}; + +const assertRunIsNotVisibleInList = (run) => { + // # Open Runs + cy.visit('/playbooks/runs'); + + // * Verify the playbook run is not visible + cy.get('#playbookRunList').within(() => { + cy.findByText(run.name).should('not.exist'); + }); +}; + +const assertRunOverviewIsNotVisible = (run) => { + // # Opening the playbook run directly + cy.visit(`/playbooks/runs/${run.id}`); + + // * Verify the not found error screen + cy.get('.error__container').within(() => { + cy.findByText('Run not found').should('be.visible'); + cy.findByText('The run you\'re requesting is private or does not exist.').should('be.visible'); + }); +}; diff --git a/e2e/cypress/tests/integration/playbooks/runs/rdp_general_spec.js b/e2e/cypress/tests/integration/playbooks/runs/rdp_general_spec.js new file mode 100644 index 0000000000..c30ee3df38 --- /dev/null +++ b/e2e/cypress/tests/integration/playbooks/runs/rdp_general_spec.js @@ -0,0 +1,83 @@ +// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. + +// *************************************************************** +// - [#] indicates a test step (e.g. # Go to a page) +// - [*] indicates an assertion (e.g. * Check the title) +// *************************************************************** + +// Stage: @prod +// Group: @playbooks + +describe('runs > run details page', () => { + let testTeam; + let testUser; + let testPublicPlaybook; + let testPlaybookRun; + + before(() => { + cy.apiInitSetup().then(({team, user}) => { + testTeam = team; + testUser = user; + + // # Login as testUser + cy.apiLogin(testUser); + + // # Create a public playbook + cy.apiCreatePlaybook({ + teamId: testTeam.id, + title: 'Public Playbook', + memberIDs: [], + }).then((playbook) => { + testPublicPlaybook = playbook; + }); + }); + }); + + beforeEach(() => { + // # Size the viewport to show the RHS without covering posts. + cy.viewport('macbook-13'); + + // # Login as testUser + cy.apiLogin(testUser); + + cy.apiRunPlaybook({ + teamId: testTeam.id, + playbookId: testPublicPlaybook.id, + playbookRunName: 'the run name', + ownerUserId: testUser.id, + }).then((playbookRun) => { + testPlaybookRun = playbookRun; + }); + }); + + it('redirects to not found error if the playbook run is unknown', () => { + // # Visit the URL of a non-existing playbook run + cy.visit('/playbooks/runs/an_unknown_id'); + + // * Verify that the user has been redirected to the playbook runs not found error page + cy.url().should('include', '/playbooks/error?type=playbook_runs'); + }); + + it('telemetry is triggered', () => { + // # Intercept all calls to telemetry + cy.interceptTelemetry(); + + // # Visit the URL of a non-existing playbook run + cy.visit(`/playbooks/runs/${testPlaybookRun.id}`); + + // * assert telemetry pageview + cy.expectTelemetryToContain([ + { + name: 'run_details', + type: 'page', + properties: { + from: '', + role: 'participant', + playbookrun_id: testPlaybookRun.id, + playbook_id: testPublicPlaybook.id, + }, + }, + ]); + }); +}); diff --git a/e2e/cypress/tests/integration/playbooks/runs/rdp_main_checklist_spec.js b/e2e/cypress/tests/integration/playbooks/runs/rdp_main_checklist_spec.js new file mode 100644 index 0000000000..97fd822df5 --- /dev/null +++ b/e2e/cypress/tests/integration/playbooks/runs/rdp_main_checklist_spec.js @@ -0,0 +1,150 @@ +// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. + +// *************************************************************** +// - [#] indicates a test step (e.g. # Go to a page) +// - [*] indicates an assertion (e.g. * Check the title) +// *************************************************************** + +// Stage: @prod +// Group: @playbooks + +// Note that this test checks the basic behavior in Run details page as participant / viewer +// It relies on the Channel RHS Checklist test to cover the full behavior of the checklists + +describe('runs > run details page > checklist', () => { + let testTeam; + let testUser; + let testViewerUser; + let testPublicPlaybook; + let testRun; + const taskIndex = 0; + + before(() => { + cy.apiInitSetup().then(({team, user}) => { + testTeam = team; + testUser = user; + + // Create another user in the same team + cy.apiCreateUser().then(({user: viewer}) => { + testViewerUser = viewer; + cy.apiAddUserToTeam(testTeam.id, testViewerUser.id); + }); + + // # Login as testUser + cy.apiLogin(testUser); + + // # Create a public playbook + cy.apiCreatePlaybook({ + teamId: testTeam.id, + title: 'Public Playbook', + memberIDs: [], + checklists: [ + { + title: 'Stage 1', + items: [ + {title: 'Step 1'}, + {title: 'Step 2'}, + ], + }, + { + title: 'Stage 2', + items: [ + {title: 'Step 1'}, + {title: 'Step 2'}, + ], + }, + ], + }).then((playbook) => { + testPublicPlaybook = playbook; + }); + }); + }); + + beforeEach(() => { + // # Size the viewport to show the RHS without covering posts. + cy.viewport('macbook-13'); + + // # Login as testUser + cy.apiLogin(testUser); + + cy.apiRunPlaybook({ + teamId: testTeam.id, + playbookId: testPublicPlaybook.id, + playbookRunName: 'the run name', + ownerUserId: testUser.id, + }).then((playbookRun) => { + testRun = playbookRun; + + // # Visit the playbook run + cy.visit(`/playbooks/runs/${playbookRun.id}`); + }); + }); + + const getChecklist = () => cy.findByTestId('run-checklist-section'); + const getChecklistTasks = () => getChecklist().findAllByTestId('checkbox-item-container'); + + const commonTests = () => { + it('is visible', () => { + // * Verify the tasks section is present + getChecklist().should('be.visible'); + }); + + it('has title', () => { + // * Verify the task section has a title + getChecklist().find('h3').contains('Tasks'); + }); + + it('can see the tasks', () => { + // * Verify tasks are shown + getChecklistTasks().should('have.length', 4); + }); + }; + + describe('as participant', () => { + commonTests(); + + it('click marks task as done', () => { + // # Click first task + getChecklistTasks().eq(taskIndex).find('.checkbox').check({force: true}); + + // * Assert checkbox is checked + getChecklistTasks().eq(taskIndex).find('.checkbox').should('be.checked'); + }); + + it('has hover menu', () => { + // # Hover over the checklist item + getChecklistTasks().eq(taskIndex).trigger('mouseover'); + + // # Click dot menu + getChecklistTasks().eq(taskIndex).findByTitle('More').click({force: true}); + + // * Assert actions are available + cy.findByRole('button', {name: 'Skip task'}).should('be.visible'); + cy.findByRole('button', {name: 'Duplicate task'}).should('be.visible'); + }); + }); + + describe('as viewer', () => { + beforeEach(() => { + cy.apiLogin(testViewerUser).then(() => { + cy.visit(`/playbooks/runs/${testRun.id}`); + }); + }); + + commonTests(); + + it('click does not work', () => { + // # Click first task + getChecklistTasks().eq(taskIndex).find('.checkbox').should('have.attr', 'readonly'); + }); + + it('has not hover menu', () => { + // # Hover over the checklist item + getChecklistTasks().eq(taskIndex).trigger('mouseover'); + + // * Check that the hover menu is not rendered + getChecklistTasks().eq(taskIndex).findByTitle('More').should('not.exist'); + }); + }); +}); diff --git a/e2e/cypress/tests/integration/playbooks/runs/rdp_main_finish_spec.js b/e2e/cypress/tests/integration/playbooks/runs/rdp_main_finish_spec.js new file mode 100644 index 0000000000..096cc16e13 --- /dev/null +++ b/e2e/cypress/tests/integration/playbooks/runs/rdp_main_finish_spec.js @@ -0,0 +1,130 @@ +// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. + +// *************************************************************** +// - [#] indicates a test step (e.g. # Go to a page) +// - [*] indicates an assertion (e.g. * Check the title) +// *************************************************************** + +// Stage: @prod +// Group: @playbooks + +describe('runs > run details page > finish', () => { + let testTeam; + let testUser; + let testViewerUser; + let testPlaybookRun; + let testPublicPlaybook; + + before(() => { + cy.apiInitSetup().then(({team, user}) => { + testTeam = team; + testUser = user; + + // # Create another user in the same team + cy.apiCreateUser().then(({user: viewer}) => { + testViewerUser = viewer; + cy.apiAddUserToTeam(testTeam.id, testViewerUser.id); + }); + + // # Login as testUser + cy.apiLogin(testUser); + + // # Create a public playbook + cy.apiCreatePlaybook({ + teamId: testTeam.id, + title: 'Public Playbook', + memberIDs: [], + }).then((playbook) => { + testPublicPlaybook = playbook; + }); + }); + }); + + beforeEach(() => { + // # Size the viewport to show the RHS without covering posts. + cy.viewport('macbook-13'); + + // # Login as testUser + cy.apiLogin(testUser); + + cy.apiRunPlaybook({ + teamId: testTeam.id, + playbookId: testPublicPlaybook.id, + playbookRunName: 'the run name(' + Date.now() + ')', + ownerUserId: testUser.id, + }).then((playbookRun) => { + testPlaybookRun = playbookRun; + + // # Visit the playbook run + cy.visit(`/playbooks/runs/${playbookRun.id}`); + }); + }); + + it('is hidden as viewer', () => { + cy.apiLogin(testViewerUser).then(() => { + // # Visit the playbook run + cy.visit(`/playbooks/runs/${testPlaybookRun.id}`); + }); + + // * Assert that finish section does not exist + cy.findByTestId('run-finish-section').should('not.exist'); + }); + + it('is visible', () => { + // * Verify the finish section is present + cy.findByTestId('run-finish-section').should('be.visible'); + }); + + it('has a placeholder visible', () => { + // * Verify the placeholder is present + cy.findByTestId('run-finish-section').contains('Time to wrap up?'); + }); + + describe('finish run', () => { + it('can be confirmed', () => { + // # Click finish run button + cy.findByTestId('run-finish-section').find('button').click(); + + // * Check that status badge is in-progress + cy.findByTestId('run-header-section').findByTestId('badge').contains('In Progress'); + + // * Check that finish run modal is open and has the right title + cy.get('#confirmModal').should('be.visible'); + cy.get('#confirmModal').find('h1').contains('Confirm finish run'); + + // # Click on confirm + cy.get('#confirmModal').get('#confirmModalButton').click(); + + // * Assert finish section is not visible anymore + cy.findByTestId('run-finish-section').should('not.exist'); + + // * Assert status badge is finished + cy.findByTestId('run-header-section').findByTestId('badge').contains('Finished'); + + // * Verify run has been removed from LHS + cy.findByTestId('lhs-navigation').findByText(testPlaybookRun.name).should('not.exist'); + }); + + it('can be canceled', () => { + // # Click on finish run + cy.findByTestId('run-finish-section').find('button').click(); + + // * Check that status badge is in-progress + cy.findByTestId('run-header-section').findByTestId('badge').contains('In Progress'); + + // * Check that finish run modal is open + cy.get('#confirmModal').should('be.visible'); + cy.get('#confirmModal').find('h1').contains('Confirm finish run'); + + // # Click on cancel + cy.get('#confirmModal').get('#cancelModalButton').click(); + + // * Check that status badge is still in-progress + cy.findByTestId('run-header-section').findByTestId('badge').contains('In Progress'); + + // * Check that section is still visible + cy.findByTestId('run-finish-section').should('be.visible'); + }); + }); +}); diff --git a/e2e/cypress/tests/integration/playbooks/runs/rdp_main_header_spec.js b/e2e/cypress/tests/integration/playbooks/runs/rdp_main_header_spec.js new file mode 100644 index 0000000000..75c6bb873a --- /dev/null +++ b/e2e/cypress/tests/integration/playbooks/runs/rdp_main_header_spec.js @@ -0,0 +1,896 @@ +// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. + +// *************************************************************** +// - [#] indicates a test step (e.g. # Go to a page) +// - [*] indicates an assertion (e.g. * Check the title) +// *************************************************************** + +// Stage: @prod +// Group: @playbooks + +/* eslint-disable no-only-tests/no-only-tests */ + +import {stubClipboard} from '../../../utils'; + +describe('runs > run details page > header', () => { + let testTeam; + let testUser; + let testViewerUser; + let testPublicPlaybook; + let testPublicPlaybookAndChannel; + let playbookRun; + + before(() => { + cy.apiInitSetup().then(({team, user}) => { + testTeam = team; + testUser = user; + + // # Create another user in the same team + cy.apiCreateUser().then(({user: viewer}) => { + testViewerUser = viewer; + cy.apiAddUserToTeam(testTeam.id, testViewerUser.id); + }); + + // # Login as testUser + cy.apiLogin(testUser); + + // # Create a public playbook + cy.apiCreatePlaybook({ + teamId: testTeam.id, + title: 'Public Playbook', + memberIDs: [], + }).then((playbook) => { + testPublicPlaybook = playbook; + }); + + // # Create a public playbook + cy.apiCreatePlaybook({ + teamId: testTeam.id, + title: 'Public Playbook', + createPublicPlaybookRun: true, + memberIDs: [], + }).then((playbook) => { + testPublicPlaybookAndChannel = playbook; + }); + }); + }); + + const openRunActionsModal = () => { + // # Click on the run actions modal button + cy.findByRole('button', {name: /Run Actions/i}).click({force: true}); + + // * Verify that the modal is shown + cy.findByRole('dialog', {name: /Run Actions/i}).should('exist'); + }; + + const saveRunActionsModal = () => { + // # Click on the Save button without changing anything + cy.findByRole('button', {name: /Save/i}).click(); + + // * Verify that the modal is no longer there + cy.findByRole('dialog', {name: /Run Actions/i}).should('not.exist'); + }; + + const getHeader = () => { + return cy.findByTestId('run-header-section'); + }; + + const getHeaderIcon = (selector) => { + return getHeader().find(selector); + }; + + const getDropdownItemByText = (text) => { + cy.findByTestId('run-header-section').find('h1').click(); + return cy.findByTestId('dropdownmenu').findByText(text); + }; + + const commonHeaderTests = () => { + it('shows the title', () => { + // * Assert title is shown in h1 inside header + cy.findByTestId('run-header-section').find('h1').contains(playbookRun.name); + }); + + it('shows the in-progress status badge', () => { + // * Assert in progress status badge + cy.findByTestId('run-header-section').findByTestId('badge').contains('In Progress'); + }); + + it('has a copy-link icon', () => { + // # Mouseover on the icon + getHeaderIcon('.icon-link-variant').trigger('mouseover'); + + // * Assert tooltip is shown + cy.get('#copy-run-link-tooltip').should('contain', 'Copy link to run'); + + stubClipboard().as('clipboard'); + getHeaderIcon('.icon-link-variant').click().then(() => { + // * Verify that tooltip text changed + cy.get('#copy-run-link-tooltip').should('contain', 'Copied!'); + + // * Verify clipboard content + cy.get('@clipboard').its('contents').should('contain', `/playbooks/runs/${playbookRun.id}`); + }); + }); + }; + + const commonContextDropdownTests = () => { + it('shows on click', () => { + // # Click title + cy.findByTestId('run-header-section').find('h1').click(); + + // * Assert context menu is opened + cy.findByTestId('dropdownmenu').should('be.visible'); + }); + + it('can copy link', () => { + stubClipboard().as('clipboard'); + + getDropdownItemByText('Copy link').click().then(() => { + // * Verify clipboard content + cy.get('@clipboard').its('contents').should('contain', `/playbooks/runs/${playbookRun.id}`); + }); + }); + }; + + describe('as participant', () => { + beforeEach(() => { + // # Size the viewport to show the RHS without covering posts. + cy.viewport('macbook-13'); + + // # Login as testUser + cy.apiLogin(testUser); + + cy.apiRunPlaybook({ + teamId: testTeam.id, + playbookId: testPublicPlaybook.id, + playbookRunName: 'the run name(' + Date.now() + ')', + ownerUserId: testUser.id, + }).then((run) => { + playbookRun = run; + + // # Visit the playbook run + cy.visit(`/playbooks/runs/${playbookRun.id}`); + + waitToLoadLHS(testUser.username); + }); + }); + + describe('title, icons and buttons', () => { + commonHeaderTests(); + + it('has not participate button', () => { + // * Assert button is not showed + getHeader().findByText('Participate').should('not.exist'); + }); + + describe('run actions', () => { + describe('modal behaviour', () => { + it('shows and hides as expected', () => { + // * Verify that the run actions modal is shown when clicking on the button + openRunActionsModal(); + + // # Click on the Cancel button + cy.findByRole('button', {name: /Cancel/i}).click(); + + // * Verify that the modal is no longer there + cy.findByRole('dialog', {name: /Run Actions/i}).should('not.exist'); + + // # Open the run actions modal + openRunActionsModal(); + + // Intercept all telemetry calls + cy.interceptTelemetry(); + + // * Verify that saving the modal hides it + saveRunActionsModal(); + + // * assert telemetry call + cy.expectTelemetryToContain([ + { + name: 'playbookrun_update_actions', + type: 'track', + properties: { + playbookrun_id: playbookRun.id, + playbook_id: playbookRun.playbook_id, + }, + }, + ]); + }); + + it('can not save an invalid form', () => { + // * Verify that the run actions modal is shown when clicking on the button + openRunActionsModal(); + + cy.findByRole('dialog', {name: /Run Actions/i}).within(() => { + // # click on webhooks toggle + cy.findByText('Send outgoing webhook').click(); + + // # Type an invalid webhook URL + cy.getStyledComponent('TextArea').clear().type('invalidurl'); + + // # Click outside textarea + cy.findByText('Run Actions').click(); + + // * Assert the error message is displayed + cy.findByText('Invalid webhook URLs').should('be.visible'); + + // # Click save + cy.findByTestId('modal-confirm-button').click(); + + // * Assert that modal is still open + cy.findByText('Run Actions').should('be.visible'); + }); + }); + + it('honours the settings from the playbook', () => { + cy.apiCreateChannel( + testTeam.id, + 'action-channel', + 'Action Channel', + 'O', + ).then(({channel}) => { + // # Create a different playbook with both settings enabled and populated with data, + // # and then start a run from it + const broadcastChannelIds = [channel.id]; + const webhookOnStatusUpdateURLs = ['https://one.com', 'https://two.com']; + cy.apiCreatePlaybook({ + teamId: testTeam.id, + title: 'Playbook' + Date.now(), + broadcastEnabled: true, + broadcastChannelIds, + webhookOnStatusUpdateEnabled: true, + webhookOnStatusUpdateURLs, + }).then((playbook) => { + cy.apiRunPlaybook({ + teamId: testTeam.id, + playbookId: playbook.id, + playbookRunName: 'Run with actions preconfigured', + ownerUserId: testUser.id, + }); + }); + + // # Navigate to the run page + cy.visit(`/${testTeam.name}/channels/run-with-actions-preconfigured`); + cy.findByRole('button', {name: /Run details/i}).click({force: true}); + + // # Open the run actions modal + openRunActionsModal(); + + // * Verify that the broadcast-to-channels toggle is checked + cy.findByText('Broadcast update to selected channels').parent().within(() => { + cy.get('input').should('be.checked'); + }); + + // * Verify that the channel is in the selector + cy.findByText(channel.display_name); + + // * Verify that the send-webhooks toggle is checked + cy.findByText('Send outgoing webhook').parent().within(() => { + cy.get('input').should('be.checked'); + }); + }); + }); + }); + }); + + describe('trigger: when a status update is posted', () => { + describe('action: Broadcast update to selected channels', () => { + it('shows channel information on first load', () => { + // # Open the run actions modal + openRunActionsModal(); + + // # Enable broadcast to channels + cy.findByText('Broadcast update to selected channels').click(); + + // # Select a couple of channels + cy.findByText('Select channels').click().type('town square{enter}off-topic{enter}'); + + // # Save the changes + saveRunActionsModal(); + + // # Reload the page, so that the store is not pre-populated when visiting Channels + cy.visit(`/playbooks/runs/${playbookRun.id}/overview`); + + // # Open the run actions modal + openRunActionsModal(); + + // * Check that the channels previously added are shown with their full name, + // * verifying that the store has been populated by the modal component. + cy.findByText('Town Square').should('exist'); + cy.findByText('Off-Topic').should('exist'); + }); + + it('broadcasts to two channels configured when it is enabled', () => { + // # Open the run actions modal + openRunActionsModal(); + + // # Enable broadcast to channels + cy.findByText('Broadcast update to selected channels').click(); + + // # Select a couple of channels + cy.findByText('Select channels').click().type('town square{enter}off-topic{enter}', {delay: 100}); + + // # Save the changes + saveRunActionsModal(); + + // # Post a status update, with a reminder in 1 second. + const message = 'Status update - ' + Date.now(); + cy.apiUpdateStatus({ + playbookRunId: playbookRun.id, + message, + }); + + // # Navigate to the town square channel + cy.visit(`/${testTeam.name}/channels/town-square`); + + // * Verify that the last post contains the status update + cy.getLastPost().then((post) => { + cy.get(post).contains(message); + }); + + // # Navigate to the off-topic channel + cy.visit(`/${testTeam.name}/channels/off-topic`); + + // * Verify that the last post contains the status update + cy.getLastPost().then((post) => { + cy.get(post).contains(message); + }); + }); + + it('does not broadcast if it is disabled, even if there are channels configured', () => { + // # Open the run actions modal + openRunActionsModal(); + + // # Enable broadcast to channels + cy.findByText('Broadcast update to selected channels').click(); + + // # Select a couple of channels + cy.findByText('Select channels').click().type('town square{enter}off-topic{enter}', {delay: 100}); + + // # Disable broadcast to channels + cy.findByText('Broadcast update to selected channels').click(); + + // # Save the changes + saveRunActionsModal(); + + // # Post a status update, with a reminder in 1 second. + const message = 'Status update - ' + Date.now(); + cy.apiUpdateStatus({ + playbookRunId: playbookRun.id, + message, + }); + + // # Navigate to the town square channel + cy.visit(`/${testTeam.name}/channels/town-square`); + + // * Verify that the last post does not contain the status update + cy.getLastPost().then((post) => { + cy.get(post).contains(message).should('not.exist'); + }); + + // # Navigate to the off-topic channel + cy.visit(`/${testTeam.name}/channels/off-topic`); + + // * Verify that the last post does not contain the status update + cy.getLastPost().then((post) => { + cy.get(post).contains(message).should('not.exist'); + }); + }); + }); + }); + }); + + describe('context menu', () => { + commonContextDropdownTests(); + + it('can rename run', () => { + // # Click on rename run + getDropdownItemByText('Rename run').click(); + + cy.findByTestId('run-header-section').within(() => { + // # Type a new name + cy.findByTestId('rendered-editable-text').clear().type('The new fancy name'); + + // # Save + cy.findByTestId('checklist-item-save-button').click(); + + // * Assert name is updated + cy.get('h1').contains('The new fancy name'); + }); + + cy.reload(); + + cy.findByTestId('run-header-section').within(() => { + // * Assert name is persisted + cy.get('h1').contains('The new fancy name'); + }); + }); + + describe('finish run', () => { + it('can be confirmed', () => { + // * Check that status badge is in-progress + cy.findByTestId('run-header-section').findByTestId('badge').contains('In Progress'); + + // # Click on finish run + getDropdownItemByText('Finish run').click(); + + // # Check that finish run modal is open + cy.get('#confirmModal').should('be.visible'); + cy.get('#confirmModal').find('h1').contains('Confirm finish run'); + + // # Click on confirm + cy.get('#confirmModal').get('#confirmModalButton').click(); + + // * Assert option is not anymore in context dropdown + getDropdownItemByText('Finish run').should('not.exist'); + + // * Assert status badge is finished + cy.findByTestId('run-header-section').findByTestId('badge').contains('Finished'); + }); + + it('can be canceled', () => { + // * Check that status badge is in-progress + cy.findByTestId('run-header-section').findByTestId('badge').contains('In Progress'); + + // # Click on finish run + getDropdownItemByText('Finish run').click(); + + // * Check that finish run modal is open + cy.get('#confirmModal').should('be.visible'); + cy.get('#confirmModal').find('h1').contains('Confirm finish run'); + + // # Click on cancel + cy.get('#confirmModal').get('#cancelModalButton').click(); + + // * Assert option is not anymore in context dropdown + getDropdownItemByText('Finish run').should('be.visible'); + + // * Assert status badge is still in progress + cy.findByTestId('run-header-section').findByTestId('badge').contains('In Progress'); + }); + }); + + describe('run actions', () => { + it('modal can be opened', () => { + // # Click on finish run + getDropdownItemByText('Run actions').click(); + + // * Assert modal pop up + cy.findByRole('dialog', {name: /Run Actions/i}).should('exist'); + + // # Click on cancel + cy.findByRole('dialog', {name: /Run Actions/i}).findByTestId('modal-cancel-button').click(); + + // * Assert modal disappeared + cy.findByRole('dialog', {name: /Run Actions/i}).should('not.exist'); + }); + }); + + describe('leave run', () => { + it('can leave run', () => { + // # Intercept all calls to telemetry + cy.interceptTelemetry(); + + // # Add viewer user to the channel + cy.apiAddUsersToRun(playbookRun.id, [testViewerUser.id]); + cy.findAllByTestId('timeline-item', {exact: false}).should('have.length', 3); + + // # Change the owner to testViewerUser + cy.apiChangePlaybookRunOwner(playbookRun.id, testViewerUser.id); + cy.findByTestId('assignee-profile-selector').should('contain', testViewerUser.username); + + // # Click on leave run + getDropdownItemByText('Leave and unfollow run').click(); + + // # confirm modal + cy.get('#confirmModal').get('#confirmModalButton').click(); + + // NOTE: this check fails because the front doesn't receive updated run object. Will deal in separate PR. + // * Assert that the Participate button is shown + getHeader().findByText('Participate').should('be.visible'); + + // * Verify run has been removed from LHS + cy.findByTestId('lhs-navigation').findByText(playbookRun.name).should('not.exist'); + + // # assert telemetry data + cy.expectTelemetryToContain([ + { + name: 'playbookrun_leave', + type: 'track', + properties: { + from: 'run_details', + playbookrun_id: playbookRun.id, + }, + }, + ]); + }); + }); + }); + }); + + describe('as viewer', () => { + let playbookRunChannelName; + let playbookRunName; + + beforeEach(() => { + // # Size the viewport to show the RHS without covering posts. + cy.viewport('macbook-13'); + + // # Login as testUser + cy.apiLogin(testUser); + + const now = Date.now(); + playbookRunName = 'Playbook Run (' + now + ')'; + playbookRunChannelName = 'playbook-run-' + now; + cy.apiRunPlaybook({ + teamId: testTeam.id, + playbookId: testPublicPlaybook.id, + playbookRunName, + ownerUserId: testUser.id, + }).then((run) => { + playbookRun = run; + + cy.apiLogin(testViewerUser).then(() => { + // # Visit the playbook run + cy.visit(`/playbooks/runs/${playbookRun.id}`); + }); + + waitToLoadLHS(testUser.username); + }); + }); + + describe('title, icons and buttons', () => { + commonHeaderTests(); + + describe('Favorite', () => { + it('add and remove from LHS', () => { + // # Click fav icon + getHeader().getStyledComponent('StarButton').click(); + + // * Assert run appears in LHS + cy.findByTestId('lhs-navigation').findByText(playbookRunName).should('exist'); + + // # Click fav icon again (unfav) + getHeader().getStyledComponent('StarButton').click(); + + // * Assert run disappeared from LHS + cy.findByTestId('lhs-navigation').findByText(playbookRunName).should('not.exist'); + }); + }); + + describe('Participate', () => { + it('shows button', () => { + // * Assert that the button is shown + getHeader().findByText('Participate').should('be.visible'); + }); + + describe('Join action enabled', () => { + it('click button to show modal and cancel', () => { + // * Assert that component is rendered + getHeader().findByText('Participate').should('be.visible'); + + // # Click Participate button + getHeader().findByText('Participate').click(); + + // * Verify modal message is correct + cy.findByText('You’ll also be added to the channel linked to this run.').should('exist'); + + // # cancel modal + cy.findByTestId('modal-cancel-button').click(); + + // * Assert modal is not shown + cy.get('#become-participant-modal').should('not.exist'); + + // # Login as testUser + cy.apiLogin(testUser).then(() => { + // # Visit the channel run + cy.visit(`${testTeam.name}/channels/${playbookRunChannelName}`); + + // * Assert user has not been added to the channel + cy.getLastPost().should('not.contain', 'Someone'); + cy.getLastPost().should('not.contain', testViewerUser.username); + }); + }); + + it('click button to show modal and confirm when private channel', () => { + // # Intercept all calls to telemetry + cy.interceptTelemetry(); + + // * Assert component is rendered + getHeader().findByText('Participate').should('be.visible'); + + // # Click start-participating button + getHeader().findByText('Participate').click(); + + // * Verify modal message is correct + cy.findByText('You’ll also be added to the channel linked to this run.').should('exist'); + + // # confirm modal + cy.findByTestId('modal-confirm-button').click(); + + // * Assert that modal is not shown + cy.get('#become-participant-modal').should('not.exist'); + + // * Verify run has been added to LHS + verifyRunHasBeenAddedToLHS(playbookRunName); + + // # Navigate to the playbook run channel + cy.visit(`/${testTeam.name}/channels/${playbookRunChannelName}`); + + // * Verify the user was added to the channel + cy.getFirstPostId().then((id) => { + cy.get(`#postMessageText_${id}`).within(() => { + cy.contains('You and'); + cy.contains('joined the channel'); + }); + }); + + // * assert telemetry data + cy.expectTelemetryToContain([ + { + name: 'playbookrun_participate', + type: 'track', + properties: { + from: 'run_details', + playbookrun_id: playbookRun.id, + }, + }, + ]); + }); + + it('click button and confirm to when public channel', () => { + // # Login as testUser + cy.apiLogin(testUser); + + const now = Date.now(); + playbookRunName = 'Playbook Run (' + now + ')'; + playbookRunChannelName = 'playbook-run-' + now; + + // # Create a run with public chanel + cy.apiRunPlaybook({ + teamId: testTeam.id, + playbookId: testPublicPlaybookAndChannel.id, + playbookRunName, + ownerUserId: testUser.id, + }).then((run) => { + cy.apiLogin(testViewerUser); + + // # Visit the playbook run + cy.visit(`/playbooks/runs/${run.id}`); + cy.wait('@gqlPlaybookLHS').wait('@gqlPlaybookLHS'); + cy.assertRunDetailsPageRenderComplete(testUser.username); + + // * Assert that component is rendered + getHeader().findByText('Participate').should('be.visible'); + + // # Click start-participating button + getHeader().findByText('Participate').click(); + + // * Verify modal message is correct + cy.findByText('You’ll also be added to the channel linked to this run.').should('exist'); + + // # confirm modal + cy.findByTestId('modal-confirm-button').click(); + + // * Assert that modal is not shown + cy.get('#become-participant-modal').should('not.exist'); + + // * Verify run has been added to LHS + cy.findByTestId('lhs-navigation').findByText(playbookRunName).should('exist'); + + // # Navigate to the playbook run channel + cy.visit(`/${testTeam.name}/channels/${playbookRunChannelName}`); + + // * Verify that the user was added to the channel + cy.getFirstPostId().then((id) => { + cy.get(`#postMessageText_${id}`).within(() => { + cy.contains('You and'); + cy.contains('joined the channel'); + }); + }); + }); + }); + }); + + describe.skip('Join action disabled', () => { + beforeEach(() => { + cy.apiLogin(testUser); + + // # Disable join action + cy.apiUpdateRun(playbookRun.id, {createChannelMemberOnNewParticipant: false}); + + cy.apiLogin(testViewerUser).then(() => { + // # Visit the playbook run + cy.visit(`/playbooks/runs/${playbookRun.id}`); + }); + + waitToLoadLHS(testUser.username); + }); + + it('join the run with private channel, request to join the channel', () => { + // # Click start-participating button + getHeader().findByText('Participate').click(); + + // * Verify modal message is correct + cy.findByText('Request access to the channel linked to this run').should('exist'); + + // # Select checkbox + cy.findByTestId('also-add-to-channel').click({force: true}); + + // # confirm modal + cy.findByTestId('modal-confirm-button').click(); + + // * Assert that modal is not shown + cy.get('#become-participant-modal').should('not.exist'); + + // * Verify run has been added to LHS + verifyRunHasBeenAddedToLHS(playbookRunName); + + // # Login as testUser to check if join request was posted in the channel + cy.apiLogin(testUser); + + // # Navigate to the playbook run channel + cy.visit(`/${testTeam.name}/channels/${playbookRunChannelName}`); + + // * Verify that the request was sent to the channel + cy.getLastPostId().then((id) => { + cy.get(`#postMessageText_${id}`).within(() => { + cy.contains(`@${testViewerUser.username} is a run participant and wants join this channel. Any member of the channel can invite them.`); + }); + }); + }); + + it('join the run with private channel, no request to join the channel', () => { + // # Click start-participating button + getHeader().findByText('Participate').click(); + + // * Verify modal message is correct + cy.findByText('Request access to the channel linked to this run').should('exist'); + + // # confirm modal + cy.findByTestId('modal-confirm-button').click(); + + // * Assert that modal is not shown + cy.get('#become-participant-modal').should('not.exist'); + + // * Verify run has been added to LHS + verifyRunHasBeenAddedToLHS(playbookRunName); + + // # Login as testUser to check if join request was posted in the channel + cy.apiLogin(testUser); + + // # Navigate to the playbook run channel + cy.visit(`/${testTeam.name}/channels/${playbookRunChannelName}`); + + // * Verify that the request was sent to the channel + cy.getLastPostId().then((id) => { + cy.get(`#postMessageText_${id}`).within(() => { + cy.contains(`@${testViewerUser.username} is a run participant and wants join this channel. Any member of the channel can invite them.`).should('not.exist'); + }); + }); + }); + + it('join run with public channel, join the channel', () => { + // # Login as testUser + cy.apiLogin(testUser); + + const now = Date.now(); + playbookRunName = 'Playbook Run (' + now + ')'; + playbookRunChannelName = 'playbook-run-' + now; + + // Create a run with public chanel + cy.apiRunPlaybook({ + teamId: testTeam.id, + playbookId: testPublicPlaybookAndChannel.id, + playbookRunName, + ownerUserId: testUser.id, + }).then((run) => { + cy.apiLogin(testViewerUser); + + // # Visit the playbook run + cy.visit(`/playbooks/runs/${run.id}`); + cy.wait('@gqlPlaybookLHS').wait('@gqlPlaybookLHS'); + cy.assertRunDetailsPageRenderComplete(testUser.username); + + // * Assert that component is rendered + getHeader().findByText('Participate').should('be.visible'); + + // # Click start-participating button + getHeader().findByText('Participate').click(); + + // * Verify modal message is correct + cy.findByText('You’ll also be added to the channel linked to this run.').should('exist'); + + // # confirm modal + cy.findByTestId('modal-confirm-button').click(); + + // * Assert that modal is not shown + cy.get('#become-participant-modal').should('not.exist'); + + // * Verify run has been added to LHS + cy.findByTestId('lhs-navigation').findByText(playbookRunName).should('exist'); + + // # Navigate to the playbook run channel + cy.visit(`/${testTeam.name}/channels/${playbookRunChannelName}`); + + // * Verify that the user was added to the channel + cy.getFirstPostId().then((id) => { + cy.get(`#postMessageText_${id}`).within(() => { + cy.contains('You and'); + cy.contains('joined the channel'); + }); + }); + }); + }); + }); + }); + + describe('run actions', () => { + describe('modal behaviour', () => { + it('modal can be opened read-only', () => { + // # Click on run actions + getDropdownItemByText('Run actions').click(); + + // * Assert modal pop up + cy.findByRole('dialog', {name: /Run Actions/i}).should('exist'); + + // * Assert there are no buttons + cy.findByRole('dialog', {name: /Run Actions/i}).findByTestId('modal-cancel-button').should('not.exist'); + cy.findByRole('button', {name: /Save/i}).should('not.exist'); + + // # Close modal + cy.findByRole('dialog', {name: /Run Actions/i}).find('.close').click(); + }); + }); + }); + }); + + describe('context menu', () => { + commonContextDropdownTests(); + + it('can not rename run', () => { + // # There's no rename option + getDropdownItemByText('Rename run').should('not.exist'); + }); + + it('can not finish run', () => { + // * There's no finish run item + getDropdownItemByText('Finish run').should('not.exist'); + }); + + describe('run actions', () => { + it('modal can be opened read-only', () => { + // # Click on finish run + getDropdownItemByText('Run actions').click(); + + // * Assert modal pop up + cy.findByRole('dialog', {name: /Run Actions/i}).should('exist'); + + // * Assert there are no buttons + cy.findByRole('dialog', {name: /Run Actions/i}).findByTestId('modal-cancel-button').should('not.exist'); + cy.findByRole('button', {name: /Save/i}).should('not.exist'); + + // # Close modal + cy.findByRole('dialog', {name: /Run Actions/i}).find('.close').click(); + }); + }); + }); + }); +}); + +const waitToLoadLHS = (username) => { + // # Intercept these graphQL requests for wait()'s + // # that help ensure rendering has finished. + cy.gqlInterceptQuery('PlaybookLHS'); + cy.wait('@gqlPlaybookLHS').wait('@gqlPlaybookLHS'); + cy.assertRunDetailsPageRenderComplete(username); +}; + +const verifyRunHasBeenAddedToLHS = (playbookRunName) => { + // * Verify run has been added to LHS + cy.findByTestId('lhs-navigation'). + should('be.visible'). + findByText(playbookRunName). + should('be.visible'); +}; diff --git a/e2e/cypress/tests/integration/playbooks/runs/rdp_main_restore_spec.js b/e2e/cypress/tests/integration/playbooks/runs/rdp_main_restore_spec.js new file mode 100644 index 0000000000..200c6b92cb --- /dev/null +++ b/e2e/cypress/tests/integration/playbooks/runs/rdp_main_restore_spec.js @@ -0,0 +1,107 @@ +// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. + +// *************************************************************** +// - [#] indicates a test step (e.g. # Go to a page) +// - [*] indicates an assertion (e.g. * Check the title) +// *************************************************************** + +// Stage: @prod +// Group: @playbooks + +describe('runs > run details page > restart run', () => { + let testTeam; + let testUser; + let testViewerUser; + let testPublicPlaybook; + let testRun; + + // const taskIndex = 0; + + before(() => { + cy.apiInitSetup().then(({team, user}) => { + testTeam = team; + testUser = user; + + // Create another user in the same team + cy.apiCreateUser().then(({user: viewer}) => { + testViewerUser = viewer; + cy.apiAddUserToTeam(testTeam.id, testViewerUser.id); + }); + + // # Login as testUser + cy.apiLogin(testUser); + + // # Create a public playbook + cy.apiCreatePlaybook({ + teamId: testTeam.id, + title: 'Public Playbook', + memberIDs: [], + checklists: [ + { + title: 'Stage 1', + items: [ + {title: 'Step 1'}, + {title: 'Step 2'}, + ], + }, + { + title: 'Stage 2', + items: [ + {title: 'Step 1'}, + {title: 'Step 2'}, + ], + }, + ], + }).then((playbook) => { + testPublicPlaybook = playbook; + }); + }); + }); + + beforeEach(() => { + // # Size the viewport to show the RHS without covering posts. + cy.viewport('macbook-13'); + + // # Login as testUser + cy.apiLogin(testUser); + + cy.apiRunPlaybook({ + teamId: testTeam.id, + playbookId: testPublicPlaybook.id, + playbookRunName: 'the run name', + ownerUserId: testUser.id, + }).then((playbookRun) => { + testRun = playbookRun; + + // # Visit the playbook run + cy.visit(`/playbooks/runs/${testRun.id}`); + }); + }); + + describe('restart run', () => { + it('can be confirmed', () => { + cy.intercept('PUT', `/plugins/playbooks/api/v0/runs/${testRun.id}/finish`).as('routeFinish'); + cy.intercept('PUT', `/plugins/playbooks/api/v0/runs/${testRun.id}/restore`).as('routeRestore'); + + cy.findByTestId('run-header-section').findByTestId('badge').contains('In Progress'); + + // # Click finish run button + cy.findByTestId('run-finish-section').find('button').click(); + cy.get('#confirmModal').get('#confirmModalButton').click(); + + cy.wait('@routeFinish'); + cy.findByTestId('run-header-section').findByTestId('badge').contains('Finished'); + + cy.findByTestId('runDropdown').click(); + cy.get('.restartRun').find('span').contains('Restart run'); + + cy.get('.restartRun').click(); + cy.get('#confirmModal').get('#confirmModalButton').click(); + cy.wait('@routeRestore'); + cy.findByTestId('run-header-section').findByTestId('badge').contains('In Progress'); + cy.findByTestId('lhs-navigation').findByText(testRun.name).should('exist'); + }, + ); + }); +}); diff --git a/e2e/cypress/tests/integration/playbooks/runs/rdp_main_retrospective_spec.js b/e2e/cypress/tests/integration/playbooks/runs/rdp_main_retrospective_spec.js new file mode 100644 index 0000000000..cdd711ad40 --- /dev/null +++ b/e2e/cypress/tests/integration/playbooks/runs/rdp_main_retrospective_spec.js @@ -0,0 +1,500 @@ +// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. + +// *************************************************************** +// - [#] indicates a test step (e.g. # Go to a page) +// - [*] indicates an assertion (e.g. * Check the title) +// *************************************************************** + +// Stage: @prod +// Group: @playbooks + +const editAndPublishRetro = () => { + getRetro().within(() => { + // # Start editing + cy.findByTestId('retro-report-text').click(); + + // * Verify the provided template text is pre-filled + cy.focused().should('include.text', 'This is a retrospective template.'); + + // # Change the retro text + cy.focused().clear().type('Edited retrospective.'); + + // # Save it by clicking outside the text area + cy.findByText('Report').click(); + + // # Publish + cy.findByRole('button', {name: 'Publish'}).click(); + }); + + cy.get('#confirm-modal-light').within(() => { + // * Verify we're showing the publish retro confirmation modal + cy.findByText('Are you sure you want to publish?'); + + // # Publish + cy.findByRole('button', {name: 'Publish'}).click(); + }); + + // * Verify that retro got published + getRetro().get('.icon-check-all').should('be.visible'); +}; + +const getMetricInput = (index) => getRetro().getStyledComponent('InputContainer').eq(index); + +const verifyMetricInput = (index, title, target, description, placeholder) => { + getMetricInput(index).within(() => { + cy.getStyledComponent('Title').contains(title); + + if (target) { + cy.getStyledComponent('TargetTitle').contains(target); + } else { + cy.getStyledComponent('TargetTitle').should('not.exist'); + } + + if (description) { + cy.getStyledComponent('HelpText').contains(description); + } + if (placeholder) { + cy.get('input').should('have.attr', 'placeholder', placeholder); + } + }); +}; + +const getRetro = () => cy.findByTestId('run-retrospective-section'); + +describe('runs > run details page', () => { + let testTeam; + let testUser; + let testViewerUser; + let testPublicPlaybook; + let testPublicPlaybookWithMetrics; + let testRun; + + before(() => { + cy.apiInitSetup().then(({team, user}) => { + testTeam = team; + testUser = user; + + // Create another user in the same team + cy.apiCreateUser().then(({user: viewer}) => { + testViewerUser = viewer; + cy.apiAddUserToTeam(testTeam.id, testViewerUser.id); + }); + + // # Login as testUser + cy.apiLogin(testUser); + + // # Create a public playbook + cy.apiCreatePlaybook({ + teamId: testTeam.id, + title: 'Public Playbook', + memberIDs: [], + retrospectiveTemplate: 'This is a retrospective template.', + }).then((playbook) => { + testPublicPlaybook = playbook; + }); + + // # Create a public playbook + cy.apiCreatePlaybook({ + teamId: testTeam.id, + title: 'Public Playbook', + memberIDs: [], + createPublicPlaybookRun: true, + metrics: [ + { + title: 'title1', + description: 'description1', + type: 'metric_duration', + target: 720000, + }, + { + title: 'title2', + description: 'description2', + type: 'metric_currency', + target: 40, + }, + { + title: 'title3', + description: 'description3', + type: 'metric_integer', + target: 30, + }, + ], + }).then((playbook) => { + testPublicPlaybookWithMetrics = playbook; + }); + }); + }); + + beforeEach(() => { + // # Size the viewport to show the RHS without covering posts. + cy.viewport('macbook-13'); + + // # Login as testUser + cy.apiLogin(testUser); + }); + + describe('retrospective', () => { + const commonTests = () => { + it('is visible', () => { + // * Verify the retrospective section is present + getRetro().should('be.visible'); + }); + + it('has title', () => { + // * Verify the retrospective section has a title + getRetro().find('h3').contains('Retrospective'); + }); + + it('has template text', () => { + // * Verify the retrospective text is rendered + getRetro().findByTestId('retro-report-text').contains('This is a retrospective template.'); + }); + + it('has no metrics', () => { + // * Verify there are no metric for this playbook + getRetro().getStyledComponent('InputContainer').should('not.exist'); + }); + }; + + describe('as participant', () => { + beforeEach(() => { + cy.apiRunPlaybook({ + teamId: testTeam.id, + playbookId: testPublicPlaybook.id, + playbookRunName: 'the run name', + ownerUserId: testUser.id, + }).then((playbookRun) => { + testRun = playbookRun; + + // # Visit the playbook run + cy.visit(`/playbooks/runs/${playbookRun.id}`); + }); + }); + + commonTests(); + + it('publishing posts to run channel', () => { + editAndPublishRetro(); + + // # Switch to the run channel + cy.findByTestId('runinfo-channel-link').click(); + + // * Verify the modified retro text is posted + cy.getStyledComponent('CustomPostContent').should('exist').contains('Edited retrospective.'); + }); + + it('can be published once', () => { + editAndPublishRetro(); + + // * Verify the button is disabled + getRetro().findByText('Publish').should('not.be.enabled'); + }); + }); + + describe('as viewer', () => { + before(() => { + // # Login as testUser + cy.apiLogin(testUser); + + // # Create test playbook run + cy.apiRunPlaybook({ + teamId: testTeam.id, + playbookId: testPublicPlaybook.id, + playbookRunName: 'the run name', + ownerUserId: testUser.id, + }).then((playbookRun) => { + testRun = playbookRun; + }); + }); + + beforeEach(() => { + // Login as the test viewer + cy.apiLogin(testViewerUser); + + // # Visit the playbook run + cy.visit(`/playbooks/runs/${testRun.id}`); + }); + + commonTests(); + + it('text is not clickable', () => { + getRetro().findByTestId('retro-report-text').click(); + getRetro().find('textarea').should('not.exist'); + }); + + it('there is no publish button', () => { + getRetro().findByText('Publish').should('not.exist'); + }); + }); + }); + + describe('metrics', () => { + const commonTests = () => { + it('inputs info(title, target, description) and order', () => { + // * Verify the created metrics + verifyMetricInput(0, 'title1', '12 minutes', 'description1', 'Add value (in dd:hh:mm)'); + verifyMetricInput(1, 'title2', '40', 'description2', 'Add value'); + verifyMetricInput(2, 'title3', '30', 'description3', 'Add value'); + }); + }; + + describe('as participant', () => { + beforeEach(() => { + cy.apiRunPlaybook({ + teamId: testTeam.id, + playbookId: testPublicPlaybookWithMetrics.id, + playbookRunName: 'the run name', + ownerUserId: testUser.id, + }).then((playbookRun) => { + testRun = playbookRun; + }); + }); + + beforeEach(() => { + cy.visit(`/playbooks/runs/${testRun.id}`); + }); + + commonTests(); + + it('inputs, null and zero values', () => { + cy.apiCreatePlaybook({ + teamId: testTeam.id, + title: 'Public Playbook', + memberIDs: [], + createPublicPlaybookRun: true, + metrics: [ + { + title: 'title1', + description: 'description1', + type: 'metric_duration', + target: null, + }, + { + title: 'title2', + description: 'description2', + type: 'metric_currency', + target: 0, + }, + { + title: 'title3', + description: 'description3', + type: 'metric_integer', + target: 30, + }, + ], + }).then((playbook) => { + cy.apiRunPlaybook({ + teamId: testTeam.id, + playbookId: playbook.id, + playbookRunName: 'the run name', + ownerUserId: testUser.id, + }).then((playbookRun) => { + // # Navigate directly to the retro tab + cy.visit(`/playbooks/runs/${playbookRun.id}`); + + // * Verify changes are reflected + verifyMetricInput(0, 'title1', null, 'description1', 'Add value (in dd:hh:mm)'); + verifyMetricInput(1, 'title2', '0', 'description2', 'Add value'); + verifyMetricInput(2, 'title3', '30', 'description3', 'Add value'); + }); + }); + }); + + it('auto save', () => { + getRetro().within(() => { + // # Enter metric values + cy.get('input[type=text]').eq(0).click(); + cy.get('input[type=text]').eq(0).type('12:11:10'). + tab().type('56'). + tab().type('123'); + + // # Click outside + cy.findByText('Retrospective').click({force: true}); + cy.wait(2000); + + // * Validate if values persist + cy.get('input[type=text]').eq(0).should('have.value', '12:11:10'); + cy.get('input[type=text]').eq(1).should('have.value', '56'); + cy.get('input[type=text]').eq(2).should('have.value', '123'); + + // # Enter new values + cy.get('input[type=text]').eq(0).click(); + cy.get('input[type=text]').eq(0).clear().type('12:00:10'). + tab().clear().type('20'). + tab().clear().type('21'); + }); + + // # Wait 2 sec to auto save + cy.wait(2000); + + // # Reload page + cy.visit(`/playbooks/runs/${testRun.id}`); + + getRetro().within(() => { + // * Validate if values are saved + cy.get('input[type=text]').eq(0).should('have.value', '12:00:10'); + cy.get('input[type=text]').eq(1).should('have.value', '20'); + cy.get('input[type=text]').eq(2).should('have.value', '21'); + }); + }); + + it('save empty and zero values', () => { + getRetro().within(() => { + // # Enter metric values + cy.get('input[type=text]').eq(0).click(); + cy.get('input[type=text]').eq(0).clear().type('00:00:00'). + tab().type('7'). + tab().type('0'); + + // # Click outside + cy.findByText('Retrospective').click({force: true}); + + // * Validate if values persist + cy.get('input[type=text]').eq(0).should('have.value', '00:00:00'); + cy.get('input[type=text]').eq(1).should('have.value', '7'); + cy.get('input[type=text]').eq(2).should('have.value', '0'); + + // # Clear first two metrics values + cy.get('input[type=text]').eq(0).click(); + cy.get('input[type=text]').eq(0).clear(). + tab().clear(); + + // # Click outside + cy.findByText('Retrospective').click({force: true}); + + // * Validate if values persist + cy.get('input[type=text]').eq(0).should('have.value', ''); + cy.get('input[type=text]').eq(1).should('have.value', ''); + cy.get('input[type=text]').eq(2).should('have.value', '0'); + }); + }); + + it('only valid values are saved. check error messages', () => { + getRetro().within(() => { + // # Enter invalid metric values + cy.get('input[type=text]').eq(0).click(); + cy.get('input[type=text]').eq(0).type('5'). + tab().type('56d'). + tab().type('125'); + + // * Validate error messages + cy.getStyledComponent('ErrorText').eq(0).contains('Please enter a duration in the format: dd:hh:mm (e.g., 12:00:00).'); + cy.getStyledComponent('ErrorText').eq(1).contains('Please enter a number.'); + + // # Click outside + cy.findByText('Retrospective').click({force: true}); + }); + + // # Reload page and navigate to the retro tab + cy.visit(`/playbooks/runs/${testRun.id}`); + + getRetro().within(() => { + // * Validate that values are not saved + cy.get('input[type=text]').eq(0).should('have.value', ''); + cy.get('input[type=text]').eq(1).should('have.value', ''); + cy.get('input[type=text]').eq(2).should('have.value', '125'); + + // # Enter new metric values + cy.get('input[type=text]').eq(0).click(); + cy.get('input[type=text]').eq(0).type('s'). + tab().type('d'). + tab().type('k'); + }); + }); + + it('publish retro', () => { + getRetro().within(() => { + // # Enter metric invalid values + cy.get('input[type=text]').eq(0).click(); + cy.get('input[type=text]').eq(0).type('20:00:12d'). + tab().type('56'). + tab().type('125v'); + + // # Publish + cy.findByRole('button', {name: 'Publish'}).click(); + }); + + // * Verify we're not showing the publish retro confirmation modal + cy.get('#confirm-modal-light').should('not.exist'); + + getRetro().within(() => { + //# Enter empty metric values + cy.get('input[type=text]').eq(0).click(); + cy.get('input[type=text]').eq(0).clear(). + tab().clear(). + tab().clear().type(24); + + // # Publish + cy.findByRole('button', {name: 'Publish'}).click(); + + // * Validate error messages + cy.getStyledComponent('ErrorText').eq(0).contains('Please fill in the metric value.'); + cy.getStyledComponent('ErrorText').eq(1).contains('Please fill in the metric value.'); + cy.getStyledComponent('ErrorText').should('have.length', 2); + }); + + // * Verify we're not showing the publish retro confirmation modal + cy.get('#confirm-modal-light').should('not.exist'); + + getRetro().within(() => { + //# Enter valid metric values + cy.get('input[type=text]').eq(0).click(); + cy.get('input[type=text]').eq(0).type('09:87:12'). + tab().type(123); + + // # Publish + cy.findByRole('button', {name: 'Publish'}).click(); + }); + + cy.get('#confirm-modal-light').within(() => { + // * Verify we're showing the publish retro confirmation modal + cy.findByText('Are you sure you want to publish?'); + + // # Publish + cy.findByRole('button', {name: 'Publish'}).click(); + }); + + getRetro().within(() => { + // * Verify that retro got published + cy.get('.icon-check-all').should('be.visible'); + + // * Verify that metrics inputs are disabled + cy.get('input[type=text]').each(($el) => { + cy.wrap($el).should('not.be.enabled'); + }); + }); + }); + }); + + describe('as viewer', () => { + before(() => { + cy.apiLogin(testUser); + + cy.apiRunPlaybook({ + teamId: testTeam.id, + playbookId: testPublicPlaybookWithMetrics.id, + playbookRunName: 'the run name', + ownerUserId: testUser.id, + }).then((playbookRun) => { + testRun = playbookRun; + }); + }); + + beforeEach(() => { + cy.apiLogin(testViewerUser).then(() => { + cy.visit(`/playbooks/runs/${testRun.id}`); + }); + }); + + commonTests(); + + it('are not editable', () => { + // * Verify that inputs are disabled + getMetricInput(0).find('input').should('be.disabled'); + getMetricInput(1).find('input').should('be.disabled'); + getMetricInput(2).find('input').should('be.disabled'); + }); + }); + }); +}); diff --git a/e2e/cypress/tests/integration/playbooks/runs/rdp_main_statusupdate_spec.js b/e2e/cypress/tests/integration/playbooks/runs/rdp_main_statusupdate_spec.js new file mode 100644 index 0000000000..5e2e40f162 --- /dev/null +++ b/e2e/cypress/tests/integration/playbooks/runs/rdp_main_statusupdate_spec.js @@ -0,0 +1,314 @@ +// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. + +// *************************************************************** +// - [#] indicates a test step (e.g. # Go to a page) +// - [*] indicates an assertion (e.g. * Check the title) +// *************************************************************** + +// Stage: @prod +// Group: @playbooks + +/* eslint-disable no-only-tests/no-only-tests */ + +describe('runs > run details page > status update', () => { + let testTeam; + let testUser; + let testViewerUser; + let testPublicPlaybook; + let testRun; + let playbookRunChannelName; + + before(() => { + cy.apiInitSetup().then(({team, user}) => { + testTeam = team; + testUser = user; + + // Create another user in the same team + cy.apiCreateUser().then(({user: viewer}) => { + testViewerUser = viewer; + cy.apiAddUserToTeam(testTeam.id, testViewerUser.id); + }); + + // # Login as testUser + cy.apiLogin(testUser); + + // # Create a public playbook + cy.apiCreatePlaybook({ + teamId: testTeam.id, + title: 'Public Playbook', + memberIDs: [], + }).then((playbook) => { + testPublicPlaybook = playbook; + }); + }); + }); + + beforeEach(() => { + // # Size the viewport to show the RHS without covering posts. + cy.viewport('macbook-13'); + + // # Login as testUser + cy.apiLogin(testUser); + + const now = Date.now(); + const playbookRunName = 'Playbook Run (' + now + ')'; + playbookRunChannelName = 'playbook-run-' + now; + + cy.apiRunPlaybook({ + teamId: testTeam.id, + playbookId: testPublicPlaybook.id, + playbookRunName, + ownerUserId: testUser.id, + }).then((playbookRun) => { + testRun = playbookRun; + + // # Visit the playbook run + cy.visit(`/playbooks/runs/${playbookRun.id}`); + + // # Intercept these graphQL requests for wait()'s + // # that help ensure rendering has finished. + cy.gqlInterceptQuery('PlaybookLHS'); + cy.wait('@gqlPlaybookLHS').wait('@gqlPlaybookLHS'); + cy.assertRunDetailsPageRenderComplete(testUser.username); + }); + }); + + describe('as participant', () => { + it('is visible', () => { + // * Verify the status update section is present + cy.findByTestId('run-statusupdate-section').should('be.visible'); + }); + + it('has no title', () => { + // * Verify the title + cy.findByTestId('run-statusupdate-section').find('h3').should('not.exist'); + }); + + describe('post update', () => { + it('button disappears if we finish the run', () => { + // * Check that post update button is visible + cy.findByTestId('run-statusupdate-section').findByTestId('post-update-button').should('be.visible'); + + // # Click finish button and confirm modal + cy.findByTestId('run-finish-section').find('button').click(); + cy.get('#confirmModal').get('#confirmModalButton').click(); + + // * Check that post update button does not exist anymore + cy.findByTestId('run-statusupdate-section').findByTestId('post-update-button').should('not.exist'); + }); + + it('button triggers post update modal', () => { + // * Check due date + cy.findByTestId('update-due-date-text').contains('Update due'); + cy.findByTestId('update-due-date-time').contains('in 24 hours'); + + // # Click post update + cy.findByTestId('run-statusupdate-section').findByTestId('post-update-button').click(); + + // * Assert modal is opened + cy.getStatusUpdateDialog().should('be.visible'); + + // # Write message + cy.findByTestId('update_run_status_textbox').clear().type('my nice update'); + cy.get('#reminder_timer_datetime').within(() => { + cy.get('input').type('15 minutes', {delay: 200, force: true}).type('{enter}', {force: true}); + }); + + // # Post update + cy.getStatusUpdateDialog().findByTestId('modal-confirm-button').click(); + + // * Check new due date + cy.findByTestId('update-due-date-text').contains('Update due'); + cy.findByTestId('update-due-date-time').contains('in 15 minutes'); + + // # Intercept all calls to telemetry + cy.interceptTelemetry(); + + // # go to channel + cy.visit(`/${testTeam.name}/channels/${playbookRunChannelName}`); + + // * check that post has been added + cy.getLastPost().contains('my nice update'); + + // * assert telemetry pageview + cy.expectTelemetryToContain([ + { + name: 'run_status_update', + type: 'page', + properties: { + channel_type: 'P', + }, + }, + ]); + }); + }); + + describe('request an update', () => { + it('is disabled if the run is finished', () => { + cy.apiFinishRun(testRun.id).then(() => { + // # reload url + cy.visit(`/playbooks/runs/${testRun.id}`); + cy.wait('@gqlPlaybookLHS').wait('@gqlPlaybookLHS'); + cy.assertRunDetailsPageRenderComplete(testUser.username); + + // # Click on kebab menu + cy.findByTestId('run-statusupdate-section').getStyledComponent('Kebab').click(); + + // # click on request update option (force because is disabled) + cy.findByText('Request update...').click({force: true}); + + // * assert modal is not opened + cy.get('#confirmModalButton').should('not.exist'); + }); + }); + + it('requests and confirm', () => { + // # Click on kebab menu + cy.findByTestId('run-statusupdate-section').getStyledComponent('Kebab').click(); + + cy.findByTestId('dropdownmenu').within(($dropdown) => { + cy.wrap($dropdown).children().should('have.length', 2); + + // # Click on request update + cy.findByText('Request update...').click(); + }); + + // # Click on modal confirmation + cy.get('#confirmModalButton').click(); + + // # Go to channel + cy.visit(`${testTeam.name}/channels/${playbookRunChannelName}`); + + // * Assert that message has been sent + cy.getLastPost().contains(`${testUser.username} requested a status update for ${testRun.name}.`); + }); + + it('requests and cancel', () => { + // # Click on kebab menu + cy.findByTestId('run-statusupdate-section').getStyledComponent('Kebab').click(); + cy.findByTestId('dropdownmenu').within(($dropdown) => { + cy.wrap($dropdown).children().should('have.length', 2); + + // # Click on request update + cy.findByText('Request update...').click(); + }); + + // # Click on modal confirmation + cy.get('#cancelModalButton').click(); + + // # Go to channel + cy.visit(`${testTeam.name}/channels/${playbookRunChannelName}`); + + // * Assert that message has not been sent + cy.getLastPost().should('not.contain', `${testUser.username} requested a status update for ${testRun.name}.`); + }); + }); + }); + + describe('as viewer', () => { + beforeEach(() => { + cy.apiLogin(testViewerUser).then(() => { + cy.visit(`/playbooks/runs/${testRun.id}`); + cy.wait('@gqlPlaybookLHS').wait('@gqlPlaybookLHS'); + cy.assertRunDetailsPageRenderComplete(testUser.username); + }); + }); + + it('is visible', () => { + // * Verify the status update section is present + cy.findByTestId('run-statusupdate-section').should('be.visible'); + }); + + it('has a title', () => { + // * Verify the title + cy.findByTestId('run-statusupdate-section').find('h3').contains('Recent status update'); + }); + + it('has placeholder', () => { + // * Verify the placeholder + cy.findByTestId('run-statusupdate-section').find('i').contains('No updates have been posted yet'); + }); + + it('has a due date', () => { + // * Verify the due date + cy.findByTestId('update-due-date-text').contains('Update due'); + cy.findByTestId('update-due-date-time').contains('in 24 hours'); + }); + + it('shows the most recent update', () => { + // # Login as participant + cy.apiLogin(testUser).then(() => { + cy.visit(`/playbooks/runs/${testRun.id}`); + cy.wait('@gqlPlaybookLHS').wait('@gqlPlaybookLHS'); + cy.assertRunDetailsPageRenderComplete(testUser.username); + }); + + // # Click post update + cy.findByTestId('run-statusupdate-section'). + should('be.visible'). + findByTestId('post-update-button').click(); + + // * Assert modal is opened + cy.getStatusUpdateDialog().should('be.visible'); + + // # Write message + cy.findByTestId('update_run_status_textbox').clear().type('my nice update'); + cy.get('#reminder_timer_datetime').within(() => { + cy.get('input').type('15 minutes', {delay: 200, force: true}).type('{enter}', {force: true}); + }); + + // # Post update + cy.getStatusUpdateDialog().findByTestId('modal-confirm-button').click(); + + cy.apiLogin(testViewerUser).then(() => { + cy.visit(`/playbooks/runs/${testRun.id}`); + cy.wait('@gqlPlaybookLHS').wait('@gqlPlaybookLHS'); + cy.assertRunDetailsPageRenderComplete(testUser.username); + + // * Check new due date + cy.findByTestId('update-due-date-text').contains('Update due'); + cy.findByTestId('update-due-date-time').contains('in 15 minutes'); + + // * Assert the recent updated text + cy.findByTestId('status-update-card').contains('my nice update'); + }); + }); + + it.skip('requests an update and confirm', () => { + // # Click on request update + cy.findByTestId('run-statusupdate-section'). + should('be.visible'). + findByText('Request update...').click(); + + // # Click on modal confirmation + cy.get('#confirmModalButton').click(); + + cy.apiLogin(testUser).then(() => { + // # Go to channel + cy.visit(`${testTeam.name}/channels/${playbookRunChannelName}`); + + // * Assert that message has been sent + cy.getLastPost().contains(`${testUser.username} requested a status update for ${testPublicPlaybook.name}.`); + }); + }); + + it.skip('requests an update and cancel', () => { + // # Click request update + cy.findByTestId('run-statusupdate-section'). + should('be.visible'). + findByText('Request update...').click(); + + // # Click on modal confirmation + cy.get('#cancelModalButton').click(); + + cy.apiLogin(testUser).then(() => { + // # Go to channel + cy.visit(`${testTeam.name}/channels/${playbookRunChannelName}`); + + // * Assert that message has been sent + cy.getLastPost().should('not.contain', `${testUser.username} requested a status update for ${testPublicPlaybook.name}].`); + }); + }); + }); +}); diff --git a/e2e/cypress/tests/integration/playbooks/runs/rdp_main_summary_spec.js b/e2e/cypress/tests/integration/playbooks/runs/rdp_main_summary_spec.js new file mode 100644 index 0000000000..967a3baa0c --- /dev/null +++ b/e2e/cypress/tests/integration/playbooks/runs/rdp_main_summary_spec.js @@ -0,0 +1,162 @@ +// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. + +// *************************************************************** +// - [#] indicates a test step (e.g. # Go to a page) +// - [*] indicates an assertion (e.g. * Check the title) +// *************************************************************** + +// Stage: @prod +// Group: @playbooks + +describe('runs > run details page > summary', () => { + let testTeam; + let testUser; + let testRun; + let testViewerUser; + let testPublicPlaybook; + + before(() => { + cy.apiInitSetup().then(({team, user}) => { + testTeam = team; + testUser = user; + + // Create another user in the same team + cy.apiCreateUser().then(({user: viewer}) => { + testViewerUser = viewer; + cy.apiAddUserToTeam(testTeam.id, testViewerUser.id); + }); + + // # Login as testUser + cy.apiLogin(testUser); + + // # Create a public playbook + cy.apiCreatePlaybook({ + teamId: testTeam.id, + title: 'Public Playbook', + memberIDs: [], + }).then((playbook) => { + testPublicPlaybook = playbook; + }); + }); + }); + + beforeEach(() => { + // # Size the viewport to show the RHS without covering posts. + cy.viewport('macbook-13'); + + // # Login as testUser + cy.apiLogin(testUser); + + cy.apiRunPlaybook({ + teamId: testTeam.id, + playbookId: testPublicPlaybook.id, + playbookRunName: 'the run name', + ownerUserId: testUser.id, + }).then((playbookRun) => { + testRun = playbookRun; + + // # Visit the playbook run + cy.visit(`/playbooks/runs/${playbookRun.id}`); + }); + }); + + const commonTests = () => { + it('is visible', () => { + // * Verify the summary section is present + cy.findByTestId('run-summary-section').should('be.visible'); + }); + + it('has title', () => { + // * Verify the summary section is present + cy.findByTestId('run-summary-section').find('h3').contains('Summary'); + }); + }; + + describe('as participant', () => { + commonTests(); + + it('has a placeholder', () => { + // * Assert the placeholder content + cy.findByTestId('run-summary-section').findByTestId('rendered-text').contains('Add a run summary'); + }); + + it('can be edited', () => { + // # Mouseover the summary + cy.findByTestId('run-summary-section').trigger('mouseover'); + + cy.findByTestId('run-summary-section').within(() => { + // # Click the edit icon + cy.findByTestId('hover-menu-edit-button').click(); + + // # Write a summary + cy.findByTestId('editabletext-markdown-textbox2').clear().type('This is my new summary'); + + // # Save changes + cy.findByTestId('checklist-item-save-button').click(); + + // * Assert that data has changed + cy.findByTestId('rendered-text').contains('This is my new summary'); + }); + + // * Assert last edition date is visible + cy.findByTestId('run-summary-section').contains('Last edited'); + }); + + it('can be canceled', () => { + // # Mouseover the summary + cy.findByTestId('run-summary-section').trigger('mouseover'); + + cy.findByTestId('run-summary-section').within(() => { + // # Click the edit icon + cy.findByTestId('hover-menu-edit-button').click(); + + // # Write a summary + cy.findByTestId('editabletext-markdown-textbox2').clear().type('This is my new summary'); + + // # Cancel changes + cy.findByText('Cancel').click(); + + // * Assert that data has not changed + cy.findByTestId('rendered-text').contains('Add a run summary'); + }); + + // * Assert last edition date is not visible + cy.findByTestId('run-summary-section').should('not.contain', 'Last edited'); + }); + + it('can not be edited once run is finished', () => { + // # Finish the run + cy.apiFinishRun(testRun.id); + + // # Mouseover the summary + cy.findByTestId('run-summary-section').trigger('mouseover'); + + // * Verify that the edit button is not rendered + cy.findByTestId('run-summary-section').findByTestId('hover-menu-edit-button').should('not.exist'); + }); + }); + + describe('as viewer', () => { + beforeEach(() => { + cy.apiLogin(testViewerUser).then(() => { + cy.visit(`/playbooks/runs/${testRun.id}`); + }); + }); + + commonTests(); + + it('has a placeholder', () => { + // * Assert the placeholder content + cy.findByTestId('run-summary-section').findByTestId('rendered-text').contains('There\'s no summary'); + }); + + it('can not be edited', () => { + // # Mouseover the summary + cy.findByTestId('run-summary-section').trigger('mouseover'); + + // * Verify that the edit button is not rendered + cy.findByTestId('run-summary-section').findByTestId('hover-menu-edit-button').should('not.exist'); + }); + }); +}); diff --git a/e2e/cypress/tests/integration/playbooks/runs/rdp_main_taskactions_spec.js b/e2e/cypress/tests/integration/playbooks/runs/rdp_main_taskactions_spec.js new file mode 100644 index 0000000000..595af8f938 --- /dev/null +++ b/e2e/cypress/tests/integration/playbooks/runs/rdp_main_taskactions_spec.js @@ -0,0 +1,712 @@ +// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. + +// *************************************************************** +// - [#] indicates a test step (e.g. # Go to a page) +// - [*] indicates an assertion (e.g. * Check the title) +// *************************************************************** + +// Stage: @prod +// Group: @playbooks + +import * as TIMEOUTS from '../../../fixtures/timeouts'; + +describe('runs > task actions', () => { + let testPlaybook; + let testTeam; + let testUser; + let testUser2; + + before(() => { + cy.apiInitSetup().then(({team, user}) => { + testTeam = team; + testUser = user; + + cy.apiCreateUser().then(({user: user2}) => { + testUser2 = user2; + + // # Add this new user to the team + cy.apiAddUserToTeam(team.id, testUser2.id); + }); + + // # Create a playbook + cy.apiCreatePlaybook({ + teamId: testTeam.id, + title: 'Playbook (' + Date.now() + ')', + checklists: [{ + title: 'Test Checklist', + items: [ + {title: 'Test Task'}, + ], + }], + memberIDs: [ + testUser.id, + ], + }).then((playbook) => { + testPlaybook = playbook; + }); + }); + }); + + beforeEach(() => { + // # intercepts telemetry + cy.interceptTelemetry(); + + // # Login as testUser + cy.apiLogin(testUser); + }); + + describe('keywords trigger - mark task as done', () => { + let testPlaybookRun; + + const getChecklist = () => cy.findByTestId('run-checklist-section'); + const getChecklistTasks = () => getChecklist().findAllByTestId('checkbox-item-container'); + + beforeEach(() => { + // # Run a playbook + cy.apiRunPlaybook({ + teamId: testTeam.id, + playbookId: testPlaybook.id, + playbookRunName: `the run name ${Date.now()}`, + ownerUserId: testUser.id, + }).then((playbookRun) => { + testPlaybookRun = playbookRun; + + // # Visit the playbook run + cy.visit(`/playbooks/runs/${playbookRun.id}`); + }); + }); + + it('disallows no keywords', () => { + // # Open the task actions modal + cy.findByText('Task Actions').click(); + + // # Attempt to enable the trigger + cy.findByText('Mark the task as done').click(); + + // # Save the dialog + cy.findByTestId('modal-confirm-button').click(); + + // * Verify no actions are configured + cy.findByText('Task Actions').should('exist'); + + cy.apiGetPlaybookRun(testPlaybookRun.id).then(({body: playbookRun}) => { + const trigger = JSON.parse(playbookRun.checklists[0].items[0].task_actions[0].trigger.payload); + const actions = JSON.parse(playbookRun.checklists[0].items[0].task_actions[0].actions[0].payload); + + assert.deepEqual(trigger.keywords, []); + assert.deepEqual(trigger.user_ids, []); + assert.isFalse(actions.enabled); + }); + }); + + it('allows a single keyword', () => { + // # Open the task actions modal + cy.findByText('Task Actions').click(); + + // # Add a keyword + cy.get('.modal-body').within(() => { + cy.get('input').eq(0).type('keyword1{enter}', {force: true}); + }); + + // # Enable the trigger + cy.findByText('Mark the task as done').click(); + + // # Save the dialog + cy.findByTestId('modal-confirm-button').click(); + + // * Verify configured actions + cy.findByText('1 action'); + cy.apiGetPlaybookRun(testPlaybookRun.id).then(({body: playbookRun}) => { + const trigger = JSON.parse(playbookRun.checklists[0].items[0].task_actions[0].trigger.payload); + const actions = JSON.parse(playbookRun.checklists[0].items[0].task_actions[0].actions[0].payload); + + assert.deepEqual(trigger.keywords, ['keyword1']); + assert.deepEqual(trigger.user_ids, []); + assert.isTrue(actions.enabled); + }); + + // # assert telemetry data + cy.expectTelemetryToContain([ + { + name: 'taskactions_updated', + type: 'track', + properties: { + playbookrun_id: testPlaybookRun.id, + }, + }, + ]); + + // # Attempt to activate trigger + cy.apiAddUserToChannel(testPlaybookRun.channel_id, testUser2.id); + cy.postMessageAs({ + sender: testUser2, + message: `hello from ${testUser2.username}: ${Date.now()}, oh and keyword1 happened`, + channelId: testPlaybookRun.channel_id, + }); + + // * Verify action activated + getChecklistTasks().eq(0).find('input[type="checkbox"]').should('be.checked'); + cy.findAllByTestId('timeline-item task_state_modified').findByText(`${testUser2.username} checked off checklist item "Test Task"`); + }); + + it('allows multiple keywords', () => { + // # Open the task actions modal + cy.findByText('Task Actions').click(); + + // # Add multiple keywords + cy.get('.modal-body').within(() => { + cy.get('input').eq(0).type('keyword1{enter}', {force: true}); + cy.get('input').eq(0).type('keyword2{enter}', {force: true}); + }); + + // # Enable the trigger + cy.findByText('Mark the task as done').click(); + + // # Save the dialog + cy.findByTestId('modal-confirm-button').click(); + + // * Verify configured actions + cy.findByText('1 action'); + cy.apiGetPlaybookRun(testPlaybookRun.id).then(({body: playbookRun}) => { + const trigger = JSON.parse(playbookRun.checklists[0].items[0].task_actions[0].trigger.payload); + const actions = JSON.parse(playbookRun.checklists[0].items[0].task_actions[0].actions[0].payload); + + assert.deepEqual(trigger.keywords, ['keyword1', 'keyword2']); + assert.deepEqual(trigger.user_ids, []); + assert.isTrue(actions.enabled); + }); + + // # Attempt to activate trigger + cy.apiAddUserToChannel(testPlaybookRun.channel_id, testUser2.id); + cy.postMessageAs({ + sender: testUser2, + message: `hello from ${testUser2.username}: ${Date.now()}, oh and keyword2 happened`, + channelId: testPlaybookRun.channel_id, + }); + + // * Verify action activated + getChecklistTasks().eq(0).find('input[type="checkbox"]').should('be.checked'); + cy.findAllByTestId('timeline-item task_state_modified').findByText(`${testUser2.username} checked off checklist item "Test Task"`); + }); + + it('allows multi-word phrases', () => { + // # Open the task actions modal + cy.findByText('Task Actions').click(); + + // # Add a phrase + cy.get('.modal-body').within(() => { + cy.get('input').eq(0).type('a phrase with multiple words{enter}', {force: true}); + }); + + // # Enable the trigger + cy.findByText('Mark the task as done').click(); + + // # Save the dialog + cy.findByTestId('modal-confirm-button').click(); + + // * Verify configured actions + cy.findByText('1 action'); + cy.apiGetPlaybookRun(testPlaybookRun.id).then(({body: playbookRun}) => { + const trigger = JSON.parse(playbookRun.checklists[0].items[0].task_actions[0].trigger.payload); + const actions = JSON.parse(playbookRun.checklists[0].items[0].task_actions[0].actions[0].payload); + + assert.deepEqual(trigger.keywords, ['a phrase with multiple words']); + assert.deepEqual(trigger.user_ids, []); + assert.isTrue(actions.enabled); + }); + + // # Attempt to activate trigger + cy.apiAddUserToChannel(testPlaybookRun.channel_id, testUser2.id); + cy.postMessageAs({ + sender: testUser2, + message: `hello from ${testUser2.username}: ${Date.now()}, oh and a phrase with multiple words happened`, + channelId: testPlaybookRun.channel_id, + }); + + // * Verify action activated + getChecklistTasks().eq(0).find('input[type="checkbox"]').should('be.checked'); + cy.findAllByTestId('timeline-item task_state_modified').findByText(`${testUser2.username} checked off checklist item "Test Task"`); + }); + + it('allows removing previously configured keywords', () => { + // # Open the task actions modal + cy.findByText('Task Actions').click(); + + // # Add multiple keywords + cy.get('.modal-body').within(() => { + cy.get('input').eq(0).type('keyword1{enter}', {force: true}); + cy.get('input').eq(0).type('keyword2{enter}', {force: true}); + }); + + // # Enable the trigger + cy.findByText('Mark the task as done').click(); + + // # Save the dialog + cy.findByTestId('modal-confirm-button').click(); + + // # Re-open the dialog + cy.findByText('1 action').click(); + + // # Remove one trigger keyword + cy.get('.modal-body').within(() => { + cy.findByText('keyword1').next().click(); + }); + + // # Save the dialog + cy.findByTestId('modal-confirm-button').click(); + + // * Verify configured actions + cy.findByText('1 action'); + cy.apiGetPlaybookRun(testPlaybookRun.id).then(({body: playbookRun}) => { + const trigger = JSON.parse(playbookRun.checklists[0].items[0].task_actions[0].trigger.payload); + const actions = JSON.parse(playbookRun.checklists[0].items[0].task_actions[0].actions[0].payload); + + assert.deepEqual(trigger.keywords, ['keyword2']); + assert.deepEqual(trigger.user_ids, []); + assert.isTrue(actions.enabled); + }); + + // # Post without activating trigger + cy.apiAddUserToChannel(testPlaybookRun.channel_id, testUser2.id); + cy.postMessageAs({ + sender: testUser2, + message: `hello from ${testUser2.username}: ${Date.now()}, oh and keyword1 happened`, + channelId: testPlaybookRun.channel_id, + }); + + // * Verify action not activated + getChecklistTasks().eq(0).find('input[type="checkbox"]').should('not.be.checked'); + + // # Attempt to activate trigger + cy.apiAddUserToChannel(testPlaybookRun.channel_id, testUser2.id); + cy.postMessageAs({ + sender: testUser2, + message: `hello from ${testUser2.username}: ${Date.now()}, oh and keyword2 happened`, + channelId: testPlaybookRun.channel_id, + }); + + // * Verify action activated + getChecklistTasks().eq(0).find('input[type="checkbox"]').should('be.checked'); + cy.findAllByTestId('timeline-item task_state_modified').findByText(`${testUser2.username} checked off checklist item "Test Task"`); + }); + + it('disables when all keywords removed', () => { + // # Open the task actions modal + cy.findByText('Task Actions').click(); + + // # Add multiple keywords + cy.get('.modal-body').within(() => { + cy.get('input').eq(0).type('keyword1{enter}', {force: true}); + cy.get('input').eq(0).type('keyword2{enter}', {force: true}); + }); + + // # Enable the trigger + cy.findByText('Mark the task as done').click(); + + // # Save the dialog + cy.findByTestId('modal-confirm-button').click(); + + // # Re-open the dialog + cy.findByText('1 action').click(); + + // # Remove all trigger keywords + cy.get('.modal-body').within(() => { + cy.findByText('keyword1').next().click(); + cy.findByText('keyword2').next().click(); + }); + + // # Save the dialog + cy.findByTestId('modal-confirm-button').click(); + + // * Verify configured actions + cy.findByText('Task Actions'); + cy.apiGetPlaybookRun(testPlaybookRun.id).then(({body: playbookRun}) => { + const trigger = JSON.parse(playbookRun.checklists[0].items[0].task_actions[0].trigger.payload); + const actions = JSON.parse(playbookRun.checklists[0].items[0].task_actions[0].actions[0].payload); + + assert.deepEqual(trigger.keywords, []); + assert.deepEqual(trigger.user_ids, []); + assert.isFalse(actions.enabled); + }); + + // # Post without activating trigger + cy.apiAddUserToChannel(testPlaybookRun.channel_id, testUser2.id); + cy.postMessageAs({ + sender: testUser2, + message: `hello from ${testUser2.username}: ${Date.now()}, oh keyword1 keyword2 happened`, + channelId: testPlaybookRun.channel_id, + }); + + // * Verify action not activated + getChecklistTasks().eq(0).find('input[type="checkbox"]').should('not.be.checked'); + }); + + it('disallows a user without keywords', () => { + // # Open the task actions modal + cy.findByText('Task Actions').click(); + + // # Add a user + cy.get('.modal-body').within(() => { + cy.get('input').eq(1). + type('@' + testUser.username, {force: true}). + wait(TIMEOUTS.ONE_SEC). + type('{enter}', {force: true}); + }); + + // # Attempt to enable the trigger + cy.findByText('Mark the task as done').click(); + + // # Save the dialog + cy.findByTestId('modal-confirm-button').click(); + + // * Verify no actions are configured + cy.findByText('Task Actions'); + cy.apiGetPlaybookRun(testPlaybookRun.id).then(({body: playbookRun}) => { + const trigger = JSON.parse(playbookRun.checklists[0].items[0].task_actions[0].trigger.payload); + const actions = JSON.parse(playbookRun.checklists[0].items[0].task_actions[0].actions[0].payload); + + assert.deepEqual(trigger.keywords, []); + assert.deepEqual(trigger.user_ids, [testUser.id]); + assert.isFalse(actions.enabled); + }); + }); + + it('allows a single user', () => { + // # Open the task actions modal + cy.findByText('Task Actions').click(); + + // # Add a keyword + cy.get('.modal-body').within(() => { + cy.get('input').eq(0).type('keyword1{enter}', {force: true}); + }); + + // # Add a user + cy.get('.modal-body').within(() => { + cy.get('input').eq(1). + type('@' + testUser.username, {force: true}). + wait(TIMEOUTS.ONE_SEC). + type('{enter}', {force: true}); + }); + + // # Attempt to enable the trigger + cy.findByText('Mark the task as done').click(); + + // # Save the dialog + cy.findByTestId('modal-confirm-button').click(); + + // * Verify configured actions and user + cy.findByText('1 action'); + cy.apiGetPlaybookRun(testPlaybookRun.id).then(({body: playbookRun}) => { + const trigger = JSON.parse(playbookRun.checklists[0].items[0].task_actions[0].trigger.payload); + const actions = JSON.parse(playbookRun.checklists[0].items[0].task_actions[0].actions[0].payload); + + assert.deepEqual(trigger.keywords, ['keyword1']); + assert.deepEqual(trigger.user_ids, [testUser.id]); + assert.isTrue(actions.enabled); + }); + + // # Post without activating trigger + cy.apiAddUserToChannel(testPlaybookRun.channel_id, testUser2.id); + cy.postMessageAs({ + sender: testUser2, + message: `hello from ${testUser2.username}: ${Date.now()}, oh and keyword1 happened`, + channelId: testPlaybookRun.channel_id, + }); + + // * Verify action not activated + getChecklistTasks().eq(0).find('input[type="checkbox"]').should('not.be.checked'); + + // # Attempt to activate trigger + cy.apiAddUserToChannel(testPlaybookRun.channel_id, testUser.id); + cy.postMessageAs({ + sender: testUser, + message: `hello from ${testUser.username}: ${Date.now()}, oh and keyword1 happened`, + channelId: testPlaybookRun.channel_id, + }); + + // * Verify action activated + getChecklistTasks().eq(0).find('input[type="checkbox"]').should('be.checked'); + cy.findAllByTestId('timeline-item task_state_modified').findByText(`${testUser.username} checked off checklist item "Test Task"`); + }); + + it('allows configuring multiple users', () => { + // # Open the task actions modal + cy.findByText('Task Actions').click(); + + // # Add a keyword + cy.get('.modal-body').within(() => { + cy.get('input').eq(0).type('keyword1{enter}', {force: true}); + }); + + // # Add two users + cy.get('.modal-body').within(() => { + cy.get('input').eq(1). + type('@' + testUser.username, {force: true}). + wait(TIMEOUTS.ONE_SEC). + type('{enter}', {force: true}); + cy.get('input').eq(1). + type('@' + testUser2.username, {force: true}). + wait(TIMEOUTS.ONE_SEC). + type('{enter}', {force: true}); + }); + + // # Attempt to enable the trigger + cy.findByText('Mark the task as done').click(); + + // # Save the dialog + cy.findByTestId('modal-confirm-button').click(); + + // * Verify configured actions and user + cy.findByText('1 action'); + cy.apiGetPlaybookRun(testPlaybookRun.id).then(({body: playbookRun}) => { + const trigger = JSON.parse(playbookRun.checklists[0].items[0].task_actions[0].trigger.payload); + const actions = JSON.parse(playbookRun.checklists[0].items[0].task_actions[0].actions[0].payload); + + assert.deepEqual(trigger.keywords, ['keyword1']); + assert.deepEqual(trigger.user_ids, [testUser.id, testUser2.id]); + assert.isTrue(actions.enabled); + }); + + // # Attempt to activate trigger + cy.apiAddUserToChannel(testPlaybookRun.channel_id, testUser.id); + cy.postMessageAs({ + sender: testUser, + message: `hello from ${testUser.username}: ${Date.now()}, oh and keyword1 happened`, + channelId: testPlaybookRun.channel_id, + }); + + // * Verify action activated + getChecklistTasks().eq(0).find('input[type="checkbox"]').should('be.checked'); + cy.findAllByTestId('timeline-item task_state_modified').findByText(`${testUser.username} checked off checklist item "Test Task"`); + + // # Reset-uncheck task + cy.apiSetChecklistItemState(testPlaybookRun.id, 0, 0, ''); + getChecklistTasks().eq(0).find('input[type="checkbox"]').should('not.be.checked'); + + // # Attempt to activate trigger + cy.apiAddUserToChannel(testPlaybookRun.channel_id, testUser2.id); + cy.postMessageAs({ + sender: testUser2, + message: `hello from ${testUser2.username}: ${Date.now()}, oh and keyword1 happened`, + channelId: testPlaybookRun.channel_id, + }); + + // * Verify action activated + getChecklistTasks().eq(0).find('input[type="checkbox"]').should('be.checked'); + cy.findAllByTestId('timeline-item task_state_modified').findByText(`${testUser2.username} checked off checklist item "Test Task"`); + }); + + it('rejects unknown user', () => { + // # Open the task actions modal + cy.findByText('Task Actions').click(); + + // # Add a keyword + cy.get('.modal-body').within(() => { + cy.get('input').eq(0).type('keyword1{enter}', {force: true}); + }); + + // # Type an unknown user + cy.get('.modal-body').within(() => { + cy.get('input').eq(1). + type('@unknown', {force: true}). + wait(TIMEOUTS.ONE_SEC). + type('{enter}', {force: true}); + }); + + // # Click away + cy.get('.modal-body').click(); + + // # Attempt to enable the trigger + cy.findByText('Mark the task as done').click(); + + // # Save the dialog + cy.findByTestId('modal-confirm-button').click(); + + // * Verify configured actions and user + cy.findByText('1 action'); + cy.apiGetPlaybookRun(testPlaybookRun.id).then(({body: playbookRun}) => { + const trigger = JSON.parse(playbookRun.checklists[0].items[0].task_actions[0].trigger.payload); + const actions = JSON.parse(playbookRun.checklists[0].items[0].task_actions[0].actions[0].payload); + + assert.deepEqual(trigger.keywords, ['keyword1']); + assert.deepEqual(trigger.user_ids, []); + assert.isTrue(actions.enabled); + }); + + // # Attempt to activate trigger + cy.apiAddUserToChannel(testPlaybookRun.channel_id, testUser.id); + cy.postMessageAs({ + sender: testUser, + message: `hello from ${testUser.username}: ${Date.now()}, oh and keyword1 happened`, + channelId: testPlaybookRun.channel_id, + }); + + // * Verify action activated + getChecklistTasks().eq(0).find('input[type="checkbox"]').should('be.checked'); + cy.findAllByTestId('timeline-item task_state_modified').findByText(`${testUser.username} checked off checklist item "Test Task"`); + }); + + it('allows removing previously configured users', () => { + // # Open the task actions modal + cy.findByText('Task Actions').click(); + + // # Add a keyword + cy.get('.modal-body').within(() => { + cy.get('input').eq(0).type('keyword1{enter}', {force: true}); + }); + + // # Add two users + cy.get('.modal-body').within(() => { + cy.get('input').eq(1). + type('@' + testUser.username, {force: true}). + wait(TIMEOUTS.ONE_SEC). + type('{enter}', {force: true}); + cy.get('input').eq(1). + type('@' + testUser2.username, {force: true}). + wait(TIMEOUTS.ONE_SEC). + type('{enter}', {force: true}); + }); + + // # Attempt to enable the trigger + cy.findByText('Mark the task as done').click(); + + // # Save the dialog + cy.findByTestId('modal-confirm-button').click(); + + // # Re-open the dialog + cy.findByText('1 action').click(); + + // # Remove one user keyword + cy.get('.modal-body').within(() => { + cy.findByText(testUser.username).parent().parent().next().click(); + }); + + // Save the dialog + cy.findByTestId('modal-confirm-button').click(); + + // Verify configured actions + cy.findByText('1 action'); + cy.apiGetPlaybookRun(testPlaybookRun.id).then(({body: playbookRun}) => { + const trigger = JSON.parse(playbookRun.checklists[0].items[0].task_actions[0].trigger.payload); + const actions = JSON.parse(playbookRun.checklists[0].items[0].task_actions[0].actions[0].payload); + + assert.deepEqual(trigger.keywords, ['keyword1']); + assert.deepEqual(trigger.user_ids, [testUser2.id]); + assert.isTrue(actions.enabled); + }); + + // # Post without activating trigger + cy.apiAddUserToChannel(testPlaybookRun.channel_id, testUser.id); + cy.postMessageAs({ + sender: testUser, + message: `hello from ${testUser.username}: ${Date.now()}, oh and keyword1 happened`, + channelId: testPlaybookRun.channel_id, + }); + + // * Verify action NOT activated + getChecklistTasks().eq(0).find('input[type="checkbox"]').should('not.be.checked'); + + // # Attempt to activate trigger + cy.apiAddUserToChannel(testPlaybookRun.channel_id, testUser2.id); + cy.postMessageAs({ + sender: testUser2, + message: `hello from ${testUser2.username}: ${Date.now()}, oh and keyword1 happened`, + channelId: testPlaybookRun.channel_id, + }); + + // * Verify action activated + getChecklistTasks().eq(0).find('input[type="checkbox"]').should('be.checked'); + cy.findAllByTestId('timeline-item task_state_modified').findByText(`${testUser2.username} checked off checklist item "Test Task"`); + }); + }); + + describe('keywords trigger - mark task as done, multiple runs in a channel', () => { + let testChannel; + let testPlaybookRun1; + let testPlaybookRun2; + + const configureTaskAction = (run) => { + // # Visit the playbook run + cy.visit(`/playbooks/runs/${run.id}`); + + // # Open the task actions modal + cy.findByText('Task Actions').click(); + + // # Add a keyword + cy.get('.modal-body').within(() => { + cy.get('input').eq(0).type('keyword1{enter}', {force: true}); + }); + + // # Enable the trigger + cy.findByText('Mark the task as done').click(); + + // # Save the dialog + cy.findByTestId('modal-confirm-button').click(); + + // * Verify configured actions + cy.findByText('1 action'); + cy.apiGetPlaybookRun(run.id).then(({body: playbookRun}) => { + const trigger = JSON.parse(playbookRun.checklists[0].items[0].task_actions[0].trigger.payload); + const actions = JSON.parse(playbookRun.checklists[0].items[0].task_actions[0].actions[0].payload); + + assert.deepEqual(trigger.keywords, ['keyword1']); + assert.deepEqual(trigger.user_ids, []); + assert.isTrue(actions.enabled); + }); + }; + + beforeEach(() => { + cy.apiCreateChannel(testTeam.id, 'channel', 'Channel').then(({channel}) => { + testChannel = channel; + + // # Run #1 + cy.apiRunPlaybook({ + teamId: testTeam.id, + playbookId: testPlaybook.id, + playbookRunName: `the run name ${Date.now()}`, + ownerUserId: testUser.id, + channelId: testChannel.id, + }).then((playbookRun) => { + testPlaybookRun1 = playbookRun; + configureTaskAction(testPlaybookRun1); + }); + + // # Run #2 + cy.apiRunPlaybook({ + teamId: testTeam.id, + playbookId: testPlaybook.id, + playbookRunName: `the run name ${Date.now()}`, + ownerUserId: testUser.id, + channelId: testChannel.id, + }).then((playbookRun) => { + testPlaybookRun2 = playbookRun; + configureTaskAction(testPlaybookRun2); + }); + }); + }); + + it('triggers', () => { + // # Attempt to activate trigger + cy.apiAddUserToChannel(testChannel.id, testUser2.id); + cy.postMessageAs({ + sender: testUser2, + message: `hello from ${testUser2.username}: ${Date.now()}, oh and keyword1 happened`, + channelId: testChannel.id, + }); + + // Give the system a chance to effect the task actions. + cy.wait(TIMEOUTS.HALF_SEC); + + // * Verify action activated ion testPlaybookRun1 + cy.apiGetPlaybookRun(testPlaybookRun1.id).then(({body: playbookRun}) => { + assert.equal(playbookRun.checklists[0].items[0].state, 'closed'); + }); + + // * Verify action activated in testPlaybookRun2 + cy.apiGetPlaybookRun(testPlaybookRun2.id).then(({body: playbookRun}) => { + assert.equal(playbookRun.checklists[0].items[0].state, 'closed'); + }); + }); + }); +}); diff --git a/e2e/cypress/tests/integration/playbooks/runs/rdp_rhs_participants_spec.js b/e2e/cypress/tests/integration/playbooks/runs/rdp_rhs_participants_spec.js new file mode 100644 index 0000000000..870e6fb195 --- /dev/null +++ b/e2e/cypress/tests/integration/playbooks/runs/rdp_rhs_participants_spec.js @@ -0,0 +1,266 @@ +// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. + +// *************************************************************** +// - [#] indicates a test step (e.g. # Go to a page) +// - [*] indicates an assertion (e.g. * Check the title) +// *************************************************************** + +// Stage: @prod +// Group: @playbooks + +describe('runs > run details page > rhs > participants', () => { + let testTeam; + let testUser; + let testUser2; + let testViewerUser; + let testPublicPlaybook; + let testRun; + + before(() => { + cy.apiInitSetup().then(({team, user}) => { + testTeam = team; + testUser = user; + + // Create another user in the same team + cy.apiCreateUser().then(({user: viewer}) => { + testViewerUser = viewer; + cy.apiAddUserToTeam(testTeam.id, testViewerUser.id); + }); + + // Create another user in the same team + cy.apiCreateUser().then(({user: viewer}) => { + testUser2 = viewer; + cy.apiAddUserToTeam(testTeam.id, testUser2.id); + }); + + // # Login as testUser + cy.apiLogin(testUser); + + // # Create a public playbook + cy.apiCreatePlaybook({ + teamId: testTeam.id, + title: 'Public Playbook', + memberIDs: [], + }).then((playbook) => { + testPublicPlaybook = playbook; + }); + }); + }); + + beforeEach(() => { + // # Size the viewport to show the RHS without covering posts. + cy.viewport('macbook-13'); + + // # Login as testUser + cy.apiLogin(testUser); + + cy.apiRunPlaybook({ + teamId: testTeam.id, + playbookId: testPublicPlaybook.id, + playbookRunName: 'the-run-name' + Date.now(), + ownerUserId: testUser.id, + }).then((playbookRun) => { + testRun = playbookRun; + + // # Add viewer user to the channel + cy.apiAddUsersToRun(testRun.id, [testUser2.id]); + + // # Visit the playbook run + cy.visit(`/playbooks/runs/${playbookRun.id}`); + }); + }); + + describe('as participant', () => { + it('switching between manage modes', () => { + navigateToParticipantsList(); + + // # Switch to manage mode + cy.findByRole('button', {name: 'Manage'}).click(); + + // * Verify that we are in manage mode + cy.findByRole('button', {name: 'Manage'}).should('not.exist'); + + // # Switch to normal mode + cy.findByRole('button', {name: 'Done'}).click(); + + // * Verify that we are in normal mode + cy.findByRole('button', {name: 'Manage'}).should('exist'); + }); + + it('change owner', () => { + navigateToParticipantsList(); + + // * Verify run owner + cy.findByTestId('run-owner').contains(testUser.username); + + // # Switch to manage mode + cy.findByRole('button', {name: 'Manage'}).click(); + + // # Change owner + cy.findByTestId(testUser2.id).findByTestId('menuButton').click(); + cy.findByTestId('dropdownmenu').findByText('Make run owner').click(); + + // # Wait for changes to apply + cy.wait(2000); + + // * Verify the owner has changed + cy.findByTestId('run-owner').contains(testUser2.username); + }); + + it('remove participant', () => { + navigateToParticipantsList(); + + // * Verify run owner + cy.findByTestId('run-owner').contains(testUser.username); + + // # Switch to manage mode + cy.findByRole('button', {name: 'Manage'}).click(); + + // # remove participant + cy.findByTestId(testUser2.id).findByTestId('menuButton').click(); + cy.findByTestId('dropdownmenu').findByText('Remove from run').click(); + + // * Verify the user has been removed + cy.findByTestId(testUser2.id).should('not.exist'); + }); + + describe('add participant', () => { + it('join action enabled', () => { + navigateToParticipantsList(); + + // * Verify run owner + cy.findByTestId('run-owner').contains(testUser.username); + + // # show add participant modal + cy.findByRole('button', {name: 'Add'}).click(); + + // # Select two new participants + cy.get('#profile-autocomplete').click().type(testUser2.username + '{enter}', {delay: 400}); + cy.get('#profile-autocomplete').click().type(testViewerUser.username + '{enter}', {delay: 400}); + + // # Intercept all calls to telemetry + cy.interceptTelemetry(); + + // * Verify modal message is correct + cy.findByText('Participants will also be added to the channel linked to this run').should('exist'); + + // # Add selected participant + cy.findByTestId('modal-confirm-button').click(); + + // * Verify telemetry + cy.expectTelemetryToContain([ + { + name: 'playbookrun_participate', + type: 'track', + properties: { + from: 'run_details', + trigger: 'add_participant', + count: '2', + }, + }, + ]); + + // * Verify the users have been added + cy.findByTestId(testUser2.id).should('exist'); + cy.findByTestId(testViewerUser.id).should('exist'); + }); + + it('join action disabled', () => { + cy.apiUpdateRun(testRun.id, {createChannelMemberOnNewParticipant: false}); + navigateToParticipantsList(); + + // * Verify run owner + cy.findByTestId('run-owner').contains(testUser.username); + + // # show add participant modal + cy.findByRole('button', {name: 'Add'}).click(); + + // # Select two new participants + cy.get('#profile-autocomplete').click().type(testViewerUser.username + '{enter}', {delay: 400}); + + // * Verify modal message is correct + cy.findByText('Also add people to the channel linked to this run').should('exist'); + + // # Add selected participant + cy.findByTestId('modal-confirm-button').click(); + + // * Verify the user has been added to the run + cy.findByTestId(testViewerUser.id).should('exist'); + + // # Intercept fetching channel members + cy.intercept('channels/members/me/view').as('members'); + + // # Navigate to the playbook run channel + cy.visit(`/${testTeam.name}/channels/${testRun.name}`); + + // * Verify that no users were invited + cy.getFirstPostId().then((id) => { + cy.get(`#postMessageText_${id}`).within(() => { + // just to wait until the username is fetched + cy.contains('Someone').should('not.exist'); + cy.contains('You were added to the channel by @playbooks.'); + cy.contains(`@${testViewerUser.username}`).should('not.exist'); + }); + }); + }); + + it('join action disabled, checkbox selected', () => { + cy.apiUpdateRun(testRun.id, {createChannelMemberOnNewParticipant: false}); + navigateToParticipantsList(); + + // * Verify run owner + cy.findByTestId('run-owner').contains(testUser.username); + + // # show add participant modal + cy.findByRole('button', {name: 'Add'}).click(); + + // # Select two new participants + cy.get('#profile-autocomplete').click().type(testViewerUser.username + '{enter}', {delay: 400}); + + // * Verify modal message is correct + cy.findByText('Also add people to the channel linked to this run').should('exist'); + + // # Select checkbox + cy.findByTestId('also-add-to-channel').click({force: true}); + + // # Add selected participant + cy.findByTestId('modal-confirm-button').click(); + + // * Verify the user has been added to the run + cy.findByTestId(testViewerUser.id).should('exist'); + + // # Navigate to the playbook run channel + cy.visit(`/${testTeam.name}/channels/${testRun.name}`); + + // * Verify that the user was added to the channel + cy.getFirstPostId().then((id) => { + cy.get(`#postMessageText_${id}`).within(() => { + cy.contains('Someone').should('not.exist'); + cy.contains(`@${testViewerUser.username}`); + }); + }); + }); + }); + }); + + describe('as viewer', () => { + beforeEach(() => { + cy.apiLogin(testViewerUser).then(() => { + cy.visit(`/playbooks/runs/${testRun.id}`); + }); + }); + + it('no manage button', () => { + navigateToParticipantsList(); + + // * Verify that there is no manage button + cy.findByRole('button', {name: 'Manage'}).should('not.exist'); + }); + }); +}); + +const navigateToParticipantsList = () => { + // # Click on participants row + cy.findByTestId('runinfo-participants').click(); +}; diff --git a/e2e/cypress/tests/integration/playbooks/runs/rdp_rhs_runinfo_spec.js b/e2e/cypress/tests/integration/playbooks/runs/rdp_rhs_runinfo_spec.js new file mode 100644 index 0000000000..1dde1dbae4 --- /dev/null +++ b/e2e/cypress/tests/integration/playbooks/runs/rdp_rhs_runinfo_spec.js @@ -0,0 +1,549 @@ +// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. + +// *************************************************************** +// - [#] indicates a test step (e.g. # Go to a page) +// - [*] indicates an assertion (e.g. * Check the title) +// *************************************************************** + +// Stage: @prod +// Group: @playbooks + +describe('runs > run details page > run info', () => { + let testTeam; + let testUser; + let testViewerUser; + let testPublicPlaybook; + let testRun; + + const getHeader = () => { + return cy.findByTestId('run-header-section'); + }; + + before(() => { + cy.apiInitSetup().then(({team, user}) => { + testTeam = team; + testUser = user; + + // Create another user in the same team + cy.apiCreateUser().then(({user: viewer}) => { + testViewerUser = viewer; + cy.apiAddUserToTeam(testTeam.id, testViewerUser.id); + }); + + // # Login as testUser + cy.apiLogin(testUser); + + // # Create a public playbook + cy.apiCreatePlaybook({ + teamId: testTeam.id, + title: 'Public Playbook', + memberIDs: [], + }).then((playbook) => { + testPublicPlaybook = playbook; + }); + }); + }); + + beforeEach(() => { + // # Size the viewport to show the RHS without covering posts. + cy.viewport('macbook-13'); + + // # Login as testUser + cy.apiLogin(testUser); + + cy.apiRunPlaybook({ + teamId: testTeam.id, + playbookId: testPublicPlaybook.id, + playbookRunName: 'the run name', + ownerUserId: testUser.id, + }).then((playbookRun) => { + testRun = playbookRun; + + // # Visit the playbook run + cy.visit(`/playbooks/runs/${playbookRun.id}`); + }); + }); + + const getRHSSection = (title) => cy.findByRole('complementary').contains('section', title); + + describe('> overview', () => { + const getOverviewEntry = (entryName) => ( + getRHSSection('Overview').findByTestId(`runinfo-${entryName}`) + ); + + const commonTests = () => { + it('Playbook entry links to the playbook', () => { + // # Click on the Playbook entry + getOverviewEntry('playbook').within(() => cy.getStyledComponent('ItemLink').click()); + + // * Verify the we're in the right playbook page + cy.url().should('include', '/playbooks/playbooks'); + cy.findByTestId('playbook-editor-title').contains(testPublicPlaybook.title); + }); + + it('Owner entry shows the owner', () => { + // * Verify that the owner is shown + getOverviewEntry('owner').contains(testUser.username); + }); + + it('Participants entry shows the participants', () => { + // * Verify that the participants are rendered + getOverviewEntry('participants').within(() => { + cy.getStyledComponent('Participants').within(() => { + cy.getStyledComponent('UserPic').should('exist'); + }); + }); + }); + + it('clicking on Participants show the full list of participants', () => { + // * Click on the Participants entry + getOverviewEntry('participants').click(); + + cy.findByRole('complementary').within(() => { + // * Verify that the Participants RHS is shown + cy.findByTestId('rhs-title').contains('Participants'); + + // * Verify that the back button is shown + cy.findByTestId('rhs-back-button').should('exist'); + + // * Verify that the participants list shows the number of participants + cy.findByText('1 Participant'); + + // * Verify that the participants list contains the test user + cy.findByText(`@${testUser.username}`); + + // # Click on the back button + cy.findByTestId('rhs-back-button').click(); + + // * Verify that the RHS is back to Run info + cy.findByTestId('rhs-title').contains('Run info'); + }); + }); + }; + + describe('as participant', () => { + commonTests(); + + it('Following button can be toggled', () => { + // # Intercept all calls to telemetry + cy.interceptTelemetry(); + + getOverviewEntry('following').within(() => { + // * Verify that the user shows in the following list + cy.getStyledComponent('UserRow').within(() => { + cy.getStyledComponent('UserPic').should('have.length', 1); + }); + + // # Click the Following button + cy.findByRole('button', {name: /Following/}).click({force: true}); + + // * Verify that it now says (exactly) Follow + cy.findByRole('button', {name: /^Follow$/}).should('exist'); + + // * Verify that the user no longer shows in the following list + cy.getStyledComponent('UserRow').should('not.exist'); + + // # Click the Follow button + cy.findByRole('button', {name: /^Follow$/}).click({force: true}); + + // * Verify that it now says Following + cy.findByRole('button', {name: /Following/}).should('exist'); + }); + + cy.expectTelemetryToContain([ + { + name: 'playbookrun_unfollow', + type: 'track', + from: 'run_details', + playbookrun_id: testRun.id, + }, + { + name: 'playbookrun_follow', + type: 'track', + from: 'run_details', + playbookrun_id: testRun.id, + }, + ], {waitForCalls: 3}); + }); + + it('click channel link navigates to run\'s channel', () => { + // * Assert channel name + getOverviewEntry('channel').contains('the run name'); + + // # Click on channel item + getOverviewEntry('channel').within(() => cy.getStyledComponent('ItemLink').click()); + + // * Assert we navigated correctly + cy.url().should('include', `${testTeam.name}/channels/the-run-name`); + }); + + it('channel is still there when the run is finished', () => { + cy.apiFinishRun(testRun.id).then(() => { + // # Reload page + cy.reload(); + + // * Assert channel name + getOverviewEntry('channel').contains('the run name'); + + // # Click on channel item + getOverviewEntry('channel').within(() => cy.getStyledComponent('ItemLink').click()); + + // * Assert we navigated correctly + cy.url().should('include', `${testTeam.name}/channels/the-run-name`); + }); + }); + }); + + describe('as viewer', () => { + beforeEach(() => { + cy.apiLogin(testViewerUser).then(() => { + cy.visit(`/playbooks/runs/${testRun.id}`); + }); + }); + + commonTests(); + + it('Following button can be toggled', () => { + getOverviewEntry('following').within(() => { + // * Verify that the user is not in the following list + cy.getStyledComponent('UserRow').within(() => { + cy.getStyledComponent('UserPic').should('have.length', 1); + }); + + // # Click the Follow button + cy.findByRole('button', {name: /^Follow$/}).click({force: true}); + + // * Verify that it now says Following + cy.findByRole('button', {name: /Following/}).should('exist'); + + // * Verify that the user is now in the following list + cy.getStyledComponent('UserRow').within(() => { + cy.getStyledComponent('UserPic').should('have.length', 2); + }); + + // # Click the Follow button + cy.findByRole('button', {name: /Following/}).click({force: true}); + + // * Verify that it now says (exactly) Follow + cy.findByRole('button', {name: /^Follow$/}).should('exist'); + }); + }); + + it('there is no channel link but can request to join', () => { + // * Assert that the section exists with label Private + getOverviewEntry('channel').contains('Private'); + + // * Assert that link does not exist + getOverviewEntry('channel').within(() => { + cy.get('a').should('not.exist'); + }); + + // * Assert that request-join button does not exist + getOverviewEntry('channel').within(() => { + cy.get('button').should('not.exist'); + }); + + cy.wait(500); + + // # Click Participate button + getHeader().findByText('Participate').click(); + + // * Assert that modal is shown + cy.get('#become-participant-modal').should('exist'); + + // # Confirm modal + cy.findByTestId('modal-confirm-button').click(); + + // Assert that request-join button doesn't exist + getOverviewEntry('channel').within(() => { + cy.get('button').should('not.exist'); + }); + }); + }); + }); + + describe('> key metrics', () => { + describe('playbook without metrics', () => { + describe('it should not render', () => { + it('as participant', () => { + // * assert metrics does not exist + getRHSSection('Key Metrics').should('not.exist'); + }); + + it('as viewer', () => { + cy.apiLogin(testViewerUser).then(() => { + cy.visit(`/playbooks/runs/${testRun.id}`); + }); + + // * assert metrics does not exist + getRHSSection('Key Metrics').should('not.exist'); + }); + }); + }); + + describe('playbook with metrics (enabled retro)', () => { + let playbookWithMetrics; + let runWithMetrics; + + before(() => { + // # Login as testUser + cy.apiLogin(testUser); + + // # Create a public playbook with metrics + cy.apiCreatePlaybook({ + teamId: testTeam.id, + title: 'Public Playbook with metrics', + memberIDs: [], + metrics: [ + { + title: 'Duration', + description: 'duration', + type: 'metric_duration', + target: 6000, + }, + { + title: 'Currency', + description: 'currency', + type: 'metric_currency', + target: 100, + }, + { + title: 'Integer', + description: 'integer', + type: 'metric_integer', + target: 1, + }, + ], + }).then((playbook) => { + playbookWithMetrics = playbook; + }); + }); + + beforeEach(() => { + // # Size the viewport to show the RHS without covering posts. + cy.viewport('macbook-13'); + + // # Login as testUser + cy.apiLogin(testUser); + + cy.apiRunPlaybook({ + teamId: testTeam.id, + playbookId: playbookWithMetrics.id, + playbookRunName: 'the run name', + ownerUserId: testUser.id, + }).then((playbookRun) => { + runWithMetrics = playbookRun; + + // # Visit the playbook run + cy.visit(`/playbooks/runs/${playbookRun.id}`); + }); + }); + + const commonTests = () => { + it('key metrics is present', () => { + getRHSSection('Key Metrics').should('exist'); + }); + + it('link scrolls to retrospective', () => { + // # click in view retro link + cy.findByRole('link', {name: /View Retrospective/}).click({force: true}); + + // * verify that URL has been changed + cy.url().should('contain', '#playbook-run-retrospective'); + }); + + it('metric items scroll to corresponding metric', () => { + getRHSSection('Key Metrics').within(() => { + playbookWithMetrics.metrics.forEach((metric) => { + // # Click on metric + cy.findByText(metric.title).click({force: true}); + + // * Verify that url changed (and therefore we scrolled) + cy.url().should('contain', `#playbook-run-retrospective${metric.id}`); + }); + }); + }); + }; + + describe('as participant', () => { + commonTests(); + + it('metric items show Add value if empty', () => { + getRHSSection('Key Metrics').within(() => { + playbookWithMetrics.metrics.forEach((metric) => { + // * Verify that we show a placeholder when empty + cy.findByText(metric.title).parent().contains('Add value...'); + }); + }); + }); + + it('click on metric items, type and see the result in the RHS', () => { + const testData = { + metric_duration: { + input: '12:06:03', + expected: '12d, 6h, 3m', + }, + metric_currency: { + input: '5000', + expected: '5000', + }, + metric_integer: { + input: '42', + expected: '42', + }, + }; + + // # Type the values for the metrics + getRHSSection('Key Metrics').within(() => { + playbookWithMetrics.metrics.forEach((metric) => { + // # Click on the metric row + cy.findByText(metric.title).click(); + + // # Seems there's a re-render between clicking the title and + // # typing that occasionally leads to dropped keystrokes in + // # .type(). Wait for it to avoid. + cy.wait(1000); + + // # Type a value for the metric + cy.focused().type(testData[metric.type].input); + }); + }); + + // * Verify that the RHS is updated with those values + getRHSSection('Key Metrics').within(() => { + playbookWithMetrics.metrics.forEach((metric) => { + // * Verify that the metric was updated in the RHS + cy.findByText(metric.title).parent().contains(testData[metric.type].expected); + }); + }); + }); + }); + + describe('as viewer', () => { + beforeEach(() => { + cy.apiLogin(testViewerUser).then(() => { + cy.visit(`/playbooks/runs/${runWithMetrics.id}`); + }); + }); + + commonTests(); + + it('metric items show - if empty', () => { + getRHSSection('Key Metrics').within(() => { + playbookWithMetrics.metrics.forEach((metric) => { + // * verify that values are shown as - when empty + cy.findByText(metric.title).parent().contains('-'); + }); + }); + }); + }); + }); + + describe('playbook with metrics (disabled retro)', () => { + let playbookWithMetrics; + let runWithMetrics; + + before(() => { + // # Login as testUser + cy.apiLogin(testUser); + + // # Create a public playbook with metrics + cy.apiCreatePlaybook({ + teamId: testTeam.id, + title: 'Public Playbook with metrics', + memberIDs: [], + metrics: [ + { + title: 'Integer', + description: 'integer', + type: 'metric_integer', + target: 1, + }, + ], + retrospectiveEnabled: false, + }).then((playbook) => { + playbookWithMetrics = playbook; + }); + }); + + beforeEach(() => { + // # Size the viewport to show the RHS without covering posts. + cy.viewport('macbook-13'); + + // # Login as testUser + cy.apiLogin(testUser); + + cy.apiRunPlaybook({ + teamId: testTeam.id, + playbookId: playbookWithMetrics.id, + playbookRunName: 'the run name', + ownerUserId: testUser.id, + }).then((playbookRun) => { + runWithMetrics = playbookRun; + + // # Visit the playbook run + cy.visit(`/playbooks/runs/${playbookRun.id}`); + }); + }); + + const commonTests = () => { + it('key metrics is hidden', () => { + getRHSSection('Key Metrics').should('not.exist'); + }); + }; + + describe('as participant', () => { + commonTests(); + }); + + describe('as viewer', () => { + beforeEach(() => { + cy.apiLogin(testViewerUser).then(() => { + cy.visit(`/playbooks/runs/${runWithMetrics.id}`); + }); + }); + + commonTests(); + }); + }); + }); + + describe('> recent activity', () => { + const commonTests = () => { + it('recent activity is present and it contains a timeline', () => { + getRHSSection('Recent Activity').within(() => { + // * assert that section is shown + cy.findByTestId('rhs-timeline').should('exist'); + }); + }); + + it('link switches the RHS to Timeline', () => { + getRHSSection('Recent Activity').within(() => { + // * click link to see all timeline + cy.findByText('View all').click({force: true}); + }); + + cy.findByRole('complementary').within(() => { + // * verify we changed to RHS-timeline + cy.findByTestId('rhs-title').contains('Timeline'); + cy.findByTestId('rhs-back-button').should('exist'); + }); + }); + }; + + describe('as participant', () => { + commonTests(); + }); + + describe('as viewer', () => { + beforeEach(() => { + cy.apiLogin(testViewerUser).then(() => { + cy.visit(`/playbooks/runs/${testRun.id}`); + }); + }); + + commonTests(); + }); + }); +}); diff --git a/e2e/cypress/tests/integration/playbooks/runs/rdp_rhs_spec.js b/e2e/cypress/tests/integration/playbooks/runs/rdp_rhs_spec.js new file mode 100644 index 0000000000..707e283937 --- /dev/null +++ b/e2e/cypress/tests/integration/playbooks/runs/rdp_rhs_spec.js @@ -0,0 +1,129 @@ +// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. + +// *************************************************************** +// - [#] indicates a test step (e.g. # Go to a page) +// - [*] indicates an assertion (e.g. * Check the title) +// *************************************************************** + +// Stage: @prod +// Group: @playbooks + +describe('runs > run details page > RHS', () => { + let testTeam; + let testUser; + let testViewerUser; + let testPublicPlaybook; + let testRun; + + before(() => { + cy.apiInitSetup().then(({team, user}) => { + testTeam = team; + testUser = user; + + // Create another user in the same team + cy.apiCreateUser().then(({user: viewer}) => { + testViewerUser = viewer; + cy.apiAddUserToTeam(testTeam.id, testViewerUser.id); + }); + + // # Login as testUser + cy.apiLogin(testUser); + + // # Create a public playbook + cy.apiCreatePlaybook({ + teamId: testTeam.id, + title: 'Public Playbook', + memberIDs: [], + }).then((playbook) => { + testPublicPlaybook = playbook; + }); + }); + }); + + beforeEach(() => { + // # Size the viewport to show the RHS without covering posts. + cy.viewport('macbook-13'); + + // # Login as testUser + cy.apiLogin(testUser); + + cy.apiRunPlaybook({ + teamId: testTeam.id, + playbookId: testPublicPlaybook.id, + playbookRunName: 'the run name', + ownerUserId: testUser.id, + }).then((playbookRun) => { + testRun = playbookRun; + + // # Visit the playbook run + cy.visit(`/playbooks/runs/${playbookRun.id}`); + }); + }); + + const getRHS = () => cy.findByRole('complementary'); + + const getHeaderButton = (name) => cy.findByTestId(`rhs-header-button-${name}`); + + const checkRHSTitle = (expectedTitle) => { + getRHS().within(() => { + cy.findByTestId('rhs-title').contains(expectedTitle); + }); + }; + + const commonTests = () => { + it('timeline button toggles timeline in the RHS', () => { + // * Verify that the run info RHS is open + checkRHSTitle('Run info'); + + // # Click on the header timeline button + getHeaderButton('timeline').click(); + + // * Verify that the run info RHS changed to Timeline + checkRHSTitle('Timeline'); + + // # Wait so we don't double-click + cy.wait(500); + + // # Click again on the header timeline button + getHeaderButton('timeline').click(); + + // * Verify that the RHS is closed + getRHS().should('not.exist'); + }); + + it('info button toggles info in the RHS', () => { + // * Verify that the run info RHS is open + checkRHSTitle('Run info'); + + // # Click on the header info button + getHeaderButton('info').click(); + + // * Verify that the RHS is now closed + getRHS().should('not.exist'); + + // # Wait so we don't double-click + cy.wait(500); + + // # Click again on the header info button + getHeaderButton('info').click(); + + // * Verify that the run info RHS is open again + checkRHSTitle('Run info'); + }); + }; + + describe('as participant', () => { + commonTests(); + }); + + describe('as viewer', () => { + beforeEach(() => { + cy.apiLogin(testViewerUser).then(() => { + cy.visit(`/playbooks/runs/${testRun.id}`); + }); + }); + + commonTests(); + }); +}); diff --git a/e2e/cypress/tests/integration/playbooks/runs/rdp_rhs_statusupdates_spec.js b/e2e/cypress/tests/integration/playbooks/runs/rdp_rhs_statusupdates_spec.js new file mode 100644 index 0000000000..b235692783 --- /dev/null +++ b/e2e/cypress/tests/integration/playbooks/runs/rdp_rhs_statusupdates_spec.js @@ -0,0 +1,146 @@ +// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. + +// *************************************************************** +// - [#] indicates a test step (e.g. # Go to a page) +// - [*] indicates an assertion (e.g. * Check the title) +// *************************************************************** + +// Stage: @prod +// Group: @playbooks + +describe('runs > run details page > status update', () => { + let testTeam; + let testUser; + let testViewerUser; + let testPublicPlaybook; + let testRun; + + const getRHS = () => cy.findByRole('complementary'); + const getStatusUpdates = () => getRHS().findAllByTestId('status-update-card'); + + before(() => { + cy.apiInitSetup().then(({team, user}) => { + testTeam = team; + testUser = user; + + // Create another user in the same team + cy.apiCreateUser().then(({user: viewer}) => { + testViewerUser = viewer; + cy.apiAddUserToTeam(testTeam.id, testViewerUser.id); + }); + + // # Login as testUser + cy.apiLogin(testUser); + + // # Create a public playbook + cy.apiCreatePlaybook({ + teamId: testTeam.id, + title: 'Public Playbook', + memberIDs: [], + }).then((playbook) => { + testPublicPlaybook = playbook; + }); + }); + }); + + beforeEach(() => { + // # Size the viewport to show the RHS without covering posts. + cy.viewport('macbook-13'); + + // # Login as testUser + cy.apiLogin(testUser); + + cy.apiRunPlaybook({ + teamId: testTeam.id, + playbookId: testPublicPlaybook.id, + playbookRunName: 'the run name', + ownerUserId: testUser.id, + }).then((playbookRun) => { + testRun = playbookRun; + + // # Visit the playbook run + cy.visit(`/playbooks/runs/${playbookRun.id}`); + }); + }); + + describe('as participant', () => { + it('rhs can not be open when there is no updates', () => { + // * Assert that the link is not present + cy.findByTestId('run-statusupdate-section').findByText('View all updates').should('not.exist'); + }); + + it('link opens the RHS when there are updates', () => { + cy.apiUpdateStatus({ + playbookRunId: testRun.id, + message: 'message 1', + reminder: 300, + }); + cy.apiUpdateStatus({ + playbookRunId: testRun.id, + message: 'message 2', + reminder: 300, + }); + + // # Click View all updates link + cy.findByTestId('run-statusupdate-section').findByText('View all updates').click(); + + // * Assert RHS is open and have the correct title/subtitle + getRHS().should('be.visible'); + getRHS().findByTestId('rhs-title').contains('Status updates'); + getRHS().findByTestId('rhs-subtitle').contains(testRun.name); + + // * Assert that we have both updates in reverse order + getStatusUpdates().should('have.length', 2); + getStatusUpdates().eq(0).contains('message 2'); + getStatusUpdates().eq(0).contains(testUser.username); + getStatusUpdates().eq(1).contains('message 1'); + getStatusUpdates().eq(1).contains(testUser.username); + }); + }); + + describe('as viewer', () => { + beforeEach(() => { + cy.apiLogin(testViewerUser).then(() => { + cy.visit(`/playbooks/runs/${testRun.id}`); + }); + }); + + it('rhs can not be open when there is no updates', () => { + // * Assert that the link is not present + cy.findByTestId('run-statusupdate-section').findByText('View all updates').should('not.exist'); + }); + + it('link opens the RHS when there are updates', () => { + cy.apiLogin(testUser).then(() => { + cy.apiUpdateStatus({ + playbookRunId: testRun.id, + message: 'message 1', + reminder: 300, + }); + cy.apiUpdateStatus({ + playbookRunId: testRun.id, + message: 'message 2', + reminder: 300, + }); + }); + + cy.apiLogin(testViewerUser).then(() => { + // # Click View all updates link + cy.findByTestId('run-statusupdate-section').findByText('View all updates').click(); + + // * Assert RHS is open and have the correct title/subtitle + getRHS().should('be.visible'); + getRHS().findByTestId('rhs-title').contains('Status updates'); + getRHS().findByTestId('rhs-subtitle').contains(testRun.name); + + // * Assert that we have both updates in reverse order + getStatusUpdates().should('have.length', 2); + getStatusUpdates().eq(0).contains('message 2'); + getStatusUpdates().eq(0).contains(testUser.username); + getStatusUpdates().eq(1).contains('message 1'); + getStatusUpdates().eq(1).contains(testUser.username); + }); + }); + }); +}); diff --git a/e2e/cypress/tests/integration/playbooks/runs/taskinbox_spec.js b/e2e/cypress/tests/integration/playbooks/runs/taskinbox_spec.js new file mode 100644 index 0000000000..e29c5a6123 --- /dev/null +++ b/e2e/cypress/tests/integration/playbooks/runs/taskinbox_spec.js @@ -0,0 +1,215 @@ +// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. + +// *************************************************************** +// - [#] indicates a test step (e.g. # Go to a page) +// - [*] indicates an assertion (e.g. * Check the title) +// *************************************************************** + +// Stage: @prod +// Group: @playbooks + +describe('Task Inbox >', () => { + let testTeam; + let testUser; + + let testViewerUser; + let testPublicPlaybook; + let testRun; + + before(() => { + cy.apiInitSetup().then(({team, user}) => { + testTeam = team; + testUser = user; + + cy.apiCreateCustomAdmin().then(({sysadmin: adminUser}) => { + cy.apiAddUserToTeam(testTeam.id, adminUser.id); + }); + + // Create another user in the same team + cy.apiCreateUser().then(({user: viewer}) => { + testViewerUser = viewer; + cy.apiAddUserToTeam(testTeam.id, testViewerUser.id); + }); + + // # Login as testUser + cy.apiLogin(testUser); + + // # Create a public playbook + cy.apiCreatePlaybook({ + teamId: testTeam.id, + title: 'Public Playbook', + checklists: [ + { + title: 'Stage 1', + items: [ + {title: 'Step 1'}, + {title: 'Step 2'}, + {title: 'Step 3'}, + {title: 'Step 4'}, + ], + }, + ], + memberIDs: [], + }).then((playbook) => { + testPublicPlaybook = playbook; + + cy.apiRunPlaybook({ + teamId: testTeam.id, + playbookId: testPublicPlaybook.id, + playbookRunName: 'the run name', + ownerUserId: testUser.id, + }).then((playbookRun) => { + testRun = playbookRun; + cy.apiChangeChecklistItemAssignee(testRun.id, 0, 0, testUser.id); + }); + }); + }); + }); + + beforeEach(() => { + // # Size the viewport to show the RHS without covering posts. + cy.viewport('macbook-13'); + + // # Login as testUser + cy.apiLogin(testUser); + + cy.visit(`/playbooks/runs/${testRun.id}`); + cy.gqlInterceptQuery('PlaybookLHS'); + cy.wait('@gqlPlaybookLHS').wait('@gqlPlaybookLHS'); + cy.assertRunDetailsPageRenderComplete(testUser.username); + }); + + const getRHS = () => cy.get('#playbooks-backstage-sidebar-right'); + + it('icon in global header, with experimental feature flag', () => { + // # Enable experimental feature flag + cy.apiAdminLogin().then(() => { + cy.apiEnsureFeatureFlag('enableexperimentalfeatures', true); + + // # Login as testUser + cy.apiLogin(testUser); + }); + + // # Visit the playbooks product + cy.visit('/playbooks'); + + // # Verify icon present in global header icon to open + cy.findByTestId('header-task-inbox-icon').click(); + }); + + it('icon in global header, without experimental feature flag', () => { + // # Disable experimental feature flag + cy.apiAdminLogin().then(() => { + cy.apiEnsureFeatureFlag('enableexperimentalfeatures', false); + + // # Login as testUser + cy.apiLogin(testUser); + }); + + // # Visit the playbooks product + cy.visit('/playbooks'); + + // # Verify icon present in global header icon to open + cy.findByTestId('header-task-inbox-icon').click(); + }); + + it('icon toggles taskinbox view', () => { + // # Intercept all calls to telemetry + cy.interceptTelemetry(); + + // # Click on global header icon to open + cy.findByTestId('header-task-inbox-icon').click(); + + // * assert RHS is shown + getRHS().should('be.visible'); + + // * assert telemetry pageview + cy.expectTelemetryToContain([ + { + name: 'task_inbox', + type: 'page', + }, + ]); + + // * assert zero case + getRHS().within(() => { + cy.getStyledComponent('HeaderTitle').contains('Your tasks'); + cy.getStyledComponent('Body').contains('1 assigned'); + }); + + // # Click on global header icon to close + cy.findByTestId('header-task-inbox-icon').click(); + + // * assert RHS is not shown + getRHS().should('not.exist'); + }); + + it('show unassigned tasks from runs I own', () => { + // # Click on global header icon to open + cy.findByTestId('header-task-inbox-icon').click(); + + // * assert 4 tasks are shown (all tasks from runs I own enabled by default) + getRHS().within(() => { + cy.getStyledComponent('TaskList').within(() => { + cy.getStyledComponent('Container').should('have.length', 4); + }); + }); + }); + + it('show only assigned tasks', () => { + // # Click on global header icon to open + cy.findByTestId('header-task-inbox-icon').click(); + + getRHS().within(() => { + cy.getStyledComponent('TaskList').within(() => { + // * assert 4 tasks are shown + cy.getStyledComponent('Container').should('have.length', 4); + }); + + // # Click on filters + cy.findByText('Filters').click(); + }); + + // # Deactivate show alltasks + cy.findByText('Show all tasks from runs I own').click(); + + cy.getStyledComponent('TaskList').within(() => { + // * assert 1 tasks are shown + cy.getStyledComponent('Container').should('have.length', 1); + }); + }); + + it('tasks can be checked', () => { + // # Click on global header icon to open + cy.findByTestId('header-task-inbox-icon').click(); + + getRHS().within(() => { + cy.getStyledComponent('TaskList').within(() => { + // * assert 4 tasks are shown + cy.getStyledComponent('Container').should('have.length', 4); + + // # Check the first task + cy.getStyledComponent('Container').eq(0).within(() => { + cy.get('input').click(); + }); + + // * assert 3 tasks are shown + cy.getStyledComponent('Container').should('have.length', 3); + }); + + // # Click on filters + cy.findByText('Filters').click(); + }); + + // # Activate checked task visibility in filters + cy.findByText('Show checked tasks').click(); + + getRHS().within(() => { + cy.getStyledComponent('TaskList').within(() => { + // * assert 4 tasks are shown + cy.getStyledComponent('Container').should('have.length', 4); + }); + }); + }); +}); diff --git a/e2e/cypress/tests/integration/playbooks/tours_spec_ignore_.js b/e2e/cypress/tests/integration/playbooks/tours_spec_ignore_.js new file mode 100644 index 0000000000..5d268e11f6 --- /dev/null +++ b/e2e/cypress/tests/integration/playbooks/tours_spec_ignore_.js @@ -0,0 +1,121 @@ +// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. + +// *************************************************************** +// - [#] indicates a test step (e.g. # Go to a page) +// - [*] indicates an assertion (e.g. * Check the title) +// *************************************************************** + +// Stage: @prod +// Group: @playbooks + +describe('playbook tour points', () => { + let testTeam; + let testUser; + let testSysadmin; + beforeEach(() => { + cy.apiInitSetup({promoteNewUserAsAdmin: true}).then(({team, user: sysadmin}) => { + testTeam = team; + testSysadmin = sysadmin; + + // # Create a user with tutorials enabled + cy.apiCreateUser({bypassTutorial: false}).then(({user: userWithTours}) => { + testUser = userWithTours; + cy.apiAddUserToTeam(team.id, testUser.id); + cy.apiLogin(userWithTours); + }); + }); + }); + + afterEach(() => { + // # Ensure apiInitSetup() can run again + cy.apiLogin(testSysadmin); + }); + + it('creation tour', () => { + // # Open creation view from RHS + cy.visit(`/${testTeam.name}/channels/town-square`); + cy.get('#incidentIcon').click({force: true}); + cy.findByRole('button', {name: /create playbook/i}).click(); + cy.url().should('contain', '/playbooks/playbooks/new'); + + // * Verify the tutorial steps + cy.contains('Create and assign tasks').should('be.visible'); + cy.findByRole('button', {name: /next/i}).click(); + + cy.contains('Set up assumptions').should('be.visible'); + cy.findByRole('button', {name: /next/i}).click(); + + cy.contains('Keep stakeholders updated').should('be.visible'); + cy.findByRole('button', {name: /next/i}).click(); + + cy.contains('Learn AND reflect').should('be.visible'); + cy.findByRole('button', {name: /done/i}).click(); + }); + + it('preview tour', () => { + // # Make a playbook to preview + cy.apiCreatePlaybook({ + teamId: testTeam.id, + title: 'Preview Tour Test Playbook', + memberIDs: [], + }).then(() => { + // # Open the playbook + cy.visit('/playbooks/playbooks'); + cy.findByText('Preview Tour Test Playbook').click(); + + // * Verify the tutorial steps + cy.contains('Welcome to the playbook preview page!').should('be.visible'); + cy.findByRole('button', {name: /next/i}).click(); + + cy.contains('different sections of the playbook').should('be.visible'); + cy.findByRole('button', {name: /next/i}).click(); + + cy.contains('Ready to run your playbook?').should('be.visible'); + cy.findByRole('button', {name: /done/i}).click(); + }); + }); + + describe('run tour', () => { + beforeEach(() => { + // # Disable the preview tour which we would otherwise see + cy.apiSaveUserPreference([{ + user_id: testUser.id, + category: 'playbook_preview', + name: testUser.id, + value: '999', + }], testUser.id); + + // # Start a run from the tutorial template + cy.visit('/playbooks/playbooks'); + cy.findByText('Learn how to use playbooks').click(); + cy.findByRole('button', {name: /run playbook/i}).click({force: true}); + + // * Verify the tour confirmation modal is shown (other tours don't have one) + cy.contains('auto-created your run').should('be.visible'); + }); + + it('follows the tour when chosen from modal', () => { + // # Accept the tour + cy.contains('quick tour').click(); + + // * Verify the tutorial steps + cy.contains('See who is involved').should('be.visible'); + cy.findByRole('button', {name: /next/i}).click(); + + cy.contains('Post status updates').should('be.visible'); + cy.findByRole('button', {name: /next/i}).click(); + + cy.contains('Track progress and ownership').should('be.visible'); + cy.findByRole('button', {name: /done/i}).click(); + }); + + it('does not follow the tour when dismissed from modal', () => { + // # Dismiss the tour + cy.findByRole('button', {name: /let me explore/i}).click(); + + // * Verify the first step is _not_ shown + cy.contains('See who is involved').should('not.exist'); + }); + }); +}); diff --git a/webapp/channels/e2e/cypress/tests/plugins/client_request.js b/e2e/cypress/tests/plugins/client_request.js similarity index 100% rename from webapp/channels/e2e/cypress/tests/plugins/client_request.js rename to e2e/cypress/tests/plugins/client_request.js diff --git a/webapp/channels/e2e/cypress/tests/plugins/db_request.js b/e2e/cypress/tests/plugins/db_request.js similarity index 100% rename from webapp/channels/e2e/cypress/tests/plugins/db_request.js rename to e2e/cypress/tests/plugins/db_request.js diff --git a/webapp/channels/e2e/cypress/tests/plugins/external_request.ts b/e2e/cypress/tests/plugins/external_request.ts similarity index 100% rename from webapp/channels/e2e/cypress/tests/plugins/external_request.ts rename to e2e/cypress/tests/plugins/external_request.ts diff --git a/webapp/channels/e2e/cypress/tests/plugins/file_util.js b/e2e/cypress/tests/plugins/file_util.js similarity index 100% rename from webapp/channels/e2e/cypress/tests/plugins/file_util.js rename to e2e/cypress/tests/plugins/file_util.js diff --git a/webapp/channels/e2e/cypress/tests/plugins/get_pdf_content.js b/e2e/cypress/tests/plugins/get_pdf_content.js similarity index 100% rename from webapp/channels/e2e/cypress/tests/plugins/get_pdf_content.js rename to e2e/cypress/tests/plugins/get_pdf_content.js diff --git a/webapp/channels/e2e/cypress/tests/plugins/get_recent_email.js b/e2e/cypress/tests/plugins/get_recent_email.js similarity index 100% rename from webapp/channels/e2e/cypress/tests/plugins/get_recent_email.js rename to e2e/cypress/tests/plugins/get_recent_email.js diff --git a/webapp/channels/e2e/cypress/tests/plugins/index.js b/e2e/cypress/tests/plugins/index.js similarity index 100% rename from webapp/channels/e2e/cypress/tests/plugins/index.js rename to e2e/cypress/tests/plugins/index.js diff --git a/webapp/channels/e2e/cypress/tests/plugins/keycloak_request.js b/e2e/cypress/tests/plugins/keycloak_request.js similarity index 100% rename from webapp/channels/e2e/cypress/tests/plugins/keycloak_request.js rename to e2e/cypress/tests/plugins/keycloak_request.js diff --git a/webapp/channels/e2e/cypress/tests/plugins/okta_request.js b/e2e/cypress/tests/plugins/okta_request.js similarity index 100% rename from webapp/channels/e2e/cypress/tests/plugins/okta_request.js rename to e2e/cypress/tests/plugins/okta_request.js diff --git a/webapp/channels/e2e/cypress/tests/plugins/post_bot_message.js b/e2e/cypress/tests/plugins/post_bot_message.js similarity index 100% rename from webapp/channels/e2e/cypress/tests/plugins/post_bot_message.js rename to e2e/cypress/tests/plugins/post_bot_message.js diff --git a/webapp/channels/e2e/cypress/tests/plugins/post_incoming_webhook.js b/e2e/cypress/tests/plugins/post_incoming_webhook.js similarity index 100% rename from webapp/channels/e2e/cypress/tests/plugins/post_incoming_webhook.js rename to e2e/cypress/tests/plugins/post_incoming_webhook.js diff --git a/webapp/channels/e2e/cypress/tests/plugins/post_list_of_messages.js b/e2e/cypress/tests/plugins/post_list_of_messages.js similarity index 100% rename from webapp/channels/e2e/cypress/tests/plugins/post_list_of_messages.js rename to e2e/cypress/tests/plugins/post_list_of_messages.js diff --git a/webapp/channels/e2e/cypress/tests/plugins/post_message_as.js b/e2e/cypress/tests/plugins/post_message_as.js similarity index 100% rename from webapp/channels/e2e/cypress/tests/plugins/post_message_as.js rename to e2e/cypress/tests/plugins/post_message_as.js diff --git a/webapp/channels/e2e/cypress/tests/plugins/react_to_message_as.js b/e2e/cypress/tests/plugins/react_to_message_as.js similarity index 100% rename from webapp/channels/e2e/cypress/tests/plugins/react_to_message_as.js rename to e2e/cypress/tests/plugins/react_to_message_as.js diff --git a/webapp/channels/e2e/cypress/tests/plugins/shell.js b/e2e/cypress/tests/plugins/shell.js similarity index 100% rename from webapp/channels/e2e/cypress/tests/plugins/shell.js rename to e2e/cypress/tests/plugins/shell.js diff --git a/webapp/channels/e2e/cypress/tests/plugins/url_health_check.js b/e2e/cypress/tests/plugins/url_health_check.js similarity index 100% rename from webapp/channels/e2e/cypress/tests/plugins/url_health_check.js rename to e2e/cypress/tests/plugins/url_health_check.js diff --git a/webapp/channels/e2e/cypress/tests/support/api/bots.d.ts b/e2e/cypress/tests/support/api/bots.d.ts similarity index 100% rename from webapp/channels/e2e/cypress/tests/support/api/bots.d.ts rename to e2e/cypress/tests/support/api/bots.d.ts diff --git a/webapp/channels/e2e/cypress/tests/support/api/bots.js b/e2e/cypress/tests/support/api/bots.js similarity index 100% rename from webapp/channels/e2e/cypress/tests/support/api/bots.js rename to e2e/cypress/tests/support/api/bots.js diff --git a/webapp/channels/e2e/cypress/tests/support/api/brand.d.ts b/e2e/cypress/tests/support/api/brand.d.ts similarity index 100% rename from webapp/channels/e2e/cypress/tests/support/api/brand.d.ts rename to e2e/cypress/tests/support/api/brand.d.ts diff --git a/webapp/channels/e2e/cypress/tests/support/api/brand.js b/e2e/cypress/tests/support/api/brand.js similarity index 100% rename from webapp/channels/e2e/cypress/tests/support/api/brand.js rename to e2e/cypress/tests/support/api/brand.js diff --git a/webapp/channels/e2e/cypress/tests/support/api/channel.d.ts b/e2e/cypress/tests/support/api/channel.d.ts similarity index 100% rename from webapp/channels/e2e/cypress/tests/support/api/channel.d.ts rename to e2e/cypress/tests/support/api/channel.d.ts diff --git a/webapp/channels/e2e/cypress/tests/support/api/channel.js b/e2e/cypress/tests/support/api/channel.js similarity index 100% rename from webapp/channels/e2e/cypress/tests/support/api/channel.js rename to e2e/cypress/tests/support/api/channel.js diff --git a/webapp/channels/e2e/cypress/tests/support/api/cloud.d.ts b/e2e/cypress/tests/support/api/cloud.d.ts similarity index 100% rename from webapp/channels/e2e/cypress/tests/support/api/cloud.d.ts rename to e2e/cypress/tests/support/api/cloud.d.ts diff --git a/webapp/channels/e2e/cypress/tests/support/api/cloud.js b/e2e/cypress/tests/support/api/cloud.js similarity index 100% rename from webapp/channels/e2e/cypress/tests/support/api/cloud.js rename to e2e/cypress/tests/support/api/cloud.js diff --git a/webapp/channels/e2e/cypress/tests/support/api/cloud_default_config.json b/e2e/cypress/tests/support/api/cloud_default_config.json similarity index 100% rename from webapp/channels/e2e/cypress/tests/support/api/cloud_default_config.json rename to e2e/cypress/tests/support/api/cloud_default_config.json diff --git a/webapp/channels/e2e/cypress/tests/support/api/cluster.d.ts b/e2e/cypress/tests/support/api/cluster.d.ts similarity index 100% rename from webapp/channels/e2e/cypress/tests/support/api/cluster.d.ts rename to e2e/cypress/tests/support/api/cluster.d.ts diff --git a/webapp/channels/e2e/cypress/tests/support/api/cluster.js b/e2e/cypress/tests/support/api/cluster.js similarity index 100% rename from webapp/channels/e2e/cypress/tests/support/api/cluster.js rename to e2e/cypress/tests/support/api/cluster.js diff --git a/webapp/channels/e2e/cypress/tests/support/api/common.d.ts b/e2e/cypress/tests/support/api/common.d.ts similarity index 100% rename from webapp/channels/e2e/cypress/tests/support/api/common.d.ts rename to e2e/cypress/tests/support/api/common.d.ts diff --git a/webapp/channels/e2e/cypress/tests/support/api/common.js b/e2e/cypress/tests/support/api/common.js similarity index 100% rename from webapp/channels/e2e/cypress/tests/support/api/common.js rename to e2e/cypress/tests/support/api/common.js diff --git a/webapp/channels/e2e/cypress/tests/support/api/data_retention.d.ts b/e2e/cypress/tests/support/api/data_retention.d.ts similarity index 100% rename from webapp/channels/e2e/cypress/tests/support/api/data_retention.d.ts rename to e2e/cypress/tests/support/api/data_retention.d.ts diff --git a/webapp/channels/e2e/cypress/tests/support/api/data_retention.js b/e2e/cypress/tests/support/api/data_retention.js similarity index 100% rename from webapp/channels/e2e/cypress/tests/support/api/data_retention.js rename to e2e/cypress/tests/support/api/data_retention.js diff --git a/webapp/channels/e2e/cypress/tests/support/api/helpers.js b/e2e/cypress/tests/support/api/helpers.js similarity index 100% rename from webapp/channels/e2e/cypress/tests/support/api/helpers.js rename to e2e/cypress/tests/support/api/helpers.js diff --git a/webapp/channels/e2e/cypress/tests/support/api/index.js b/e2e/cypress/tests/support/api/index.js similarity index 95% rename from webapp/channels/e2e/cypress/tests/support/api/index.js rename to e2e/cypress/tests/support/api/index.js index 5e522c47a6..e9edc95e1b 100644 --- a/webapp/channels/e2e/cypress/tests/support/api/index.js +++ b/e2e/cypress/tests/support/api/index.js @@ -7,8 +7,10 @@ import './channel'; import './cloud'; import './cluster'; import './common'; +import './data_retention'; import './keycloak'; import './ldap'; +import './playbooks'; import './preference'; import './plugin'; import './role'; @@ -20,4 +22,3 @@ import './system'; import './team'; import './user'; import './webhooks'; -import './data_retention'; diff --git a/webapp/channels/e2e/cypress/tests/support/api/keycloak.d.ts b/e2e/cypress/tests/support/api/keycloak.d.ts similarity index 100% rename from webapp/channels/e2e/cypress/tests/support/api/keycloak.d.ts rename to e2e/cypress/tests/support/api/keycloak.d.ts diff --git a/webapp/channels/e2e/cypress/tests/support/api/keycloak.js b/e2e/cypress/tests/support/api/keycloak.js similarity index 100% rename from webapp/channels/e2e/cypress/tests/support/api/keycloak.js rename to e2e/cypress/tests/support/api/keycloak.js diff --git a/webapp/channels/e2e/cypress/tests/support/api/keycloak_realm.json b/e2e/cypress/tests/support/api/keycloak_realm.json similarity index 100% rename from webapp/channels/e2e/cypress/tests/support/api/keycloak_realm.json rename to e2e/cypress/tests/support/api/keycloak_realm.json diff --git a/webapp/channels/e2e/cypress/tests/support/api/ldap.d.ts b/e2e/cypress/tests/support/api/ldap.d.ts similarity index 100% rename from webapp/channels/e2e/cypress/tests/support/api/ldap.d.ts rename to e2e/cypress/tests/support/api/ldap.d.ts diff --git a/webapp/channels/e2e/cypress/tests/support/api/ldap.js b/e2e/cypress/tests/support/api/ldap.js similarity index 100% rename from webapp/channels/e2e/cypress/tests/support/api/ldap.js rename to e2e/cypress/tests/support/api/ldap.js diff --git a/webapp/channels/e2e/cypress/tests/support/api/on_prem_default_config.json b/e2e/cypress/tests/support/api/on_prem_default_config.json similarity index 99% rename from webapp/channels/e2e/cypress/tests/support/api/on_prem_default_config.json rename to e2e/cypress/tests/support/api/on_prem_default_config.json index 88e6ac0f74..1f397e1cc2 100644 --- a/webapp/channels/e2e/cypress/tests/support/api/on_prem_default_config.json +++ b/e2e/cypress/tests/support/api/on_prem_default_config.json @@ -369,7 +369,8 @@ "ClientSideCertCheck": "secondary", "LinkMetadataTimeoutMilliseconds": 5000, "RestrictSystemAdmin": false, - "UseNewSAMLLibrary": false + "UseNewSAMLLibrary": false, + "EnableAppBar": true }, "AnalyticsSettings": { "MaxUsersForStatistics": 2500 diff --git a/e2e/cypress/tests/support/api/playbooks.js b/e2e/cypress/tests/support/api/playbooks.js new file mode 100644 index 0000000000..553eb1f376 --- /dev/null +++ b/e2e/cypress/tests/support/api/playbooks.js @@ -0,0 +1,491 @@ +// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. + +const playbookRunsEndpoint = '/plugins/playbooks/api/v0/runs'; + +const StatusOK = 200; +const StatusCreated = 201; + +/** + * Get all playbook runs directly via API + */ +Cypress.Commands.add('apiGetAllPlaybookRuns', (teamId) => { + return cy.request({ + headers: {'X-Requested-With': 'XMLHttpRequest'}, + url: '/plugins/playbooks/api/v0/runs', + qs: {team_id: teamId, per_page: 10000}, + method: 'GET', + }).then((response) => { + expect(response.status).to.equal(StatusOK); + cy.wrap(response); + }); +}); + +/** + * Get all InProgress playbook runs directly via API + */ +Cypress.Commands.add('apiGetAllInProgressPlaybookRuns', (teamId, userId = '') => { + return cy.request({ + headers: {'X-Requested-With': 'XMLHttpRequest'}, + url: '/plugins/playbooks/api/v0/runs', + qs: {team_id: teamId, status: 'InProgress', participant_id: userId}, + method: 'GET', + }).then((response) => { + expect(response.status).to.equal(StatusOK); + cy.wrap(response); + }); +}); + +/** + * Get playbook run by name directly via API + */ +Cypress.Commands.add('apiGetPlaybookRunByName', (teamId, name) => { + return cy.request({ + headers: {'X-Requested-With': 'XMLHttpRequest'}, + url: '/plugins/playbooks/api/v0/runs', + qs: {team_id: teamId, search_term: name}, + method: 'GET', + }).then((response) => { + expect(response.status).to.equal(StatusOK); + cy.wrap(response); + }); +}); + +/** + * Get a playbook run directly via API + * @param {String} playbookRunId + * All parameters required + */ +Cypress.Commands.add('apiGetPlaybookRun', (playbookRunId) => { + return cy.request({ + headers: {'X-Requested-With': 'XMLHttpRequest'}, + url: `${playbookRunsEndpoint}/${playbookRunId}`, + method: 'GET', + }).then((response) => { + expect(response.status).to.equal(StatusOK); + cy.wrap(response); + }); +}); + +/** + * Start a playbook run directly via API. + */ +Cypress.Commands.add('apiRunPlaybook', ( + { + teamId, + playbookId, + playbookRunName, + ownerUserId, + channelId, + description, + }, options) => { + return cy.request({ + headers: {'X-Requested-With': 'XMLHttpRequest'}, + url: playbookRunsEndpoint, + method: 'POST', + body: { + name: playbookRunName, + owner_user_id: ownerUserId, + team_id: teamId, + playbook_id: playbookId, + channel_id: channelId, + description, + }, + failOnStatusCode: !(options?.expectedStatusCode), + }).then((response) => { + const statusCode = options?.expectedStatusCode || StatusCreated; + expect(response.status).to.equal(statusCode); + cy.wrap(response.body); + }); +}); + +// Finish a playbook's run programmaticially. Uses currently logged in user, so that user must +// have edit permissions on the run +Cypress.Commands.add('apiFinishRun', (playbookRunId) => { + return cy.request({ + headers: {'X-Requested-With': 'XMLHttpRequest'}, + url: `${playbookRunsEndpoint}/${playbookRunId}/finish`, + method: 'PUT', + }).then((response) => { + expect(response.status).to.equal(StatusOK); + cy.wrap(response.body); + }); +}); + +// Update a playbook run's status programmatically. +Cypress.Commands.add('apiUpdateStatus', ( + { + playbookRunId, + message, + reminder = 300, + }) => { + return cy.request({ + headers: {'X-Requested-With': 'XMLHttpRequest'}, + url: `${playbookRunsEndpoint}/${playbookRunId}/status`, + method: 'POST', + body: { + message, + reminder, + }, + }).then((response) => { + expect(response.status).to.equal(StatusOK); + cy.wrap(response.body); + }); +}); + +/** + * Change the owner of a playbook run directly via API + * @param {String} playbookRunId + * @param {String} userId + * All parameters required + */ +Cypress.Commands.add('apiChangePlaybookRunOwner', (playbookRunId, userId) => { + return cy.request({ + headers: {'X-Requested-With': 'XMLHttpRequest'}, + url: playbookRunsEndpoint + '/' + playbookRunId + '/owner', + method: 'POST', + body: { + owner_id: userId, + }, + }).then((response) => { + expect(response.status).to.equal(StatusOK); + cy.wrap(response); + }); +}); + +/** + * Change the assignee of a checklist item directly via API + * @param {String} playbookRunId + * @param {String} checklistId + * @param {String} itemId + * @param {String} userId + * All parameters required + */ +Cypress.Commands.add('apiChangeChecklistItemAssignee', (playbookRunId, checklistId, itemId, userId) => { + return cy.request({ + headers: {'X-Requested-With': 'XMLHttpRequest'}, + url: playbookRunsEndpoint + `/${playbookRunId}/checklists/${checklistId}/item/${itemId}/assignee`, + method: 'PUT', + body: { + assignee_id: userId, + }, + }).then((response) => { + expect(response.status).to.equal(StatusOK); + cy.wrap(response); + }); +}); + +/** + * Check a checklist item directly via API + * @param {String} playbookRunId + * @param {String} checklistId + * @param {String} itemId + * @param {String} state ('' or 'closed') + */ +Cypress.Commands.add('apiSetChecklistItemState', (playbookRunId, checklistId, itemId, state) => { + return cy.request({ + headers: {'X-Requested-With': 'XMLHttpRequest'}, + url: playbookRunsEndpoint + `/${playbookRunId}/checklists/${checklistId}/item/${itemId}/state`, + method: 'PUT', + body: { + new_state: state, + }, + }).then((response) => { + expect(response.status).to.equal(StatusOK); + cy.wrap(response); + }); +}); + +// Verify playbook run is created +Cypress.Commands.add('verifyPlaybookRunActive', (teamId, playbookRunName, playbookRunDescription) => { + cy.apiGetPlaybookRunByName(teamId, playbookRunName).then((response) => { + const returnedPlaybookRuns = response.body; + const playbookRun = returnedPlaybookRuns.items.find((inc) => inc.name === playbookRunName); + assert.isDefined(playbookRun); + assert.equal(playbookRun.end_at, 0); + assert.equal(playbookRun.name, playbookRunName); + + cy.log('test 1'); + + // Only check the description if provided. The server may supply a default depending + // on how the playbook run was started. + if (playbookRunDescription) { + assert.equal(playbookRun.description, playbookRunDescription); + } + }); +}); + +// Verify playbook run exists but is not active +Cypress.Commands.add('verifyPlaybookRunEnded', (teamId, playbookRunName) => { + cy.apiGetPlaybookRunByName(teamId, playbookRunName).then((response) => { + const returnedPlaybookRuns = response.body; + const playbookRun = returnedPlaybookRuns.items.find((inc) => inc.name === playbookRunName); + assert.isDefined(playbookRun); + assert.notEqual(playbookRun.end_at, 0); + }); +}); + +// Create a playbook programmatically. +Cypress.Commands.add('apiCreatePlaybook', ( + { + teamId, + title, + description, + createPublicPlaybookRun, + createChannelMemberOnNewParticipant = true, + checklists, + memberIDs, + makePublic = true, + broadcastEnabled, + broadcastChannelIds, + reminderMessageTemplate, + reminderTimerDefaultSeconds = 24 * 60 * 60, // 24 hours + statusUpdateEnabled = true, + retrospectiveReminderIntervalSeconds, + retrospectiveTemplate, + retrospectiveEnabled = true, + invitedUserIds, + inviteUsersEnabled, + defaultOwnerId, + defaultOwnerEnabled, + announcementChannelId, + announcementChannelEnabled, + webhookOnCreationURLs, + webhookOnCreationEnabled, + webhookOnStatusUpdateURLs, + webhookOnStatusUpdateEnabled, + messageOnJoin, + messageOnJoinEnabled, + signalAnyKeywords, + signalAnyKeywordsEnabled, + channelNameTemplate, + runSummaryTemplate, + runSummaryTemplateEnabled, + channelMode = 'create_new_channel', + channelId = '', + metrics, + }) => { + return cy.request({ + headers: {'X-Requested-With': 'XMLHttpRequest'}, + url: '/plugins/playbooks/api/v0/playbooks', + method: 'POST', + body: { + title, + description, + team_id: teamId, + create_public_playbook_run: createPublicPlaybookRun, + create_channel_member_on_new_participant: createChannelMemberOnNewParticipant, + checklists, + public: makePublic, + members: memberIDs?.map((val) => ({user_id: val, roles: ['playbook_member', 'playbook_admin']})), + broadcast_enabled: broadcastEnabled, + broadcast_channel_ids: broadcastChannelIds, + reminder_message_template: reminderMessageTemplate, + reminder_timer_default_seconds: reminderTimerDefaultSeconds, + status_update_enabled: statusUpdateEnabled, + retrospective_reminder_interval_seconds: retrospectiveReminderIntervalSeconds, + retrospective_template: retrospectiveTemplate, + retrospective_enabled: retrospectiveEnabled, + invited_user_ids: invitedUserIds, + invite_users_enabled: inviteUsersEnabled, + default_owner_id: defaultOwnerId, + default_owner_enabled: defaultOwnerEnabled, + announcement_channel_id: announcementChannelId, + announcement_channel_enabled: announcementChannelEnabled, + webhook_on_creation_urls: webhookOnCreationURLs, + webhook_on_creation_enabled: webhookOnCreationEnabled, + webhook_on_status_update_urls: webhookOnStatusUpdateURLs, + webhook_on_status_update_enabled: webhookOnStatusUpdateEnabled, + message_on_join: messageOnJoin, + message_on_join_enabled: messageOnJoinEnabled, + signal_any_keywords: signalAnyKeywords, + signal_any_keywords_enabled: signalAnyKeywordsEnabled, + channel_name_template: channelNameTemplate, + run_summary_template: runSummaryTemplate, + run_summary_template_enabled: runSummaryTemplateEnabled, + channel_mode: channelMode, + channel_id: channelId, + metrics, + }, + }).then((response) => { + expect(response.status).to.equal(201); + cy.wrap(response.headers.location); + }).then((location) => { + cy.request({ + url: location, + method: 'GET', + }).then((response) => { + cy.wrap(response.body); + }); + }); +}); + +// Create a test playbook programmatically. +Cypress.Commands.add('apiCreateTestPlaybook', ( + { + teamId, + title, + userId, + broadcastEnabled, + broadcastChannelIds, + reminderMessageTemplate, + checklists, + inviteUsersEnabled, + reminderTimerDefaultSeconds = 24 * 60 * 60, // 24 hours + otherMembers = [], + invitedUserIds = [], + channelNameTemplate = '', + }) => ( + cy.apiCreatePlaybook({ + teamId, + title, + checklists: checklists || [{ + title: 'Stage 1', + items: [ + {title: 'Step 1'}, + {title: 'Step 2'}, + ], + }], + memberIDs: [ + userId, + ...otherMembers, + ], + broadcastEnabled, + broadcastChannelIds, + reminderMessageTemplate, + reminderTimerDefaultSeconds, + invitedUserIds, + inviteUsersEnabled, + channelNameTemplate, + createChannelMemberOnNewParticipant: true, + removeChannelMemberOnRemovedParticipant: true, + }) +)); + +// Verify that the playbook was created +Cypress.Commands.add('verifyPlaybookCreated', (teamId, playbookTitle) => ( + cy.request({ + headers: {'X-Requested-With': 'XMLHttpRequest'}, + url: '/plugins/playbooks/api/v0/playbooks', + qs: {team_id: teamId, sort: 'title', direction: 'asc'}, + method: 'GET', + }).then((response) => { + expect(response.status).to.equal(StatusOK); + const playbookResults = response.body; + const playbook = playbookResults.items.find((p) => p.title === playbookTitle); + assert.isDefined(playbook); + }) +)); + +// Get a playbook +Cypress.Commands.add('apiGetPlaybook', (playbookId) => { + return cy.request({ + headers: {'X-Requested-With': 'XMLHttpRequest'}, + url: `/plugins/playbooks/api/v0/playbooks/${playbookId}`, + method: 'GET', + }).then((response) => { + expect(response.status).to.equal(StatusOK); + cy.wrap(response.body); + }); +}); + +// Update a playbook +Cypress.Commands.add('apiUpdatePlaybook', (playbook, expectedHttpCode = StatusOK) => { + return cy.request({ + headers: {'X-Requested-With': 'XMLHttpRequest'}, + url: `/plugins/playbooks/api/v0/playbooks/${playbook.id}`, + method: 'PUT', + body: JSON.stringify(playbook), + failOnStatusCode: false, + }).then((response) => { + expect(response.status).to.equal(expectedHttpCode); + cy.wrap(response.body); + }); +}); + +// Archive a playbook +Cypress.Commands.add('apiArchivePlaybook', (playbookId) => { + return cy.request({ + headers: {'X-Requested-With': 'XMLHttpRequest'}, + url: `/plugins/playbooks/api/v0/playbooks/${playbookId}`, + method: 'DELETE', + }).then((response) => { + expect(response.status).to.equal(204); + }); +}); + +// Follow a playbook run +Cypress.Commands.add('apiFollowPlaybookRun', (playbookRunId) => { + return cy.request({ + headers: {'X-Requested-With': 'XMLHttpRequest'}, + url: `/plugins/playbooks/api/v0/runs/${playbookRunId}/followers`, + method: 'PUT', + }).then((response) => { + expect(response.status).to.equal(StatusOK); + cy.wrap(response.body); + }); +}); + +// Unfollow a playbook run +Cypress.Commands.add('apiUnfollowPlaybookRun', (playbookRunId) => { + return cy.request({ + headers: {'X-Requested-With': 'XMLHttpRequest'}, + url: `/plugins/playbooks/api/v0/runs/${playbookRunId}/followers`, + method: 'DELETE', + }).then((response) => { + expect(response.status).to.equal(StatusOK); + cy.wrap(response.body); + }); +}); + +//addUsersToRun +Cypress.Commands.add('apiAddUsersToRun', (playbookRunId, usersIds) => { + const query = ` + mutation AddRunParticipants($runID: String!, $userIDs: [String!]!) { + addRunParticipants(runID: $runID, userIDs: $userIDs) + } + `; + const vars = { + runID: playbookRunId, + userIDs: usersIds, + }; + return doGraphqlQuery(query, 'AddRunParticipants', vars).then((response) => { + expect(response.status).to.equal(StatusOK); + cy.wrap(response.body); + }); +}); + +//updateRun +Cypress.Commands.add('apiUpdateRun', (playbookRunId, updates) => { + const query = ` + mutation UpdateRun($id: String!, $updates: RunUpdates!) { + updateRun(id: $id, updates: $updates) + } + `; + const vars = { + id: playbookRunId, + updates, + }; + return doGraphqlQuery(query, 'UpdateRun', vars).then((response) => { + expect(response.status).to.equal(StatusOK); + cy.wrap(response.body); + }); +}); + +const doGraphqlQuery = (query, operationName, variables) => { + const payload = {query, operationName, variables}; + return cy.request({ + headers: {'X-Requested-With': 'XMLHttpRequest'}, + url: '/plugins/playbooks/api/v0/query', + body: JSON.stringify(payload), + method: 'POST', + }); +}; + +Cypress.Commands.add('gqlInterceptQuery', (operationName) => { + cy.intercept('/plugins/playbooks/api/v0/query', (req) => { + if (req.body?.operationName === operationName) { + req.alias = `gql${operationName}`; + } + }); +}); diff --git a/webapp/channels/e2e/cypress/tests/support/api/plugin.d.ts b/e2e/cypress/tests/support/api/plugin.d.ts similarity index 100% rename from webapp/channels/e2e/cypress/tests/support/api/plugin.d.ts rename to e2e/cypress/tests/support/api/plugin.d.ts diff --git a/webapp/channels/e2e/cypress/tests/support/api/plugin.js b/e2e/cypress/tests/support/api/plugin.js similarity index 100% rename from webapp/channels/e2e/cypress/tests/support/api/plugin.js rename to e2e/cypress/tests/support/api/plugin.js diff --git a/webapp/channels/e2e/cypress/tests/support/api/preference.d.ts b/e2e/cypress/tests/support/api/preference.d.ts similarity index 100% rename from webapp/channels/e2e/cypress/tests/support/api/preference.d.ts rename to e2e/cypress/tests/support/api/preference.d.ts diff --git a/webapp/channels/e2e/cypress/tests/support/api/preference.js b/e2e/cypress/tests/support/api/preference.js similarity index 94% rename from webapp/channels/e2e/cypress/tests/support/api/preference.js rename to e2e/cypress/tests/support/api/preference.js index 3fa8e040a8..102619ca82 100644 --- a/webapp/channels/e2e/cypress/tests/support/api/preference.js +++ b/e2e/cypress/tests/support/api/preference.js @@ -212,6 +212,17 @@ Cypress.Commands.add('apiSaveTutorialStep', (userId, value = '999') => { return cy.apiSaveUserPreference([preference], userId); }); +Cypress.Commands.add('apiSaveOnboardingPreference', (userId, name, value) => { + const preference = { + user_id: userId, + category: 'recommended_next_steps', + name, + value, + }; + + return cy.apiSaveUserPreference([preference], userId); +}); + Cypress.Commands.add('apiSaveDirectChannelShowPreference', (userId, otherUserId, value) => { const preference = { user_id: userId, @@ -223,6 +234,17 @@ Cypress.Commands.add('apiSaveDirectChannelShowPreference', (userId, otherUserId, return cy.apiSaveUserPreference([preference], userId); }); +Cypress.Commands.add('apiHideSidebarWhatsNewModalPreference', (userId, value) => { + const preference = { + user_id: userId, + category: 'whats_new_modal', + name: 'has_seen_sidebar_whats_new_modal', + value, + }; + + return cy.apiSaveUserPreference([preference], userId); +}); + Cypress.Commands.add('apiGetUserPreference', (userId) => { return cy.request(`/api/v4/users/${userId}/preferences`).then((response) => { expect(response.status).to.equal(200); diff --git a/webapp/channels/e2e/cypress/tests/support/api/role.d.ts b/e2e/cypress/tests/support/api/role.d.ts similarity index 100% rename from webapp/channels/e2e/cypress/tests/support/api/role.d.ts rename to e2e/cypress/tests/support/api/role.d.ts diff --git a/e2e/cypress/tests/support/api/role.js b/e2e/cypress/tests/support/api/role.js new file mode 100644 index 0000000000..6a8eed7082 --- /dev/null +++ b/e2e/cypress/tests/support/api/role.js @@ -0,0 +1,83 @@ +// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. + +import xor from 'lodash.xor'; + +// ***************************************************************************** +// Preferences +// https://api.mattermost.com/#tag/roles +// ***************************************************************************** + +export const defaultRolesPermissions = { + channel_admin: 'use_channel_mentions remove_reaction manage_public_channel_members use_group_mentions manage_channel_roles manage_private_channel_members add_reaction read_public_channel_groups create_post read_private_channel_groups', + channel_guest: 'upload_file edit_post create_post use_channel_mentions use_slash_commands read_channel add_reaction remove_reaction', + channel_user: 'manage_private_channel_members read_public_channel_groups delete_post read_private_channel_groups use_group_mentions manage_private_channel_properties delete_public_channel use_slash_commands add_reaction manage_public_channel_properties edit_post upload_file use_channel_mentions get_public_link read_channel delete_private_channel manage_public_channel_members create_post remove_reaction', + custom_group_user: '', + playbook_admin: 'playbook_private_manage_properties playbook_public_make_private playbook_public_manage_members playbook_public_manage_roles playbook_public_manage_properties playbook_private_manage_members playbook_private_manage_roles', + playbook_member: 'playbook_public_view playbook_public_manage_members playbook_public_manage_properties playbook_private_view playbook_private_manage_members playbook_private_manage_properties run_create', + run_admin: 'run_manage_properties run_manage_members', + run_member: 'run_view', + system_admin: 'sysconsole_write_environment_elasticsearch playbook_public_manage_properties sysconsole_write_authentication_ldap run_view manage_jobs manage_roles playbook_public_create manage_public_channel_properties sysconsole_read_plugins delete_post purge_elasticsearch_indexes sysconsole_read_integrations_bot_accounts read_data_retention_job manage_private_channel_members create_elasticsearch_post_indexing_job sysconsole_read_authentication_guest_access create_elasticsearch_post_aggregation_job join_public_teams sysconsole_read_site_public_links add_saml_idp_cert sysconsole_write_site_announcement_banner sysconsole_write_site_notices sysconsole_read_experimental_feature_flags sysconsole_read_site_users_and_teams manage_slash_commands sysconsole_read_authentication_ldap read_channel sysconsole_write_authentication_password list_users_without_team sysconsole_read_authentication_email add_saml_public_cert playbook_private_create promote_guest sysconsole_read_user_management_system_roles manage_public_channel_members create_data_retention_job add_saml_private_cert sysconsole_write_user_management_users sysconsole_read_compliance_compliance_monitoring playbook_public_manage_members sysconsole_write_environment_database sysconsole_write_user_management_teams playbook_private_manage_roles read_public_channel sysconsole_write_plugins sysconsole_read_authentication_openid sysconsole_write_user_management_groups sysconsole_write_site_file_sharing_and_downloads playbook_private_manage_properties sysconsole_read_site_customization join_public_channels add_user_to_team restore_custom_group download_compliance_export_result sysconsole_write_user_management_system_roles sysconsole_write_environment_session_lengths create_custom_group manage_private_channel_properties create_post_public remove_ldap_private_cert sysconsole_write_site_public_links import_team sysconsole_read_environment_developer sysconsole_read_environment_database sysconsole_read_environment_web_server use_channel_mentions view_team remove_others_reactions sysconsole_read_environment_session_lengths sysconsole_write_integrations_bot_accounts playbook_public_view use_group_mentions sysconsole_write_environment_web_server add_ldap_private_cert read_public_channel_groups invite_guest sysconsole_read_environment_smtp create_post sysconsole_read_about_edition_and_license sysconsole_read_authentication_signup sysconsole_read_authentication_saml sysconsole_read_environment_file_storage sysconsole_write_experimental_feature_flags sysconsole_write_site_localization sysconsole_write_environment_rate_limiting sysconsole_read_environment_rate_limiting sysconsole_read_products_boards get_saml_cert_status sysconsole_read_environment_high_availability manage_secure_connections read_compliance_export_job sysconsole_write_compliance_custom_terms_of_service read_user_access_token edit_post sysconsole_write_environment_logging sysconsole_read_environment_push_notification_server sysconsole_write_site_customization read_other_users_teams read_elasticsearch_post_aggregation_job sysconsole_write_compliance_data_retention_policy sysconsole_read_user_management_permissions sysconsole_read_site_emoji sysconsole_read_compliance_data_retention_policy read_license_information sysconsole_read_experimental_features read_deleted_posts sysconsole_read_environment_logging sysconsole_read_reporting_site_statistics test_elasticsearch sysconsole_read_site_posts add_reaction sysconsole_write_authentication_signup manage_outgoing_webhooks create_post_ephemeral sysconsole_read_environment_image_proxy invite_user manage_others_outgoing_webhooks create_user_access_token sysconsole_write_environment_image_proxy sysconsole_write_products_boards read_elasticsearch_post_indexing_job purge_bleve_indexes sysconsole_write_environment_performance_monitoring sysconsole_write_authentication_guest_access sysconsole_read_compliance_custom_terms_of_service edit_others_posts sysconsole_write_billing get_saml_metadata_from_idp sysconsole_write_authentication_saml create_post_bleve_indexes_job invalidate_caches sysconsole_write_experimental_bleve view_members manage_others_bots run_create join_private_teams convert_private_channel_to_public read_audits assign_bot read_jobs remove_user_from_team revoke_user_access_token manage_team sysconsole_read_reporting_server_logs get_public_link manage_others_slash_commands manage_system delete_public_channel read_private_channel_groups sysconsole_read_authentication_mfa delete_emojis list_private_teams create_emojis sysconsole_read_billing sysconsole_write_site_emoji invalidate_email_invite sysconsole_write_environment_file_storage sysconsole_write_compliance_compliance_monitoring remove_saml_public_cert sysconsole_read_compliance_compliance_export sysconsole_read_site_localization use_slash_commands manage_team_roles list_public_teams get_logs sysconsole_write_integrations_integration_management sysconsole_read_integrations_cors manage_oauth delete_others_emojis sysconsole_write_integrations_gif manage_incoming_webhooks sysconsole_write_authentication_email create_private_channel playbook_private_make_public manage_bots add_ldap_public_cert remove_ldap_public_cert sysconsole_write_site_notifications sysconsole_write_environment_developer playbook_private_manage_members sysconsole_read_user_management_teams edit_custom_group remove_reaction playbook_public_manage_roles sysconsole_write_reporting_server_logs read_others_bots sysconsole_write_site_posts sysconsole_read_site_notifications sysconsole_read_authentication_password playbook_private_view manage_system_wide_oauth get_analytics list_team_channels sysconsole_write_user_management_channels delete_private_channel manage_custom_group_members test_s3 create_ldap_sync_job sysconsole_read_integrations_integration_management test_site_url recycle_database_connections sysconsole_read_site_announcement_banner test_email manage_shared_channels read_bots sysconsole_write_environment_smtp sysconsole_read_experimental_bleve sysconsole_write_environment_push_notification_server sysconsole_write_user_management_permissions sysconsole_read_environment_elasticsearch sysconsole_write_reporting_site_statistics sysconsole_write_site_users_and_teams demote_to_guest create_team test_ldap remove_saml_idp_cert delete_others_posts edit_other_users sysconsole_write_reporting_team_statistics sysconsole_read_integrations_gif sysconsole_read_site_notices sysconsole_write_about_edition_and_license manage_others_incoming_webhooks run_manage_members create_bot sysconsole_write_authentication_mfa sysconsole_read_user_management_users assign_system_admin_role sysconsole_write_experimental_features edit_brand create_group_channel sysconsole_write_authentication_openid create_direct_channel manage_license_information reload_config manage_channel_roles sysconsole_read_user_management_groups create_compliance_export_job read_ldap_sync_job upload_file sysconsole_read_site_file_sharing_and_downloads delete_custom_group sysconsole_read_user_management_channels sysconsole_write_compliance_compliance_export remove_saml_private_cert sysconsole_read_environment_performance_monitoring create_public_channel sysconsole_write_integrations_cors sysconsole_write_environment_high_availability playbook_public_make_private run_manage_properties sysconsole_read_reporting_team_statistics convert_public_channel_to_private', + system_custom_group_admin: 'create_custom_group edit_custom_group delete_custom_group restore_custom_group manage_custom_group_members', + system_guest: 'create_group_channel create_direct_channel', + system_manager: ' sysconsole_read_site_announcement_banner manage_private_channel_properties edit_brand read_private_channel_groups manage_private_channel_members manage_team_roles sysconsole_write_environment_session_lengths sysconsole_read_site_emoji sysconsole_write_environment_developer sysconsole_read_user_management_groups sysconsole_write_user_management_groups sysconsole_write_environment_rate_limiting delete_private_channel sysconsole_read_environment_performance_monitoring sysconsole_read_environment_rate_limiting sysconsole_write_user_management_teams sysconsole_write_integrations_integration_management sysconsole_write_site_public_links sysconsole_read_authentication_ldap sysconsole_write_integrations_cors reload_config sysconsole_write_user_management_channels sysconsole_read_environment_high_availability sysconsole_read_site_users_and_teams sysconsole_read_user_management_teams sysconsole_write_site_users_and_teams sysconsole_read_site_customization sysconsole_write_environment_high_availability sysconsole_read_integrations_bot_accounts sysconsole_read_authentication_guest_access sysconsole_read_site_public_links read_elasticsearch_post_indexing_job sysconsole_read_user_management_channels sysconsole_read_reporting_team_statistics invalidate_caches sysconsole_read_authentication_signup read_elasticsearch_post_aggregation_job sysconsole_write_environment_smtp manage_public_channel_members list_public_teams add_user_to_team sysconsole_read_environment_web_server sysconsole_read_site_localization get_logs sysconsole_write_site_posts sysconsole_write_integrations_bot_accounts sysconsole_write_user_management_permissions sysconsole_read_environment_elasticsearch sysconsole_read_environment_smtp list_private_teams read_public_channel_groups sysconsole_write_environment_file_storage sysconsole_write_integrations_gif manage_public_channel_properties sysconsole_write_environment_performance_monitoring sysconsole_write_site_notifications sysconsole_read_site_notifications sysconsole_read_environment_image_proxy sysconsole_write_site_announcement_banner sysconsole_write_site_emoji test_site_url sysconsole_read_integrations_gif sysconsole_write_environment_logging convert_public_channel_to_private get_analytics sysconsole_read_user_management_permissions sysconsole_write_environment_image_proxy test_elasticsearch recycle_database_connections sysconsole_write_site_localization sysconsole_read_reporting_server_logs create_elasticsearch_post_indexing_job sysconsole_read_reporting_site_statistics test_ldap delete_public_channel sysconsole_write_environment_push_notification_server read_license_information sysconsole_write_products_boards sysconsole_read_about_edition_and_license convert_private_channel_to_public sysconsole_read_integrations_integration_management create_elasticsearch_post_aggregation_job purge_elasticsearch_indexes sysconsole_read_environment_database join_public_teams sysconsole_read_authentication_email sysconsole_read_environment_push_notification_server view_team read_channel sysconsole_read_authentication_password read_ldap_sync_job sysconsole_read_integrations_cors sysconsole_read_environment_logging manage_team sysconsole_read_authentication_openid read_public_channel sysconsole_write_environment_elasticsearch sysconsole_read_plugins manage_channel_roles remove_user_from_team test_email sysconsole_write_site_file_sharing_and_downloads test_s3 sysconsole_read_site_file_sharing_and_downloads sysconsole_read_site_notices sysconsole_read_environment_file_storage join_private_teams sysconsole_read_products_boards sysconsole_read_environment_session_lengths sysconsole_write_environment_database sysconsole_read_authentication_saml sysconsole_read_authentication_mfa sysconsole_write_site_notices sysconsole_write_environment_web_server sysconsole_read_site_posts sysconsole_read_environment_developer sysconsole_write_site_customization', + system_post_all: 'use_group_mentions use_channel_mentions create_post', + system_post_all_public: 'use_group_mentions use_channel_mentions create_post_public', + system_read_only_admin: 'sysconsole_read_authentication_guest_access download_compliance_export_result sysconsole_read_compliance_data_retention_policy get_logs sysconsole_read_environment_file_storage read_channel sysconsole_read_integrations_integration_management sysconsole_read_compliance_custom_terms_of_service sysconsole_read_site_notices sysconsole_read_environment_rate_limiting sysconsole_read_about_edition_and_license read_public_channel sysconsole_read_experimental_features test_ldap sysconsole_read_user_management_permissions read_elasticsearch_post_aggregation_job sysconsole_read_environment_image_proxy sysconsole_read_compliance_compliance_export sysconsole_read_integrations_bot_accounts sysconsole_read_authentication_openid sysconsole_read_site_posts sysconsole_read_user_management_users sysconsole_read_experimental_feature_flags sysconsole_read_reporting_team_statistics sysconsole_read_site_localization read_private_channel_groups sysconsole_read_site_file_sharing_and_downloads sysconsole_read_user_management_channels sysconsole_read_authentication_email read_data_retention_job read_audits sysconsole_read_plugins view_team get_analytics sysconsole_read_user_management_groups sysconsole_read_experimental_bleve sysconsole_read_products_boards read_compliance_export_job sysconsole_read_environment_logging sysconsole_read_authentication_signup sysconsole_read_environment_smtp sysconsole_read_environment_session_lengths sysconsole_read_environment_developer sysconsole_read_environment_high_availability read_ldap_sync_job sysconsole_read_environment_performance_monitoring sysconsole_read_authentication_saml read_public_channel_groups sysconsole_read_integrations_gif sysconsole_read_authentication_mfa list_public_teams sysconsole_read_environment_database list_private_teams sysconsole_read_authentication_ldap sysconsole_read_compliance_compliance_monitoring sysconsole_read_site_notifications sysconsole_read_site_announcement_banner read_other_users_teams sysconsole_read_authentication_password sysconsole_read_environment_push_notification_server sysconsole_read_site_users_and_teams sysconsole_read_site_public_links sysconsole_read_site_emoji sysconsole_read_environment_elasticsearch read_license_information sysconsole_read_integrations_cors sysconsole_read_user_management_teams sysconsole_read_reporting_server_logs sysconsole_read_site_customization sysconsole_read_reporting_site_statistics sysconsole_read_environment_web_server read_elasticsearch_post_indexing_job', + system_user: 'delete_custom_group create_emojis edit_custom_group create_direct_channel view_members join_public_teams restore_custom_group create_custom_group manage_custom_group_members delete_emojis list_public_teams create_team create_group_channel', + system_user_access_token: 'create_user_access_token read_user_access_token revoke_user_access_token', + system_user_manager: 'sysconsole_read_authentication_password sysconsole_read_authentication_openid sysconsole_write_user_management_groups list_private_teams sysconsole_read_user_management_groups sysconsole_read_authentication_email manage_public_channel_properties delete_private_channel sysconsole_read_authentication_signup read_private_channel_groups sysconsole_read_user_management_teams test_ldap read_channel view_team manage_team sysconsole_write_user_management_teams manage_channel_roles sysconsole_read_authentication_saml sysconsole_read_authentication_guest_access convert_private_channel_to_public sysconsole_read_user_management_permissions join_public_teams sysconsole_write_user_management_channels read_public_channel_groups sysconsole_read_user_management_channels list_public_teams manage_team_roles join_private_teams manage_public_channel_members convert_public_channel_to_private remove_user_from_team sysconsole_read_authentication_ldap manage_private_channel_properties delete_public_channel manage_private_channel_members read_public_channel add_user_to_team sysconsole_read_authentication_mfa read_ldap_sync_job', + team_admin: 'manage_others_slash_commands manage_channel_roles manage_others_outgoing_webhooks manage_team_roles use_channel_mentions manage_incoming_webhooks manage_slash_commands manage_public_channel_members convert_private_channel_to_public manage_private_channel_members manage_team convert_public_channel_to_private use_group_mentions delete_post read_public_channel_groups delete_others_posts playbook_private_manage_roles add_reaction remove_reaction remove_user_from_team read_private_channel_groups manage_outgoing_webhooks create_post playbook_public_manage_roles import_team manage_others_incoming_webhooks', + team_guest: 'view_team', + team_post_all: 'create_post use_channel_mentions use_group_mentions', + team_post_all_public: 'create_post_public use_channel_mentions use_group_mentions', + team_user: 'add_user_to_team view_team playbook_private_create playbook_public_create invite_user join_public_channels list_team_channels read_public_channel create_private_channel create_public_channel', +}; + +Cypress.Commands.add('getRoleByName', (name) => { + return cy.request({ + headers: {'X-Requested-With': 'XMLHttpRequest'}, + url: `/api/v4/roles/name/${name}`, + method: 'GET', + }).then((response) => { + expect(response.status).to.equal(200); + return cy.wrap({name: response.body}); + }); +}); + +Cypress.Commands.add('apiGetRolesByNames', (names) => { + return cy.request({ + headers: {'X-Requested-With': 'XMLHttpRequest'}, + url: '/api/v4/roles/names', + method: 'POST', + body: names || Object.keys(defaultRolesPermissions), + }).then((response) => { + expect(response.status).to.equal(200); + return cy.wrap({roles: response.body}); + }); +}); + +Cypress.Commands.add('apiPatchRole', (roleID, patch) => { + return cy.request({ + headers: {'X-Requested-With': 'XMLHttpRequest'}, + url: `/api/v4/roles/${roleID}/patch`, + method: 'PUT', + body: patch, + }).then((response) => { + expect(response.status).to.equal(200); + return cy.wrap({role: response.body}); + }); +}); + +Cypress.Commands.add('apiResetRoles', () => { + cy.apiGetRolesByNames().then(({roles}) => { + roles.forEach((role) => { + const defaultPermissions = defaultRolesPermissions[role.name].split(' '); + const diff = xor(role.permissions, defaultPermissions)?.filter((p) => p?.length); + + if (diff?.length > 0) { + cy.apiPatchRole(role.id, {permissions: defaultPermissions}); + } + }); + }); +}); diff --git a/webapp/channels/e2e/cypress/tests/support/api/saml.d.ts b/e2e/cypress/tests/support/api/saml.d.ts similarity index 100% rename from webapp/channels/e2e/cypress/tests/support/api/saml.d.ts rename to e2e/cypress/tests/support/api/saml.d.ts diff --git a/webapp/channels/e2e/cypress/tests/support/api/saml.js b/e2e/cypress/tests/support/api/saml.js similarity index 100% rename from webapp/channels/e2e/cypress/tests/support/api/saml.js rename to e2e/cypress/tests/support/api/saml.js diff --git a/webapp/channels/e2e/cypress/tests/support/api/scheme.d.ts b/e2e/cypress/tests/support/api/scheme.d.ts similarity index 100% rename from webapp/channels/e2e/cypress/tests/support/api/scheme.d.ts rename to e2e/cypress/tests/support/api/scheme.d.ts diff --git a/webapp/channels/e2e/cypress/tests/support/api/scheme.js b/e2e/cypress/tests/support/api/scheme.js similarity index 100% rename from webapp/channels/e2e/cypress/tests/support/api/scheme.js rename to e2e/cypress/tests/support/api/scheme.js diff --git a/webapp/channels/e2e/cypress/tests/support/api/setup.ts b/e2e/cypress/tests/support/api/setup.ts similarity index 100% rename from webapp/channels/e2e/cypress/tests/support/api/setup.ts rename to e2e/cypress/tests/support/api/setup.ts diff --git a/webapp/channels/e2e/cypress/tests/support/api/status.d.ts b/e2e/cypress/tests/support/api/status.d.ts similarity index 100% rename from webapp/channels/e2e/cypress/tests/support/api/status.d.ts rename to e2e/cypress/tests/support/api/status.d.ts diff --git a/webapp/channels/e2e/cypress/tests/support/api/status.js b/e2e/cypress/tests/support/api/status.js similarity index 100% rename from webapp/channels/e2e/cypress/tests/support/api/status.js rename to e2e/cypress/tests/support/api/status.js diff --git a/webapp/channels/e2e/cypress/tests/support/api/system.d.ts b/e2e/cypress/tests/support/api/system.d.ts similarity index 100% rename from webapp/channels/e2e/cypress/tests/support/api/system.d.ts rename to e2e/cypress/tests/support/api/system.d.ts diff --git a/webapp/channels/e2e/cypress/tests/support/api/system.js b/e2e/cypress/tests/support/api/system.js similarity index 100% rename from webapp/channels/e2e/cypress/tests/support/api/system.js rename to e2e/cypress/tests/support/api/system.js diff --git a/webapp/channels/e2e/cypress/tests/support/api/team.d.ts b/e2e/cypress/tests/support/api/team.d.ts similarity index 100% rename from webapp/channels/e2e/cypress/tests/support/api/team.d.ts rename to e2e/cypress/tests/support/api/team.d.ts diff --git a/webapp/channels/e2e/cypress/tests/support/api/team.js b/e2e/cypress/tests/support/api/team.js similarity index 100% rename from webapp/channels/e2e/cypress/tests/support/api/team.js rename to e2e/cypress/tests/support/api/team.js diff --git a/webapp/channels/e2e/cypress/tests/support/api/user.d.ts b/e2e/cypress/tests/support/api/user.d.ts similarity index 100% rename from webapp/channels/e2e/cypress/tests/support/api/user.d.ts rename to e2e/cypress/tests/support/api/user.d.ts diff --git a/webapp/channels/e2e/cypress/tests/support/api/user.js b/e2e/cypress/tests/support/api/user.js similarity index 96% rename from webapp/channels/e2e/cypress/tests/support/api/user.js rename to e2e/cypress/tests/support/api/user.js index a4daa514b8..9f7a6061ec 100644 --- a/webapp/channels/e2e/cypress/tests/support/api/user.js +++ b/e2e/cypress/tests/support/api/user.js @@ -232,8 +232,9 @@ function generateRandomUser(prefix = 'user') { Cypress.Commands.add('apiCreateUser', ({ prefix = 'user', bypassTutorial = true, - showOnboarding = false, hideActionsMenu = true, + hideOnboarding = true, + bypassWhatsNewModal = true, user = null, } = {}) => { const newUser = user || generateRandomUser(prefix); @@ -250,7 +251,7 @@ Cypress.Commands.add('apiCreateUser', ({ const createdUser = userRes.body; - // // hide the onboarding task list by default so it doesn't block the execution of subsequent tests + // hide the onboarding task list by default so it doesn't block the execution of subsequent tests cy.apiSaveSkipStepsPreference(createdUser.id, 'true'); cy.apiSaveOnboardingTaskListPreference(createdUser.id, 'onboarding_task_list_open', 'false'); cy.apiSaveOnboardingTaskListPreference(createdUser.id, 'onboarding_task_list_show', 'false'); @@ -262,16 +263,19 @@ Cypress.Commands.add('apiCreateUser', ({ cy.apiSaveTutorialStep(createdUser.id, '999'); } - if (showOnboarding) { - cy.apiSaveSkipStepsPreference(createdUser.id, 'false'); - cy.apiSaveOnboardingTaskListPreference(createdUser.id, 'onboarding_task_list_open', 'false'); - cy.apiSaveOnboardingTaskListPreference(createdUser.id, 'onboarding_task_list_show', 'true'); - } - if (hideActionsMenu) { cy.apiSaveActionsMenuPreference(createdUser.id, true); } + if (hideOnboarding) { + cy.apiSaveOnboardingPreference(createdUser.id, 'hide', 'true'); + cy.apiSaveOnboardingPreference(createdUser.id, 'skip', 'true'); + } + + if (bypassWhatsNewModal) { + cy.apiHideSidebarWhatsNewModalPreference(createdUser.id, 'false'); + } + return cy.wrap({user: {...createdUser, password: newUser.password}}); }); }); diff --git a/webapp/channels/e2e/cypress/tests/support/api/webhooks.d.ts b/e2e/cypress/tests/support/api/webhooks.d.ts similarity index 100% rename from webapp/channels/e2e/cypress/tests/support/api/webhooks.d.ts rename to e2e/cypress/tests/support/api/webhooks.d.ts diff --git a/webapp/channels/e2e/cypress/tests/support/api/webhooks.js b/e2e/cypress/tests/support/api/webhooks.js similarity index 100% rename from webapp/channels/e2e/cypress/tests/support/api/webhooks.js rename to e2e/cypress/tests/support/api/webhooks.js diff --git a/webapp/channels/e2e/cypress/tests/support/api_commands.ts b/e2e/cypress/tests/support/api_commands.ts similarity index 100% rename from webapp/channels/e2e/cypress/tests/support/api_commands.ts rename to e2e/cypress/tests/support/api_commands.ts diff --git a/webapp/channels/e2e/cypress/tests/support/assertions.js b/e2e/cypress/tests/support/assertions.js similarity index 100% rename from webapp/channels/e2e/cypress/tests/support/assertions.js rename to e2e/cypress/tests/support/assertions.js diff --git a/webapp/channels/e2e/cypress/tests/support/client-impl.js b/e2e/cypress/tests/support/client-impl.js similarity index 100% rename from webapp/channels/e2e/cypress/tests/support/client-impl.js rename to e2e/cypress/tests/support/client-impl.js diff --git a/webapp/channels/e2e/cypress/tests/support/client.d.ts b/e2e/cypress/tests/support/client.d.ts similarity index 100% rename from webapp/channels/e2e/cypress/tests/support/client.d.ts rename to e2e/cypress/tests/support/client.d.ts diff --git a/webapp/channels/e2e/cypress/tests/support/client.js b/e2e/cypress/tests/support/client.js similarity index 100% rename from webapp/channels/e2e/cypress/tests/support/client.js rename to e2e/cypress/tests/support/client.js diff --git a/webapp/channels/e2e/cypress/tests/support/common_login_commands.d.ts b/e2e/cypress/tests/support/common_login_commands.d.ts similarity index 100% rename from webapp/channels/e2e/cypress/tests/support/common_login_commands.d.ts rename to e2e/cypress/tests/support/common_login_commands.d.ts diff --git a/webapp/channels/e2e/cypress/tests/support/common_login_commands.js b/e2e/cypress/tests/support/common_login_commands.js similarity index 100% rename from webapp/channels/e2e/cypress/tests/support/common_login_commands.js rename to e2e/cypress/tests/support/common_login_commands.js diff --git a/webapp/channels/e2e/cypress/tests/support/constants.js b/e2e/cypress/tests/support/constants.js similarity index 100% rename from webapp/channels/e2e/cypress/tests/support/constants.js rename to e2e/cypress/tests/support/constants.js diff --git a/webapp/channels/e2e/cypress/tests/support/db_commands.ts b/e2e/cypress/tests/support/db_commands.ts similarity index 100% rename from webapp/channels/e2e/cypress/tests/support/db_commands.ts rename to e2e/cypress/tests/support/db_commands.ts diff --git a/webapp/channels/e2e/cypress/tests/support/email.ts b/e2e/cypress/tests/support/email.ts similarity index 100% rename from webapp/channels/e2e/cypress/tests/support/email.ts rename to e2e/cypress/tests/support/email.ts diff --git a/webapp/channels/e2e/cypress/tests/support/env.ts b/e2e/cypress/tests/support/env.ts similarity index 100% rename from webapp/channels/e2e/cypress/tests/support/env.ts rename to e2e/cypress/tests/support/env.ts diff --git a/webapp/channels/e2e/cypress/tests/support/extended_commands.d.ts b/e2e/cypress/tests/support/extended_commands.d.ts similarity index 100% rename from webapp/channels/e2e/cypress/tests/support/extended_commands.d.ts rename to e2e/cypress/tests/support/extended_commands.d.ts diff --git a/webapp/channels/e2e/cypress/tests/support/extended_commands.js b/e2e/cypress/tests/support/extended_commands.js similarity index 100% rename from webapp/channels/e2e/cypress/tests/support/extended_commands.js rename to e2e/cypress/tests/support/extended_commands.js diff --git a/webapp/channels/e2e/cypress/tests/support/external_commands.d.ts b/e2e/cypress/tests/support/external_commands.d.ts similarity index 100% rename from webapp/channels/e2e/cypress/tests/support/external_commands.d.ts rename to e2e/cypress/tests/support/external_commands.d.ts diff --git a/webapp/channels/e2e/cypress/tests/support/external_commands.js b/e2e/cypress/tests/support/external_commands.js similarity index 100% rename from webapp/channels/e2e/cypress/tests/support/external_commands.js rename to e2e/cypress/tests/support/external_commands.js diff --git a/webapp/channels/e2e/cypress/tests/support/fetch_commands.js b/e2e/cypress/tests/support/fetch_commands.js similarity index 100% rename from webapp/channels/e2e/cypress/tests/support/fetch_commands.js rename to e2e/cypress/tests/support/fetch_commands.js diff --git a/webapp/channels/e2e/cypress/tests/support/index.d.ts b/e2e/cypress/tests/support/index.d.ts similarity index 100% rename from webapp/channels/e2e/cypress/tests/support/index.d.ts rename to e2e/cypress/tests/support/index.d.ts diff --git a/webapp/channels/e2e/cypress/tests/support/index.js b/e2e/cypress/tests/support/index.js similarity index 98% rename from webapp/channels/e2e/cypress/tests/support/index.js rename to e2e/cypress/tests/support/index.js index 982160bdc0..2186107421 100644 --- a/webapp/channels/e2e/cypress/tests/support/index.js +++ b/e2e/cypress/tests/support/index.js @@ -171,9 +171,7 @@ function printServerDetails() { - Version = ${config.Version} - BuildHash = ${config.BuildHash} - BuildHashEnterprise = ${config.BuildHashEnterprise} - - BuildHashBoards = ${config.BuildHashBoards} - BuildEnterpriseReady = ${config.BuildEnterpriseReady} - - BuildBoards = ${config.BuildBoards} - TelemetryId = ${config.TelemetryId}`); }); } diff --git a/webapp/channels/e2e/cypress/tests/support/keycloak_commands.d.ts b/e2e/cypress/tests/support/keycloak_commands.d.ts similarity index 100% rename from webapp/channels/e2e/cypress/tests/support/keycloak_commands.d.ts rename to e2e/cypress/tests/support/keycloak_commands.d.ts diff --git a/webapp/channels/e2e/cypress/tests/support/keycloak_commands.js b/e2e/cypress/tests/support/keycloak_commands.js similarity index 100% rename from webapp/channels/e2e/cypress/tests/support/keycloak_commands.js rename to e2e/cypress/tests/support/keycloak_commands.js diff --git a/webapp/channels/e2e/cypress/tests/support/ldap_commands.d.ts b/e2e/cypress/tests/support/ldap_commands.d.ts similarity index 100% rename from webapp/channels/e2e/cypress/tests/support/ldap_commands.d.ts rename to e2e/cypress/tests/support/ldap_commands.d.ts diff --git a/webapp/channels/e2e/cypress/tests/support/ldap_commands.js b/e2e/cypress/tests/support/ldap_commands.js similarity index 100% rename from webapp/channels/e2e/cypress/tests/support/ldap_commands.js rename to e2e/cypress/tests/support/ldap_commands.js diff --git a/webapp/channels/e2e/cypress/tests/support/ldap_server_commands.d.ts b/e2e/cypress/tests/support/ldap_server_commands.d.ts similarity index 100% rename from webapp/channels/e2e/cypress/tests/support/ldap_server_commands.d.ts rename to e2e/cypress/tests/support/ldap_server_commands.d.ts diff --git a/webapp/channels/e2e/cypress/tests/support/ldap_server_commands.js b/e2e/cypress/tests/support/ldap_server_commands.js similarity index 100% rename from webapp/channels/e2e/cypress/tests/support/ldap_server_commands.js rename to e2e/cypress/tests/support/ldap_server_commands.js diff --git a/webapp/channels/e2e/cypress/tests/support/notification.ts b/e2e/cypress/tests/support/notification.ts similarity index 100% rename from webapp/channels/e2e/cypress/tests/support/notification.ts rename to e2e/cypress/tests/support/notification.ts diff --git a/webapp/channels/e2e/cypress/tests/support/okta_commands.js b/e2e/cypress/tests/support/okta_commands.js similarity index 100% rename from webapp/channels/e2e/cypress/tests/support/okta_commands.js rename to e2e/cypress/tests/support/okta_commands.js diff --git a/webapp/channels/e2e/cypress/tests/support/saml_commands.js b/e2e/cypress/tests/support/saml_commands.js similarity index 100% rename from webapp/channels/e2e/cypress/tests/support/saml_commands.js rename to e2e/cypress/tests/support/saml_commands.js diff --git a/webapp/channels/e2e/cypress/tests/support/shell.d.ts b/e2e/cypress/tests/support/shell.d.ts similarity index 100% rename from webapp/channels/e2e/cypress/tests/support/shell.d.ts rename to e2e/cypress/tests/support/shell.d.ts diff --git a/webapp/channels/e2e/cypress/tests/support/shell.js b/e2e/cypress/tests/support/shell.js similarity index 100% rename from webapp/channels/e2e/cypress/tests/support/shell.js rename to e2e/cypress/tests/support/shell.js diff --git a/webapp/channels/e2e/cypress/tests/support/task_commands.ts b/e2e/cypress/tests/support/task_commands.ts similarity index 100% rename from webapp/channels/e2e/cypress/tests/support/task_commands.ts rename to e2e/cypress/tests/support/task_commands.ts diff --git a/webapp/channels/e2e/cypress/tests/support/ui/account_settings_modal.d.ts b/e2e/cypress/tests/support/ui/account_settings_modal.d.ts similarity index 100% rename from webapp/channels/e2e/cypress/tests/support/ui/account_settings_modal.d.ts rename to e2e/cypress/tests/support/ui/account_settings_modal.d.ts diff --git a/webapp/channels/e2e/cypress/tests/support/ui/account_settings_modal.js b/e2e/cypress/tests/support/ui/account_settings_modal.js similarity index 100% rename from webapp/channels/e2e/cypress/tests/support/ui/account_settings_modal.js rename to e2e/cypress/tests/support/ui/account_settings_modal.js diff --git a/webapp/channels/e2e/cypress/tests/support/ui/announcement_bar.d.ts b/e2e/cypress/tests/support/ui/announcement_bar.d.ts similarity index 100% rename from webapp/channels/e2e/cypress/tests/support/ui/announcement_bar.d.ts rename to e2e/cypress/tests/support/ui/announcement_bar.d.ts diff --git a/webapp/channels/e2e/cypress/tests/support/ui/announcement_bar.js b/e2e/cypress/tests/support/ui/announcement_bar.js similarity index 100% rename from webapp/channels/e2e/cypress/tests/support/ui/announcement_bar.js rename to e2e/cypress/tests/support/ui/announcement_bar.js diff --git a/webapp/channels/e2e/cypress/tests/support/ui/boards.d.ts b/e2e/cypress/tests/support/ui/boards.d.ts similarity index 100% rename from webapp/channels/e2e/cypress/tests/support/ui/boards.d.ts rename to e2e/cypress/tests/support/ui/boards.d.ts diff --git a/webapp/channels/e2e/cypress/tests/support/ui/boards.js b/e2e/cypress/tests/support/ui/boards.js similarity index 100% rename from webapp/channels/e2e/cypress/tests/support/ui/boards.js rename to e2e/cypress/tests/support/ui/boards.js diff --git a/webapp/channels/e2e/cypress/tests/support/ui/channel.d.ts b/e2e/cypress/tests/support/ui/channel.d.ts similarity index 100% rename from webapp/channels/e2e/cypress/tests/support/ui/channel.d.ts rename to e2e/cypress/tests/support/ui/channel.d.ts diff --git a/webapp/channels/e2e/cypress/tests/support/ui/channel.js b/e2e/cypress/tests/support/ui/channel.js similarity index 100% rename from webapp/channels/e2e/cypress/tests/support/ui/channel.js rename to e2e/cypress/tests/support/ui/channel.js diff --git a/webapp/channels/e2e/cypress/tests/support/ui/channel_header.d.ts b/e2e/cypress/tests/support/ui/channel_header.d.ts similarity index 100% rename from webapp/channels/e2e/cypress/tests/support/ui/channel_header.d.ts rename to e2e/cypress/tests/support/ui/channel_header.d.ts diff --git a/webapp/channels/e2e/cypress/tests/support/ui/channel_header.js b/e2e/cypress/tests/support/ui/channel_header.js similarity index 100% rename from webapp/channels/e2e/cypress/tests/support/ui/channel_header.js rename to e2e/cypress/tests/support/ui/channel_header.js diff --git a/webapp/channels/e2e/cypress/tests/support/ui/channel_sidebar.js b/e2e/cypress/tests/support/ui/channel_sidebar.js similarity index 100% rename from webapp/channels/e2e/cypress/tests/support/ui/channel_sidebar.js rename to e2e/cypress/tests/support/ui/channel_sidebar.js diff --git a/webapp/channels/e2e/cypress/tests/support/ui/cloud_billing.d.ts b/e2e/cypress/tests/support/ui/cloud_billing.d.ts similarity index 100% rename from webapp/channels/e2e/cypress/tests/support/ui/cloud_billing.d.ts rename to e2e/cypress/tests/support/ui/cloud_billing.d.ts diff --git a/webapp/channels/e2e/cypress/tests/support/ui/cloud_billing.js b/e2e/cypress/tests/support/ui/cloud_billing.js similarity index 100% rename from webapp/channels/e2e/cypress/tests/support/ui/cloud_billing.js rename to e2e/cypress/tests/support/ui/cloud_billing.js diff --git a/webapp/channels/e2e/cypress/tests/support/ui/common.d.ts b/e2e/cypress/tests/support/ui/common.d.ts similarity index 100% rename from webapp/channels/e2e/cypress/tests/support/ui/common.d.ts rename to e2e/cypress/tests/support/ui/common.d.ts diff --git a/webapp/channels/e2e/cypress/tests/support/ui/common.js b/e2e/cypress/tests/support/ui/common.js similarity index 100% rename from webapp/channels/e2e/cypress/tests/support/ui/common.js rename to e2e/cypress/tests/support/ui/common.js diff --git a/webapp/channels/e2e/cypress/tests/support/ui/compliance_export.d.ts b/e2e/cypress/tests/support/ui/compliance_export.d.ts similarity index 100% rename from webapp/channels/e2e/cypress/tests/support/ui/compliance_export.d.ts rename to e2e/cypress/tests/support/ui/compliance_export.d.ts diff --git a/webapp/channels/e2e/cypress/tests/support/ui/compliance_export.js b/e2e/cypress/tests/support/ui/compliance_export.js similarity index 100% rename from webapp/channels/e2e/cypress/tests/support/ui/compliance_export.js rename to e2e/cypress/tests/support/ui/compliance_export.js diff --git a/webapp/channels/e2e/cypress/tests/support/ui/data_retention.d.ts b/e2e/cypress/tests/support/ui/data_retention.d.ts similarity index 100% rename from webapp/channels/e2e/cypress/tests/support/ui/data_retention.d.ts rename to e2e/cypress/tests/support/ui/data_retention.d.ts diff --git a/webapp/channels/e2e/cypress/tests/support/ui/data_retention.js b/e2e/cypress/tests/support/ui/data_retention.js similarity index 100% rename from webapp/channels/e2e/cypress/tests/support/ui/data_retention.js rename to e2e/cypress/tests/support/ui/data_retention.js diff --git a/webapp/channels/e2e/cypress/tests/support/ui/emoji.ts b/e2e/cypress/tests/support/ui/emoji.ts similarity index 100% rename from webapp/channels/e2e/cypress/tests/support/ui/emoji.ts rename to e2e/cypress/tests/support/ui/emoji.ts diff --git a/webapp/channels/e2e/cypress/tests/support/ui/extend_testing_library.d.ts b/e2e/cypress/tests/support/ui/extend_testing_library.d.ts similarity index 100% rename from webapp/channels/e2e/cypress/tests/support/ui/extend_testing_library.d.ts rename to e2e/cypress/tests/support/ui/extend_testing_library.d.ts diff --git a/webapp/channels/e2e/cypress/tests/support/ui/extend_testing_library.js b/e2e/cypress/tests/support/ui/extend_testing_library.js similarity index 100% rename from webapp/channels/e2e/cypress/tests/support/ui/extend_testing_library.js rename to e2e/cypress/tests/support/ui/extend_testing_library.js diff --git a/webapp/channels/e2e/cypress/tests/support/ui/file_preview.d.ts b/e2e/cypress/tests/support/ui/file_preview.d.ts similarity index 100% rename from webapp/channels/e2e/cypress/tests/support/ui/file_preview.d.ts rename to e2e/cypress/tests/support/ui/file_preview.d.ts diff --git a/webapp/channels/e2e/cypress/tests/support/ui/file_preview.js b/e2e/cypress/tests/support/ui/file_preview.js similarity index 100% rename from webapp/channels/e2e/cypress/tests/support/ui/file_preview.js rename to e2e/cypress/tests/support/ui/file_preview.js diff --git a/webapp/channels/e2e/cypress/tests/support/ui/global_header.d.ts b/e2e/cypress/tests/support/ui/global_header.d.ts similarity index 100% rename from webapp/channels/e2e/cypress/tests/support/ui/global_header.d.ts rename to e2e/cypress/tests/support/ui/global_header.d.ts diff --git a/webapp/channels/e2e/cypress/tests/support/ui/global_header.js b/e2e/cypress/tests/support/ui/global_header.js similarity index 100% rename from webapp/channels/e2e/cypress/tests/support/ui/global_header.js rename to e2e/cypress/tests/support/ui/global_header.js diff --git a/webapp/channels/e2e/cypress/tests/support/ui/index.js b/e2e/cypress/tests/support/ui/index.js similarity index 97% rename from webapp/channels/e2e/cypress/tests/support/ui/index.js rename to e2e/cypress/tests/support/ui/index.js index 9344e441b1..c841f133cd 100644 --- a/webapp/channels/e2e/cypress/tests/support/ui/index.js +++ b/e2e/cypress/tests/support/ui/index.js @@ -19,6 +19,7 @@ import './login'; import './menu'; import './mfa'; import './modal'; +import './playbooks'; import './post'; import './post_dropdown_menu'; import './search'; diff --git a/webapp/channels/e2e/cypress/tests/support/ui/login.d.ts b/e2e/cypress/tests/support/ui/login.d.ts similarity index 100% rename from webapp/channels/e2e/cypress/tests/support/ui/login.d.ts rename to e2e/cypress/tests/support/ui/login.d.ts diff --git a/webapp/channels/e2e/cypress/tests/support/ui/login.js b/e2e/cypress/tests/support/ui/login.js similarity index 100% rename from webapp/channels/e2e/cypress/tests/support/ui/login.js rename to e2e/cypress/tests/support/ui/login.js diff --git a/webapp/channels/e2e/cypress/tests/support/ui/menu.d.ts b/e2e/cypress/tests/support/ui/menu.d.ts similarity index 100% rename from webapp/channels/e2e/cypress/tests/support/ui/menu.d.ts rename to e2e/cypress/tests/support/ui/menu.d.ts diff --git a/webapp/channels/e2e/cypress/tests/support/ui/menu.js b/e2e/cypress/tests/support/ui/menu.js similarity index 100% rename from webapp/channels/e2e/cypress/tests/support/ui/menu.js rename to e2e/cypress/tests/support/ui/menu.js diff --git a/webapp/channels/e2e/cypress/tests/support/ui/mfa.d.ts b/e2e/cypress/tests/support/ui/mfa.d.ts similarity index 100% rename from webapp/channels/e2e/cypress/tests/support/ui/mfa.d.ts rename to e2e/cypress/tests/support/ui/mfa.d.ts diff --git a/webapp/channels/e2e/cypress/tests/support/ui/mfa.js b/e2e/cypress/tests/support/ui/mfa.js similarity index 100% rename from webapp/channels/e2e/cypress/tests/support/ui/mfa.js rename to e2e/cypress/tests/support/ui/mfa.js diff --git a/webapp/channels/e2e/cypress/tests/support/ui/modal.d.ts b/e2e/cypress/tests/support/ui/modal.d.ts similarity index 100% rename from webapp/channels/e2e/cypress/tests/support/ui/modal.d.ts rename to e2e/cypress/tests/support/ui/modal.d.ts diff --git a/webapp/channels/e2e/cypress/tests/support/ui/modal.js b/e2e/cypress/tests/support/ui/modal.js similarity index 100% rename from webapp/channels/e2e/cypress/tests/support/ui/modal.js rename to e2e/cypress/tests/support/ui/modal.js diff --git a/e2e/cypress/tests/support/ui/playbooks.js b/e2e/cypress/tests/support/ui/playbooks.js new file mode 100644 index 0000000000..3bbd18dc6d --- /dev/null +++ b/e2e/cypress/tests/support/ui/playbooks.js @@ -0,0 +1,334 @@ +// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. + +import * as TIMEOUTS from '../../fixtures/timeouts'; +const playbookRunStartCommand = '/playbook run'; + +Cypress.Commands.add('startPlaybookRun', (playbookName, playbookRunName) => { + cy.get('#interactiveDialogModal').should('exist').within(() => { + // # Select playbook + cy.selectPlaybookFromDropdown(playbookName); + + // # Type playbook run name + cy.findByTestId('playbookRunNameinput').type(playbookRunName, {force: true}); + + // # Submit + cy.get('#interactiveDialogSubmit').click(); + }); + + cy.get('#interactiveDialogModal').should('not.exist'); +}); + +// Runs the given slash command +Cypress.Commands.add('executeSlashCommand', (command) => { + cy.findByTestId('post_textbox').clear().type(command); + + // Using esc to make sure we exit out of slash command autocomplete + cy.findByTestId('post_textbox').type('{esc}{esc}{esc}{esc}', {delay: TIMEOUTS.TWO_HUNDRED_MILLIS}); + cy.findByTestId('post_textbox').type('{enter}'); +}); + +// Opens playbook run dialog using the `/playbook run` slash command +Cypress.Commands.add('openPlaybookRunDialogFromSlashCommand', () => { + cy.executeSlashCommand(playbookRunStartCommand); +}); + +// Starts playbook run with the `/playbook run` slash command +Cypress.Commands.add('startPlaybookRunWithSlashCommand', (playbookName, playbookRunName) => { + cy.openPlaybookRunDialogFromSlashCommand(); + + cy.startPlaybookRun(playbookName, playbookRunName); +}); + +// Selects Playbooks icon in the App Bar +Cypress.Commands.add('getPlaybooksAppBarIcon', () => { + cy.apiGetConfig(true).then(({config}) => { + cy.get('#channel_view').should('be.visible'); + return cy.get(`.app-bar .app-bar__icon-inner img[src="${config.SiteURL}/plugins/playbooks/public/app-bar-icon.png"]`); + }); +}); + +// Starts playbook run from the playbook run RHS +Cypress.Commands.add('startPlaybookRunFromRHS', (playbookName, playbookRunName) => { + cy.get('#channel-header').within(() => { + // open flagged posts to ensure playbook run RHS is closed + cy.get('#channelHeaderFlagButton').click(); + + // open the playbook run RHS + cy.getPlaybooksAppBarIcon().should('exist').click(); + }); + + cy.get('#rhsContainer').should('exist').within(() => { + cy.findByText('Run playbook').click(); + }); + + cy.startPlaybookRun(playbookName, playbookRunName); +}); + +// Create a new task from the RHS +Cypress.Commands.add('addNewTaskFromRHS', (taskname) => { + // Click add new task + cy.findByTestId('add-new-task-0').click(); + + // Type a name + cy.findByTestId('checklist-item-textarea-title').type(taskname); + + // Save task + cy.findByTestId('checklist-item-save-button').click(); +}); + +// Starts playbook run from the post menu +Cypress.Commands.add('startPlaybookRunFromPostMenu', (playbookName, playbookRunName) => { + // post a message as user to avoid system message + cy.findByTestId('post_textbox').clear().type('new message here{enter}'); + + // post a second message because cypress has trouble finding latest post when there's only one message + cy.findByTestId('post_textbox').clear().type('another new message here{enter}'); + cy.clickPostActionsMenu(); + cy.findByTestId('playbookRunPostMenuIcon').click(); + cy.startPlaybookRun(playbookName, playbookRunName); +}); + +// Create playbook +Cypress.Commands.add('createPlaybook', (teamName, playbookName) => { + cy.visit('/playbooks/playbooks/new'); + + cy.findByTestId('save_playbook', {timeout: TIMEOUTS.HALF_MIN}).should('exist'); + + // # Type playbook name + cy.get('#playbook-name .editable-trigger').click(); + cy.get('#playbook-name .editable-input').type(playbookName); + cy.get('#playbook-name .editable-input').type('{enter}'); + + // # Save playbook + cy.findByTestId('save_playbook', {timeout: TIMEOUTS.HALF_MIN}).should('not.be.disabled').click(); + cy.wait(TIMEOUTS.TWO_SEC); + cy.findByTestId('save_playbook', {timeout: TIMEOUTS.HALF_MIN}).should('not.be.disabled').click(); +}); + +// Select the playbook from the dropdown menu +Cypress.Commands.add('selectPlaybookFromDropdown', (playbookName) => { + cy.findByTestId('autoCompleteSelector').should('exist').within(() => { + cy.get('input').click().type(playbookName.toLowerCase()); + cy.get('#suggestionList').contains(playbookName).click({force: true}); + }); +}); + +Cypress.Commands.add('createPost', (message) => { + // post a message as user to avoid system message + cy.findByTestId('post_textbox').clear().type(`${message}{enter}`); +}); + +Cypress.Commands.add('addPostToTimelineUsingPostMenu', (playbookRunName, summary, postId) => { + cy.clickPostDotMenu(postId); + cy.findByTestId('playbookRunAddToTimeline').click(); + + cy.get('#interactiveDialogModal').should('exist').within(() => { + // # Select playbook run + cy.findByTestId('autoCompleteSelector').should('exist').within(() => { + cy.get('input').click().type(playbookRunName); + cy.get('#suggestionList').contains(playbookRunName).click({force: true}); + }); + + // # Type playbook run name + cy.findByTestId('summaryinput').clear().type(summary, {force: true}); + + // # Submit + cy.get('#interactiveDialogSubmit').click(); + }); + + cy.get('#interactiveDialogModal').should('not.exist'); +}); + +Cypress.Commands.add('openSelector', () => { + cy.findByText('Search for people').click({force: true}); +}); + +Cypress.Commands.add('addInvitedUser', (userName) => { + cy.get('.invite-users-selector__menu').within(() => { + cy.findByText(userName).click({force: true}); + }); +}); + +Cypress.Commands.add('selectOwner', (userName) => { + cy.get('.assign-owner-selector__menu').within(() => { + cy.findByText(userName).click({force: true}); + }); +}); + +Cypress.Commands.add('selectChannel', (channelName) => { + cy.get('#playbook-automation-broadcast .playbooks-rselect__menu').within(() => { + cy.findByText(channelName).click({force: true}); + }); +}); + +Cypress.Commands.add('openReminderSelector', () => { + cy.get('#reminder_timer_datetime input').click({force: true}); +}); + +Cypress.Commands.add('selectReminderTime', (timeText) => { + cy.get('#reminder_timer_datetime .playbooks-rselect__menu').within(() => { + cy.findByText(timeText).click({force: true}); + }); +}); + +/** + * Update the status of the current playbook run through the slash command. + */ +Cypress.Commands.add('updateStatus', (message, reminderQuery) => { + // # Run the slash command to update status. + cy.executeSlashCommand('/playbook update'); + + // # Get the interactive dialog modal. + cy.getStatusUpdateDialog().within(() => { + // # remove what's there if applicable, and type the new update in the textbox. + cy.findByTestId('update_run_status_textbox').clear().type(message); + + if (reminderQuery) { + cy.get('#reminder_timer_datetime').within(() => { + cy.get('input').type(reminderQuery, {delay: TIMEOUTS.TWO_HUNDRED_MILLIS, force: true}).type('{enter}', {force: true}); + }); + } + + // # Submit the dialog. + cy.get('button.confirm').click(); + }); + + // * Verify that the interactive dialog has gone. + cy.getStatusUpdateDialog().should('not.exist'); + + // # Return the post ID of the status update. + return cy.getLastPostId(); +}); + +/** + * Edit a post through the post dot menu. + * @param {String} postId - ID of the post to delete. + * @param {String} newMessage - New content of the post. + */ +Cypress.Commands.add('editPost', (postId, newMessage) => { + // # Open the post dot menu. + cy.clickPostDotMenu(postId); + + // # Click on the Edit menu option. + cy.get(`#edit_post_${postId}`).click(); + + // # Overwrite the post content with the new message provided. + cy.get('#edit_textbox').clear().type(newMessage); + + // # Confirm the edit in the dialog. + cy.get('#editButton').click(); +}); + +Cypress.Commands.add('getStatusUpdateDialog', () => { + return cy.findByRole('dialog', {name: /post update/i}); +}); + +Cypress.Commands.add('getStyledComponent', (className) => { + cy.get(`[class^="${className}-"]`); +}); + +/** + * Get the provided pseudo-class from the previous element and return the property passed as argument + * @param {String} pseudoClass - CSS pseudo class to get. + * @param {String} property - Property that will be returned. + * + * Stolen from https://stackoverflow.com/questions/55516990/cypress-testing-pseudo-css-class-before + */ +Cypress.Commands.add('cssPseudoClass', {prevSubject: 'element'}, (el, pseudoClass, property) => { + const win = el[0].ownerDocument.defaultView; + const pseudoElem = win.getComputedStyle(el[0], pseudoClass); + return pseudoElem.getPropertyValue(property).replace(/(^")|("$)/g, ''); +}); + +/** + * Get the :before pseudo-class from the previous element and return the property passed as argument + * @param {String} property - Property that will be returned. + */ +Cypress.Commands.add('before', {prevSubject: 'element'}, (el, property) => { + return cy.wrap(el).cssPseudoClass('before', property); +}); + +/** + * Get the :after pseudo-class from the previous element and return the property passed as argument + * @param {String} property - Property that will be returned. + */ +Cypress.Commands.add('after', {prevSubject: 'element'}, (el, property) => { + return cy.wrap(el).cssPseudoClass('after', property); +}); + +function waitUntilPermanentPost() { + cy.get('#postListContent').should('exist'); + cy.waitUntil(() => cy.findAllByTestId('postView').last().then((el) => !(el[0].id.includes(':')))); +} + +Cypress.Commands.add('getFirstPostId', () => { + waitUntilPermanentPost(); + + cy.findAllByTestId('postView').first().should('have.attr', 'id').and('not.include', ':'). + invoke('replace', 'post_', ''); +}); + +Cypress.Commands.add('assertRunDetailsPageRenderComplete', (expectedRunOwner) => { + cy.findByTestId('lhs-navigation').should('be.visible').within(() => { + cy.contains('Playbooks').should('be.visible'); + cy.contains('Runs').should('be.visible'); + }); + cy.get('#playbooks-sidebar-right').should('be.visible').within(() => { + cy.findByTestId('assignee-profile-selector').should('contain', expectedRunOwner); + cy.findAllByTestId('timeline-item', {exact: false}).should('have.length.of.at.least', 1); + cy.findAllByTestId('profile-option', {exact: false}).should('have.length.of.at.least', 1); + }); +}); + +Cypress.Commands.add('interceptTelemetry', () => { + cy.intercept('/plugins/playbooks/api/v0/telemetry').as('telemetry'); +}); + +const defaultExpectTelemetryToContainOptions = { + waitForCalls: 'auto', +}; + +// cy.expectTelemetryToContain expects to find the given telemetry events in the order given among the +// recorded telemetry. It doesn't fail if other telemetry events happen to occur in between. +Cypress.Commands.add('expectTelemetryToContain', (items, opts) => { + const options = {...defaultExpectTelemetryToContainOptions, ...opts}; + + // Wait for at least as many telemetry events as requested if auto, or explicit number if passed. + if (options.waitForCalls === 'auto') { + items.forEach(() => cy.wait('@telemetry')); + } else { + for (let i = 0; i < options.waitForCalls; i++) { + cy.wait('@telemetry'); + } + } + + // When additional telemetry events are emitted than what is expected, the ones we want may + // still be be pending, so wait a bit more to try to let requests settle. + cy.wait(TIMEOUTS.HALF_SEC); + + cy.get('@telemetry.all').then((xhrs) => { + let xhrIndex = 0; + items.forEach((item) => { + while (xhrIndex < xhrs.length) { + const xhr = xhrs[xhrIndex]; + + // Advance to the next xhr element regardless of whether or not we find a match. + xhrIndex++; + + if (xhr.request.body.name === item.name && xhr.request.body.type === item.type) { + // Validate only passed properties + if (item.properties) { + for (const [key, value] of Object.entries(item.properties)) { + expect(xhr.request.body.properties[key]).to.eq(value, `Property ${key} does not match for event ${item.name}`); + } + } + + return; + } + } + + throw new Error(`failed to find telemetry event '${item.type}' '${item.name}'`); + }); + }); +}); diff --git a/webapp/channels/e2e/cypress/tests/support/ui/post.ts b/e2e/cypress/tests/support/ui/post.ts similarity index 100% rename from webapp/channels/e2e/cypress/tests/support/ui/post.ts rename to e2e/cypress/tests/support/ui/post.ts diff --git a/webapp/channels/e2e/cypress/tests/support/ui/post_dropdown_menu.d.ts b/e2e/cypress/tests/support/ui/post_dropdown_menu.d.ts similarity index 100% rename from webapp/channels/e2e/cypress/tests/support/ui/post_dropdown_menu.d.ts rename to e2e/cypress/tests/support/ui/post_dropdown_menu.d.ts diff --git a/webapp/channels/e2e/cypress/tests/support/ui/post_dropdown_menu.js b/e2e/cypress/tests/support/ui/post_dropdown_menu.js similarity index 100% rename from webapp/channels/e2e/cypress/tests/support/ui/post_dropdown_menu.js rename to e2e/cypress/tests/support/ui/post_dropdown_menu.js diff --git a/webapp/channels/e2e/cypress/tests/support/ui/search.js b/e2e/cypress/tests/support/ui/search.js similarity index 100% rename from webapp/channels/e2e/cypress/tests/support/ui/search.js rename to e2e/cypress/tests/support/ui/search.js diff --git a/webapp/channels/e2e/cypress/tests/support/ui/sidebar_left.ts b/e2e/cypress/tests/support/ui/sidebar_left.ts similarity index 100% rename from webapp/channels/e2e/cypress/tests/support/ui/sidebar_left.ts rename to e2e/cypress/tests/support/ui/sidebar_left.ts diff --git a/webapp/channels/e2e/cypress/tests/support/ui/sidebar_right.d.ts b/e2e/cypress/tests/support/ui/sidebar_right.d.ts similarity index 100% rename from webapp/channels/e2e/cypress/tests/support/ui/sidebar_right.d.ts rename to e2e/cypress/tests/support/ui/sidebar_right.d.ts diff --git a/webapp/channels/e2e/cypress/tests/support/ui/sidebar_right.js b/e2e/cypress/tests/support/ui/sidebar_right.js similarity index 100% rename from webapp/channels/e2e/cypress/tests/support/ui/sidebar_right.js rename to e2e/cypress/tests/support/ui/sidebar_right.js diff --git a/webapp/channels/e2e/cypress/tests/support/ui/suggestion_list.d.ts b/e2e/cypress/tests/support/ui/suggestion_list.d.ts similarity index 100% rename from webapp/channels/e2e/cypress/tests/support/ui/suggestion_list.d.ts rename to e2e/cypress/tests/support/ui/suggestion_list.d.ts diff --git a/webapp/channels/e2e/cypress/tests/support/ui/suggestion_list.js b/e2e/cypress/tests/support/ui/suggestion_list.js similarity index 100% rename from webapp/channels/e2e/cypress/tests/support/ui/suggestion_list.js rename to e2e/cypress/tests/support/ui/suggestion_list.js diff --git a/webapp/channels/e2e/cypress/tests/support/ui/system.d.ts b/e2e/cypress/tests/support/ui/system.d.ts similarity index 100% rename from webapp/channels/e2e/cypress/tests/support/ui/system.d.ts rename to e2e/cypress/tests/support/ui/system.d.ts diff --git a/webapp/channels/e2e/cypress/tests/support/ui/system.js b/e2e/cypress/tests/support/ui/system.js similarity index 100% rename from webapp/channels/e2e/cypress/tests/support/ui/system.js rename to e2e/cypress/tests/support/ui/system.js diff --git a/webapp/channels/e2e/cypress/tests/support/ui/team.js b/e2e/cypress/tests/support/ui/team.js similarity index 100% rename from webapp/channels/e2e/cypress/tests/support/ui/team.js rename to e2e/cypress/tests/support/ui/team.js diff --git a/webapp/channels/e2e/cypress/tests/support/ui/tooltip.d.ts b/e2e/cypress/tests/support/ui/tooltip.d.ts similarity index 100% rename from webapp/channels/e2e/cypress/tests/support/ui/tooltip.d.ts rename to e2e/cypress/tests/support/ui/tooltip.d.ts diff --git a/webapp/channels/e2e/cypress/tests/support/ui/tooltip.js b/e2e/cypress/tests/support/ui/tooltip.js similarity index 100% rename from webapp/channels/e2e/cypress/tests/support/ui/tooltip.js rename to e2e/cypress/tests/support/ui/tooltip.js diff --git a/webapp/channels/e2e/cypress/tests/support/ui_commands.ts b/e2e/cypress/tests/support/ui_commands.ts similarity index 93% rename from webapp/channels/e2e/cypress/tests/support/ui_commands.ts rename to e2e/cypress/tests/support/ui_commands.ts index ef0672845a..b6dd8983d1 100644 --- a/webapp/channels/e2e/cypress/tests/support/ui_commands.ts +++ b/e2e/cypress/tests/support/ui_commands.ts @@ -526,6 +526,42 @@ function clickEmojiInEmojiPicker(emojiName: string) { } Cypress.Commands.add('clickEmojiInEmojiPicker', clickEmojiInEmojiPicker); +function verifyPostedMessage(message) { + cy.wait(TIMEOUTS.HALF_SEC).getLastPostId().then((postId) => { + cy.get(`#post_${postId}`).within(() => { + cy.get(`#postMessageText_${postId}`).contains(message); + }); + }); +} +Cypress.Commands.add('verifyPostedMessage', verifyPostedMessage); + +function verifyEphemeralMessage(message, isCompactMode, needsToScroll) { + if (needsToScroll) { + // # Scroll the ephemeral message into view + cy.get('#postListContent').within(() => { + cy.get('.post-list__dynamic').scrollTo('bottom', {ensureScrollable: false}); + }); + } + + // # Checking if we got the ephemeral message with the selection we made + cy.wait(TIMEOUTS.HALF_SEC).getLastPostId().then((postId) => { + cy.get(`#post_${postId}`).within(() => { + if (isCompactMode) { + // * Check if Bot message only visible to you and has requisite message. + cy.get(`#postMessageText_${postId}`).contains(message); + cy.get(`#postMessageText_${postId}`).contains('(Only visible to you)'); + } else { + // * Check if Bot message only visible to you + cy.get('.post__visibility').last().should('exist').and('have.text', '(Only visible to you)'); + + // * Check if we got ephemeral message of our selection + cy.get(`#postMessageText_${postId}`).contains(message); + } + }); + }); +} +Cypress.Commands.add('verifyEphemeralMessage', verifyEphemeralMessage); + declare global { // eslint-disable-next-line @typescript-eslint/no-namespace namespace Cypress { @@ -743,6 +779,17 @@ declare global { * Navigate to system console-PluginManagement from account settings */ checkRunLDAPSync: typeof checkRunLDAPSync; + + /** + * verifyPostedMessage verifies the receipt of a post containing the given message substring. + */ + verifyPostedMessage: typeof verifyPostedMessage; + + /** + * verifyEphemeralMessage verifies the receipt of an ephemeral message containing the given + * message substring. An exact match is avoided to simplify tests. + */ + verifyEphemeralMessage: typeof verifyEphemeralMessage; } } } diff --git a/webapp/channels/e2e/cypress/tests/support/win.d.ts b/e2e/cypress/tests/support/win.d.ts similarity index 100% rename from webapp/channels/e2e/cypress/tests/support/win.d.ts rename to e2e/cypress/tests/support/win.d.ts diff --git a/webapp/channels/e2e/cypress/tests/types/index.ts b/e2e/cypress/tests/types/index.ts similarity index 100% rename from webapp/channels/e2e/cypress/tests/types/index.ts rename to e2e/cypress/tests/types/index.ts diff --git a/webapp/channels/e2e/cypress/tests/utils/admin_console.js b/e2e/cypress/tests/utils/admin_console.js similarity index 100% rename from webapp/channels/e2e/cypress/tests/utils/admin_console.js rename to e2e/cypress/tests/utils/admin_console.js diff --git a/webapp/channels/e2e/cypress/tests/utils/benchmark.js b/e2e/cypress/tests/utils/benchmark.js similarity index 100% rename from webapp/channels/e2e/cypress/tests/utils/benchmark.js rename to e2e/cypress/tests/utils/benchmark.js diff --git a/webapp/channels/e2e/cypress/tests/utils/config.js b/e2e/cypress/tests/utils/config.js similarity index 100% rename from webapp/channels/e2e/cypress/tests/utils/config.js rename to e2e/cypress/tests/utils/config.js diff --git a/webapp/channels/e2e/cypress/tests/utils/constants.js b/e2e/cypress/tests/utils/constants.js similarity index 100% rename from webapp/channels/e2e/cypress/tests/utils/constants.js rename to e2e/cypress/tests/utils/constants.js diff --git a/webapp/channels/e2e/cypress/tests/utils/email.js b/e2e/cypress/tests/utils/email.js similarity index 100% rename from webapp/channels/e2e/cypress/tests/utils/email.js rename to e2e/cypress/tests/utils/email.js diff --git a/webapp/channels/e2e/cypress/tests/utils/file.js b/e2e/cypress/tests/utils/file.js similarity index 100% rename from webapp/channels/e2e/cypress/tests/utils/file.js rename to e2e/cypress/tests/utils/file.js diff --git a/webapp/channels/e2e/cypress/tests/utils/index.js b/e2e/cypress/tests/utils/index.js similarity index 100% rename from webapp/channels/e2e/cypress/tests/utils/index.js rename to e2e/cypress/tests/utils/index.js diff --git a/webapp/channels/e2e/cypress/tests/utils/plugins.js b/e2e/cypress/tests/utils/plugins.js similarity index 100% rename from webapp/channels/e2e/cypress/tests/utils/plugins.js rename to e2e/cypress/tests/utils/plugins.js diff --git a/webapp/channels/e2e/cypress/tests/utils/timezone.js b/e2e/cypress/tests/utils/timezone.js similarity index 100% rename from webapp/channels/e2e/cypress/tests/utils/timezone.js rename to e2e/cypress/tests/utils/timezone.js diff --git a/webapp/channels/e2e/cypress/tsconfig.json b/e2e/cypress/tsconfig.json similarity index 71% rename from webapp/channels/e2e/cypress/tsconfig.json rename to e2e/cypress/tsconfig.json index 2152bde6d7..77cff92343 100644 --- a/webapp/channels/e2e/cypress/tsconfig.json +++ b/e2e/cypress/tsconfig.json @@ -4,16 +4,12 @@ "lib": ["esnext", "dom"], "types": ["cypress", "cypress-wait-until", "@testing-library/cypress", "node"], "esModuleInterop": true, - "module": "commonjs", "resolveJsonModule": true, "moduleResolution": "node", "baseUrl": ".", "skipLibCheck": true, "allowJs": true, "noEmit": true, - "paths": { - "@mattermost/types/*": ["node_modules/@mattermost/types/lib/*"] - } }, - "include": ["**/*.ts"] + "include": ["**/*.*"] } diff --git a/webapp/channels/e2e/cypress/utils/artifacts.js b/e2e/cypress/utils/artifacts.js similarity index 100% rename from webapp/channels/e2e/cypress/utils/artifacts.js rename to e2e/cypress/utils/artifacts.js diff --git a/webapp/channels/e2e/cypress/utils/constants.js b/e2e/cypress/utils/constants.js similarity index 100% rename from webapp/channels/e2e/cypress/utils/constants.js rename to e2e/cypress/utils/constants.js diff --git a/webapp/channels/e2e/cypress/utils/dashboard.js b/e2e/cypress/utils/dashboard.js similarity index 100% rename from webapp/channels/e2e/cypress/utils/dashboard.js rename to e2e/cypress/utils/dashboard.js diff --git a/webapp/channels/e2e/cypress/utils/even_distribution.js b/e2e/cypress/utils/even_distribution.js similarity index 100% rename from webapp/channels/e2e/cypress/utils/even_distribution.js rename to e2e/cypress/utils/even_distribution.js diff --git a/webapp/channels/e2e/cypress/utils/even_distribution.test.js b/e2e/cypress/utils/even_distribution.test.js similarity index 100% rename from webapp/channels/e2e/cypress/utils/even_distribution.test.js rename to e2e/cypress/utils/even_distribution.test.js diff --git a/webapp/channels/e2e/cypress/utils/file.js b/e2e/cypress/utils/file.js similarity index 100% rename from webapp/channels/e2e/cypress/utils/file.js rename to e2e/cypress/utils/file.js diff --git a/webapp/channels/e2e/cypress/utils/report.js b/e2e/cypress/utils/report.js similarity index 100% rename from webapp/channels/e2e/cypress/utils/report.js rename to e2e/cypress/utils/report.js diff --git a/webapp/channels/e2e/cypress/utils/test_cases.js b/e2e/cypress/utils/test_cases.js similarity index 100% rename from webapp/channels/e2e/cypress/utils/test_cases.js rename to e2e/cypress/utils/test_cases.js diff --git a/webapp/channels/e2e/cypress/utils/webhook_utils.js b/e2e/cypress/utils/webhook_utils.js similarity index 100% rename from webapp/channels/e2e/cypress/utils/webhook_utils.js rename to e2e/cypress/utils/webhook_utils.js diff --git a/webapp/channels/e2e/cypress/webhook_serve.js b/e2e/cypress/webhook_serve.js similarity index 99% rename from webapp/channels/e2e/cypress/webhook_serve.js rename to e2e/cypress/webhook_serve.js index 080a7dfbb1..7a0053f71a 100644 --- a/webapp/channels/e2e/cypress/webhook_serve.js +++ b/e2e/cypress/webhook_serve.js @@ -5,7 +5,7 @@ const express = require('express'); const axios = require('axios'); -var ClientOAuth2 = require('client-oauth2'); +const ClientOAuth2 = require('client-oauth2'); const webhookUtils = require('./utils/webhook_utils'); diff --git a/webapp/channels/e2e/playwright/.eslintignore b/e2e/playwright/.eslintignore similarity index 61% rename from webapp/channels/e2e/playwright/.eslintignore rename to e2e/playwright/.eslintignore index 3c3629e647..44e9af97e7 100644 --- a/webapp/channels/e2e/playwright/.eslintignore +++ b/e2e/playwright/.eslintignore @@ -1 +1,2 @@ +results node_modules diff --git a/webapp/channels/e2e/playwright/.eslintrc.json b/e2e/playwright/.eslintrc.json similarity index 100% rename from webapp/channels/e2e/playwright/.eslintrc.json rename to e2e/playwright/.eslintrc.json diff --git a/webapp/channels/e2e/playwright/.percy.yml b/e2e/playwright/.percy.yml similarity index 100% rename from webapp/channels/e2e/playwright/.percy.yml rename to e2e/playwright/.percy.yml diff --git a/webapp/channels/e2e/playwright/.prettierignore b/e2e/playwright/.prettierignore similarity index 100% rename from webapp/channels/e2e/playwright/.prettierignore rename to e2e/playwright/.prettierignore diff --git a/webapp/channels/e2e/playwright/.prettierrc.json b/e2e/playwright/.prettierrc.json similarity index 100% rename from webapp/channels/e2e/playwright/.prettierrc.json rename to e2e/playwright/.prettierrc.json diff --git a/webapp/channels/e2e/playwright/README.md b/e2e/playwright/README.md similarity index 87% rename from webapp/channels/e2e/playwright/README.md rename to e2e/playwright/README.md index b0ba53f955..25dd2c9d68 100644 --- a/webapp/channels/e2e/playwright/README.md +++ b/e2e/playwright/README.md @@ -29,17 +29,17 @@ npm run test #### 1. Run docker container using latest focal version -Change to root directory at `mattermost-webapp`, run docker container +Change to root directory, run docker container ``` -docker run -it --rm -v "$(pwd):/mattermost-webapp/" --ipc=host mcr.microsoft.com/playwright:v1.30.0-focal /bin/bash +docker run -it --rm -v "$(pwd):/mattermost/" --ipc=host mcr.microsoft.com/playwright:v1.30.0-focal /bin/bash ``` #### 2. Inside the docker container ``` export PW_BASE_URL=http://host.docker.internal:8065 -cd mattermost-webapp/e2e/playwright +cd mattermost/e2e/playwright # Install npm packages. Use "npm ci" to match the automated environment npm ci diff --git a/webapp/channels/e2e/playwright/global_setup.ts b/e2e/playwright/global_setup.ts similarity index 97% rename from webapp/channels/e2e/playwright/global_setup.ts rename to e2e/playwright/global_setup.ts index dc3a8eec1f..ed5c9d00ad 100644 --- a/webapp/channels/e2e/playwright/global_setup.ts +++ b/e2e/playwright/global_setup.ts @@ -2,7 +2,9 @@ // See LICENSE.txt for license information. import {expect} from '@playwright/test'; +import {AdminConfig} from '@mattermost/types/config'; import {UserProfile} from '@mattermost/types/users'; +import {PluginsResponse} from '@mattermost/types/plugins'; import { Client, @@ -14,7 +16,6 @@ import { } from './support/server'; import {defaultTeam} from './support/util'; import testConfig from './test.config'; -import {AdminConfig} from '@mattermost/types/config'; async function globalSetup() { let adminClient: Client; @@ -130,7 +131,7 @@ function getProductsAsPlugin() { async function ensurePluginsLoaded(client: Client) { const pluginStatus = await client.getPluginStatuses(); - const plugins = await client.getPlugins(); + const plugins = (await client.getPlugins()) as PluginsResponse; getProductsAsPlugin().forEach(async (pluginId) => { const isInstalled = pluginStatus.some((plugin) => plugin.plugin_id === pluginId); @@ -165,7 +166,7 @@ function printBoardsProductStatus(config: AdminConfig) { } async function printPluginDetails(client: Client) { - const plugins = await client.getPlugins(); + const plugins = (await client.getPlugins()) as PluginsResponse; if (plugins.active.length) { // eslint-disable-next-line no-console diff --git a/webapp/channels/e2e/playwright/package-lock.json b/e2e/playwright/package-lock.json similarity index 100% rename from webapp/channels/e2e/playwright/package-lock.json rename to e2e/playwright/package-lock.json diff --git a/webapp/channels/e2e/playwright/package.json b/e2e/playwright/package.json similarity index 100% rename from webapp/channels/e2e/playwright/package.json rename to e2e/playwright/package.json diff --git a/webapp/channels/e2e/playwright/playwright.config.ts b/e2e/playwright/playwright.config.ts similarity index 100% rename from webapp/channels/e2e/playwright/playwright.config.ts rename to e2e/playwright/playwright.config.ts diff --git a/webapp/channels/e2e/playwright/support/asset/mattermost-icon_128x128.png b/e2e/playwright/support/asset/mattermost-icon_128x128.png similarity index 100% rename from webapp/channels/e2e/playwright/support/asset/mattermost-icon_128x128.png rename to e2e/playwright/support/asset/mattermost-icon_128x128.png diff --git a/webapp/channels/e2e/playwright/support/browser_context.ts b/e2e/playwright/support/browser_context.ts similarity index 100% rename from webapp/channels/e2e/playwright/support/browser_context.ts rename to e2e/playwright/support/browser_context.ts diff --git a/webapp/channels/e2e/playwright/support/flag.ts b/e2e/playwright/support/flag.ts similarity index 100% rename from webapp/channels/e2e/playwright/support/flag.ts rename to e2e/playwright/support/flag.ts diff --git a/webapp/channels/e2e/playwright/support/server/channel.ts b/e2e/playwright/support/server/channel.ts similarity index 100% rename from webapp/channels/e2e/playwright/support/server/channel.ts rename to e2e/playwright/support/server/channel.ts diff --git a/webapp/channels/e2e/playwright/support/server/client.ts b/e2e/playwright/support/server/client.ts similarity index 100% rename from webapp/channels/e2e/playwright/support/server/client.ts rename to e2e/playwright/support/server/client.ts diff --git a/webapp/channels/e2e/playwright/support/server/default_config.ts b/e2e/playwright/support/server/default_config.ts similarity index 99% rename from webapp/channels/e2e/playwright/support/server/default_config.ts rename to e2e/playwright/support/server/default_config.ts index f2b7dd9d65..06b5becd1b 100644 --- a/webapp/channels/e2e/playwright/support/server/default_config.ts +++ b/e2e/playwright/support/server/default_config.ts @@ -180,6 +180,9 @@ const defaultServerConfig: AdminConfig = { EnableCustomGroups: true, SelfHostedPurchase: true, AllowSyncedDrafts: true, + + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore SelfHostedExpansion: false, }, TeamSettings: { diff --git a/webapp/channels/e2e/playwright/support/server/index.ts b/e2e/playwright/support/server/index.ts similarity index 100% rename from webapp/channels/e2e/playwright/support/server/index.ts rename to e2e/playwright/support/server/index.ts diff --git a/webapp/channels/e2e/playwright/support/server/init.ts b/e2e/playwright/support/server/init.ts similarity index 100% rename from webapp/channels/e2e/playwright/support/server/init.ts rename to e2e/playwright/support/server/init.ts diff --git a/webapp/channels/e2e/playwright/support/server/team.ts b/e2e/playwright/support/server/team.ts similarity index 100% rename from webapp/channels/e2e/playwright/support/server/team.ts rename to e2e/playwright/support/server/team.ts diff --git a/webapp/channels/e2e/playwright/support/server/user.ts b/e2e/playwright/support/server/user.ts similarity index 100% rename from webapp/channels/e2e/playwright/support/server/user.ts rename to e2e/playwright/support/server/user.ts diff --git a/webapp/channels/e2e/playwright/support/test_action.ts b/e2e/playwright/support/test_action.ts similarity index 100% rename from webapp/channels/e2e/playwright/support/test_action.ts rename to e2e/playwright/support/test_action.ts diff --git a/webapp/channels/e2e/playwright/support/test_fixture.ts b/e2e/playwright/support/test_fixture.ts similarity index 100% rename from webapp/channels/e2e/playwright/support/test_fixture.ts rename to e2e/playwright/support/test_fixture.ts diff --git a/webapp/channels/e2e/playwright/support/ui/components/boards/create_modal.ts b/e2e/playwright/support/ui/components/boards/create_modal.ts similarity index 100% rename from webapp/channels/e2e/playwright/support/ui/components/boards/create_modal.ts rename to e2e/playwright/support/ui/components/boards/create_modal.ts diff --git a/webapp/channels/e2e/playwright/support/ui/components/boards/sidebar.ts b/e2e/playwright/support/ui/components/boards/sidebar.ts similarity index 100% rename from webapp/channels/e2e/playwright/support/ui/components/boards/sidebar.ts rename to e2e/playwright/support/ui/components/boards/sidebar.ts diff --git a/webapp/channels/e2e/playwright/support/ui/components/channels/app_bar.ts b/e2e/playwright/support/ui/components/channels/app_bar.ts similarity index 100% rename from webapp/channels/e2e/playwright/support/ui/components/channels/app_bar.ts rename to e2e/playwright/support/ui/components/channels/app_bar.ts diff --git a/webapp/channels/e2e/playwright/support/ui/components/channels/post.ts b/e2e/playwright/support/ui/components/channels/post.ts similarity index 100% rename from webapp/channels/e2e/playwright/support/ui/components/channels/post.ts rename to e2e/playwright/support/ui/components/channels/post.ts diff --git a/webapp/channels/e2e/playwright/support/ui/components/channels/post_create.ts b/e2e/playwright/support/ui/components/channels/post_create.ts similarity index 100% rename from webapp/channels/e2e/playwright/support/ui/components/channels/post_create.ts rename to e2e/playwright/support/ui/components/channels/post_create.ts diff --git a/webapp/channels/e2e/playwright/support/ui/components/global_header.ts b/e2e/playwright/support/ui/components/global_header.ts similarity index 100% rename from webapp/channels/e2e/playwright/support/ui/components/global_header.ts rename to e2e/playwright/support/ui/components/global_header.ts diff --git a/webapp/channels/e2e/playwright/support/ui/components/index.ts b/e2e/playwright/support/ui/components/index.ts similarity index 100% rename from webapp/channels/e2e/playwright/support/ui/components/index.ts rename to e2e/playwright/support/ui/components/index.ts diff --git a/webapp/channels/e2e/playwright/support/ui/pages/boards_create.ts b/e2e/playwright/support/ui/pages/boards_create.ts similarity index 100% rename from webapp/channels/e2e/playwright/support/ui/pages/boards_create.ts rename to e2e/playwright/support/ui/pages/boards_create.ts diff --git a/webapp/channels/e2e/playwright/support/ui/pages/boards_view.ts b/e2e/playwright/support/ui/pages/boards_view.ts similarity index 100% rename from webapp/channels/e2e/playwright/support/ui/pages/boards_view.ts rename to e2e/playwright/support/ui/pages/boards_view.ts diff --git a/webapp/channels/e2e/playwright/support/ui/pages/channels.ts b/e2e/playwright/support/ui/pages/channels.ts similarity index 100% rename from webapp/channels/e2e/playwright/support/ui/pages/channels.ts rename to e2e/playwright/support/ui/pages/channels.ts diff --git a/webapp/channels/e2e/playwright/support/ui/pages/index.ts b/e2e/playwright/support/ui/pages/index.ts similarity index 100% rename from webapp/channels/e2e/playwright/support/ui/pages/index.ts rename to e2e/playwright/support/ui/pages/index.ts diff --git a/webapp/channels/e2e/playwright/support/ui/pages/landing_login.ts b/e2e/playwright/support/ui/pages/landing_login.ts similarity index 100% rename from webapp/channels/e2e/playwright/support/ui/pages/landing_login.ts rename to e2e/playwright/support/ui/pages/landing_login.ts diff --git a/webapp/channels/e2e/playwright/support/ui/pages/login.ts b/e2e/playwright/support/ui/pages/login.ts similarity index 100% rename from webapp/channels/e2e/playwright/support/ui/pages/login.ts rename to e2e/playwright/support/ui/pages/login.ts diff --git a/webapp/channels/e2e/playwright/support/ui/pages/signup.ts b/e2e/playwright/support/ui/pages/signup.ts similarity index 100% rename from webapp/channels/e2e/playwright/support/ui/pages/signup.ts rename to e2e/playwright/support/ui/pages/signup.ts diff --git a/webapp/channels/e2e/playwright/support/util.ts b/e2e/playwright/support/util.ts similarity index 100% rename from webapp/channels/e2e/playwright/support/util.ts rename to e2e/playwright/support/util.ts diff --git a/webapp/channels/e2e/playwright/support/visual/index.ts b/e2e/playwright/support/visual/index.ts similarity index 100% rename from webapp/channels/e2e/playwright/support/visual/index.ts rename to e2e/playwright/support/visual/index.ts diff --git a/webapp/channels/e2e/playwright/support/visual/percy.ts b/e2e/playwright/support/visual/percy.ts similarity index 100% rename from webapp/channels/e2e/playwright/support/visual/percy.ts rename to e2e/playwright/support/visual/percy.ts diff --git a/webapp/channels/e2e/playwright/test.config.ts b/e2e/playwright/test.config.ts similarity index 100% rename from webapp/channels/e2e/playwright/test.config.ts rename to e2e/playwright/test.config.ts diff --git a/webapp/channels/e2e/playwright/tests/functional/boards/board-creation-and-set-up/create_empty_board.spec.ts b/e2e/playwright/tests/functional/boards/board-creation-and-set-up/create_empty_board.spec.ts similarity index 100% rename from webapp/channels/e2e/playwright/tests/functional/boards/board-creation-and-set-up/create_empty_board.spec.ts rename to e2e/playwright/tests/functional/boards/board-creation-and-set-up/create_empty_board.spec.ts diff --git a/webapp/channels/e2e/playwright/tests/visual/boards/board_template.spec.ts b/e2e/playwright/tests/visual/boards/board_template.spec.ts similarity index 100% rename from webapp/channels/e2e/playwright/tests/visual/boards/board_template.spec.ts rename to e2e/playwright/tests/visual/boards/board_template.spec.ts diff --git a/webapp/channels/e2e/playwright/tests/visual/boards/board_template.spec.ts-snapshots/board-template-chrome-linux.png b/e2e/playwright/tests/visual/boards/board_template.spec.ts-snapshots/board-template-chrome-linux.png similarity index 100% rename from webapp/channels/e2e/playwright/tests/visual/boards/board_template.spec.ts-snapshots/board-template-chrome-linux.png rename to e2e/playwright/tests/visual/boards/board_template.spec.ts-snapshots/board-template-chrome-linux.png diff --git a/webapp/channels/e2e/playwright/tests/visual/boards/board_template.spec.ts-snapshots/board-template-firefox-linux.png b/e2e/playwright/tests/visual/boards/board_template.spec.ts-snapshots/board-template-firefox-linux.png similarity index 100% rename from webapp/channels/e2e/playwright/tests/visual/boards/board_template.spec.ts-snapshots/board-template-firefox-linux.png rename to e2e/playwright/tests/visual/boards/board_template.spec.ts-snapshots/board-template-firefox-linux.png diff --git a/webapp/channels/e2e/playwright/tests/visual/boards/board_template.spec.ts-snapshots/board-template-ipad-linux.png b/e2e/playwright/tests/visual/boards/board_template.spec.ts-snapshots/board-template-ipad-linux.png similarity index 100% rename from webapp/channels/e2e/playwright/tests/visual/boards/board_template.spec.ts-snapshots/board-template-ipad-linux.png rename to e2e/playwright/tests/visual/boards/board_template.spec.ts-snapshots/board-template-ipad-linux.png diff --git a/webapp/channels/e2e/playwright/tests/visual/boards/view_untitled_board.spec.ts b/e2e/playwright/tests/visual/boards/view_untitled_board.spec.ts similarity index 100% rename from webapp/channels/e2e/playwright/tests/visual/boards/view_untitled_board.spec.ts rename to e2e/playwright/tests/visual/boards/view_untitled_board.spec.ts diff --git a/webapp/channels/e2e/playwright/tests/visual/boards/view_untitled_board.spec.ts-snapshots/view-untitled-board-chrome-linux.png b/e2e/playwright/tests/visual/boards/view_untitled_board.spec.ts-snapshots/view-untitled-board-chrome-linux.png similarity index 100% rename from webapp/channels/e2e/playwright/tests/visual/boards/view_untitled_board.spec.ts-snapshots/view-untitled-board-chrome-linux.png rename to e2e/playwright/tests/visual/boards/view_untitled_board.spec.ts-snapshots/view-untitled-board-chrome-linux.png diff --git a/webapp/channels/e2e/playwright/tests/visual/boards/view_untitled_board.spec.ts-snapshots/view-untitled-board-firefox-linux.png b/e2e/playwright/tests/visual/boards/view_untitled_board.spec.ts-snapshots/view-untitled-board-firefox-linux.png similarity index 100% rename from webapp/channels/e2e/playwright/tests/visual/boards/view_untitled_board.spec.ts-snapshots/view-untitled-board-firefox-linux.png rename to e2e/playwright/tests/visual/boards/view_untitled_board.spec.ts-snapshots/view-untitled-board-firefox-linux.png diff --git a/webapp/channels/e2e/playwright/tests/visual/boards/view_untitled_board.spec.ts-snapshots/view-untitled-board-ipad-linux.png b/e2e/playwright/tests/visual/boards/view_untitled_board.spec.ts-snapshots/view-untitled-board-ipad-linux.png similarity index 100% rename from webapp/channels/e2e/playwright/tests/visual/boards/view_untitled_board.spec.ts-snapshots/view-untitled-board-ipad-linux.png rename to e2e/playwright/tests/visual/boards/view_untitled_board.spec.ts-snapshots/view-untitled-board-ipad-linux.png diff --git a/webapp/channels/e2e/playwright/tests/visual/channels/intro_channel.spec.ts b/e2e/playwright/tests/visual/channels/intro_channel.spec.ts similarity index 100% rename from webapp/channels/e2e/playwright/tests/visual/channels/intro_channel.spec.ts rename to e2e/playwright/tests/visual/channels/intro_channel.spec.ts diff --git a/webapp/channels/e2e/playwright/tests/visual/channels/intro_channel.spec.ts-snapshots/intro-to-channel-as-regular-user-chrome-linux.png b/e2e/playwright/tests/visual/channels/intro_channel.spec.ts-snapshots/intro-to-channel-as-regular-user-chrome-linux.png similarity index 100% rename from webapp/channels/e2e/playwright/tests/visual/channels/intro_channel.spec.ts-snapshots/intro-to-channel-as-regular-user-chrome-linux.png rename to e2e/playwright/tests/visual/channels/intro_channel.spec.ts-snapshots/intro-to-channel-as-regular-user-chrome-linux.png diff --git a/webapp/channels/e2e/playwright/tests/visual/channels/intro_channel.spec.ts-snapshots/intro-to-channel-as-regular-user-firefox-linux.png b/e2e/playwright/tests/visual/channels/intro_channel.spec.ts-snapshots/intro-to-channel-as-regular-user-firefox-linux.png similarity index 100% rename from webapp/channels/e2e/playwright/tests/visual/channels/intro_channel.spec.ts-snapshots/intro-to-channel-as-regular-user-firefox-linux.png rename to e2e/playwright/tests/visual/channels/intro_channel.spec.ts-snapshots/intro-to-channel-as-regular-user-firefox-linux.png diff --git a/webapp/channels/e2e/playwright/tests/visual/channels/intro_channel.spec.ts-snapshots/intro-to-channel-as-regular-user-ipad-linux.png b/e2e/playwright/tests/visual/channels/intro_channel.spec.ts-snapshots/intro-to-channel-as-regular-user-ipad-linux.png similarity index 100% rename from webapp/channels/e2e/playwright/tests/visual/channels/intro_channel.spec.ts-snapshots/intro-to-channel-as-regular-user-ipad-linux.png rename to e2e/playwright/tests/visual/channels/intro_channel.spec.ts-snapshots/intro-to-channel-as-regular-user-ipad-linux.png diff --git a/webapp/channels/e2e/playwright/tests/visual/channels/intro_channel.spec.ts-snapshots/intro-to-channel-as-regular-user-iphone-linux.png b/e2e/playwright/tests/visual/channels/intro_channel.spec.ts-snapshots/intro-to-channel-as-regular-user-iphone-linux.png similarity index 100% rename from webapp/channels/e2e/playwright/tests/visual/channels/intro_channel.spec.ts-snapshots/intro-to-channel-as-regular-user-iphone-linux.png rename to e2e/playwright/tests/visual/channels/intro_channel.spec.ts-snapshots/intro-to-channel-as-regular-user-iphone-linux.png diff --git a/webapp/channels/e2e/playwright/tests/visual/common/landing_page.spec.ts b/e2e/playwright/tests/visual/common/landing_page.spec.ts similarity index 100% rename from webapp/channels/e2e/playwright/tests/visual/common/landing_page.spec.ts rename to e2e/playwright/tests/visual/common/landing_page.spec.ts diff --git a/webapp/channels/e2e/playwright/tests/visual/common/landing_page.spec.ts-snapshots/landing-login-chrome-linux.png b/e2e/playwright/tests/visual/common/landing_page.spec.ts-snapshots/landing-login-chrome-linux.png similarity index 100% rename from webapp/channels/e2e/playwright/tests/visual/common/landing_page.spec.ts-snapshots/landing-login-chrome-linux.png rename to e2e/playwright/tests/visual/common/landing_page.spec.ts-snapshots/landing-login-chrome-linux.png diff --git a/webapp/channels/e2e/playwright/tests/visual/common/landing_page.spec.ts-snapshots/landing-login-firefox-linux.png b/e2e/playwright/tests/visual/common/landing_page.spec.ts-snapshots/landing-login-firefox-linux.png similarity index 100% rename from webapp/channels/e2e/playwright/tests/visual/common/landing_page.spec.ts-snapshots/landing-login-firefox-linux.png rename to e2e/playwright/tests/visual/common/landing_page.spec.ts-snapshots/landing-login-firefox-linux.png diff --git a/webapp/channels/e2e/playwright/tests/visual/common/landing_page.spec.ts-snapshots/landing-login-ipad-linux.png b/e2e/playwright/tests/visual/common/landing_page.spec.ts-snapshots/landing-login-ipad-linux.png similarity index 100% rename from webapp/channels/e2e/playwright/tests/visual/common/landing_page.spec.ts-snapshots/landing-login-ipad-linux.png rename to e2e/playwright/tests/visual/common/landing_page.spec.ts-snapshots/landing-login-ipad-linux.png diff --git a/webapp/channels/e2e/playwright/tests/visual/common/landing_page.spec.ts-snapshots/landing-login-iphone-linux.png b/e2e/playwright/tests/visual/common/landing_page.spec.ts-snapshots/landing-login-iphone-linux.png similarity index 100% rename from webapp/channels/e2e/playwright/tests/visual/common/landing_page.spec.ts-snapshots/landing-login-iphone-linux.png rename to e2e/playwright/tests/visual/common/landing_page.spec.ts-snapshots/landing-login-iphone-linux.png diff --git a/webapp/channels/e2e/playwright/tests/visual/common/login.spec.ts b/e2e/playwright/tests/visual/common/login.spec.ts similarity index 100% rename from webapp/channels/e2e/playwright/tests/visual/common/login.spec.ts rename to e2e/playwright/tests/visual/common/login.spec.ts diff --git a/webapp/channels/e2e/playwright/tests/visual/common/login.spec.ts-snapshots/login-chrome-linux.png b/e2e/playwright/tests/visual/common/login.spec.ts-snapshots/login-chrome-linux.png similarity index 100% rename from webapp/channels/e2e/playwright/tests/visual/common/login.spec.ts-snapshots/login-chrome-linux.png rename to e2e/playwright/tests/visual/common/login.spec.ts-snapshots/login-chrome-linux.png diff --git a/webapp/channels/e2e/playwright/tests/visual/common/login.spec.ts-snapshots/login-error-chrome-linux.png b/e2e/playwright/tests/visual/common/login.spec.ts-snapshots/login-error-chrome-linux.png similarity index 100% rename from webapp/channels/e2e/playwright/tests/visual/common/login.spec.ts-snapshots/login-error-chrome-linux.png rename to e2e/playwright/tests/visual/common/login.spec.ts-snapshots/login-error-chrome-linux.png diff --git a/webapp/channels/e2e/playwright/tests/visual/common/login.spec.ts-snapshots/login-error-firefox-linux.png b/e2e/playwright/tests/visual/common/login.spec.ts-snapshots/login-error-firefox-linux.png similarity index 100% rename from webapp/channels/e2e/playwright/tests/visual/common/login.spec.ts-snapshots/login-error-firefox-linux.png rename to e2e/playwright/tests/visual/common/login.spec.ts-snapshots/login-error-firefox-linux.png diff --git a/webapp/channels/e2e/playwright/tests/visual/common/login.spec.ts-snapshots/login-error-ipad-linux.png b/e2e/playwright/tests/visual/common/login.spec.ts-snapshots/login-error-ipad-linux.png similarity index 100% rename from webapp/channels/e2e/playwright/tests/visual/common/login.spec.ts-snapshots/login-error-ipad-linux.png rename to e2e/playwright/tests/visual/common/login.spec.ts-snapshots/login-error-ipad-linux.png diff --git a/webapp/channels/e2e/playwright/tests/visual/common/login.spec.ts-snapshots/login-error-iphone-linux.png b/e2e/playwright/tests/visual/common/login.spec.ts-snapshots/login-error-iphone-linux.png similarity index 100% rename from webapp/channels/e2e/playwright/tests/visual/common/login.spec.ts-snapshots/login-error-iphone-linux.png rename to e2e/playwright/tests/visual/common/login.spec.ts-snapshots/login-error-iphone-linux.png diff --git a/webapp/channels/e2e/playwright/tests/visual/common/login.spec.ts-snapshots/login-firefox-linux.png b/e2e/playwright/tests/visual/common/login.spec.ts-snapshots/login-firefox-linux.png similarity index 100% rename from webapp/channels/e2e/playwright/tests/visual/common/login.spec.ts-snapshots/login-firefox-linux.png rename to e2e/playwright/tests/visual/common/login.spec.ts-snapshots/login-firefox-linux.png diff --git a/webapp/channels/e2e/playwright/tests/visual/common/login.spec.ts-snapshots/login-ipad-linux.png b/e2e/playwright/tests/visual/common/login.spec.ts-snapshots/login-ipad-linux.png similarity index 100% rename from webapp/channels/e2e/playwright/tests/visual/common/login.spec.ts-snapshots/login-ipad-linux.png rename to e2e/playwright/tests/visual/common/login.spec.ts-snapshots/login-ipad-linux.png diff --git a/webapp/channels/e2e/playwright/tests/visual/common/login.spec.ts-snapshots/login-iphone-linux.png b/e2e/playwright/tests/visual/common/login.spec.ts-snapshots/login-iphone-linux.png similarity index 100% rename from webapp/channels/e2e/playwright/tests/visual/common/login.spec.ts-snapshots/login-iphone-linux.png rename to e2e/playwright/tests/visual/common/login.spec.ts-snapshots/login-iphone-linux.png diff --git a/webapp/channels/e2e/playwright/tests/visual/common/signup_email.spec.ts b/e2e/playwright/tests/visual/common/signup_email.spec.ts similarity index 100% rename from webapp/channels/e2e/playwright/tests/visual/common/signup_email.spec.ts rename to e2e/playwright/tests/visual/common/signup_email.spec.ts diff --git a/webapp/channels/e2e/playwright/tests/visual/common/signup_email.spec.ts-snapshots/signup-email-chrome-linux.png b/e2e/playwright/tests/visual/common/signup_email.spec.ts-snapshots/signup-email-chrome-linux.png similarity index 100% rename from webapp/channels/e2e/playwright/tests/visual/common/signup_email.spec.ts-snapshots/signup-email-chrome-linux.png rename to e2e/playwright/tests/visual/common/signup_email.spec.ts-snapshots/signup-email-chrome-linux.png diff --git a/webapp/channels/e2e/playwright/tests/visual/common/signup_email.spec.ts-snapshots/signup-email-error-chrome-linux.png b/e2e/playwright/tests/visual/common/signup_email.spec.ts-snapshots/signup-email-error-chrome-linux.png similarity index 100% rename from webapp/channels/e2e/playwright/tests/visual/common/signup_email.spec.ts-snapshots/signup-email-error-chrome-linux.png rename to e2e/playwright/tests/visual/common/signup_email.spec.ts-snapshots/signup-email-error-chrome-linux.png diff --git a/webapp/channels/e2e/playwright/tests/visual/common/signup_email.spec.ts-snapshots/signup-email-error-firefox-linux.png b/e2e/playwright/tests/visual/common/signup_email.spec.ts-snapshots/signup-email-error-firefox-linux.png similarity index 100% rename from webapp/channels/e2e/playwright/tests/visual/common/signup_email.spec.ts-snapshots/signup-email-error-firefox-linux.png rename to e2e/playwright/tests/visual/common/signup_email.spec.ts-snapshots/signup-email-error-firefox-linux.png diff --git a/webapp/channels/e2e/playwright/tests/visual/common/signup_email.spec.ts-snapshots/signup-email-error-ipad-linux.png b/e2e/playwright/tests/visual/common/signup_email.spec.ts-snapshots/signup-email-error-ipad-linux.png similarity index 100% rename from webapp/channels/e2e/playwright/tests/visual/common/signup_email.spec.ts-snapshots/signup-email-error-ipad-linux.png rename to e2e/playwright/tests/visual/common/signup_email.spec.ts-snapshots/signup-email-error-ipad-linux.png diff --git a/webapp/channels/e2e/playwright/tests/visual/common/signup_email.spec.ts-snapshots/signup-email-error-iphone-linux.png b/e2e/playwright/tests/visual/common/signup_email.spec.ts-snapshots/signup-email-error-iphone-linux.png similarity index 100% rename from webapp/channels/e2e/playwright/tests/visual/common/signup_email.spec.ts-snapshots/signup-email-error-iphone-linux.png rename to e2e/playwright/tests/visual/common/signup_email.spec.ts-snapshots/signup-email-error-iphone-linux.png diff --git a/webapp/channels/e2e/playwright/tests/visual/common/signup_email.spec.ts-snapshots/signup-email-firefox-linux.png b/e2e/playwright/tests/visual/common/signup_email.spec.ts-snapshots/signup-email-firefox-linux.png similarity index 100% rename from webapp/channels/e2e/playwright/tests/visual/common/signup_email.spec.ts-snapshots/signup-email-firefox-linux.png rename to e2e/playwright/tests/visual/common/signup_email.spec.ts-snapshots/signup-email-firefox-linux.png diff --git a/webapp/channels/e2e/playwright/tests/visual/common/signup_email.spec.ts-snapshots/signup-email-ipad-linux.png b/e2e/playwright/tests/visual/common/signup_email.spec.ts-snapshots/signup-email-ipad-linux.png similarity index 100% rename from webapp/channels/e2e/playwright/tests/visual/common/signup_email.spec.ts-snapshots/signup-email-ipad-linux.png rename to e2e/playwright/tests/visual/common/signup_email.spec.ts-snapshots/signup-email-ipad-linux.png diff --git a/webapp/channels/e2e/playwright/tests/visual/common/signup_email.spec.ts-snapshots/signup-email-iphone-linux.png b/e2e/playwright/tests/visual/common/signup_email.spec.ts-snapshots/signup-email-iphone-linux.png similarity index 100% rename from webapp/channels/e2e/playwright/tests/visual/common/signup_email.spec.ts-snapshots/signup-email-iphone-linux.png rename to e2e/playwright/tests/visual/common/signup_email.spec.ts-snapshots/signup-email-iphone-linux.png diff --git a/webapp/channels/e2e/playwright/tsconfig.json b/e2e/playwright/tsconfig.json similarity index 70% rename from webapp/channels/e2e/playwright/tsconfig.json rename to e2e/playwright/tsconfig.json index 7bcb5346b0..acf6a4122b 100644 --- a/webapp/channels/e2e/playwright/tsconfig.json +++ b/e2e/playwright/tsconfig.json @@ -7,8 +7,8 @@ "noEmit": true, "baseUrl": ".", "paths": { - "@mattermost/client/*": ["../../packages/client/lib/*"], - "@mattermost/types/*": ["../../packages/types/lib/*"], + "@mattermost/client/*": ["../../webapp/platform/client/lib/*"], + "@mattermost/types/*": ["../../webapp/platform/types/lib/*"], "@e2e-support/*": ["support/*"], "@e2e-test.config": ["test.config.ts"] } diff --git a/webapp/channels/.gitignore b/webapp/channels/.gitignore index e081222c1e..c1c7faa7e2 100644 --- a/webapp/channels/.gitignore +++ b/webapp/channels/.gitignore @@ -13,25 +13,6 @@ coverage *.crt *.key -# disable folders generated by Cypress -e2e/cypress/node_modules -e2e/cypress/tests/downloads -e2e/cypress/tests/screenshots -e2e/cypress/tests/videos -e2e/cypress/tests/integration/benchmark/__benchmarks__ -e2e/cypress/tests/integration/performance/logs -e2e/cypress/tests/fixtures/ldap_tmp -e2e/cypress/tests/fixtures/mmctl -e2e/cypress/results - -# disable files/folders generated by Playwright -e2e/playwright/node_modules -e2e/playwright/playwright-report -e2e/playwright/storage_state -e2e/playwright/test-results -e2e/playwright/tests/**/*-darwin.png -e2e/playwright/tests/**/*-window.png - mattermost-license.txt # Vim temporary files diff --git a/webapp/channels/e2e/cypress/.ignore b/webapp/channels/e2e/cypress/.ignore deleted file mode 100644 index 3c3629e647..0000000000 --- a/webapp/channels/e2e/cypress/.ignore +++ /dev/null @@ -1 +0,0 @@ -node_modules diff --git a/webapp/channels/e2e/cypress/tests/support/api/role.js b/webapp/channels/e2e/cypress/tests/support/api/role.js deleted file mode 100644 index aa575465c9..0000000000 --- a/webapp/channels/e2e/cypress/tests/support/api/role.js +++ /dev/null @@ -1,632 +0,0 @@ -// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. -// See LICENSE.txt for license information. - -import xor from 'lodash.xor'; - -// ***************************************************************************** -// Preferences -// https://api.mattermost.com/#tag/roles -// ***************************************************************************** - -export const defaultRolesPermissions = { - channel_admin: [ - 'create_post', - 'manage_private_channel_members', - 'read_public_channel_groups', - 'manage_channel_roles', - 'use_channel_mentions', - 'use_group_mentions', - 'read_private_channel_groups', - 'remove_reaction', - 'add_reaction', - 'manage_public_channel_members', - ], - channel_guest: [ - 'remove_reaction', - 'upload_file', - 'create_post', - 'use_channel_mentions', - 'use_slash_commands', - 'read_channel', - 'add_reaction', - 'edit_post', - ], - channel_user: [ - 'remove_reaction', - 'use_slash_commands', - 'edit_post', - 'read_public_channel_groups', - 'delete_post', - 'read_private_channel_groups', - 'manage_public_channel_properties', - 'manage_public_channel_members', - 'delete_private_channel', - 'manage_private_channel_members', - 'manage_private_channel_properties', - 'use_channel_mentions', - 'create_post', - 'delete_public_channel', - 'use_group_mentions', - 'upload_file', - 'add_reaction', - 'read_channel', - 'get_public_link', - ], - sysadmin: [ - 'read_user_access_token', - 'manage_incoming_webhooks', - 'delete_public_channel', - 'create_direct_channel', - 'list_private_teams', - 'sysconsole_write_user_management_channels', - 'sysconsole_write_authentication_signup', - 'sysconsole_write_authentication_email', - 'sysconsole_write_authentication_password', - 'sysconsole_write_authentication_mfa', - 'sysconsole_write_authentication_ldap', - 'sysconsole_write_authentication_saml', - 'sysconsole_write_authentication_openid', - 'sysconsole_write_authentication_guest_access', - 'add_reaction', - 'list_users_without_team', - 'read_others_bots', - 'convert_private_channel_to_public', - 'sysconsole_read_user_management_permissions', - 'edit_post', - 'edit_other_users', - 'manage_team', - 'convert_public_channel_to_private', - 'sysconsole_write_user_management_users', - 'manage_system_wide_oauth', - 'manage_private_channel_members', - 'revoke_user_access_token', - 'sysconsole_read_authentication_signup', - 'sysconsole_read_authentication_email', - 'sysconsole_read_authentication_password', - 'sysconsole_read_authentication_mfa', - 'sysconsole_read_authentication_ldap', - 'sysconsole_read_authentication_saml', - 'sysconsole_read_authentication_openid', - 'sysconsole_read_authentication_guest_access', - 'read_private_channel_groups', - 'manage_bots', - 'delete_private_channel', - 'create_group_channel', - 'add_user_to_team', - 'manage_others_slash_commands', - 'sysconsole_read_user_management_teams', - 'sysconsole_read_site_customization', - 'sysconsole_read_site_localization', - 'sysconsole_read_site_users_and_teams', - 'sysconsole_read_site_notifications', - 'sysconsole_read_site_announcement_banner', - 'sysconsole_read_site_emoji', - 'sysconsole_read_site_posts', - 'sysconsole_read_site_file_sharing_and_downloads', - 'sysconsole_read_site_public_links', - 'sysconsole_read_site_notices', - 'read_public_channel_groups', - 'view_members', - 'remove_others_reactions', - 'sysconsole_write_reporting_site_statistics', - 'sysconsole_write_reporting_server_logs', - 'sysconsole_write_reporting_team_statistics', - 'list_team_channels', - 'create_private_channel', - 'read_channel', - 'create_public_channel', - 'use_slash_commands', - 'sysconsole_write_site_customization', - 'sysconsole_write_site_localization', - 'sysconsole_write_site_users_and_teams', - 'sysconsole_write_site_notifications', - 'sysconsole_write_site_announcement_banner', - 'sysconsole_write_site_emoji', - 'sysconsole_write_site_posts', - 'sysconsole_write_site_file_sharing_and_downloads', - 'sysconsole_write_site_public_links', - 'sysconsole_write_site_notices', - 'sysconsole_write_user_management_groups', - 'read_jobs', - 'sysconsole_write_user_management_permissions', - 'create_bot', - 'sysconsole_read_user_management_channels', - 'use_group_mentions', - 'manage_public_channel_properties', - 'manage_others_bots', - 'manage_channel_roles', - 'assign_bot', - 'assign_system_admin_role', - 'create_user_access_token', - 'sysconsole_write_plugins', - 'manage_system', - 'demote_to_guest', - 'manage_others_incoming_webhooks', - 'view_team', - 'delete_post', - 'promote_guest', - 'manage_public_channel_members', - 'sysconsole_write_user_management_teams', - 'invite_user', - 'join_private_teams', - 'upload_file', - 'edit_others_posts', - 'delete_others_posts', - 'list_public_teams', - 'read_public_channel', - 'read_bots', - 'sysconsole_read_plugins', - 'manage_team_roles', - 'create_emojis', - 'sysconsole_read_user_management_groups', - 'join_public_channels', - 'create_post', - 'remove_reaction', - 'manage_slash_commands', - 'get_public_link', - 'sysconsole_read_environment_web_server', - 'sysconsole_read_environment_database', - 'sysconsole_read_environment_elasticsearch', - 'sysconsole_read_environment_file_storage', - 'sysconsole_read_environment_image_proxy', - 'sysconsole_read_environment_smtp', - 'sysconsole_read_environment_push_notification_server', - 'sysconsole_read_environment_high_availability', - 'sysconsole_read_environment_rate_limiting', - 'sysconsole_read_environment_logging', - 'sysconsole_read_environment_session_lengths', - 'sysconsole_read_environment_performance_monitoring', - 'sysconsole_read_environment_developer', - 'sysconsole_write_environment_web_server', - 'sysconsole_write_environment_database', - 'sysconsole_write_environment_elasticsearch', - 'sysconsole_write_environment_file_storage', - 'sysconsole_write_environment_image_proxy', - 'sysconsole_write_environment_smtp', - 'sysconsole_write_environment_push_notification_server', - 'sysconsole_write_environment_high_availability', - 'sysconsole_write_environment_rate_limiting', - 'sysconsole_write_environment_logging', - 'sysconsole_write_environment_session_lengths', - 'sysconsole_write_environment_performance_monitoring', - 'sysconsole_write_environment_developer', - 'test_site_url', - 'test_elasticsearch', - 'test_s3', - 'test_email', - 'reload_config', - 'invalidate_caches', - 'purge_elasticsearch_indexes', - 'recycle_database_connections', - 'create_elasticsearch_post_indexing_job', - 'create_elasticsearch_post_aggregation_job', - 'read_elasticsearch_post_indexing_job', - 'read_elasticsearch_post_aggregation_job', - 'read_other_users_teams', - 'manage_private_channel_properties', - 'manage_oauth', - 'remove_user_from_team', - 'create_post_ephemeral', - 'delete_emojis', - 'sysconsole_read_user_management_users', - 'manage_jobs', - 'create_team', - 'manage_roles', - 'sysconsole_read_reporting_server_logs', - 'sysconsole_read_reporting_site_statistics', - 'sysconsole_read_reporting_team_statistics', - 'get_logs', - 'get_analytics', - 'edit_brand', - 'use_channel_mentions', - 'delete_others_emojis', - 'invite_guest', - 'manage_others_outgoing_webhooks', - 'create_post_public', - 'manage_outgoing_webhooks', - 'import_team', - 'join_public_teams', - 'sysconsole_read_integrations_integration_management', - 'sysconsole_read_integrations_bot_accounts', - 'sysconsole_read_integrations_gif', - 'sysconsole_read_integrations_cors', - 'sysconsole_write_integrations_integration_management', - 'sysconsole_write_integrations_bot_accounts', - 'sysconsole_write_integrations_gif', - 'sysconsole_write_integrations_cors', - 'sysconsole_read_experimental_features', - 'sysconsole_read_experimental_feature_flags', - 'sysconsole_read_experimental_bleve', - 'sysconsole_write_experimental_features', - 'sysconsole_write_experimental_feature_flags', - 'sysconsole_write_experimental_bleve', - 'purge_bleve_indexes', - 'post_bleve_indexes', - 'create_ldap_sync_job', - 'read_ldap_sync_job', - 'test_ldap', - 'invalidate_email_invite', - 'get_saml_metadata_from_idp', - 'add_saml_public_cert', - 'add_saml_private_cert', - 'add_saml_idp_cert', - 'remove_saml_public_cert', - 'remove_saml_private_cert', - 'remove_saml_idp_cert', - 'get_saml_cert_status', - 'add_ldap_public_cert', - 'add_ldap_private_cert', - 'remove_ldap_public_cert', - 'remove_ldap_private_cert', - 'sysconsole_read_compliance_data_retention_policy', - 'sysconsole_read_compliance_compliance_export', - 'sysconsole_read_compliance_compliance_monitoring', - 'sysconsole_read_compliance_custom_terms_of_service', - 'sysconsole_write_compliance_data_retention_policy', - 'sysconsole_write_compliance_compliance_export', - 'sysconsole_write_compliance_compliance_monitoring', - 'sysconsole_write_compliance_custom_terms_of_service', - 'create_data_retention_job', - 'read_data_retention_job', - 'create_compliance_export_job', - 'read_compliance_export_job', - 'read_audits', - 'sysconsole_read_about_edition_and_license', - 'sysconsole_write_about_edition_and_license', - 'read_license_information', - 'manage_license_information', - ], - system_guest: [ - 'create_direct_channel', - 'create_group_channel', - ], - system_manager: [ - 'read_public_channel_groups', - 'read_channel', - 'sysconsole_write_user_management_channels', - 'manage_private_channel_properties', - 'add_user_to_team', - 'manage_private_channel_members', - 'sysconsole_write_user_management_teams', - 'convert_private_channel_to_public', - 'manage_public_channel_members', - 'remove_user_from_team', - 'manage_team_roles', - 'sysconsole_read_user_management_groups', - 'manage_channel_roles', - 'list_private_teams', - 'sysconsole_read_authentication_signup', - 'sysconsole_read_authentication_email', - 'sysconsole_read_authentication_password', - 'sysconsole_read_authentication_mfa', - 'sysconsole_read_authentication_ldap', - 'read_ldap_sync_job', - 'sysconsole_read_authentication_saml', - 'sysconsole_read_authentication_openid', - 'sysconsole_read_authentication_guest_access', - 'manage_jobs', - 'read_jobs', - 'sysconsole_read_plugins', - 'manage_public_channel_properties', - 'list_public_teams', - 'sysconsole_write_user_management_groups', - 'read_private_channel_groups', - 'delete_public_channel', - 'sysconsole_write_site_customization', - 'sysconsole_write_site_localization', - 'sysconsole_write_site_users_and_teams', - 'sysconsole_write_site_notifications', - 'sysconsole_write_site_announcement_banner', - 'sysconsole_write_site_emoji', - 'sysconsole_write_site_posts', - 'sysconsole_write_site_file_sharing_and_downloads', - 'sysconsole_write_site_public_links', - 'sysconsole_write_site_notices', - 'sysconsole_read_user_management_channels', - 'sysconsole_read_user_management_teams', - 'sysconsole_write_user_management_permissions', - 'sysconsole_read_site_customization', - 'sysconsole_read_site_localization', - 'sysconsole_read_site_users_and_teams', - 'sysconsole_read_site_notifications', - 'sysconsole_read_site_announcement_banner', - 'sysconsole_read_site_emoji', - 'sysconsole_read_site_posts', - 'sysconsole_read_site_file_sharing_and_downloads', - 'sysconsole_read_site_public_links', - 'sysconsole_read_site_notices', - 'sysconsole_read_about_edition_and_license', - 'read_license_information', - 'sysconsole_read_reporting_server_logs', - 'sysconsole_read_reporting_site_statistics', - 'sysconsole_read_reporting_team_statistics', - 'get_logs', - 'get_analytics', - 'sysconsole_read_integrations_integration_management', - 'sysconsole_read_integrations_bot_accounts', - 'sysconsole_read_integrations_gif', - 'sysconsole_read_integrations_cors', - 'sysconsole_write_integrations_integration_management', - 'sysconsole_write_integrations_bot_accounts', - 'sysconsole_write_integrations_gif', - 'sysconsole_write_integrations_cors', - 'view_team', - 'convert_public_channel_to_private', - 'join_public_teams', - 'read_public_channel', - 'edit_brand', - 'join_private_teams', - 'sysconsole_read_user_management_permissions', - 'manage_team', - 'delete_private_channel', - 'sysconsole_read_environment_web_server', - 'sysconsole_read_environment_database', - 'sysconsole_read_environment_elasticsearch', - 'sysconsole_read_environment_file_storage', - 'sysconsole_read_environment_image_proxy', - 'sysconsole_read_environment_smtp', - 'sysconsole_read_environment_push_notification_server', - 'sysconsole_read_environment_high_availability', - 'sysconsole_read_environment_rate_limiting', - 'sysconsole_read_environment_logging', - 'sysconsole_read_environment_session_lengths', - 'sysconsole_read_environment_performance_monitoring', - 'sysconsole_read_environment_developer', - 'sysconsole_write_environment_web_server', - 'sysconsole_write_environment_database', - 'sysconsole_write_environment_elasticsearch', - 'sysconsole_write_environment_file_storage', - 'sysconsole_write_environment_image_proxy', - 'sysconsole_write_environment_smtp', - 'sysconsole_write_environment_push_notification_server', - 'sysconsole_write_environment_high_availability', - 'sysconsole_write_environment_rate_limiting', - 'sysconsole_write_environment_logging', - 'sysconsole_write_environment_session_lengths', - 'sysconsole_write_environment_performance_monitoring', - 'sysconsole_write_environment_developer', - 'test_site_url', - 'test_elasticsearch', - 'test_s3', - 'test_email', - 'reload_config', - 'invalidate_caches', - 'purge_elasticsearch_indexes', - 'recycle_database_connections', - 'create_elasticsearch_post_indexing_job', - 'create_elasticsearch_post_aggregation_job', - 'read_elasticsearch_post_indexing_job', - 'read_elasticsearch_post_aggregation_job', - ], - system_post_all: [ - 'use_group_mentions', - 'use_channel_mentions', - 'create_post', - ], - system_post_all_public: [ - 'use_group_mentions', - 'use_channel_mentions', - 'create_post_public', - ], - system_read_only_admin: [ - 'list_private_teams', - 'list_public_teams', - 'read_public_channel_groups', - 'read_channel', - 'sysconsole_read_user_management_users', - 'read_other_users_teams', - 'sysconsole_read_user_management_permissions', - 'sysconsole_read_site_customization', - 'sysconsole_read_site_localization', - 'sysconsole_read_site_users_and_teams', - 'sysconsole_read_site_notifications', - 'sysconsole_read_site_announcement_banner', - 'sysconsole_read_site_emoji', - 'sysconsole_read_site_posts', - 'sysconsole_read_site_file_sharing_and_downloads', - 'sysconsole_read_site_public_links', - 'sysconsole_read_site_notices', - 'sysconsole_read_user_management_channels', - 'sysconsole_read_about', - 'sysconsole_read_authentication_signup', - 'sysconsole_read_authentication_email', - 'sysconsole_read_authentication_password', - 'sysconsole_read_authentication_mfa', - 'sysconsole_read_authentication_ldap', - 'read_ldap_sync_job', - 'sysconsole_read_authentication_saml', - 'sysconsole_read_authentication_openid', - 'sysconsole_read_authentication_guest_access', - 'sysconsole_read_about_edition_and_license', - 'read_license_information', - 'sysconsole_read_user_management_teams', - 'sysconsole_read_user_management_groups', - 'sysconsole_read_plugins', - 'sysconsole_read_reporting_server_logs', - 'sysconsole_read_reporting_site_statistics', - 'sysconsole_read_reporting_team_statistics', - 'get_logs', - 'get_analytics', - 'read_jobs', - 'read_private_channel_groups', - 'view_team', - 'sysconsole_read_environment_web_server', - 'sysconsole_read_environment_database', - 'sysconsole_read_environment_elasticsearch', - 'sysconsole_read_environment_file_storage', - 'sysconsole_read_environment_image_proxy', - 'sysconsole_read_environment_smtp', - 'sysconsole_read_environment_push_notification_server', - 'sysconsole_read_environment_high_availability', - 'sysconsole_read_environment_rate_limiting', - 'sysconsole_read_environment_logging', - 'sysconsole_read_environment_session_lengths', - 'sysconsole_read_environment_performance_monitoring', - 'sysconsole_read_environment_developer', - 'read_elasticsearch_post_indexing_job', - 'read_elasticsearch_post_aggregation_job', - 'read_public_channel', - 'sysconsole_read_integrations_integration_management', - 'sysconsole_read_integrations_bot_accounts', - 'sysconsole_read_integrations_gif', - 'sysconsole_read_integrations_cors', - 'sysconsole_read_compliance_data_retention_policy', - 'sysconsole_read_compliance_compliance_export', - 'sysconsole_read_compliance_compliance_monitoring', - 'sysconsole_read_compliance_custom_terms_of_service', - 'sysconsole_read_experimental_features', - 'sysconsole_read_experimental_feature_flags', - 'sysconsole_read_experimental_bleve', - ], - system_user: [ - 'list_public_teams', - 'join_public_teams', - 'create_direct_channel', - 'create_group_channel', - 'create_team', - 'view_members', - 'create_emojis', - 'delete_emojis', - ], - system_user_access_token: [ - 'revoke_user_access_token', - 'create_user_access_token', - 'read_user_access_token', - ], - system_user_manager: [ - 'manage_private_channel_members', - 'manage_team_roles', - 'manage_public_channel_members', - 'read_channel', - 'read_public_channel_groups', - 'sysconsole_read_user_management_teams', - 'list_public_teams', - 'manage_private_channel_properties', - 'sysconsole_read_user_management_groups', - 'manage_team', - 'sysconsole_write_user_management_channels', - 'read_private_channel_groups', - 'list_private_teams', - 'sysconsole_write_user_management_teams', - 'remove_user_from_team', - 'delete_public_channel', - 'sysconsole_read_authentication_signup', - 'sysconsole_read_authentication_email', - 'sysconsole_read_authentication_password', - 'sysconsole_read_authentication_mfa', - 'sysconsole_read_authentication_ldap', - 'read_ldap_sync_job', - 'sysconsole_read_authentication_saml', - 'sysconsole_read_authentication_openid', - 'sysconsole_read_authentication_guest_access', - 'convert_public_channel_to_private', - 'join_private_teams', - 'add_user_to_team', - 'sysconsole_read_user_management_permissions', - 'join_public_teams', - 'read_public_channel', - 'manage_public_channel_properties', - 'convert_private_channel_to_public', - 'manage_channel_roles', - 'read_jobs', - 'sysconsole_read_user_management_channels', - 'delete_private_channel', - 'view_team', - 'sysconsole_write_user_management_groups', - ], - team_admin: [ - 'manage_private_channel_members', - 'delete_others_posts', - 'import_team', - 'convert_private_channel_to_public', - 'manage_incoming_webhooks', - 'delete_post', - 'create_post', - 'manage_others_outgoing_webhooks', - 'manage_others_incoming_webhooks', - 'manage_outgoing_webhooks', - 'manage_team', - 'manage_slash_commands', - 'read_private_channel_groups', - 'remove_user_from_team', - 'manage_channel_roles', - 'use_channel_mentions', - 'convert_public_channel_to_private', - 'manage_team_roles', - 'use_group_mentions', - 'read_public_channel_groups', - 'add_reaction', - 'manage_public_channel_members', - 'remove_reaction', - 'manage_others_slash_commands', - ], - team_guest: ['view_team'], - team_post_all: [ - 'use_channel_mentions', - 'use_group_mentions', - 'create_post', - ], - team_post_all_public: [ - 'use_channel_mentions', - 'use_group_mentions', - 'create_post_public', - ], - team_user: [ - 'list_team_channels', - 'join_public_channels', - 'read_public_channel', - 'view_team', - 'create_public_channel', - 'create_private_channel', - 'invite_user', - 'add_user_to_team', - ], -}; - -Cypress.Commands.add('getRoleByName', (name) => { - return cy.request({ - headers: {'X-Requested-With': 'XMLHttpRequest'}, - url: `/api/v4/roles/name/${name}`, - method: 'GET', - }).then((response) => { - expect(response.status).to.equal(200); - return cy.wrap({name: response.body}); - }); -}); - -Cypress.Commands.add('apiGetRolesByNames', (names) => { - return cy.request({ - headers: {'X-Requested-With': 'XMLHttpRequest'}, - url: '/api/v4/roles/names', - method: 'POST', - body: names || Object.keys(defaultRolesPermissions), - }).then((response) => { - expect(response.status).to.equal(200); - return cy.wrap({roles: response.body}); - }); -}); - -Cypress.Commands.add('apiPatchRole', (roleID, patch) => { - return cy.request({ - headers: {'X-Requested-With': 'XMLHttpRequest'}, - url: `/api/v4/roles/${roleID}/patch`, - method: 'PUT', - body: patch, - }).then((response) => { - expect(response.status).to.equal(200); - return cy.wrap({role: response.body}); - }); -}); - -Cypress.Commands.add('apiResetRoles', () => { - cy.apiGetRolesByNames().then(({roles}) => { - roles.forEach((role) => { - const defaultPermissions = defaultRolesPermissions[role.name]; - const diff = xor(role.permissions, defaultPermissions); - - if (diff.length > 0) { - cy.apiPatchRole(role.id, {permissions: defaultPermissions}); - } - }); - }); -});