import React from 'react';
import { screen } from '@testing-library/react';
import { renderInAppContext } from '@theorchard/suite-testing';
import * as identityQuery from 'src/apollo/queries/identity';
import IdentityName, {
    IdentityNameProps,
} from 'src/components/shared/identity-name';
import type { QueryResult } from '@apollo/client';
import type {
    GetIdentityByIdQuery,
    GetIdentityByIdQueryVariables,
} from 'src/apollo/queries/__generated__/identity';

describe('<IdentityName>', () => {
    const defaultProps = {
        identity: 'abcd-2345-efgh-3992',
    };

    const render = (componentProps: IdentityNameProps) =>
        renderInAppContext(<IdentityName {...componentProps} />);

    afterEach(() => {
        jest.restoreAllMocks();
    });

    it('renders with identity exists', async () => {
        const mockIdentityResponse: GetIdentityByIdQuery = {
            identityById: {
                name: 'Joe User',
            },
        };

        jest.spyOn(identityQuery, 'useGetIdentityByIdQuery').mockReturnValue({
            data: mockIdentityResponse,
            loading: false,
            error: undefined,
        } as unknown as QueryResult<
            GetIdentityByIdQuery,
            GetIdentityByIdQueryVariables
        >);

        render(defaultProps);
        expect(
            await screen.findByText(
                mockIdentityResponse.identityById?.name as string
            )
        ).toBeDefined();
    });

    it('renders without existing identity', async () => {
        const mockIdentityResponse: GetIdentityByIdQuery = {
            identityById: null,
        };

        jest.spyOn(identityQuery, 'useGetIdentityByIdQuery').mockReturnValue({
            data: mockIdentityResponse,
            loading: false,
            error: undefined,
        } as unknown as QueryResult<
            GetIdentityByIdQuery,
            GetIdentityByIdQueryVariables
        >);

        render(defaultProps);

        expect(
            await screen.findByText(defaultProps.identity)
        ).toBeInTheDocument();
    });

    it('renders loader when loading', () => {
        jest.spyOn(identityQuery, 'useGetIdentityByIdQuery').mockReturnValue({
            data: undefined,
            loading: true,
            error: undefined,
        } as unknown as QueryResult<
            GetIdentityByIdQuery,
            GetIdentityByIdQueryVariables
        >);

        render(defaultProps);
        expect(screen.getByTestId('SkeletonLoader')).toBeInTheDocument();
    });
});
