diff --git a/e2e-tests/cypress/.eslintrc.json b/e2e-tests/cypress/.eslintrc.json index 2d84a2ee5c..feffdb5cb4 100644 --- a/e2e-tests/cypress/.eslintrc.json +++ b/e2e-tests/cypress/.eslintrc.json @@ -15,6 +15,12 @@ "env": { "cypress/globals": true }, + "settings": { + "react": { + "pragma": "React", + "version": "detect" + } + }, "rules": { "header/header": [ 2, diff --git a/e2e-tests/cypress/tests/integration/channels/accessibility/accessibility_keyboard_usability_spec.js b/e2e-tests/cypress/tests/integration/channels/accessibility/accessibility_keyboard_usability_spec.js index 1c3052edf4..9aa70288e9 100644 --- a/e2e-tests/cypress/tests/integration/channels/accessibility/accessibility_keyboard_usability_spec.js +++ b/e2e-tests/cypress/tests/integration/channels/accessibility/accessibility_keyboard_usability_spec.js @@ -137,10 +137,11 @@ describe('Verify Accessibility keyboard usability across different regions in th cy.clickPostCommentIcon(postId); // * Verify Screen reader should not switch to virtual cursor mode. This is handled by adding a role=application attribute - const regions = ['#sidebar-left', '#rhsContainer .post-right__content', '.search__form', '#advancedTextEditorCell']; + const regions = ['#sidebar-left', '#rhsContainer .post-right__content', '#advancedTextEditorCell']; regions.forEach((region) => { cy.get(region).should('have.attr', 'role', 'application'); }); + cy.get('.search__form').should('have.attr', 'role', 'search'); cy.get(`#post_${postId}`).children('.post__content').eq(0).should('have.attr', 'role', 'application'); cy.get(`#rhsPost_${postId}`).children('.post__content').eq(0).should('have.attr', 'role', 'application'); }); diff --git a/e2e-tests/cypress/tests/integration/channels/accessibility/accessibility_post_spec.js b/e2e-tests/cypress/tests/integration/channels/accessibility/accessibility_post_spec.js index 3ecf92ca94..b3cf28dc06 100644 --- a/e2e-tests/cypress/tests/integration/channels/accessibility/accessibility_post_spec.js +++ b/e2e-tests/cypress/tests/integration/channels/accessibility/accessibility_post_spec.js @@ -201,7 +201,7 @@ describe('Verify Accessibility Support in Post', () => { cy.focused().tab(); // * Verify focus is on the post text - cy.get(`#postMessageText_${postId}`).should('be.focused').and('have.attr', 'aria-readonly', 'true'); + cy.get(`#postMessageText_${postId}`).should('be.focused'); }); }); }); @@ -231,7 +231,7 @@ describe('Verify Accessibility Support in Post', () => { cy.getLastPostId().then((postId) => { cy.get(`#rhsPost_${postId}`).within(() => { // * Verify focus is on the post text - cy.get(`#rhsPostMessageText_${postId}`).should('be.focused').and('have.attr', 'aria-readonly', 'true'); + cy.get(`#rhsPostMessageText_${postId}`).should('be.focused'); cy.focused().tab({shift: true}); // * Verify focus is on the more button diff --git a/e2e-tests/cypress/tests/integration/channels/channel_sidebar/dm_category_spec.ts b/e2e-tests/cypress/tests/integration/channels/channel_sidebar/dm_category_spec.ts index 6b52fca362..12cf407685 100644 --- a/e2e-tests/cypress/tests/integration/channels/channel_sidebar/dm_category_spec.ts +++ b/e2e-tests/cypress/tests/integration/channels/channel_sidebar/dm_category_spec.ts @@ -24,6 +24,20 @@ describe('MM-T3156 DM category', () => { cy.apiInitSetup({loginAfter: true, promoteNewUserAsAdmin: true}).then(({team, user}) => { testUser = user; cy.visit(`/${team.name}/channels/town-square`); + + const usersPrefixes = ['a', 'c', 'd', 'j', 'p', 'u', 'x', 'z']; + usersPrefixes.forEach((prefix) => { + // # Create users with prefixes in alphabetical order + cy.apiCreateUser({prefix}).then(({user: newUser}) => { + cy.apiCreateDirectChannel([testUser.id, newUser.id]).then(({channel}) => { + // # Post message in The DM channel + cy.postMessageAs({sender: newUser, message: 'test', channelId: channel.id}); + + // add usernames in array for reference + usernames.push(newUser.username); + }); + }); + }); }); }); @@ -36,20 +50,6 @@ describe('MM-T3156 DM category', () => { }); it('MM-T3156_2 should order DMs based on recent interactions', () => { - const usersPrefixes = ['a', 'c', 'd', 'j', 'p', 'u', 'x', 'z']; - usersPrefixes.forEach((prefix) => { - // # Create users with prefixes in alphabetical order - cy.apiCreateUser({prefix}).then(({user: newUser}) => { - cy.apiCreateDirectChannel([testUser.id, newUser.id]).then(({channel}) => { - // # Post message in The DM channel - cy.postMessageAs({sender: newUser, message: 'test', channelId: channel.id}); - - // add usernames in array for reference - usernames.push(newUser.username); - }); - }); - }); - // get DM category group cy.findByLabelText('DIRECT MESSAGES').parents('.SidebarChannelGroup').within(() => { const usernamesReversed = [...usernames].reverse(); @@ -68,15 +68,14 @@ describe('MM-T3156 DM category', () => { // # Change sorting to be alphabetical cy.findByText('Sort').trigger('mouseover'); - cy.findByText('Alphabetically').click(); + cy.findByText('Alphabetically').click().wait(TIMEOUTS.ONE_SEC); - cy.findByLabelText('DIRECT MESSAGES').should('be.visible'). - parents('.SidebarChannelGroup').within(() => { - cy.get('.NavGroupContent').children().each(($el, index) => { - // * Verify that the usernames are in alphabetical order - cy.wrap($el).findByText(usernames[index]).should('be.visible'); - }); + cy.findByLabelText('DIRECT MESSAGES').parents('.SidebarChannelGroup').within(() => { + cy.get('.NavGroupContent').children().each(($el, index) => { + // * Verify that the usernames are in alphabetical order + cy.wrap($el).findByText(usernames[index]).should('be.visible'); }); + }); }); it('MM-T3156_4 should not be able to rearrange DMs', () => { diff --git a/e2e-tests/cypress/tests/integration/channels/enterprise/guest_accounts/guest_identification_spec.ts b/e2e-tests/cypress/tests/integration/channels/enterprise/guest_accounts/guest_identification_spec.ts index ed4cf9dd24..2057a66a55 100644 --- a/e2e-tests/cypress/tests/integration/channels/enterprise/guest_accounts/guest_identification_spec.ts +++ b/e2e-tests/cypress/tests/integration/channels/enterprise/guest_accounts/guest_identification_spec.ts @@ -119,7 +119,7 @@ describe('Guest Accounts', () => { children().should('have.length', 1). eq(0).should('contain', testChannel.name).click(); - cy.get('#inviteGuestButton').scrollIntoView().click(); + cy.findByTestId('inviteButton').scrollIntoView().click(); cy.findByTestId('confirm-done').should('be.visible').click(); // # Get invitation link. diff --git a/e2e-tests/cypress/tests/integration/channels/enterprise/guest_accounts/guest_invitation_ui_spec.ts b/e2e-tests/cypress/tests/integration/channels/enterprise/guest_accounts/guest_invitation_ui_spec.ts index 396869cd8e..a1acc16f2e 100644 --- a/e2e-tests/cypress/tests/integration/channels/enterprise/guest_accounts/guest_invitation_ui_spec.ts +++ b/e2e-tests/cypress/tests/integration/channels/enterprise/guest_accounts/guest_invitation_ui_spec.ts @@ -65,7 +65,7 @@ describe('Guest Account - Guest User Invitation Flow', () => { }); // * Verify Invite Guests button is disabled by default - cy.get('#inviteGuestButton').scrollIntoView().should('be.visible').and('be.disabled'); + cy.findByTestId('inviteButton').scrollIntoView().should('be.visible').and('be.disabled'); // * Verify Invite People field const email = `temp-${getRandomId()}@mattermost.com`; @@ -141,7 +141,7 @@ describe('Guest Account - Guest User Invitation Flow', () => { invitePeople(email, 1, email, 'Town Square', false); // * Verify Invite Guests button is disabled - cy.get('#inviteGuestButton').should('be.disabled'); + cy.findByTestId('inviteButton').should('be.disabled'); }); it('MM-T4449 Invite Guest via Email containing upper case letters', () => { @@ -177,7 +177,7 @@ describe('Guest Account - Guest User Invitation Flow', () => { children().should('have.length', 1).eq(0).should('contain', newUser.username).click(); // # Click Invite Members - cy.get('#inviteMembersButton').scrollIntoView().click(); + cy.findByTestId('inviteButton').scrollIntoView().click(); // * Verify the content and error message in the Invitation Modal cy.findByTestId('invitationModal').within(() => { @@ -218,7 +218,7 @@ describe('Guest Account - Guest User Invitation Flow', () => { cy.get('.users-emails-input__menu').children().should('have.length', 1).eq(0).should('contain', email).click(); // # Click Invite Guests Button - cy.get('#inviteGuestButton').scrollIntoView().click(); + cy.findByTestId('inviteButton').scrollIntoView().click(); // * Verify invite more button is present cy.findByTestId('invite-more').should('be.visible'); diff --git a/e2e-tests/cypress/tests/integration/channels/enterprise/guest_accounts/helpers.ts b/e2e-tests/cypress/tests/integration/channels/enterprise/guest_accounts/helpers.ts index ad1c41ab85..b4bb5a2674 100644 --- a/e2e-tests/cypress/tests/integration/channels/enterprise/guest_accounts/helpers.ts +++ b/e2e-tests/cypress/tests/integration/channels/enterprise/guest_accounts/helpers.ts @@ -38,7 +38,7 @@ export function invitePeople(typeText: string, resultsCount: number, verifyText: if (clickInvite) { // # Click Invite Guests Button - cy.get('#inviteGuestButton').scrollIntoView().click(); + cy.findByTestId('inviteButton').scrollIntoView().click(); } } diff --git a/e2e-tests/cypress/tests/integration/channels/enterprise/guest_accounts/member_invitation_ui_spec.ts b/e2e-tests/cypress/tests/integration/channels/enterprise/guest_accounts/member_invitation_ui_spec.ts index 5c21131d04..3b64ec9396 100644 --- a/e2e-tests/cypress/tests/integration/channels/enterprise/guest_accounts/member_invitation_ui_spec.ts +++ b/e2e-tests/cypress/tests/integration/channels/enterprise/guest_accounts/member_invitation_ui_spec.ts @@ -69,7 +69,7 @@ describe('Guest Account - Member Invitation Flow', () => { cy.get('@clipboard').its('contents').should('eq', `${baseUrl}/signup_user_complete/?id=${testTeam.invite_id}`); - cy.get('#inviteMembersButton').scrollIntoView().should('be.visible').and('be.disabled'); + cy.findByTestId('inviteButton').scrollIntoView().should('be.visible').and('be.disabled'); cy.get('.users-emails-input__control').should('be.visible').within(() => { // * Verify the input placeholder text cy.get('.users-emails-input__placeholder').should('have.text', 'Enter a name or email address'); @@ -224,7 +224,7 @@ describe('Guest Account - Member Invitation Flow', () => { }); // # Click Invite Members - cy.get('#inviteMembersButton').scrollIntoView().click(); + cy.findByTestId('inviteButton').scrollIntoView().click(); // * Verify the content and message in the Invitation Modal cy.findByTestId('invitationModal').within(() => { @@ -267,7 +267,7 @@ function invitePeople(typeText, resultsCount, verifyText, clickInvite = true) { // # Click Invite Members if (clickInvite) { - cy.get('#inviteMembersButton').scrollIntoView().click(); + cy.findByTestId('inviteButton').scrollIntoView().click(); } } diff --git a/e2e-tests/cypress/tests/integration/channels/enterprise/ldap_group/invite_bot_spec.ts b/e2e-tests/cypress/tests/integration/channels/enterprise/ldap_group/invite_bot_spec.ts index ab11433cfd..8bffb1172c 100644 --- a/e2e-tests/cypress/tests/integration/channels/enterprise/ldap_group/invite_bot_spec.ts +++ b/e2e-tests/cypress/tests/integration/channels/enterprise/ldap_group/invite_bot_spec.ts @@ -66,7 +66,7 @@ describe('Group Synced Team - Bot invitation flow', () => { click(); // # Invite the bot - cy.get('#inviteMembersButton').click(); + cy.findByTestId('inviteButton').click(); // * Ensure that the response message was not an error cy.get('.InviteResultRow').find('.reason').should('not.contain', 'Error'); diff --git a/e2e-tests/cypress/tests/integration/channels/interactive_dialog/full_dialog_spec.js b/e2e-tests/cypress/tests/integration/channels/interactive_dialog/full_dialog_spec.js index e5a1e32309..b58f44f74d 100644 --- a/e2e-tests/cypress/tests/integration/channels/interactive_dialog/full_dialog_spec.js +++ b/e2e-tests/cypress/tests/integration/channels/interactive_dialog/full_dialog_spec.js @@ -18,7 +18,7 @@ const webhookUtils = require('../../../../utils/webhook_utils'); describe('Interactive Dialog', () => { const inputTypes = { - realname: 'input', + realname: 'text', someemail: 'email', somenumber: 'number', somepassword: 'password', @@ -101,7 +101,7 @@ describe('Interactive Dialog', () => { cy.wrap($elForm).find('#suggestionList').scrollIntoView().should('be.visible'); // # Click field label to close any opened drop-downs - cy.wrap($elForm).find('label.control-label').scrollIntoView().click(); + cy.wrap($elForm).find('label.control-label').scrollIntoView().click({force: true}); } else if (element.name === 'someradiooptions') { cy.wrap($elForm).find('input').should('be.visible').and('have.length', optionsLength[element.name]); diff --git a/e2e-tests/cypress/tests/integration/channels/interactive_menu/slack_parsing_message_button_spec.js b/e2e-tests/cypress/tests/integration/channels/interactive_menu/slack_parsing_message_button_spec.js index 799d032ea3..5085ab6a21 100644 --- a/e2e-tests/cypress/tests/integration/channels/interactive_menu/slack_parsing_message_button_spec.js +++ b/e2e-tests/cypress/tests/integration/channels/interactive_menu/slack_parsing_message_button_spec.js @@ -44,21 +44,29 @@ describe('Interactive Menu', () => { // # Post an incoming webhook cy.postIncomingWebhook({url: incomingWebhook.url, data: payload, waitFor: 'attachment-pretext'}); + cy.waitUntil(() => cy.findAllByTestId('postContent').then((el) => { + if (el.length > 0) { + return el[1].innerText.includes(payload.attachments[0].actions[0].name); + } + return false; + })); // # Click on "Skip Parsing" button - cy.findByText('Skip Parsing').should('be.visible').click({force: true}); + cy.findByText(payload.attachments[0].actions[0].name).should('be.visible').click({force: true}); cy.wait(TIMEOUTS.HALF_SEC); // * Verify that it renders original "spoiler" text + cy.uiWaitUntilMessagePostedIncludes('a < a | b > a'); cy.getLastPostId().then((postId) => { cy.get(`#postMessageText_${postId}`).should('have.html', '
a < a | b > a
'); }); // # Click on "Do Parsing" button - cy.findByText('Do Parsing').should('be.visible').click({force: true}); + cy.findByText(payload.attachments[0].actions[1].name).should('be.visible').click({force: true}); cy.wait(TIMEOUTS.HALF_SEC); // * Verify that it renders markdown with link + cy.uiWaitUntilMessagePostedIncludes('a b a'); cy.getLastPostId().then((postId) => { cy.get(`#postMessageText_${postId}`).should('have.html', 'a b a
'); }); diff --git a/e2e-tests/cypress/tests/integration/channels/keyboard_shortcuts/ctrl_cmd_shift_l_does_not_change_focus_to_msgbox_spec.js b/e2e-tests/cypress/tests/integration/channels/keyboard_shortcuts/ctrl_cmd_shift_l_does_not_change_focus_to_msgbox_spec.js index 1b785f3fb1..fc1afe51db 100644 --- a/e2e-tests/cypress/tests/integration/channels/keyboard_shortcuts/ctrl_cmd_shift_l_does_not_change_focus_to_msgbox_spec.js +++ b/e2e-tests/cypress/tests/integration/channels/keyboard_shortcuts/ctrl_cmd_shift_l_does_not_change_focus_to_msgbox_spec.js @@ -32,7 +32,7 @@ describe('Keyboard Shortcuts', () => { cy.uiClose(); // # Open invite members full-page screen - cy.get('#introTextInvite').click(); + cy.findByLabelText('Invite Users').click(); // # Press ctrl/cmd+shift+l cy.get('body').cmdOrCtrlShortcut('{shift+l}'); diff --git a/e2e-tests/cypress/tests/integration/channels/onboarding/invalidate_pending_email_invitations_spec.js b/e2e-tests/cypress/tests/integration/channels/onboarding/invalidate_pending_email_invitations_spec.js index 46cf7b224e..29206155ac 100644 --- a/e2e-tests/cypress/tests/integration/channels/onboarding/invalidate_pending_email_invitations_spec.js +++ b/e2e-tests/cypress/tests/integration/channels/onboarding/invalidate_pending_email_invitations_spec.js @@ -103,6 +103,6 @@ describe('Onboarding', () => { cy.findByRole('textbox', {name: 'Add or Invite People'}). typeWithForce(email).wait(TIMEOUTS.HALF_SEC). typeWithForce('{enter}'); - cy.get('#inviteMembersButton').click(); + cy.findByTestId('inviteButton').click(); } }); diff --git a/e2e-tests/cypress/tests/integration/channels/team_settings/closed_team_invite_by_email_spec.js b/e2e-tests/cypress/tests/integration/channels/team_settings/closed_team_invite_by_email_spec.js index ddaa36945d..2e1c148b05 100644 --- a/e2e-tests/cypress/tests/integration/channels/team_settings/closed_team_invite_by_email_spec.js +++ b/e2e-tests/cypress/tests/integration/channels/team_settings/closed_team_invite_by_email_spec.js @@ -83,7 +83,7 @@ describe('Team Settings', () => { } cy.findByRole('textbox', {name: 'Add or Invite People'}).type(email, {force: true}).wait(TIMEOUTS.HALF_SEC).type('{enter}', {force: true}); - cy.get('#inviteMembersButton').click(); + cy.findByTestId('inviteButton').click(); // # Wait for a while to ensure that email notification is sent and logout from sysadmin account cy.wait(TIMEOUTS.FIVE_SEC); diff --git a/e2e-tests/cypress/tests/integration/channels/team_settings/helpers.js b/e2e-tests/cypress/tests/integration/channels/team_settings/helpers.js index 7cef607d78..8af3462cfe 100644 --- a/e2e-tests/cypress/tests/integration/channels/team_settings/helpers.js +++ b/e2e-tests/cypress/tests/integration/channels/team_settings/helpers.js @@ -40,7 +40,7 @@ export const inviteUserByEmail = (email) => { typeWithForce(email). wait(TIMEOUTS.HALF_SEC). typeWithForce('{enter}'); - cy.get('#inviteMembersButton').click(); + cy.findByTestId('inviteButton').click(); // # Wait for a while to ensure that email notification is sent cy.wait(TIMEOUTS.TWO_SEC); diff --git a/e2e-tests/cypress/tests/integration/channels/team_settings/invite_members_spec.js b/e2e-tests/cypress/tests/integration/channels/team_settings/invite_members_spec.js index 29d3072971..9f4571d7f1 100644 --- a/e2e-tests/cypress/tests/integration/channels/team_settings/invite_members_spec.js +++ b/e2e-tests/cypress/tests/integration/channels/team_settings/invite_members_spec.js @@ -172,7 +172,7 @@ function inviteUser(user) { cy.get('.users-emails-input__menu').children().eq(0).should('contain', user.username).click(); // # Click Invite Members - cy.get('#inviteMembersButton').scrollIntoView().click(); + cy.findByTestId('inviteButton').scrollIntoView().click(); } function inviteUserToTeamAsMember(testUser, testTeam, user) { diff --git a/e2e-tests/cypress/tests/integration/channels/team_settings/invite_user_to_closed_team_spec.js b/e2e-tests/cypress/tests/integration/channels/team_settings/invite_user_to_closed_team_spec.js index cff33f6517..19cbc1ceff 100644 --- a/e2e-tests/cypress/tests/integration/channels/team_settings/invite_user_to_closed_team_spec.js +++ b/e2e-tests/cypress/tests/integration/channels/team_settings/invite_user_to_closed_team_spec.js @@ -82,6 +82,6 @@ describe('Team Settings', () => { typeWithForce(email). wait(TIMEOUTS.HALF_SEC). typeWithForce('{enter}'); - cy.get('#inviteMembersButton').click(); + cy.findByTestId('inviteButton').click(); } }); diff --git a/e2e-tests/cypress/tests/integration/channels/team_settings/teams_spec.js b/e2e-tests/cypress/tests/integration/channels/team_settings/teams_spec.js index 211ecaa40a..02d53bcc52 100644 --- a/e2e-tests/cypress/tests/integration/channels/team_settings/teams_spec.js +++ b/e2e-tests/cypress/tests/integration/channels/team_settings/teams_spec.js @@ -93,7 +93,7 @@ describe('Teams Suite', () => { click(); // # Click "Invite Members" button, then "Done" button - cy.get('#inviteMembersButton').click(); + cy.findByTestId('inviteButton').click(); cy.findByTestId('confirm-done').click(); // * As sysadmin, verify system message posts in Town Square and Off-Topic diff --git a/e2e-tests/cypress/tests/integration/playbooks/channels/broadcast_spec.js b/e2e-tests/cypress/tests/integration/playbooks/channels/broadcast_spec.js index bdb21248a0..066ab67342 100644 --- a/e2e-tests/cypress/tests/integration/playbooks/channels/broadcast_spec.js +++ b/e2e-tests/cypress/tests/integration/playbooks/channels/broadcast_spec.js @@ -325,10 +325,10 @@ const verifyInitialAndStatusPostInBroadcast = (testTeam, channelName, runName, i should('exist'). within(() => { // * Thread should have two posts - cy.findAllByRole('listitem').should('have.length', 2); + cy.findAllByTestId('postContent').should('have.length', 2); // * The first should be announcement - cy.findAllByRole('listitem').eq(0).contains(initialMessage); + cy.findAllByTestId('postContent').eq(0).contains(initialMessage); // * Latest post should be update cy.get(`#rhsPost_${lastPostId}`).contains( @@ -354,7 +354,7 @@ const deleteLatestPostRoot = (testTeam, channelName) => { cy.get('#rhsContainer'). should('exist'). within(() => { - cy.findAllByRole('listitem').eq(0).then((root) => { + cy.findAllByTestId('postContent').eq(0).parent().then((root) => { const rootId = root.attr('id').slice(8); // # Click root's post dot menu. diff --git a/e2e-tests/cypress/tests/support/ui/team.js b/e2e-tests/cypress/tests/support/ui/team.js index bac28ae4d1..3354972f3c 100644 --- a/e2e-tests/cypress/tests/support/ui/team.js +++ b/e2e-tests/cypress/tests/support/ui/team.js @@ -14,7 +14,7 @@ Cypress.Commands.add('uiInviteMemberToCurrentTeam', (username) => { cy.get('.users-emails-input__control input').typeWithForce(username).as('input'); cy.get('.users-emails-input__option ').contains(`@${username}`); cy.get('@input').typeWithForce('{enter}'); - cy.get('#inviteMembersButton').click(); + cy.findByTestId('inviteButton').click(); // * Verify user invited to team cy.get('.invitation-modal-confirm--sent .InviteResultRow'). diff --git a/e2e-tests/playwright/support/test_fixture.ts b/e2e-tests/playwright/support/test_fixture.ts index 5cfb75815f..7d963933d8 100644 --- a/e2e-tests/playwright/support/test_fixture.ts +++ b/e2e-tests/playwright/support/test_fixture.ts @@ -19,8 +19,9 @@ type ExtendedFixtures = { }; export const test = base.extend