/*
* Wire
* Copyright (C) 2023 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 {Availability} from '@wireapp/protocol-messaging';
import {Participant} from 'src/script/calling/Participant';
import {User} from 'src/script/entity/User';
import {ROLE} from 'src/script/user/UserPermission';
import {createUuid} from 'Util/uuid';
import {CallParticipantsListItem} from './CallParticipantsListItem';
const createMockParticipant = ({
name,
availability,
isSelfUser = false,
isGuest = false,
isFederated = false,
isExternal = false,
isAudioEstablished = true,
}: {
name?: string;
availability?: Availability.Type;
isSelfUser?: boolean;
isGuest?: boolean;
isFederated?: boolean;
isExternal?: boolean;
isAudioEstablished?: boolean;
}) => {
const user = new User(createUuid());
user.name('user');
user.isMe = isSelfUser;
user.isGuest(isGuest);
user.isFederated = isFederated;
if (isExternal) {
user.teamRole(ROLE.PARTNER);
}
if (name) {
user.name(name);
}
if (availability) {
user.availability(availability);
}
const clientId = createUuid();
const participant = new Participant(user, clientId);
participant.isAudioEstablished(isAudioEstablished);
return participant;
};
describe('CallParticipantsListItem', () => {
it('should render participant user avatar', () => {
const participant = createMockParticipant({});
const {getByTestId} = render(
,
);
expect(getByTestId('element-avatar-user')).toBeDefined();
});
it('should render participant user name', () => {
const participantName = 'John Doe';
const participant = createMockParticipant({
name: participantName,
isSelfUser: false,
});
const {getByText} = render(
,
);
expect(getByText(participantName)).toBeDefined();
});
it('should mark user as self if relevant', () => {
const selfParticipant = createMockParticipant({isSelfUser: true});
const {getByText} = render(
,
);
expect(getByText('(ConversationYouNominative)')).toBeDefined();
});
it('should display user status badges based on its status', () => {
const selfParticipant = createMockParticipant({
isGuest: true,
isFederated: false,
isExternal: true,
});
const {getByTestId} = render(
,
);
expect(getByTestId('status-guest')).toBeDefined();
expect(getByTestId('status-external')).toBeDefined();
});
it('should open context menu on user item click', () => {
const participant = createMockParticipant({});
const onContextMenu = jest.fn();
const {getByTestId} = render(
,
);
const userItem = getByTestId('item-user');
userItem.click();
expect(onContextMenu).toHaveBeenCalled();
});
it('should not open context menu when user is in unestablished audio state', () => {
const participant = createMockParticipant({isAudioEstablished: false});
const onContextMenu = jest.fn();
const {getByTestId} = render(
,
);
const userItem = getByTestId('item-user');
userItem.click();
expect(onContextMenu).not.toHaveBeenCalled();
});
it('should show "connecting..." text if user is in unestablishd audio state', () => {
const participant = createMockParticipant({isAudioEstablished: false});
const onContextMenu = jest.fn();
const {getByText} = render(
,
);
expect(getByText('videoCallParticipantConnecting')).toBeDefined();
});
});