MM-35354 Detox/E2E: Add e2e for channel info zephyr cases (#5375)

* MM-35354 Detox/E2E: Add e2e for channel info zephyr cases

* Fix zephyr key
This commit is contained in:
Joseph Baylon 2021-05-06 07:47:46 -07:00 committed by GitHub
parent 29cfca9876
commit a94fcd07d4
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 288 additions and 70 deletions

View file

@ -11,6 +11,9 @@ class BottomSheet {
archivedChannelsOption = isAndroid() ? element(by.text('Archived Channels')) : element(by.label('Archived Channels')).atIndex(0);
awayOption = isAndroid() ? element(by.text('Away')) : element(by.label('Away')).atIndex(0);
cancelOption = isAndroid() ? element(by.text('Cancel')) : element(by.label('Cancel')).atIndex(0);
copyHeaderOption = isAndroid() ? element(by.text('Copy Header')) : element(by.label('Copy Header')).atIndex(0);
copyPurposeOption = isAndroid() ? element(by.text('Copy Purpose')) : element(by.label('Copy Purpose')).atIndex(0);
copyUrlOption = isAndroid() ? element(by.text('Copy URL')) : element(by.label('Copy URL')).atIndex(0);
doNotDisturbOption = isAndroid() ? element(by.text('Do Not Disturb')) : element(by.label('Do No Disturb')).atIndex(0);
offlineOption = isAndroid() ? element(by.text('Offline')) : element(by.label('Offline')).atIndex(0);
onlineOption = isAndroid() ? element(by.text('Online')) : element(by.label('Online')).atIndex(0);

View file

@ -3,7 +3,7 @@
import {Alert} from '@support/ui/component';
import {ChannelScreen} from '@support/ui/screen';
import {timeouts, wait} from '@support/utils';
import {isAndroid, timeouts, wait} from '@support/utils';
class ChannelInfoScreen {
testID = {
@ -78,7 +78,7 @@ class ChannelInfoScreen {
await expect(this.channelInfoScreen).not.toBeVisible();
}
archiveChannel = async ({confirm = true, publicChannel = true} = {}) => {
archiveChannel = async ({confirm = true, publicChannel = true, description = null} = {}) => {
await this.channelInfoScrollView.scrollTo('bottom');
await this.archiveAction.tap();
const {
@ -92,6 +92,10 @@ class ChannelInfoScreen {
} else {
await expect(archivePrivateChannelTitle).toBeVisible();
}
if (description) {
const descriptionElement = isAndroid() ? element(by.text(description)) : element(by.label(description)).atIndex(0);
await expect(descriptionElement).toBeVisible();
}
await expect(noButton).toBeVisible();
await expect(yesButton).toBeVisible();
if (confirm) {
@ -105,7 +109,7 @@ class ChannelInfoScreen {
}
}
leaveChannel = async ({confirm = true, publicChannel = true} = {}) => {
leaveChannel = async ({confirm = true, publicChannel = true, description = null} = {}) => {
await this.channelInfoScrollView.scrollTo('bottom');
await this.leaveAction.tap();
const {
@ -119,6 +123,10 @@ class ChannelInfoScreen {
} else {
await expect(leavePrivateChannelTitle).toBeVisible();
}
if (description) {
const descriptionElement = isAndroid() ? element(by.text(description)) : element(by.label(description)).atIndex(0);
await expect(descriptionElement).toBeVisible();
}
await expect(noButton).toBeVisible();
await expect(yesButton).toBeVisible();
if (confirm) {

View file

@ -0,0 +1,248 @@
// 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 {BottomSheet} from '@support/ui/component';
import {
ChannelInfoScreen,
ChannelScreen,
EditChannelScreen,
MoreDirectMessagesScreen,
} from '@support/ui/screen';
import {
Channel,
Setup,
} from '@support/server_api';
import {isIos, timeouts, wait} from '@support/utils';
describe('Channel Info', () => {
const {
goToChannel,
postInput,
} = ChannelScreen;
const {
headerInput,
nameInput,
purposeInput,
saveButton,
} = EditChannelScreen;
let testChannel1;
let testChannel2;
let townSquareChannel;
beforeAll(async () => {
const {channel, team, user} = await Setup.apiInit();
testChannel1 = channel;
({channel: townSquareChannel} = await Channel.apiGetChannelByName(team.name, 'town-square'));
({channel: testChannel2} = await Channel.apiCreateChannel({type: 'O', teamId: team.id}));
await Channel.apiAddUserToChannel(user.id, testChannel2.id);
// # Open channel screen
await ChannelScreen.open(user);
});
afterAll(async () => {
await ChannelScreen.logout();
});
it('MM-T849 should be able to display channel info', async () => {
// # Open channel info screen
await ChannelInfoScreen.open();
// * Verify channel info is displayed
await expect(ChannelInfoScreen.channelDisplayName).toHaveText(townSquareChannel.display_name);
// # Go back to channel
await ChannelInfoScreen.close();
});
it('MM-T866 whitespaces on channel name should be trimmed on alert popups', async () => {
const {
archiveChannel,
leaveChannel,
} = ChannelInfoScreen;
// # Add whitespaces to channel name
await ChannelScreen.goToChannel(testChannel1.display_name);
await ChannelInfoScreen.open();
await EditChannelScreen.open();
await nameInput.replaceText(` ${testChannel1.display_name} `);
await saveButton.tap();
// * Verify channel name is trimmed on alert popups
await leaveChannel({confirm: false, description: `Are you sure you want to leave the public channel ${testChannel1.display_name}?`});
await archiveChannel({confirm: false, description: `Are you sure you want to archive the public channel ${testChannel1.display_name}?`});
// # Go back to channel
await ChannelInfoScreen.close();
});
it('MM-T867 should be able to copy channel header text', async () => {
// # Edit channel header
await goToChannel(townSquareChannel.display_name);
const expectedHeader = `Channel header: ${townSquareChannel.display_name.toLowerCase()}`;
await ChannelInfoScreen.open();
await EditChannelScreen.open();
await headerInput.replaceText(expectedHeader);
await saveButton.tap();
// # Copy channel header text
await element(by.text(expectedHeader)).longPress();
await BottomSheet.copyHeaderOption.tap();
// # Go back to channel
await ChannelInfoScreen.close();
// Tapping on Paste currently works on iOS only
if (isIos()) {
// # Paste to channel post draft
await postInput.longPress();
await element(by.text('Paste')).tap();
// * Verify header text is pasted to channel post draft
await expect(postInput).toHaveText(expectedHeader);
await postInput.clearText();
}
});
it('MM-T868 should be able to copy channel purpose text', async () => {
// # Edit channel purpose
await goToChannel(townSquareChannel.display_name);
const expectedPurpose = `Channel purpose: ${townSquareChannel.display_name.toLowerCase()}`;
await ChannelInfoScreen.open();
await EditChannelScreen.open();
await purposeInput.replaceText(expectedPurpose);
await saveButton.tap();
// # Copy channel purpose text
await element(by.text(expectedPurpose)).longPress();
await BottomSheet.copyPurposeOption.tap();
// # Go back to channel
await ChannelInfoScreen.close();
// Tapping on Paste currently works on iOS only
if (isIos()) {
// # Paste to channel post draft
await postInput.longPress();
await element(by.text('Paste')).tap();
// * Verify purpose text is pasted to channel post draft
await expect(postInput).toHaveText(expectedPurpose);
await postInput.clearText();
}
});
it('MM-T869 should be able to copy url from channel header', async () => {
// # Edit channel header
const expectedHeaderUrl = 'https://mattermost.com';
await goToChannel(townSquareChannel.display_name);
await ChannelInfoScreen.open();
await EditChannelScreen.open();
await headerInput.replaceText(expectedHeaderUrl);
await saveButton.tap();
// # Copy channel url
await element(by.text(expectedHeaderUrl)).longPress();
await BottomSheet.copyUrlOption.tap();
// # Go back to channel
await ChannelInfoScreen.close();
// Tapping on Paste currently works on iOS only
if (isIos()) {
// # Paste to channel post draft
await postInput.longPress();
await element(by.text('Paste')).tap();
// * Verify url is pasted to channel post draft
await expect(postInput).toHaveText(expectedHeaderUrl);
await postInput.clearText();
}
});
it('MM-T1733 should not render markdown in channel purpose', async () => {
// # Edit channel purpose
const expectedPurpose = '[Mattermost](https://mattermost.com)';
await goToChannel(townSquareChannel.display_name);
await ChannelInfoScreen.open();
await EditChannelScreen.open();
await purposeInput.replaceText(expectedPurpose);
await saveButton.tap();
// * Verify purpose is literal text
await expect(element(by.text(expectedPurpose))).toBeVisible();
// # Go back to channel
await ChannelInfoScreen.close();
});
it('MM-T2980 should be able to save channel name up to 64 characters only', async () => {
// # Open edit channel screen
const channelName64Char = 'ChannelName12345678901234567890123456789012345678901234567890123';
await ChannelScreen.goToChannel(testChannel2.display_name);
await ChannelInfoScreen.open();
await EditChannelScreen.open();
// # Attempt to edit channel name with more than 64 characters
await nameInput.replaceText(channelName64Char + 'x');
if (isIos()) {
// # Attempt to save
await saveButton.tap();
// * Verify error message is displayed
await expect(element(by.text('Channel name must be less than 64 characters'))).toBeVisible();
} else {
// * Verify extra characters are trimmed on Android
await expect(nameInput).toHaveText(channelName64Char);
}
// # Edit channel name with exactly 64 characters
await nameInput.replaceText(channelName64Char);
await saveButton.tap();
// * Verify channel name is saved
await expect(ChannelInfoScreen.channelDisplayName).toHaveText(channelName64Char);
// # Go back to channel
await ChannelInfoScreen.close();
});
it('MM-T3406 should render correct GM member count in channel info header', async () => {
const {
getUserAtIndex,
startButton,
} = MoreDirectMessagesScreen;
// # Open more direct messages screen
await ChannelScreen.goToChannel(townSquareChannel.display_name);
await ChannelScreen.openMainSidebar();
await MoreDirectMessagesScreen.open();
// # Wait for some profiles to load
await wait(timeouts.ONE_SEC);
// # Select 3 profiles
await getUserAtIndex(0).tap();
await getUserAtIndex(1).tap();
await getUserAtIndex(2).tap();
// # Create a GM with selected profiles
await startButton.tap();
// # Open channel info screen
await ChannelInfoScreen.open();
// * Verify GM member count is 3
await expect(ChannelInfoScreen.channelIconGMMemberCount).toHaveText('3');
// # Close channel info screen
await ChannelInfoScreen.close();
});
});

View file

@ -1,60 +0,0 @@
// 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 {
ChannelInfoScreen,
ChannelScreen,
MoreDirectMessagesScreen,
} from '@support/ui/screen';
import {timeouts, wait} from '@support/utils';
import {Setup} from '@support/server_api';
describe('Channel Info Header', () => {
beforeAll(async () => {
const {user} = await Setup.apiInit();
// # Open channel screen
await ChannelScreen.open(user);
});
afterAll(async () => {
await ChannelScreen.logout();
});
it('MM-T3406 should render correct GM member count in channel info header', async () => {
// # Open more direct messages screen
await ChannelScreen.openMainSidebar();
await MoreDirectMessagesScreen.open();
// # Wait for some profiles to load
await wait(timeouts.ONE_SEC);
const {
getUserAtIndex,
startButton,
} = MoreDirectMessagesScreen;
// # Select 3 profiles
await getUserAtIndex(0).tap();
await getUserAtIndex(1).tap();
await getUserAtIndex(2).tap();
// # Create a GM with selected profiles
await startButton.tap();
// # Open channel info screen
await ChannelInfoScreen.open();
// * Verify GM member count is 3
await expect(ChannelInfoScreen.channelIconGMMemberCount).toHaveText('3');
// # Close channel info screen
await ChannelInfoScreen.close();
});
});

View file

@ -19,6 +19,16 @@ import {Setup} from '@support/server_api';
import {isAndroid} from '@support/utils';
describe('Channels', () => {
const {
channelIntro,
openMainSidebar,
} = ChannelScreen;
const {
nameInput,
purposeInput,
headerInput,
} = CreateChannelScreen;
beforeAll(async () => {
const {user} = await Setup.apiInit();
@ -30,9 +40,24 @@ describe('Channels', () => {
await ChannelScreen.logout();
});
it('MM-T838 should be able to create channel using non-latin characters', async () => {
// # Open more channels screen
await openMainSidebar();
await MoreChannelsScreen.open();
// # Create new channel with non-latin characters
const expectedChannelName = '熊本';
await MoreChannelsScreen.createButton.tap();
await nameInput.replaceText(expectedChannelName);
await CreateChannelScreen.createButton.tap();
// * Verify channel is created
await expect(channelIntro).toHaveText('Beginning of ' + expectedChannelName);
});
it('MM-T3201 Create public channel', async () => {
// # Open more channels screen
await ChannelScreen.openMainSidebar();
await openMainSidebar();
await MoreChannelsScreen.open();
// * Expect a list of public channels, initially empty
@ -45,12 +70,6 @@ describe('Channels', () => {
const createChannelScreen = await CreateChannelScreen.toBeVisible();
await expect(element(by.text('New Public Channel'))).toBeVisible();
const {
nameInput,
purposeInput,
headerInput,
} = CreateChannelScreen;
// # Fill data
await nameInput.typeText('a');
await attemptToTapCreateButton();