/* * Wire * Copyright (C) 2021 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 {render} from '@testing-library/react'; import {CONVERSATION_EVENT} from '@wireapp/api-client/lib/event'; import {randomInt} from 'crypto'; import en from 'I18n/en-US.json'; import {MemberMessage as MemberMessageEntity} from 'src/script/entity/message/MemberMessage'; import {User} from 'src/script/entity/User'; import {SystemMessageType} from 'src/script/message/SystemMessageType'; import {generateUser} from 'test/helper/UserGenerator'; import {setStrings} from 'Util/LocalizerUtil'; import {MemberMessage} from './MemberMessage'; import {CONFIG} from './MemberMessage/MessageContent'; setStrings({en}); function createMemberMessage({systemType, type}: {systemType?: SystemMessageType; type?: string}, users?: User[]) { const message = new MemberMessageEntity(); if (systemType) { message.memberMessageType = systemType; } if (type) { message.type = type; } const actor = generateUser(); message.user(actor); if (users) { message.userIds(users.map(user => user.qualifiedId)); message.userEntities(users); } else { message.userIds([actor.qualifiedId]); message.userEntities([actor]); } message.name('message'); return message; } const baseProps = { hasReadReceiptsTurnedOn: false, isSelfTemporaryGuest: false, onClickCancelRequest: jest.fn(), onClickInvitePeople: jest.fn(), onClickParticipants: jest.fn(), shouldShowInvitePeople: false, conversationName: 'group 1', }; describe('MemberMessage', () => { beforeEach(() => { jest.resetAllMocks(); }); it('shows connected message', async () => { const props = { ...baseProps, message: createMemberMessage({systemType: SystemMessageType.CONNECTION_ACCEPTED}, [new User('id')]), }; const {getByTestId} = render(); expect(getByTestId('element-connected-message')).not.toBeNull(); }); describe('CONVERSATION_CREATE', () => { it('displays participants of a newly created conversation', () => { const nbUsers = randomInt(1, 10); const users = Array.from({length: nbUsers}, () => generateUser()); const message = createMemberMessage({systemType: SystemMessageType.CONVERSATION_CREATE}, users); const props = { ...baseProps, message, }; const {getByText} = render(); users.forEach(user => { expect(getByText(user.name())).not.toBeNull(); }); }); it('displays a showMore when there are more than MAX_USERS_VISIBLE users', () => { const nbExtraUsers = randomInt(1, 10); const nbUsers = CONFIG.MAX_USERS_VISIBLE + nbExtraUsers; const users = Array.from({length: nbUsers}, () => generateUser()); const message = createMemberMessage({systemType: SystemMessageType.CONVERSATION_CREATE}, users); const props = { ...baseProps, message, }; const {getByText, container} = render(); // We expect to see the first 15 users + the user that created the conversation expect(container.querySelectorAll('strong')).toHaveLength(CONFIG.REDUCED_USERS_COUNT + 1); const showMoreButton = getByText(`${nbUsers - CONFIG.REDUCED_USERS_COUNT} more`); showMoreButton.click(); expect(props.onClickParticipants).toHaveBeenCalledTimes(1); }); it('displays all team members', () => { const nbExtraUsers = randomInt(1, 10); const nbTeamUsers = CONFIG.MAX_WHOLE_TEAM_USERS_VISIBLE + nbExtraUsers; const teamUsers = Array.from({length: nbTeamUsers}, () => generateUser()); const message = createMemberMessage({systemType: SystemMessageType.CONVERSATION_CREATE}, teamUsers); message.allTeamMembers = teamUsers; const props = { ...baseProps, message, }; const {getByText} = render(); const showMoreButton = getByText(`all team members`); showMoreButton.click(); expect(props.onClickParticipants).toHaveBeenCalledTimes(1); }); it('displays all team members and one guest message', () => { const nbExtraUsers = randomInt(1, 10); const nbTeamUsers = CONFIG.MAX_WHOLE_TEAM_USERS_VISIBLE + nbExtraUsers; const teamUsers = Array.from({length: nbTeamUsers}, () => generateUser()); const guest = generateUser(); guest.isGuest(true); const message = createMemberMessage({systemType: SystemMessageType.CONVERSATION_CREATE}, [...teamUsers, guest]); message.allTeamMembers = teamUsers; const props = { ...baseProps, message, }; const {getByText} = render(); expect(getByText(`all team members and one guest`)).not.toBeNull(); }); it('displays all team members and multiple guests message', () => { const nbGuests = randomInt(2, 10); const nbTeamUsers = CONFIG.MAX_WHOLE_TEAM_USERS_VISIBLE; const teamUsers = Array.from({length: nbTeamUsers}, () => generateUser()); const guests = Array.from({length: nbGuests}, () => { const guest = generateUser(); guest.isGuest(true); return guest; }); const message = createMemberMessage({systemType: SystemMessageType.CONVERSATION_CREATE}, [ ...teamUsers, ...guests, ]); message.allTeamMembers = teamUsers; const props = { ...baseProps, message, }; const {getByText} = render(); expect(getByText(`all team members and ${nbGuests} guests`)).not.toBeNull(); }); it('displays that another user created a conversation', () => { const nbUsers = randomInt(1, 10); const users = Array.from({length: nbUsers}, () => generateUser()); const message = createMemberMessage({systemType: SystemMessageType.CONVERSATION_CREATE}, users); message.name(''); message.user().name('Creator'); const props = { ...baseProps, message, }; const {container} = render(); expect(container.textContent).toContain(`Creator started a conversation with`); }); it('displays that self user created a conversation', () => { const nbUsers = randomInt(1, 10); const users = Array.from({length: nbUsers}, () => generateUser()); const message = createMemberMessage({systemType: SystemMessageType.CONVERSATION_CREATE}, users); message.name(''); message.user().isMe = true; const props = { ...baseProps, message, }; const {container} = render(); expect(container.textContent).toContain(`You started a conversation with`); }); }); describe('MEMBER_JOIN', () => { it('displays that self user added new members', () => { const nbUsers = randomInt(1, 10); const users = Array.from({length: nbUsers}, () => generateUser()); const message = createMemberMessage({type: CONVERSATION_EVENT.MEMBER_JOIN}, users); message.user().isMe = true; const props = { ...baseProps, message, }; const {container} = render(); expect(container.textContent).toContain(`You added `); }); it('displays that a new members were added by someone', () => { const nbUsers = randomInt(1, 10); const users = Array.from({length: nbUsers}, () => generateUser()); const message = createMemberMessage({type: CONVERSATION_EVENT.MEMBER_JOIN}, users); const props = { ...baseProps, message, }; const {container} = render(); expect(container.textContent).toContain(`${message.user().name()} added `); }); it('displays that a new members joined the conversation', () => { const message = createMemberMessage({type: CONVERSATION_EVENT.MEMBER_JOIN}); const props = { ...baseProps, message, }; const {container} = render(); expect(container.textContent).toContain(`${message.user().name()} joined`); }); }); describe('MEMBER_LEAVE', () => { it('displays that self user left the conversation', () => { const message = createMemberMessage({type: CONVERSATION_EVENT.MEMBER_LEAVE}); message.user().isMe = true; const props = { ...baseProps, message, }; const {container} = render(); expect(container.textContent).toContain(`You left`); }); it('displays that a member left the conversation', () => { const message = createMemberMessage({type: CONVERSATION_EVENT.MEMBER_LEAVE}); const props = { ...baseProps, message, }; const {container} = render(); expect(container.textContent).toContain(`${message.user().name()} left`); }); it('displays that a member was removed by someone', () => { const removedUser = generateUser(); const message = createMemberMessage({type: CONVERSATION_EVENT.MEMBER_LEAVE}, [removedUser]); const props = { ...baseProps, message, }; const {container} = render(); expect(container.textContent).toContain(`${message.user().name()} removed ${removedUser.name()}`); }); it('displays that many users were removed', () => { const nbUsers = randomInt(1, 10); const users = Array.from({length: nbUsers}, () => generateUser()); const message = createMemberMessage({type: CONVERSATION_EVENT.MEMBER_LEAVE}, users); message.user().id = ''; const props = { ...baseProps, message, }; const {container} = render(); expect(container.textContent).toContain(`were removed`); }); }); });