diff --git a/app/screens/edit_server/form.tsx b/app/screens/edit_server/form.tsx index 1a5c833170..cce18c5a43 100644 --- a/app/screens/edit_server/form.tsx +++ b/app/screens/edit_server/form.tsx @@ -145,6 +145,8 @@ const EditServerForm = ({ ); } + const saveButtonTestId = buttonDisabled ? 'edit_server_form.save.button.disabled' : 'edit_server_form.save.button'; + return ( @@ -164,7 +166,7 @@ const EditServerForm = ({ ref={displayNameRef} returnKeyType='done' spellCheck={false} - testID='select_server.server_display_name.input' + testID='edit_server_form.server_display_name.input' theme={theme} value={displayName} /> @@ -174,7 +176,7 @@ const EditServerForm = ({ defaultMessage={'Server: {url}'} id={'edit_server.display_help'} style={styles.chooseText} - testID={'edit_server.display_help'} + testID={'edit_server_form.display_help'} values={{url: removeProtocol(stripTrailingSlashes(serverUrl))}} /> } @@ -182,7 +184,7 @@ const EditServerForm = ({ containerStyle={[styles.connectButton, styleButtonBackground]} disabled={buttonDisabled} onPress={onUpdate} - testID='select_server.connect.button' + testID={saveButtonTestId} > {buttonIcon} { defaultMessage='Edit server name' id='edit_server.title' style={styles.title} - testID='edit_server.title' + testID='edit_server_header.title' /> ); diff --git a/app/screens/edit_server/index.tsx b/app/screens/edit_server/index.tsx index 6bacbd541f..ee2b43cb2c 100644 --- a/app/screens/edit_server/index.tsx +++ b/app/screens/edit_server/index.tsx @@ -99,7 +99,7 @@ const EditServer = ({closeButtonId, componentId, server, theme}: ServerProps) => { + const title = `Are you sure you want to remove ${serverDisplayName}?`; + + return isAndroid() ? element(by.text(title)) : element(by.label(title)).atIndex(0); + }; // alert buttons cancelButton = isAndroid() ? element(by.text('CANCEL')) : element(by.label('Cancel')).atIndex(1); logoutButton = isAndroid() ? element(by.text('LOG OUT')) : element(by.label('Log out')).atIndex(1); + removeButton = isAndroid() ? element(by.text('REMOVE')) : element(by.label('Remove')).atIndex(1); } const alert = new Alert(); diff --git a/detox/e2e/support/ui/screen/edit_server.ts b/detox/e2e/support/ui/screen/edit_server.ts new file mode 100644 index 0000000000..a3f249a912 --- /dev/null +++ b/detox/e2e/support/ui/screen/edit_server.ts @@ -0,0 +1,36 @@ +// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. + +import {timeouts} from '@support/utils'; + +class EditServerScreen { + testID = { + editServerScreen: 'edit_server.screen', + headerTitle: 'edit_server_header.title', + headerDescription: 'edit_server_header.description', + serverDisplayNameInput: 'edit_server_form.server_display_name.input', + serverDisplayNameInputError: 'edit_server_form.server_display_name.input.error', + displayHelp: 'edit_server_form.display_help', + saveButton: 'edit_server_form.save.button', + saveButtonDisabled: 'edit_server_form.save.button.disabled', + }; + + editServerScreen = element(by.id(this.testID.editServerScreen)); + headerTitle = element(by.id(this.testID.headerTitle)); + headerDescription = element(by.id(this.testID.headerDescription)); + serverDisplayNameInput = element(by.id(this.testID.serverDisplayNameInput)); + serverDisplayNameInputError = element(by.id(this.testID.serverDisplayNameInputError)); + displayHelp = element(by.id(this.testID.displayHelp)); + saveButton = element(by.id(this.testID.saveButton)); + saveButtonDisabled = element(by.id(this.testID.saveButtonDisabled)); + + toBeVisible = async () => { + await waitFor(this.editServerScreen).toExist().withTimeout(timeouts.TEN_SEC); + await waitFor(this.serverDisplayNameInput).toBeVisible().withTimeout(timeouts.TEN_SEC); + + return this.editServerScreen; + }; +} + +const editServerScreen = new EditServerScreen(); +export default editServerScreen; diff --git a/detox/e2e/support/ui/screen/index.ts b/detox/e2e/support/ui/screen/index.ts index b9b6a4e9d3..6218be8714 100644 --- a/detox/e2e/support/ui/screen/index.ts +++ b/detox/e2e/support/ui/screen/index.ts @@ -3,6 +3,7 @@ import AccountScreen from './account'; import ChannelListScreen from './channel_list'; +import EditServerScreen from './edit_server'; import HomeScreen from './home'; import LoginScreen from './login'; import ServerScreen from './server'; @@ -11,6 +12,7 @@ import ServerListScreen from './server_list'; export { AccountScreen, ChannelListScreen, + EditServerScreen, HomeScreen, LoginScreen, ServerScreen, diff --git a/detox/e2e/test/server_login/server_list.e2e.ts b/detox/e2e/test/server_login/server_list.e2e.ts new file mode 100644 index 0000000000..5bf4dad1a4 --- /dev/null +++ b/detox/e2e/test/server_login/server_list.e2e.ts @@ -0,0 +1,230 @@ +// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. + +// ******************************************************************* +// - [#] indicates a test step (e.g. # Go to a screen) +// - [*] indicates an assertion (e.g. * Check the title) +// - Use element testID when selecting an element. Create one if none. +// ******************************************************************* + +import { + User, + Setup, +} from '@support/server_api'; +import { + serverOneUrl, + serverTwoUrl, + serverThreeUrl, + siteOneUrl, + siteTwoUrl, + siteThreeUrl, +} from '@support/test_config'; +import { + Alert, +} from '@support/ui/component'; +import { + ChannelListScreen, + EditServerScreen, + HomeScreen, + LoginScreen, + ServerScreen, + ServerListScreen, +} from '@support/ui/screen'; +import {expect} from 'detox'; + +describe('Server Login - Server List', () => { + const serverOneDisplayName = 'Server 1'; + const serverTwoDisplayName = 'Server 2'; + const serverThreeDisplayName = 'Server 3'; + let serverOneUser; + let serverTwoUser; + let serverThreeUser; + + beforeAll(async () => { + // # Log in to the first server + ({user: serverOneUser} = await Setup.apiInit(siteOneUrl)); + await expect(ServerScreen.headerTitleConnectToServer).toBeVisible(); + await ServerScreen.connectToServer(serverOneUrl, serverOneDisplayName); + await LoginScreen.login(serverOneUser); + }); + + afterAll(async () => { + // # Log out + await HomeScreen.logout(); + }); + + it('MM-T4691_1 - should be able to add and log in to new servers', async () => { + // * Verify on channel list screen of the first server + await ChannelListScreen.toBeVisible(); + await expect(ChannelListScreen.headerServerDisplayName).toHaveText(serverOneDisplayName); + + // # Open server list screen + await ServerListScreen.open(); + + // * Verify first server is active + await ServerListScreen.toBeVisible(); + await expect(ServerListScreen.getServerItemActive(serverOneDisplayName)).toBeVisible(); + + // # Add a second server and log in to the second server + await User.apiAdminLogin(siteTwoUrl); + ({user: serverTwoUser} = await Setup.apiInit(siteTwoUrl)); + await ServerListScreen.addServerButton.tap(); + await expect(ServerScreen.headerTitleAddServer).toBeVisible(); + await ServerScreen.connectToServer(serverTwoUrl, serverTwoDisplayName); + await LoginScreen.login(serverTwoUser); + + // * Verify on channel list screen of the second server + await ChannelListScreen.toBeVisible(); + await expect(ChannelListScreen.headerServerDisplayName).toHaveText(serverTwoDisplayName); + + // # Open server list screen + await ServerListScreen.open(); + + // * Verify second server is active and first server is inactive + await ServerListScreen.toBeVisible(); + await expect(ServerListScreen.getServerItemActive(serverTwoDisplayName)).toBeVisible(); + await expect(ServerListScreen.getServerItemInactive(serverOneDisplayName)).toBeVisible(); + + // # Add a third server and log in to the third server + await User.apiAdminLogin(siteThreeUrl); + ({user: serverThreeUser} = await Setup.apiInit(siteThreeUrl)); + await ServerListScreen.addServerButton.tap(); + await expect(ServerScreen.headerTitleAddServer).toBeVisible(); + await ServerScreen.connectToServer(serverThreeUrl, serverThreeDisplayName); + await LoginScreen.login(serverThreeUser); + + // * Verify on channel list screen of the third server + await ChannelListScreen.toBeVisible(); + await expect(ChannelListScreen.headerServerDisplayName).toHaveText(serverThreeDisplayName); + + // # Open server list screen + await ServerListScreen.open(); + + // * Verify third server is active, and first and second servers are inactive + await ServerListScreen.toBeVisible(); + await expect(ServerListScreen.getServerItemActive(serverThreeDisplayName)).toBeVisible(); + await expect(ServerListScreen.getServerItemInactive(serverOneDisplayName)).toBeVisible(); + await expect(ServerListScreen.getServerItemInactive(serverTwoDisplayName)).toBeVisible(); + + // # Go back to first server + await ServerListScreen.getServerItemInactive(serverOneDisplayName).tap(); + }); + + it('MM-T4691_2 - should be able to switch to another existing server', async () => { + // * Verify on channel list screen of the first server + await ChannelListScreen.toBeVisible(); + await expect(ChannelListScreen.headerServerDisplayName).toHaveText(serverOneDisplayName); + + // # Tap on third server + await ServerListScreen.open(); + await ServerListScreen.getServerItemInactive(serverThreeDisplayName).tap(); + + // * Verify on channel list screen of the third server + await ChannelListScreen.toBeVisible(); + await expect(ChannelListScreen.headerServerDisplayName).toHaveText(serverThreeDisplayName); + + // # Go back to first server + await ServerListScreen.open(); + await ServerListScreen.getServerItemInactive(serverOneDisplayName).tap(); + }); + + it('MM-T4691_3 - should be able to edit server display name of active and inactive servers', async () => { + // * Verify on channel list screen of the first server + await ChannelListScreen.toBeVisible(); + await expect(ChannelListScreen.headerServerDisplayName).toHaveText(serverOneDisplayName); + + // # Swipe left on first server and tap on edit option + await ServerListScreen.open(); + await ServerListScreen.getServerItemActive(serverOneDisplayName).swipe('left'); + await ServerListScreen.getServerItemEditOption(serverOneDisplayName).tap(); + + // * Verify on edit server screen + await EditServerScreen.toBeVisible(); + + // # Enter the same first server display name + await EditServerScreen.serverDisplayNameInput.replaceText(serverOneDisplayName); + + // * Verify save button is disabled + await expect(EditServerScreen.saveButtonDisabled).toBeVisible(); + + // # Enter a new first server display name + const newServerOneDisplayName = `${serverOneDisplayName} new`; + await EditServerScreen.serverDisplayNameInput.replaceText(newServerOneDisplayName); + + // * Verify save button is enabled + await expect(EditServerScreen.saveButton).toBeVisible(); + + // # Tap on save button + await EditServerScreen.saveButton.tap(); + + // * Verify the new first server display name + await expect(ServerListScreen.getServerItemActive(newServerOneDisplayName)).toBeVisible(); + + // # Revert back to original first server display name and go back to first server + await ServerListScreen.getServerItemActive(newServerOneDisplayName).swipe('left'); + await ServerListScreen.getServerItemEditOption(newServerOneDisplayName).tap(); + await EditServerScreen.serverDisplayNameInput.replaceText(serverOneDisplayName); + await EditServerScreen.saveButton.tap(); + await ServerListScreen.getServerItemActive(serverOneDisplayName).tap(); + }); + + it('MM-T4691_4 - should be able to remove a server from the list', async () => { + // * Verify on channel list screen of the first server + await ChannelListScreen.toBeVisible(); + await expect(ChannelListScreen.headerServerDisplayName).toHaveText(serverOneDisplayName); + + // # Swipe left on first server and tap on remove option + await ServerListScreen.open(); + await ServerListScreen.getServerItemActive(serverOneDisplayName).swipe('left'); + await ServerListScreen.getServerItemRemoveOption(serverOneDisplayName).tap(); + + // * Verify remove server alert is displayed + await expect(Alert.removeServerTitle(serverOneDisplayName)).toBeVisible(); + + // # Tap on remove button and go back to server list screen + await Alert.removeButton.tap(); + await ServerListScreen.open(); + + // * Verify first server is removed + await expect(ServerListScreen.getServerItemActive(serverOneDisplayName)).not.toExist(); + await expect(ServerListScreen.getServerItemInactive(serverOneDisplayName)).not.toExist(); + + // # Add first server back to the list and log in to the first server + await User.apiAdminLogin(siteOneUrl); + ({user: serverOneUser} = await Setup.apiInit(siteOneUrl)); + await ServerListScreen.addServerButton.tap(); + await expect(ServerScreen.headerTitleAddServer).toBeVisible(); + await ServerScreen.connectToServer(serverOneUrl, serverOneDisplayName); + await LoginScreen.login(serverOneUser); + }); + + it('MM-T4691_5 - should be able to log out a server from the list', async () => { + // * Verify on channel list screen of the first server + await ChannelListScreen.toBeVisible(); + await expect(ChannelListScreen.headerServerDisplayName).toHaveText(serverOneDisplayName); + + // # Swipe left on first server and tap on logout option + await ServerListScreen.open(); + await ServerListScreen.getServerItemActive(serverOneDisplayName).swipe('left'); + await ServerListScreen.getServerItemLogoutOption(serverOneDisplayName).tap(); + + // * Verify logout server alert is displayed + await expect(Alert.logoutTitle(serverOneDisplayName)).toBeVisible(); + + // # Tap on logout button and go back to server list screen + await Alert.logoutButton.tap(); + await ServerListScreen.open(); + + // * Verify first server is logged out + await ServerListScreen.getServerItemInactive(serverOneDisplayName).swipe('left'); + await expect(ServerListScreen.getServerItemLoginOption(serverOneDisplayName)).toBeVisible(); + + // # Log back in to first server + await ServerListScreen.getServerItemLoginOption(serverOneDisplayName).tap(); + await User.apiAdminLogin(siteOneUrl); + ({user: serverOneUser} = await Setup.apiInit(siteOneUrl)); + await expect(ServerScreen.headerTitleAddServer).toBeVisible(); + await ServerScreen.connectToServer(serverOneUrl, serverOneDisplayName); + await LoginScreen.login(serverOneUser); + }); +}); diff --git a/detox/e2e/test/smoke_test/server_login.e2e.ts b/detox/e2e/test/smoke_test/server_login.e2e.ts index 557018276a..ef18d5cfa2 100644 --- a/detox/e2e/test/smoke_test/server_login.e2e.ts +++ b/detox/e2e/test/smoke_test/server_login.e2e.ts @@ -7,28 +7,35 @@ // - Use element testID when selecting an element. Create one if none. // ******************************************************************* -import {Setup} from '@support/server_api'; +import { + Setup, + User, +} from '@support/server_api'; import { serverOneUrl, siteOneUrl, + serverTwoUrl, + siteTwoUrl, } from '@support/test_config'; import { ChannelListScreen, HomeScreen, LoginScreen, + ServerListScreen, ServerScreen, } from '@support/ui/screen'; import {expect} from 'detox'; describe('Server Login', () => { const serverOneDisplayName = 'Server 1'; + const serverTwoDisplayName = 'Server 2'; afterAll(async () => { // # Log out await HomeScreen.logout(serverOneDisplayName); }); - it('MM-T4675 - should be able to connect to a server, log in, and show channel list screen', async () => { + it('MM-T4675_1 - should be able to connect to a server, log in, and show channel list screen', async () => { // * Verify on server screen await ServerScreen.toBeVisible(); @@ -47,4 +54,24 @@ describe('Server Login', () => { await expect(ChannelListScreen.headerTeamDisplayName).toHaveText(team.display_name); await expect(ChannelListScreen.headerServerDisplayName).toHaveText(serverOneDisplayName); }); + + it('MM-T4675_2 - should be able to add a new server and log in to the new server', async () => { + // # Open server list screen + await ServerListScreen.open(); + + // * Verify on server list screen + await ServerListScreen.toBeVisible(); + + // # Add a second server and log in to the second server + await User.apiAdminLogin(siteTwoUrl); + const {user} = await Setup.apiInit(siteTwoUrl); + await ServerListScreen.addServerButton.tap(); + await expect(ServerScreen.headerTitleAddServer).toBeVisible(); + await ServerScreen.connectToServer(serverTwoUrl, serverTwoDisplayName); + await LoginScreen.login(user); + + // * Verify on channel list screen of the second server + await ChannelListScreen.toBeVisible(); + await expect(ChannelListScreen.headerServerDisplayName).toHaveText(serverTwoDisplayName); + }); });