mattermost-mobile/app/actions/remote/search.test.ts
Daniel Espino García b475f2bedb
Fix team sidebar not showing thread unreads (#8624)
* Fix team sidebar not showing thread unreads

* Fix tests

---------

Co-authored-by: Mattermost Build <build@mattermost.com>
2025-03-18 13:33:15 +01:00

161 lines
6.3 KiB
TypeScript

// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
// See LICENSE.txt for license information.
/* eslint-disable max-lines */
import {SYSTEM_IDENTIFIERS} from '@constants/database';
import DatabaseManager from '@database/manager';
import NetworkManager from '@managers/network_manager';
import TestHelper from '@test/test_helper';
import {
fetchRecentMentions,
searchPosts,
searchFiles,
} from './search';
import type ServerDataOperator from '@database/operator/server_data_operator';
const serverUrl = 'baseHandler.test.com';
let operator: ServerDataOperator;
const teamId = 'teamid1';
const channelId = 'channelid1';
const channel: Channel = {
id: channelId,
display_name: 'channelname',
team_id: teamId,
total_msg_count: 0,
type: 'D',
} as Channel;
const user1 = {id: 'userid1', username: 'user1', email: 'user1@mattermost.com', roles: ''} as UserProfile;
const post1 = TestHelper.fakePost({channel_id: channelId, id: 'postid1'});
const fileInfo1: FileInfo = {
id: 'fileid1',
clientId: 'clientid',
localPath: 'path1',
channel_id: channelId,
post_id: post1.id,
} as FileInfo;
const throwFunc = () => {
throw Error('error');
};
let mockGetIsCRTEnabled: jest.Mock;
jest.mock('@queries/servers/thread', () => {
const original = jest.requireActual('@queries/servers/thread');
mockGetIsCRTEnabled = jest.fn(() => true);
return {
...original,
getIsCRTEnabled: mockGetIsCRTEnabled,
};
});
const mockClient = {
searchPostsWithParams: jest.fn(() => ({posts: {[post1.id]: post1}, order: [post1.id], matches: {[post1.id]: post1.message}})),
getProfilesByIds: jest.fn((ids: string[]) => (ids.map((id) => ({...user1, id})))),
getChannel: jest.fn((_channelId: string) => ({id: _channelId, name: 'channel1', creatorId: user1.id, total_msg_count: 100})),
getMyChannelMember: jest.fn((_channelId: string) => ({id: user1.id + '-' + _channelId, user_id: user1.id, channel_id: _channelId, roles: '', msg_count: 100, mention_count: 0})),
searchFiles: jest.fn(() => ({file_infos: {[fileInfo1.id as string]: fileInfo1}, order: [fileInfo1.id]})),
};
beforeAll(() => {
// eslint-disable-next-line
// @ts-ignore
NetworkManager.getClient = () => mockClient;
});
beforeEach(async () => {
await DatabaseManager.init([serverUrl]);
operator = DatabaseManager.serverDatabases[serverUrl]!.operator;
});
afterEach(async () => {
await DatabaseManager.destroyServerDatabase(serverUrl);
});
describe('search', () => {
it('fetchRecentMentions - handle not found database', async () => {
const result = await fetchRecentMentions('foo');
expect(result).toBeDefined();
expect(result.error).toBeDefined();
});
it('fetchRecentMentions - base case', async () => {
await operator.handleUsers({users: [user1], prepareRecordsOnly: false});
await operator.handleSystem({systems: [{id: SYSTEM_IDENTIFIERS.CURRENT_USER_ID, value: user1.id}], prepareRecordsOnly: false});
const result = await fetchRecentMentions(serverUrl);
expect(result).toBeDefined();
expect(result.error).toBeUndefined();
expect(result.posts).toBeDefined();
expect(result.posts?.length).toBe(1);
expect(result.order).toBeDefined();
expect(result.order?.length).toBe(1);
});
it('fetchRecentMentions - no current user', async () => {
await operator.handleSystem({systems: [{id: SYSTEM_IDENTIFIERS.CURRENT_USER_ID, value: user1.id}], prepareRecordsOnly: false});
const result = await fetchRecentMentions(serverUrl);
expect(result).toBeDefined();
expect(result.error).toBeUndefined();
expect(result.posts).toBeDefined();
expect(result.posts?.length).toBe(0);
expect(result.order).toBeDefined();
expect(result.order?.length).toBe(0);
});
it('fetchRecentMentions - search error', async () => {
mockClient.searchPostsWithParams.mockImplementationOnce(jest.fn(throwFunc));
await operator.handleUsers({users: [user1], prepareRecordsOnly: false});
await operator.handleSystem({systems: [{id: SYSTEM_IDENTIFIERS.CURRENT_USER_ID, value: user1.id}], prepareRecordsOnly: false});
const result = await fetchRecentMentions(serverUrl);
expect(result).toBeDefined();
expect(result.error).toBeDefined();
});
it('searchPosts - handle not found database', async () => {
const result = await searchPosts('foo', '', {terms: 'test', is_or_search: true});
expect(result).toBeDefined();
expect(result.error).toBeDefined();
});
it('searchPosts - base case', async () => {
await operator.handleUsers({users: [user1], prepareRecordsOnly: false});
await operator.handleSystem({systems: [{id: SYSTEM_IDENTIFIERS.CURRENT_USER_ID, value: user1.id}], prepareRecordsOnly: false});
const result = await searchPosts(serverUrl, '', {terms: 'test', is_or_search: true});
expect(result).toBeDefined();
expect(result.error).toBeUndefined();
expect(result.posts).toBeDefined();
expect(result.posts?.length).toBe(1);
expect(result.order).toBeDefined();
expect(result.order?.length).toBe(1);
});
it('searchFiles - handle request error', async () => {
mockClient.searchFiles.mockImplementationOnce(jest.fn(throwFunc));
const result = await searchFiles(serverUrl, '', {terms: 'test', is_or_search: true});
expect(result).toBeDefined();
expect(result.error).toBeDefined();
});
it('searchFiles - base case', async () => {
await operator.handleUsers({users: [user1], prepareRecordsOnly: false});
await operator.handleSystem({systems: [{id: SYSTEM_IDENTIFIERS.CURRENT_TEAM_ID, value: teamId}, {id: SYSTEM_IDENTIFIERS.CURRENT_USER_ID, value: user1.id}], prepareRecordsOnly: false});
const channelModels = await operator.handleChannel({channels: [channel], prepareRecordsOnly: false});
const result = await searchFiles(serverUrl, '', {terms: 'test', is_or_search: true}, channelModels[0]);
expect(result).toBeDefined();
expect(result.error).toBeUndefined();
expect(result.files).toBeDefined();
expect(result.files?.length).toBe(1);
expect(result.channels).toBeDefined();
expect(result.channels?.length).toBe(1);
});
});