183 lines
		
	
	
		
			6.7 KiB
		
	
	
	
		
			TypeScript
		
	
	
			
		
		
	
	
			183 lines
		
	
	
		
			6.7 KiB
		
	
	
	
		
			TypeScript
		
	
	
/*
 | 
						|
Copyright 2022 The Matrix.org Foundation C.I.C.
 | 
						|
 | 
						|
Licensed under the Apache License, Version 2.0 (the "License");
 | 
						|
you may not use this file except in compliance with the License.
 | 
						|
You may obtain a copy of the License at
 | 
						|
 | 
						|
    http://www.apache.org/licenses/LICENSE-2.0
 | 
						|
 | 
						|
Unless required by applicable law or agreed to in writing, software
 | 
						|
distributed under the License is distributed on an "AS IS" BASIS,
 | 
						|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
						|
See the License for the specific language governing permissions and
 | 
						|
limitations under the License.
 | 
						|
*/
 | 
						|
 | 
						|
import React from 'react';
 | 
						|
import { mount } from 'enzyme';
 | 
						|
import { act } from "react-dom/test-utils";
 | 
						|
import { Room, User } from 'matrix-js-sdk';
 | 
						|
import { Phase, VerificationRequest } from 'matrix-js-sdk/src/crypto/verification/request/VerificationRequest';
 | 
						|
 | 
						|
import "../../../skinned-sdk";
 | 
						|
import UserInfo from '../../../../src/components/views/right_panel/UserInfo';
 | 
						|
import { RightPanelPhases } from '../../../../src/stores/right-panel/RightPanelStorePhases';
 | 
						|
import { MatrixClientPeg } from '../../../../src/MatrixClientPeg';
 | 
						|
import MatrixClientContext from '../../../../src/contexts/MatrixClientContext';
 | 
						|
import VerificationPanel from '../../../../src/components/views/right_panel/VerificationPanel';
 | 
						|
import EncryptionInfo from '../../../../src/components/views/right_panel/EncryptionInfo';
 | 
						|
 | 
						|
const findByTestId = (component, id) => component.find(`[data-test-id="${id}"]`);
 | 
						|
 | 
						|
jest.mock('../../../../src/utils/DMRoomMap', () => {
 | 
						|
    const mock = {
 | 
						|
        getUserIdForRoomId: jest.fn(),
 | 
						|
        getDMRoomsForUserId: jest.fn(),
 | 
						|
    };
 | 
						|
 | 
						|
    return {
 | 
						|
        shared: jest.fn().mockReturnValue(mock),
 | 
						|
        sharedInstance: mock,
 | 
						|
    };
 | 
						|
});
 | 
						|
 | 
						|
