* MM-29039: unit and e2e tests for #4821 * add e2e test * Apply suggestions from code review Co-authored-by: Joseph Baylon <joseph.baylon@mattermost.com> * use suggested test libs * move mock to test setup * update snapshot for new mock Co-authored-by: Joseph Baylon <joseph.baylon@mattermost.com>
This commit is contained in:
parent
6e2549de7f
commit
3988e64d22
5 changed files with 117 additions and 3 deletions
|
|
@ -32,7 +32,9 @@ LongPost {
|
|||
"goToThread": [Function],
|
||||
"handleClose": [Function],
|
||||
"handlePress": [Function],
|
||||
"navigationEventListener": undefined,
|
||||
"navigationEventListener": Object {
|
||||
"remove": [MockFunction],
|
||||
},
|
||||
"props": Object {
|
||||
"actions": Object {
|
||||
"getPostThread": [MockFunction],
|
||||
|
|
|
|||
83
app/screens/select_server/select_server.test.js
Normal file
83
app/screens/select_server/select_server.test.js
Normal file
|
|
@ -0,0 +1,83 @@
|
|||
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
|
||||
// See LICENSE.txt for license information.
|
||||
import React from 'react';
|
||||
|
||||
import SelectServer from './select_server.js';
|
||||
import {renderWithReduxIntl} from 'test/testing_library';
|
||||
import {fireEvent, waitFor} from '@testing-library/react-native';
|
||||
|
||||
describe('SelectServer', () => {
|
||||
const actions = {
|
||||
getPing: jest.fn(),
|
||||
handleServerUrlChanged: jest.fn(),
|
||||
scheduleExpiredNotification: jest.fn(),
|
||||
loadConfigAndLicense: jest.fn(),
|
||||
login: jest.fn(),
|
||||
resetPing: jest.fn(),
|
||||
setLastUpgradeCheck: jest.fn(),
|
||||
setServerVersion: jest.fn(),
|
||||
};
|
||||
|
||||
const baseProps = {
|
||||
actions,
|
||||
hasConfigAndLicense: true,
|
||||
serverUrl: '',
|
||||
};
|
||||
|
||||
test('should match error when URL is empty string', async () => {
|
||||
const {getByTestId, getByText} = renderWithReduxIntl(
|
||||
<SelectServer {...baseProps}/>,
|
||||
);
|
||||
|
||||
const button = getByText('Connect');
|
||||
fireEvent.press(button);
|
||||
|
||||
await waitFor(() => expect(getByTestId('error_text')).toBeTruthy());
|
||||
expect(getByText('Please enter a valid server URL')).toBeTruthy();
|
||||
});
|
||||
|
||||
test('should match error when URL is only spaces', async () => {
|
||||
const {getByTestId, getByText} = renderWithReduxIntl(
|
||||
<SelectServer {...baseProps}/>,
|
||||
);
|
||||
|
||||
const urlInput = getByTestId('server_url_input');
|
||||
fireEvent.changeText(urlInput, ' ');
|
||||
|
||||
const button = getByText('Connect');
|
||||
fireEvent.press(button);
|
||||
|
||||
await waitFor(() => expect(getByTestId('error_text')).toBeTruthy());
|
||||
expect(getByText('Please enter a valid server URL')).toBeTruthy();
|
||||
});
|
||||
|
||||
test('should match error when URL does not start with http:// or https://', async () => {
|
||||
const {getByTestId, getByText} = renderWithReduxIntl(
|
||||
<SelectServer {...baseProps}/>,
|
||||
);
|
||||
|
||||
const urlInput = getByTestId('server_url_input');
|
||||
fireEvent.changeText(urlInput, 'ht://invalid:8065');
|
||||
|
||||
const button = getByText('Connect');
|
||||
fireEvent.press(button);
|
||||
|
||||
await waitFor(() => expect(getByTestId('error_text')).toBeTruthy());
|
||||
expect(getByText('URL must start with http:// or https://')).toBeTruthy();
|
||||
});
|
||||
|
||||
test('should not show error when valid URL is entered', async () => {
|
||||
const {getByTestId, getByText, queryByTestId} = renderWithReduxIntl(
|
||||
<SelectServer {...baseProps}/>,
|
||||
);
|
||||
|
||||
const urlInput = getByTestId('server_url_input');
|
||||
fireEvent.changeText(urlInput, 'http://localhost:8065');
|
||||
|
||||
const button = getByText('Connect');
|
||||
fireEvent.press(button);
|
||||
|
||||
expect(queryByTestId('error_text')).toBeNull();
|
||||
await waitFor(() => expect(getByText('Connecting...')).toBeTruthy());
|
||||
});
|
||||
});
|
||||
|
|
@ -5,7 +5,9 @@ NotificationSettingsMentionsKeywords {
|
|||
"context": Object {},
|
||||
"handleSubmit": [Function],
|
||||
"keywordsRef": [Function],
|
||||
"navigationEventListener": undefined,
|
||||
"navigationEventListener": Object {
|
||||
"remove": [MockFunction],
|
||||
},
|
||||
"onKeywordsChangeText": [Function],
|
||||
"props": Object {
|
||||
"componentId": "component-id",
|
||||
|
|
|
|||
|
|
@ -32,6 +32,31 @@ describe('On boarding', () => {
|
|||
await expect(element(by.id('connect_button'))).toBeVisible();
|
||||
});
|
||||
|
||||
it('MM-T3383 should show error on empty server URL', async () => {
|
||||
await expect(element(by.id('select_server_screen'))).toBeVisible();
|
||||
|
||||
// # Enter an empty server URL
|
||||
await element(by.id('server_url_input')).typeText(' ');
|
||||
|
||||
// # Tap anywhere to hide keyboard
|
||||
await element(by.text('Enter Server URL')).tap();
|
||||
|
||||
// * Verify that the error message does not exist
|
||||
await waitFor(element(by.id('error_text'))).not.toExist().withTimeout(timeouts.HALF_SEC);
|
||||
|
||||
// # Tap connect button
|
||||
await element(by.id('connect_button')).tap();
|
||||
|
||||
// # Explicitly wait on Android before verifying error message
|
||||
if (isAndroid()) {
|
||||
await wait(timeouts.ONE_MIN);
|
||||
}
|
||||
|
||||
// * Verify error message
|
||||
await waitFor(element(by.id('error_text'))).toBeVisible().withTimeout(timeouts.ONE_MIN);
|
||||
await expect(element(by.id('error_text'))).toHaveText('Please enter a valid server URL');
|
||||
});
|
||||
|
||||
it('should show error on invalid server URL', async () => {
|
||||
await expect(element(by.id('select_server_screen'))).toBeVisible();
|
||||
|
||||
|
|
|
|||
|
|
@ -188,7 +188,9 @@ jest.mock('react-native-navigation', () => {
|
|||
...RNN.Navigation,
|
||||
events: () => ({
|
||||
registerAppLaunchedListener: jest.fn(),
|
||||
bindComponent: jest.fn(),
|
||||
bindComponent: jest.fn(() => {
|
||||
return {remove: jest.fn()};
|
||||
}),
|
||||
}),
|
||||
setRoot: jest.fn(),
|
||||
pop: jest.fn(),
|
||||
|
|
|
|||
Loading…
Reference in a new issue