/*
* 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, waitFor} from '@testing-library/react';
import {CONVERSATION_TYPE, MLSConversation} from '@wireapp/api-client/lib/conversation';
import {CredentialType} from '@wireapp/core/lib/messagingProtocols/mls';
import {container} from 'tsyringe';
import {withTheme} from 'src/script/auth/util/test/TestUtil';
import {E2EIHandler, MLSStatuses, WireIdentity} from 'src/script/E2EIdentity';
import {User} from 'src/script/entity/User';
import {Core} from 'src/script/service/CoreSingleton';
import {UserState} from 'src/script/user/UserState';
import {generateAPIConversation} from 'test/helper/ConversationGenerator';
import {E2EICertificateDetails} from './E2EICertificateDetails';
const generateIdentity = (status: MLSStatuses, credentialType = CredentialType.X509): WireIdentity => ({
status,
x509Identity: {
certificate: 'certificate',
displayName: '',
domain: '',
handle: '',
notBefore: BigInt(0),
notAfter: BigInt(0),
serialNumber: '',
},
credentialType,
deviceId: '',
clientId: '',
thumbprint: '',
qualifiedUserId: {
domain: '',
id: '',
},
});
const core = container.resolve(Core);
describe('E2EICertificateDetails', () => {
beforeAll(async () => {
jest.spyOn(core.service?.conversation!, 'getMLSSelfConversation').mockResolvedValue(
generateAPIConversation({
id: {id: 'id', domain: 'domain'},
type: CONVERSATION_TYPE.ONE_TO_ONE,
overwites: {group_id: 'groupId'},
}) as MLSConversation,
);
const selfUser = new User('id', 'domain');
container.resolve(UserState).self(selfUser);
const handler = E2EIHandler.getInstance();
await handler.initialize({discoveryUrl: '', gracePeriodInSeconds: 100});
});
describe('idicates the state of the e2ei identity', () => {
it('is e2ei identity not downloaded', async () => {
const {getByTestId} = render(withTheme());
const E2EIdentityStatus = getByTestId('e2ei-identity-status');
expect(E2EIdentityStatus.getAttribute('data-uie-value')).toEqual(MLSStatuses.NOT_ACTIVATED);
});
it('is e2ei identity not downloaded for basic MLS device', async () => {
const identity = generateIdentity(MLSStatuses.VALID, CredentialType.Basic);
const {getByTestId} = render(withTheme());
const E2EIdentityStatus = getByTestId('e2ei-identity-status');
expect(E2EIdentityStatus.getAttribute('data-uie-value')).toEqual(MLSStatuses.NOT_ACTIVATED);
});
it('is e2ei identity expired', async () => {
const identity = generateIdentity(MLSStatuses.EXPIRED);
const {getByTestId} = render(withTheme());
const E2EIdentityStatus = getByTestId('e2ei-identity-status');
expect(E2EIdentityStatus.getAttribute('data-uie-value')).toEqual(MLSStatuses.EXPIRED);
});
it('is e2ei identity revoked', async () => {
const identity = generateIdentity(MLSStatuses.REVOKED);
const {getByTestId} = render(withTheme());
const E2EIdentityStatus = getByTestId('e2ei-identity-status');
expect(E2EIdentityStatus.getAttribute('data-uie-value')).toEqual(MLSStatuses.REVOKED);
});
it('is e2ei identity verified', async () => {
const identity = generateIdentity(MLSStatuses.VALID);
const {getByTestId} = render(withTheme());
const E2EIdentityStatus = getByTestId('e2ei-identity-status');
expect(E2EIdentityStatus.getAttribute('data-uie-value')).toEqual(MLSStatuses.VALID);
});
});
describe('shows the update certificate button for the current device', () => {
it('for expired certificate', async () => {
const identity = generateIdentity(MLSStatuses.EXPIRED);
const {getByText} = render(withTheme());
await waitFor(() => {
const E2EIdentityStatus = getByText('E2EI.updateCertificate');
expect(E2EIdentityStatus).toBeDefined();
});
});
it('for certificate that expires soon', async () => {
const identity = generateIdentity(MLSStatuses.VALID);
const instance = E2EIHandler.getInstance();
jest.spyOn(instance, 'hasGracePeriodStartedForSelfClient').mockResolvedValue(true);
const {getByText} = render(withTheme());
await waitFor(() => {
const E2EIdentityStatus = getByText('E2EI.updateCertificate');
expect(E2EIdentityStatus).toBeDefined();
});
});
it('for not downloaded certificate', async () => {
const identity = generateIdentity(MLSStatuses.NOT_ACTIVATED);
const {getByText} = render(withTheme());
const E2EIdentityStatus = getByText('E2EI.getCertificate');
expect(E2EIdentityStatus).toBeDefined();
});
});
});