describe('<UserInfo />', () => {
 | 
						|
    const defaultUserId = '@test:test';
 | 
						|
    const defaultUser = new User(defaultUserId);
 | 
						|
 | 
						|
    const defaultProps = {
 | 
						|
        user: defaultUser,
 | 
						|
        phase: RightPanelPhases.RoomMemberInfo,
 | 
						|
        onClose: jest.fn(),
 | 
						|
    };
 | 
						|
 | 
						|
    const mockClient = {
 | 
						|
        getUser: jest.fn(),
 | 
						|
        isGuest: jest.fn().mockReturnValue(false),
 | 
						|
        isUserIgnored: jest.fn(),
 | 
						|
        isCryptoEnabled: jest.fn(),
 | 
						|
        getUserId: jest.fn(),
 | 
						|
        on: jest.fn(),
 | 
						|
        isSynapseAdministrator: jest.fn().mockResolvedValue(false),
 | 
						|
        isRoomEncrypted: jest.fn().mockReturnValue(false),
 | 
						|
        doesServerSupportUnstableFeature: jest.fn().mockReturnValue(false),
 | 
						|
        mxcUrlToHttp: jest.fn().mockReturnValue('mock-mxcUrlToHttp'),
 | 
						|
        removeListerner: jest.fn(),
 | 
						|
        currentState: {
 | 
						|
            on: jest.fn(),
 | 
						|
        },
 | 
						|
    };
 | 
						|
 | 
						|
    const verificationRequest = {
 | 
						|
        pending: true, on: jest.fn(), phase: Phase.Ready,
 | 
						|
        channel: { transactionId: 1 },
 | 
						|
        otherPartySupportsMethod: jest.fn(),
 | 
						|
    } as unknown as VerificationRequest;
 | 
						|
 | 
						|
    const getComponent = (props = {}) => mount(<UserInfo {...defaultProps} {...props} />, {
 | 
						|
        wrappingComponent: MatrixClientContext.Provider,
 | 
						|
        wrappingComponentProps: { value: mockClient },
 | 
						|
    });
 | 
						|
 | 
						|
    beforeAll(() => {
 | 
						|
        jest.spyOn(MatrixClientPeg, 'get').mockReturnValue(mockClient);
 | 
						|
    });
 | 
						|
 | 
						|
    beforeEach(() => {
 | 
						|
        mockClient.getUser.mockClear().mockResolvedValue(undefined);
 | 
						|
    });
 | 
						|
 | 
						|
    it('closes on close button click', () => {
 | 
						|
        const onClose = jest.fn();
 | 
						|
        const component = getComponent({ onClose });
 | 
						|
        act(() => {
 | 
						|
            findByTestId(component, 'base-card-close-button').at(0).simulate('click');
 | 
						|
        });
 | 
						|
 | 
						|
        expect(onClose).toHaveBeenCalled();
 | 
						|
    });
 | 
						|
 | 
						|
    describe('without a room', () => {
 | 
						|
        it('does not render space header', () => {
 | 
						|
            const component = getComponent();
 | 
						|
            expect(findByTestId(component, 'space-header').length).toBeFalsy();
 | 
						|
        });
 | 
						|
 | 
						|
        it('renders user info', () => {
 | 
						|
            const component = getComponent();
 | 
						|
            expect(component.find("BasicUserInfo").length).toBeTruthy();
 | 
						|
        });
 | 
						|
 | 
						|
        it('renders encryption info panel without pending verification', () => {
 | 
						|
            const phase = RightPanelPhases.EncryptionPanel;
 | 
						|
            const component = getComponent({ phase });
 | 
						|
 | 
						|
            expect(component.find(EncryptionInfo).length).toBeTruthy();
 | 
						|
        });
 | 
						|
 | 
						|
        it('renders encryption verification panel with pending verification', () => {
 | 
						|
            const phase = RightPanelPhases.EncryptionPanel;
 | 
						|
            const component = getComponent({ phase, verificationRequest });
 | 
						|
 | 
						|
            expect(component.find(EncryptionInfo).length).toBeFalsy();
 | 
						|
            expect(component.find(VerificationPanel).length).toBeTruthy();
 | 
						|
        });
 | 
						|
 | 
						|
        it('renders close button correctly when encryption panel with a pending verification request', () => {
 | 
						|
            const phase = RightPanelPhases.EncryptionPanel;
 | 
						|
            const component = getComponent({ phase, verificationRequest });
 | 
						|
 | 
						|
            expect(findByTestId(component, 'base-card-close-button').at(0).props().title).toEqual('Cancel');
 | 
						|
        });
 | 
						|
    });
 | 
						|
 | 
						|
    describe('with a room', () => {
 | 
						|
        const room = {
 | 
						|
            roomId: '!fkfk',
 | 
						|
            isSpaceRoom: jest.fn().mockReturnValue(false),
 | 
						|
            getMember: jest.fn().mockReturnValue(undefined),
 | 
						|
            getMxcAvatarUrl: jest.fn().mockReturnValue('mock-avatar-url'),
 | 
						|
            name: 'test room',
 | 
						|
            on: jest.fn(),
 | 
						|
            currentState: {
 | 
						|
                getStateEvents: jest.fn(),
 | 
						|
                on: jest.fn(),
 | 
						|
            },
 | 
						|
        } as unknown as Room;
 | 
						|
 | 
						|
        it('renders user info', () => {
 | 
						|
            const component = getComponent();
 | 
						|
            expect(component.find("BasicUserInfo").length).toBeTruthy();
 | 
						|
        });
 | 
						|
 | 
						|
        it('does not render space header when room is not a space room', () => {
 | 
						|
            const component = getComponent({ room });
 | 
						|
            expect(findByTestId(component, 'space-header').length).toBeFalsy();
 | 
						|
        });
 | 
						|
 | 
						|
        it('renders space header when room is a space room', () => {
 | 
						|
            const spaceRoom = {
 | 
						|
                ...room, isSpaceRoom: jest.fn().mockReturnValue(true),
 | 
						|
            };
 | 
						|
            const component = getComponent({ room: spaceRoom });
 | 
						|
            expect(findByTestId(component, 'space-header').length).toBeTruthy();
 | 
						|
        });
 | 
						|
 | 
						|
        it('renders encryption info panel without pending verification', () => {
 | 
						|
            const phase = RightPanelPhases.EncryptionPanel;
 | 
						|
            const component = getComponent({ phase, room });
 | 
						|
 | 
						|
            expect(component.find(EncryptionInfo).length).toBeTruthy();
 | 
						|
        });
 | 
						|
 | 
						|
        it('renders encryption verification panel with pending verification', () => {
 | 
						|
            const phase = RightPanelPhases.EncryptionPanel;
 | 
						|
            const component = getComponent({ phase, verificationRequest, room });
 | 
						|
 | 
						|
            expect(component.find(EncryptionInfo).length).toBeFalsy();
 | 
						|
            expect(component.find(VerificationPanel).length).toBeTruthy();
 | 
						|
        });
 | 
						|
    });
 | 
						|
});
 |