MM-29039: unit and e2e tests for #4821 (#4879)

* 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:
Ashish Bhate 2020-10-15 16:27:28 +00:00 committed by GitHub
parent 6e2549de7f
commit 3988e64d22
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 117 additions and 3 deletions

View file

@ -32,7 +32,9 @@ LongPost {
"goToThread": [Function],
"handleClose": [Function],
"handlePress": [Function],
"navigationEventListener": undefined,
"navigationEventListener": Object {
"remove": [MockFunction],
},
"props": Object {
"actions": Object {
"getPostThread": [MockFunction],

View 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());
});
});

View file

@ -5,7 +5,9 @@ NotificationSettingsMentionsKeywords {
"context": Object {},
"handleSubmit": [Function],
"keywordsRef": [Function],
"navigationEventListener": undefined,
"navigationEventListener": Object {
"remove": [MockFunction],
},
"onKeywordsChangeText": [Function],
"props": Object {
"componentId": "component-id",

View file

@ -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();

View file

@ -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(),