/*
* Wire
* Copyright (C) 2022 Wire Swiss GmbH
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see http://www.gnu.org/licenses/.
*
*/
import {fireEvent, render, waitFor, act} from '@testing-library/react';
import {container} from 'tsyringe';
import {withTheme} from 'src/script/auth/util/test/TestUtil';
import {Conversation} from 'src/script/entity/Conversation';
import {ContentMessage} from 'src/script/entity/message/ContentMessage';
import {FileAsset} from 'src/script/entity/message/FileAsset';
import {LinkPreview} from 'src/script/entity/message/LinkPreview';
import {MediumImage} from 'src/script/entity/message/MediumImage';
import {MessageCategory} from 'src/script/message/MessageCategory';
import {createUuid} from 'Util/uuid';
import {Collection} from './Collection';
import {AssetRepository} from '../../../../assets/AssetRepository';
import {MessageRepository} from '../../../../conversation/MessageRepository';
import {Text} from '../../../../entity/message/Text';
import {User} from '../../../../entity/User';
jest.mock('./CollectionDetails', () => ({
CollectionDetails: () =>
CollectionDetails
,
__esModule: true,
}));
jest.mock('./CollectionItem', () => ({
CollectionItem: () => CollectionItem
,
__esModule: true,
}));
const createImageMessage = (timestamp: number = Date.now()) => {
const message = new ContentMessage(createUuid());
message.timestamp(timestamp);
const image = new MediumImage(createUuid());
message.assets.push(image);
message.category = MessageCategory.IMAGE;
return message;
};
const createFileMessage = () => {
const message = new ContentMessage(createUuid());
const file = new FileAsset(createUuid());
message.assets.push(file);
message.category = MessageCategory.FILE;
return message;
};
const createLinkMessage = () => {
const message = new ContentMessage(createUuid());
const link = new Text(createUuid());
link.previews.push(new LinkPreview({}));
message.assets.push(link);
message.category = MessageCategory.LINK_PREVIEW;
return message;
};
const createAudioMessage = () => {
const message = new ContentMessage(createUuid());
const audio = new FileAsset(createUuid());
audio.isAudio = () => true;
message.assets.push(audio);
message.category = MessageCategory.FILE;
return message;
};
describe('Collection', () => {
const conversation = new Conversation();
const messages = [createImageMessage(), createLinkMessage(), createAudioMessage(), createFileMessage()];
const mockConversationRepository = {
getEventsForCategory: jest.fn().mockResolvedValue(messages),
searchInConversation: jest.fn().mockResolvedValue({messageEntities: [createLinkMessage()], query: 'term'}),
};
const mockAssetRepository = container.resolve(AssetRepository);
const mockMessageRepository = {} as MessageRepository;
const mockSelfUser = new User(createUuid());
it('displays all image assets', async () => {
const {getAllByText, getByText, queryByText} = render(
withTheme(
,
),
);
await waitFor(() => getAllByText('CollectionItem'));
expect(getAllByText('CollectionItem')).toHaveLength(messages.length);
expect(getByText('collectionSectionAudio')).toBeDefined();
expect(getByText('collectionSectionImages')).toBeDefined();
expect(getByText('collectionSectionLinks')).toBeDefined();
expect(getByText('collectionSectionFiles')).toBeDefined();
expect(queryByText('collectionDetails')).toBeNull();
});
it('displays collection details when a section is selected', async () => {
const IMAGE_COLLECTION_LENGTH = 13;
const imageMessages = new Array(IMAGE_COLLECTION_LENGTH).fill(null).map(createImageMessage);
mockConversationRepository.getEventsForCategory.mockResolvedValueOnce(imageMessages);
const {getAllByText, getByText} = render(
withTheme(
,
),
);
await waitFor(() => getAllByText('CollectionItem'));
act(() => {
getAllByText('collectionShowAll')[0].click();
});
expect(getByText('CollectionDetails')).toBeDefined();
});
it('should display search results when term is typed', async () => {
jest.useFakeTimers();
const {getAllByText, queryByText, getByTestId} = render(
withTheme(
,
),
);
await waitFor(() => getAllByText('CollectionItem'));
await act(async () => {
const input = getByTestId('full-search-header-input');
fireEvent.change(input, {target: {value: 'term'}});
jest.advanceTimersByTime(500);
});
await waitFor(() => expect(mockConversationRepository.searchInConversation).toHaveBeenCalled());
expect(queryByText('CollectionTime')).toBeNull();
});
});