mattermost-mobile/detox/e2e/support/ui/screen/custom_status.ts

105 lines
4.5 KiB
TypeScript

// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
// See LICENSE.txt for license information.
import {
AccountScreen,
EmojiPickerScreen,
} from '@support/ui/screen';
import {timeouts, wait} from '@support/utils';
import {expect} from 'detox';
class CustomStatusScreen {
testID = {
customStatusEmojiPrefix: 'custom_status.custom_status_emoji.',
customStatusDurationPrefix: 'custom_status.clear_after.custom_status_duration.',
customStatusSuggestionPrefix: 'custom_status.custom_status_suggestion.',
customStatusScreen: 'custom_status.screen',
doneButton: 'custom_status.done.button',
scrollView: 'custom_status.scroll_view',
statusInput: 'custom_status.status.input',
statusInputClearButton: 'custom_status.status.input.clear.button',
recents: 'custom_status.recents',
suggestions: 'custom_status.suggestions',
};
customStatusScreen = element(by.id(this.testID.customStatusScreen));
doneButton = element(by.id(this.testID.doneButton));
scrollView = element(by.id(this.testID.scrollView));
statusInput = element(by.id(this.testID.statusInput));
statusInputClearButton = element(by.id(this.testID.statusInputClearButton));
recents = element(by.id(this.testID.recents));
suggestions = element(by.id(this.testID.suggestions));
getCustomStatusEmoji = (emojiName: string) => {
return element(by.id(`${this.testID.customStatusEmojiPrefix}${emojiName}`));
};
getCustomStatusClearAfterAction = (duration: string) => {
return element(by.id(`${this.testID.customStatusDurationPrefix}${duration}.action`));
};
getCustomStatusExpiry = (duration: string) => {
return element(by.id(`${this.testID.customStatusDurationPrefix}${duration}.custom_status_expiry`));
};
getCustomStatusSuggestion = (blockMatcher: Detox.NativeMatcher, emojiName: string, text: string, duration: string) => {
const customStatusSuggestionTestId = `${this.testID.customStatusSuggestionPrefix}${text}`;
const customStatusSuggestionMatcher = by.id(customStatusSuggestionTestId).withAncestor(blockMatcher);
const customStatusEmojiMatcher = by.id(`${customStatusSuggestionTestId}.custom_status_emoji.${emojiName}`).withAncestor(blockMatcher);
const customStatusTextMatcher = by.id(`${customStatusSuggestionTestId}.custom_status_text`).withAncestor(blockMatcher);
const customStatusDurationMatcher = by.id(`${customStatusSuggestionTestId}.custom_status_duration.${duration}`).withAncestor(blockMatcher);
const customStatusClearButtonMatcher = by.id(`${customStatusSuggestionTestId}.clear.button`).withAncestor(blockMatcher);
return {
customStatusSuggestion: element(customStatusSuggestionMatcher),
customStatusSuggestionEmoji: element(customStatusEmojiMatcher),
customStatusSuggestionText: element(customStatusTextMatcher),
customStatusSuggestionDuration: element(customStatusDurationMatcher),
customStatusClearButton: element(customStatusClearButtonMatcher),
};
};
getRecentCustomStatus = (emojiName: string, text: string, duration: string) => {
const recentsMatcher = by.id(this.testID.recents);
return this.getCustomStatusSuggestion(recentsMatcher, emojiName, text, duration);
};
getSuggestedCustomStatus = (emojiName: string, text: string, duration: string) => {
const suggestedMatcher = by.id(this.testID.suggestions);
return this.getCustomStatusSuggestion(suggestedMatcher, emojiName, text, duration);
};
toBeVisible = async () => {
await waitFor(this.customStatusScreen).toExist().withTimeout(timeouts.TEN_SEC);
return this.customStatusScreen;
};
open = async () => {
// # Open custom status screen
await AccountScreen.setStatusOption.tap();
return this.toBeVisible();
};
openEmojiPicker = async (emojiName: string, closeToolTip = false) => {
await this.getCustomStatusEmoji(emojiName).tap();
if (closeToolTip) {
await wait(timeouts.TWO_SEC);
try {
await EmojiPickerScreen.toolTipCloseButton.tap();
} catch (error) {
// Tool tip not shown
}
}
await EmojiPickerScreen.toBeVisible();
};
close = async () => {
await this.doneButton.tap();
await expect(this.customStatusScreen).not.toBeVisible();
};
}
const customStatusScreen = new CustomStatusScreen();
export default customStatusScreen;