mattermost-mobile/test/test_helper.js
Avinash Lingaloo 3ee6e673c8
MM-35115 [Gekidou] Login flow - Email and Password (#5402)
* MM_35115: ADDED select_server screen

* MM_35115: ADDED select_server screen

* MM_35115: ADDED files on which select_server is dependent

* MM_35115: ADDED react-native-button

* MM_35115: Fixing TS issues [IN PROGRESS]

* MM_35115: Started withObservables [IN PROGRESS]

* MM_35115: Started withObservables [IN PROGRESS]

* MM_35115: withObservables - defaulting when no connection is available [IN PROGRESS]

* MM_35115: withObservables - some code clean up [IN PROGRESS]

* MM_35115: withObservables - some code clean up [IN PROGRESS]

* MM_35115: withObservables - some code clean up [IN PROGRESS]

* MM_35115: Substituting mapDispatchToProps [IN PROGRESS]

* MM_35115: Substituting mapDispatchToProps [IN PROGRESS]

* MM_35115: Substituting mapDispatchToProps [IN PROGRESS]

* MM_35115: Removed resetPing action [IN PROGRESS]

* MM_35115: ADDED app/client

* MM_35115: Preparing scheduleExpiredNotification

* MM_35115: Adding some todos

* Server & LoginOptions

* Use default server if available and autoconnect if configured

* Fix login header & manual server url

* MM_35115: Login Options[IN PROGRESS]

* MM_35115: Login screen - email [IN PROGRESS]

* MM_35115: Login screen - email [IN PROGRESS]

* MM_35115: Login screen - email - login api call [IN PROGRESS]

* MM_35115: Login screen - email - login api call [IN PROGRESS]

* MM_35115: Login screen - email - saving to server db [IN PROGRESS]

* MM_35115: Login screen - email - saving to System, Preferences to db [IN PROGRESS]

* MM_35115: Login screen - enforcing unique check on System entity [IN PROGRESS]

* MM_35115: Login screen - writing TeamMembership [IN PROGRESS]

* MM_35115: Login screen - writing Teams [IN PROGRESS]

* MM_35115: Login screen [IN PROGRESS]

* MM_35115: Login screen- Refactored DataOperator handlers [IN PROGRESS]

* MM_35115: Login screen - Proper clean up [IN PROGRESS]

* MM_35115: Login screen - completeLogin  [IN PROGRESS]

* MM_35115: Improving DataOperator

* MM_35115: Improving DataOperator

* MM_35115: 80% DONE - login with email and password - some todos

* MM_35115: 80% DONE - login with email and password - some todos

* MM_35115: 80% DONE - login with email and password - some todos

* MM_35115: Removing unused app/queries folder

* MM_35115: Clean up

* MM_35115: Clean up

* MM_35115: Clean up

* MM_35115: Clean up

* MM_35115: Clean up

* MM_35115: Adding roles for MYTEAM

* MM_35115: Code clean up

* MM_35115: Code clean up

* MM_35115: Code clean up

* MM_35115: Adding rn-fetch-blob for Android

* MM_35115: Code clean up

* MM_35115: Code clean up

* MM_35115: Added test setup

* MM_35115: Fix database utils

* MM_35115: ADDED loadRolesIfNeeded

* MM_35115: Fix TS issue

* MM_35115: ADDED Tests setup

* MM_35115: Fix TS issues

* MM_35115: Fix TS issues

* MM_35115: Fix TS issues

* MM_35115: Added alternative to site name

* MM_35115: Added alternative to site name

* MM_35115: Removed hardcoded values

* MM_35115: Clean up

* MM_35115 - Fixed Android platform check instead of hermes

* MM_35115  - Replaced emptyErrorHandlingFunction with emptyFunction

* MM_35115 : Implemented TS fixes

* Update index.ts

* MM-35115 - Fix react-test-renderer issue

* MM_35115 - Optimizing DatabaseManager

* MM_35115 : Implemented getDatabaseConnection

* MM_35115 : Refactoring set/getActiveDatabase to use flag record

* MM_35115 : Refactored active database to use flag in Global entity

* MM_35115 : Updated manual database manager test

* MM_35115 : Fix operator/utils/test

* MM_35115 : Fix for base_handler

* MM_35115 : Fix test issues with Handlers

* MM_35115 : Fix test issues with prepareRecords

* MM_35115 : Fix wrapper test issue

* MM_35115 : Updated getMostRecentServerConnection to return the serverUrl as well as the connection

* MM_35115 : Refactored the way we call DataOperator

* MM_35115 : Updated database manager mock

* Add getMostRecentServerUrl function (#5440)

* fix: add getMostRecentServerUrl func

* fix: add ts and tsx to editorconfig

* fix: rename functions

* fix: return type

* Fix unit test setup

* fix login screen unit tests

* MM-36205 [GEKIDOU] Login Flow SSO (#5454)

* MM_35115: Starting LoginOptions SSO

* MM_36205: SSO [IN PROGRESS]

* MM_36205 : SSO [ IN PROGRESS ]

* Update sso_with_redirect_url.tsx

* MM_36205 : SSO Tests [ IN PROGRESS ]

* MM_36205 : Passing serverUrl to SSO screen

* Update sso.test.tsx

* Fix ViewTypes imports and keyMirror method

* MM_36205 : Code clean up

* Fix : Clean up imports

* Update: Aligning with PR 5452

* Fix: AndroidManifest file to include redirection ofr scheme mmauthbeta

* refactor: SSO Login method via Gitlab now navigates to Channel screen

* refactor: SSO Login without redirectURL is also working

* feat: SSO - main test completed

* feat: ADDED test for sso_with_redirect_url

* fix : eslint correction

* fix: Updated Loading component name

* fix : code clean up from reviews

* fix: reviews check

* fix: Added mmauthbeta into info.plist

* Revert "fix: Added mmauthbeta into info.plist"

This reverts commit d87cc23f5b451a49d9ffa9de4745224b7ecfc977.

* Update Info.plist

* Update AppDelegate.m

* feat: ADDED Forgot Password - Test [ IN PROGRESS ]

* feat: Forgot Password - Completed & Tested

* fix: Including MFA screen [ IN PROGRESS ]

* MFA - Properly tested

* Properly testing forgot_password screen

* Fix login.test.tsx

* Fix SSO method calls chain

* Update index.tsx

* Sort imports for sceen/navigation

* fix: Reviews

* Update signing + act in test

* Removed todo comment on MFA

* feedback review

* fix login tests

Co-authored-by: Avinash Lingaloo <>
Co-authored-by: Elias Nahum <nahumhbl@gmail.com>

* App initialization refactor (#5430)

* fix: initial init refactor

* fix: await isServerPresent

* fix: more refactor

* fix: move out launch functions

* fix: remove comment

* fix: update credential functions

* fix: refactor launch functions

* fix: deep link parsing

* fix: lint change

* fix: update deeplink and notification handlers

* fix: indentation

* fix: add relaunchApp

* fix eslint

* refactor launchProps and autoconnect server for deeplink

* fix: use undefined

* fix: define OptionalLaunchProps

* fix: Android - handle server URL in push notification

* fix: rename func

* fix: use boolean launchError instead

* fix: use DatabaseModule

* fix: use DatabaseHelper instead

* fix: remove unnecessary null check

* fix: iOS - support for serverUrl

* fix: iOS - extract serverUrl in reply action

* fix: iOS - expose objc specific func

* fix: remove unnecessary deviceToken param

* fix: return if device is untrusted

Co-authored-by: Elias Nahum <nahumhbl@gmail.com>

* fix: bye bye modulePaths

* fix: ios build

* chore: remove unused aliases from babel.config

* chore: fix dependency format in package-lock.json

* chore: remove transparent window background color for android AppTheme

* chore: remove mattermost.js and use index.ts as app entry

* fix: login flow screens theme

* fix: Launch types

* chore: remove OptionalLaunchProps type

* fix: url utils unit tests

* chore: update en.json

Co-authored-by: Elias Nahum <nahumhbl@gmail.com>

Co-authored-by: Avinash Lingaloo <>
Co-authored-by: Elias Nahum <nahumhbl@gmail.com>
Co-authored-by: Miguel Alatzar <migbot@users.noreply.github.com>
2021-06-18 00:57:40 -04:00

477 lines
14 KiB
JavaScript

// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
// See LICENSE.txt for license information.
import assert from 'assert';
import nock from 'nock';
import Config from '@assets/config.json';
import {Client} from '@client/rest';
import GENERAL_CONSTANTS from '@constants/general';
import {generateId} from '@utils/general';
const PASSWORD = 'password1';
const DEFAULT_LOCALE = GENERAL_CONSTANTS.DEFAULT_LOCALE;
class TestHelper {
constructor() {
this.basicClient = null;
this.basicClient4 = null;
this.basicUser = null;
this.basicTeam = null;
this.basicTeamMember = null;
this.basicChannel = null;
this.basicChannelMember = null;
this.basicPost = null;
this.basicRoles = null;
this.basicScheme = null;
}
activateMocking() {
if (!nock.isActive()) {
nock.activate();
}
}
assertStatusOkay = (data) => {
assert(data);
assert(data.status === 'OK');
};
generateId = () => {
return generateId();
};
createClient = () => {
const client = new Client();
client.setUrl(Config.DefaultServerUrl || Config.TestServerUrl);
return client;
};
fakeChannel = (teamId) => {
const name = this.generateId();
return {
name,
team_id: teamId,
display_name: `Unit Test ${name}`,
type: 'O',
delete_at: 0,
total_msg_count: 0,
scheme_id: this.generateId(),
};
};
fakeChannelWithId = (teamId) => {
return {
...this.fakeChannel(teamId),
id: this.generateId(),
create_at: 1507840900004,
update_at: 1507840900004,
delete_at: 0,
};
};
fakeDmChannel = (userId, otherUserId) => {
return {
name: userId > otherUserId ? otherUserId + '__' + userId : userId + '__' + otherUserId,
team_id: '',
display_name: `${otherUserId}`,
type: 'D',
status: 'offline',
teammate_id: `${otherUserId}`,
id: this.generateId(),
delete_at: 0,
};
}
fakeChannelMember = (userId, channelId) => {
return {
user_id: userId,
channel_id: channelId,
notify_props: {},
roles: 'system_user',
msg_count: 0,
mention_count: 0,
scheme_user: false,
scheme_admin: false,
};
};
fakeEmail = () => {
return 'success' + this.generateId() + '@simulator.amazonses.com';
};
fakePost = (channelId) => {
const time = Date.now();
return {
id: this.generateId(),
channel_id: channelId,
create_at: time,
update_at: time,
message: `Unit Test ${this.generateId()}`,
type: '',
};
};
fakePostWithId = (channelId) => {
return {
...this.fakePost(channelId),
id: this.generateId(),
create_at: 1507840900004,
update_at: 1507840900004,
delete_at: 0,
};
};
fakeTeam = () => {
const name = this.generateId();
let inviteId = this.generateId();
if (inviteId.length > 32) {
inviteId = inviteId.substring(0, 32);
}
return {
name,
display_name: `Unit Test ${name}`,
type: 'O',
email: this.fakeEmail(),
allowed_domains: '',
invite_id: inviteId,
scheme_id: this.generateId(),
};
};
fakeTeamWithId = () => {
return {
...this.fakeTeam(),
id: this.generateId(),
create_at: 1507840900004,
update_at: 1507840900004,
delete_at: 0,
};
};
fakeTeamMember = (userId, teamId) => {
return {
user_id: userId,
team_id: teamId,
roles: 'team_user',
delete_at: 0,
scheme_user: false,
scheme_admin: false,
};
};
fakeUser = () => {
return {
email: this.fakeEmail(),
allow_marketing: true,
password: PASSWORD,
locale: DEFAULT_LOCALE,
username: this.generateId(),
first_name: this.generateId(),
last_name: this.generateId(),
create_at: Date.now(),
delete_at: 0,
roles: 'system_user',
};
};
fakeUserWithId = (id = this.generateId()) => {
return {
...this.fakeUser(),
id,
create_at: 1507840900004,
update_at: 1507840900004,
delete_at: 0,
};
};
fakeOutgoingHook = (teamId) => {
return {
team_id: teamId,
};
};
fakeOutgoingHookWithId = (teamId) => {
return {
...this.fakeOutgoingHook(teamId),
id: this.generateId(),
};
};
fakeFiles = (count) => {
const files = [];
while (files.length < count) {
files.push({
id: this.generateId(),
});
}
return files;
};
fakeOAuthApp = () => {
return {
name: this.generateId(),
callback_urls: ['http://localhost/notrealurl'],
homepage: 'http://localhost/notrealurl',
description: 'fake app',
is_trusted: false,
icon_url: 'http://localhost/notrealurl',
update_at: 1507841118796,
};
};
fakeOAuthAppWithId = () => {
return {
...this.fakeOAuthApp(),
id: this.generateId(),
};
};
fakeBot = () => {
return {
user_id: this.generateId(),
username: this.generateId(),
display_name: 'Fake bot',
owner_id: this.generateId(),
create_at: 1507840900004,
update_at: 1507840900004,
delete_at: 0,
};
}
generateId = () => {
// Implementation taken from http://stackoverflow.com/a/2117523
let id = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx';
id = id.replace(/[xy]/g, (c) => {
const r = Math.floor(Math.random() * 16);
let v;
if (c === 'x') {
v = r;
} else {
v = (r & 0x3) | 0x8;
}
return v.toString(16);
});
return 'uid' + id;
};
mockLogin = () => {
nock(this.basicClient4.getBaseRoute()).
post('/users/login').
reply(200, this.basicUser, {'X-Version-Id': 'Server Version'});
nock(this.basicClient4.getBaseRoute()).
get('/users/me/teams/members').
reply(200, [this.basicTeamMember]);
nock(this.basicClient4.getBaseRoute()).
get('/users/me/teams/unread').
reply(200, [{team_id: this.basicTeam.id, msg_count: 0, mention_count: 0}]);
nock(this.basicClient4.getBaseRoute()).
get('/users/me/teams').
reply(200, [this.basicTeam]);
nock(this.basicClient4.getBaseRoute()).
get('/users/me/preferences').
reply(200, [{user_id: this.basicUser.id, category: 'tutorial_step', name: this.basicUser.id, value: '999'}]);
}
initMockEntities = () => {
this.basicUser = this.fakeUserWithId();
this.basicUser.roles = 'system_user system_admin';
this.basicTeam = this.fakeTeamWithId();
this.basicTeamMember = this.fakeTeamMember(this.basicUser.id, this.basicTeam.id);
this.basicChannel = this.fakeChannelWithId(this.basicTeam.id);
this.basicChannelMember = this.fakeChannelMember(this.basicUser.id, this.basicChannel.id);
this.basicPost = {...this.fakePostWithId(this.basicChannel.id), create_at: 1507841118796};
this.basicRoles = {
system_admin: {
id: this.generateId(),
name: 'system_admin',
display_name: 'authentication.roles.global_admin.name',
description: 'authentication.roles.global_admin.description',
permissions: [
'system_admin_permission',
],
scheme_managed: true,
built_in: true,
},
system_user: {
id: this.generateId(),
name: 'system_user',
display_name: 'authentication.roles.global_user.name',
description: 'authentication.roles.global_user.description',
permissions: [
'system_user_permission',
],
scheme_managed: true,
built_in: true,
},
team_admin: {
id: this.generateId(),
name: 'team_admin',
display_name: 'authentication.roles.team_admin.name',
description: 'authentication.roles.team_admin.description',
permissions: [
'team_admin_permission',
],
scheme_managed: true,
built_in: true,
},
team_user: {
id: this.generateId(),
name: 'team_user',
display_name: 'authentication.roles.team_user.name',
description: 'authentication.roles.team_user.description',
permissions: [
'team_user_permission',
],
scheme_managed: true,
built_in: true,
},
channel_admin: {
id: this.generateId(),
name: 'channel_admin',
display_name: 'authentication.roles.channel_admin.name',
description: 'authentication.roles.channel_admin.description',
permissions: [
'channel_admin_permission',
],
scheme_managed: true,
built_in: true,
},
channel_user: {
id: this.generateId(),
name: 'channel_user',
display_name: 'authentication.roles.channel_user.name',
description: 'authentication.roles.channel_user.description',
permissions: [
'channel_user_permission',
],
scheme_managed: true,
built_in: true,
},
};
this.basicScheme = this.mockSchemeWithId();
}
initBasic = async (client = this.createClient()) => {
client.setUrl(Config.TestServerUrl || Config.DefaultServerUrl);
this.basicClient = client;
this.basicClient4 = client;
this.initMockEntities();
this.activateMocking();
return {
client: this.basicClient,
client4: this.basicClient4,
user: this.basicUser,
team: this.basicTeam,
channel: this.basicChannel,
post: this.basicPost,
};
};
mockScheme = () => {
return {
name: this.generateId(),
description: this.generateId(),
scope: 'channel',
defaultchanneladminrole: false,
defaultchanneluserrole: false,
};
};
mockSchemeWithId = () => {
return {
...this.mockScheme(),
id: this.generateId(),
create_at: 1507840900004,
update_at: 1507840900004,
delete_at: 0,
};
};
testIncomingHook = () => {
return {
id: this.generateId(),
create_at: 1507840900004,
update_at: 1507840900004,
delete_at: 0,
user_id: this.basicUser.id,
channel_id: this.basicChannel.id,
team_id: this.basicTeam.id,
display_name: 'test',
description: 'test',
};
};
testOutgoingHook = () => {
return {
id: this.generateId(),
token: this.generateId(),
create_at: 1507841118796,
update_at: 1507841118796,
delete_at: 0,
creator_id: this.basicUser.id,
channel_id: this.basicChannel.id,
team_id: this.basicTeam.id,
trigger_words: ['testword'],
trigger_when: 0,
callback_urls: ['http://localhost/notarealendpoint'],
display_name: 'test',
description: '',
content_type: 'application/x-www-form-urlencoded',
};
}
testCommand = (teamId) => {
return {
trigger: this.generateId(),
method: 'P',
create_at: 1507841118796,
update_at: 1507841118796,
delete_at: 0,
creator_id: this.basicUser.id,
team_id: teamId,
username: 'test',
icon_url: 'http://localhost/notarealendpoint',
auto_complete: true,
auto_complete_desc: 'test',
auto_complete_hint: 'test',
display_name: 'test',
description: 'test',
url: 'http://localhost/notarealendpoint',
};
};
tearDown = async () => {
nock.restore();
this.basicClient = null;
this.basicClient4 = null;
this.basicUser = null;
this.basicTeam = null;
this.basicTeamMember = null;
this.basicChannel = null;
this.basicChannelMember = null;
this.basicPost = null;
}
wait = (time) => new Promise((resolve) => setTimeout(resolve, time))
}
export default new TestHelper();