/*
* 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 {act, render} from '@testing-library/react';
import {QualifiedId} from '@wireapp/api-client/lib/user';
import {AddUsersFailure, AddUsersFailureReasons} from '@wireapp/core/lib/conversation';
import en from 'I18n/en-US.json';
import {withTheme, generateQualifiedIds} from 'src/script/auth/util/test/TestUtil';
import {FailedToAddUsersMessage as FailedToAddUsersMessageEntity} from 'src/script/entity/message/FailedToAddUsersMessage';
import {User} from 'src/script/entity/User';
import {UserState} from 'src/script/user/UserState';
import {setStrings} from 'Util/LocalizerUtil';
import {FailedToAddUsersMessage} from './FailedToAddUsersMessage';
setStrings({en});
const createFailedToAddUsersMessages = (
failures: AddUsersFailure[] = [{users: [], backends: [], reason: AddUsersFailureReasons.UNREACHABLE_BACKENDS}],
) => {
return new FailedToAddUsersMessageEntity(failures, Date.now());
};
function createUser(qualifiedId: QualifiedId, name: string) {
const user = new User(qualifiedId.id, qualifiedId.domain);
user.name(name);
return user;
}
describe('FailedToAddUsersMessage', () => {
it('shows that 1 user could not be added', async () => {
const userState = new UserState();
const [qualifiedId1] = generateQualifiedIds(1, 'test.domain');
const user1 = createUser(qualifiedId1, 'Felix');
userState.users.push(user1);
const message = createFailedToAddUsersMessages([
{
users: [qualifiedId1],
reason: AddUsersFailureReasons.UNREACHABLE_BACKENDS,
backends: [],
},
]);
const {getAllByText} = render(
withTheme(),
);
const mainMessage = getAllByText(
(_, element) =>
element?.textContent ===
'Felix could not be added to the group as the backend of test.domain could not be reached.',
);
expect(mainMessage.length).toBeGreaterThanOrEqual(1);
});
it('shows that multiple users could not be added', async () => {
const userState = new UserState();
const [qualifiedId1, qualifiedId2, qualifiedId3] = generateQualifiedIds(3, 'test.domain');
const user1 = createUser(qualifiedId1, 'Virgile');
const user2 = createUser(qualifiedId2, 'Bardia');
const user3 = createUser(qualifiedId3, 'Patryk');
userState.users([user1, user2, user3]);
const message = createFailedToAddUsersMessages([
{
users: [qualifiedId1, qualifiedId2, qualifiedId3],
reason: AddUsersFailureReasons.UNREACHABLE_BACKENDS,
backends: [],
},
]);
const {getAllByText} = render(
withTheme(),
);
const mainMessage = getAllByText(
(_, element) => element?.textContent === '3 participants could not be added to the group.',
);
expect(mainMessage.length).toBeGreaterThanOrEqual(1);
});
it('shows details of failed to add multi users', async () => {
const userState = new UserState();
const [qualifiedId1, qualifiedId2, qualifiedId3] = generateQualifiedIds(3, 'test.domain');
const user1 = createUser(qualifiedId1, 'Tim');
const user2 = createUser(qualifiedId2, 'Adrian');
const user3 = createUser(qualifiedId3, 'Przemek');
userState.users([user1, user2, user3]);
const message = createFailedToAddUsersMessages([
{
users: [qualifiedId1, qualifiedId2, qualifiedId3],
backends: ['test.domain'],
reason: AddUsersFailureReasons.UNREACHABLE_BACKENDS,
},
]);
const {getByText, getAllByText} = render(
withTheme(),
);
const mainMessage = getAllByText(
(_, element) => element?.textContent === '3 participants could not be added to the group.',
);
expect(mainMessage.length).toBeGreaterThanOrEqual(1);
const toggleButton = getByText('Show details');
act(() => {
toggleButton.click();
});
const details = getAllByText(
(_, element) =>
element?.textContent ===
'Adrian, Przemek and Tim could not be added to the group as the backend of test.domain could not be reached.',
);
expect(details.length).toBeGreaterThanOrEqual(1);
});
it('shows details of failed to add multi users from 2 different backends', async () => {
const userState = new UserState();
const [qualifiedId1] = generateQualifiedIds(1, 'test.domain');
const [qualifiedId2] = generateQualifiedIds(1, 'test-2.domain');
const user1 = createUser(qualifiedId1, 'Tom');
const user2 = createUser(qualifiedId2, 'Arjita');
userState.users([user1, user2]);
const message = createFailedToAddUsersMessages([
{
users: [qualifiedId1, qualifiedId2],
reason: AddUsersFailureReasons.UNREACHABLE_BACKENDS,
backends: ['test.domain', 'test-2.domain'],
},
]);
const {getByText, getAllByText} = render(
withTheme(),
);
const mainMessage = getAllByText(
(_, element) => element?.textContent === '2 participants could not be added to the group.',
);
expect(mainMessage.length).toBeGreaterThanOrEqual(1);
const toggleButton = getByText('Show details');
act(() => {
toggleButton.click();
});
const details = getAllByText(
(_, element) =>
element?.textContent ===
'Arjita and Tom could not be added to the group as the backend of test.domain, test-2.domain could not be reached.',
);
expect(details.length).toBeGreaterThanOrEqual(1);
});
it('shows details of failed to add users from non federating backends', async () => {
const userState = new UserState();
const [qualifiedId1] = generateQualifiedIds(1, 'test.domain');
const [qualifiedId2] = generateQualifiedIds(1, 'test-2.domain');
const user1 = createUser(qualifiedId1, 'Patryk');
const user2 = createUser(qualifiedId2, 'Przemek');
userState.users([user1, user2]);
const message = createFailedToAddUsersMessages([
{
users: [qualifiedId1, qualifiedId2],
reason: AddUsersFailureReasons.NON_FEDERATING_BACKENDS,
backends: [],
},
]);
const {getByTestId, getAllByText} = render(
withTheme(),
);
const elementMessageFailedToAdd = getByTestId('element-message-failed-to-add-users');
expect(elementMessageFailedToAdd.getAttribute('data-uie-value')).toEqual('multi-users-not-added');
const toggleButton = getByTestId('toggle-failed-to-add-users');
act(() => {
toggleButton.click();
});
const details = getAllByText(
(_, element) =>
element?.textContent ===
'Przemek and Patryk could not be added to the group as their backends do not federate with each other.',
);
expect(details.length).toBeGreaterThanOrEqual(1);
});
it('shows details of multiple failed reasons', async () => {
const userState = new UserState();
const [qualifiedId1] = generateQualifiedIds(1, 'test.domain');
const [qualifiedId2] = generateQualifiedIds(1, 'test-2.domain');
const [qualifiedId3] = generateQualifiedIds(1, 'test-3.domain');
const user1 = createUser(qualifiedId1, 'Patryk');
const user2 = createUser(qualifiedId2, 'Przemek');
const user3 = createUser(qualifiedId3, 'Tom');
userState.users([user1, user2, user3]);
const message = createFailedToAddUsersMessages([
{
users: [qualifiedId1],
reason: AddUsersFailureReasons.NON_FEDERATING_BACKENDS,
backends: [],
},
{
users: [qualifiedId2],
reason: AddUsersFailureReasons.UNREACHABLE_BACKENDS,
backends: [qualifiedId2.domain],
},
{
users: [qualifiedId3],
reason: AddUsersFailureReasons.OFFLINE_FOR_TOO_LONG,
},
]);
const {getByTestId, getAllByText} = render(
withTheme(),
);
const elementMessageFailedToAdd = getByTestId('element-message-failed-to-add-users');
expect(elementMessageFailedToAdd.getAttribute('data-uie-value')).toEqual('multi-users-not-added');
const toggleButton = getByTestId('toggle-failed-to-add-users');
act(() => {
toggleButton.click();
});
const mainMessage = getAllByText(
(_, element) => element?.textContent === '3 participants could not be added to the group.',
);
expect(mainMessage.length).toBeGreaterThanOrEqual(1);
const details1 = getAllByText(
(_, element) =>
element?.textContent ===
`${user1.name()} could not be added to the group as their backends do not federate with each other.`,
);
expect(details1.length).toBeGreaterThanOrEqual(1);
const details2 = getAllByText(
(_, element) =>
element?.textContent ===
`${user2.name()} could not be added to the group as the backend of ${user2.qualifiedId.domain} could not be reached.`,
);
expect(details2.length).toBeGreaterThanOrEqual(1);
const details3 = getAllByText(
(_, element) => element?.textContent === `${user3.name()} could not be added to the group.`,
);
expect(details3.length).toBeGreaterThanOrEqual(1);
});
});