import * as apollo from '@apollo/client';
import { renderInAppContext } from '@theorchard/suite-testing';
import {
    createEditFormDictionaries,
    createEditFormVendorData,
    createMockDataFromServer,
    mockVendor,
} from 'lib/tests/mock-data';
import React from 'react';
import {
    HomePage as LabelForm,
    transformDictionaries,
    transformInitLabelDataForMutation,
} from '../home-page';
import type { GetDictionariesQuery } from 'src/data/queries/__generated__/getDictionaries';

describe('<LabelForm>', () => {
    beforeAll(() => {
        jest.spyOn(apollo, 'useQuery').mockImplementation(
            () =>
                ({
                    error: undefined,
                    loading: false,
                    data: createMockDataFromServer(),
                }) as apollo.QueryResult<unknown, apollo.OperationVariables>
        );
    });

    afterAll(jest.resetAllMocks);

    const renderComponent = () => renderInAppContext(<LabelForm />);

    test('LabelForm Match Snapshot', () => {
        const { container } = renderComponent();
        expect(container).toMatchSnapshot();
    });

    test('transformDictionaries func works correct', () => {
        const mockDataFromServer = createMockDataFromServer();
        const mockDictionaries = createEditFormDictionaries();
        expect(
            transformDictionaries(mockDataFromServer as GetDictionariesQuery)
        ).toStrictEqual(mockDictionaries);
    });

    test('transformInitLabelDataForMutation  func works correct', () => {
        const mockDictionaries = createEditFormDictionaries();
        const vendorDataMock = createEditFormVendorData();
        expect(
            transformInitLabelDataForMutation(mockVendor, mockDictionaries)
        ).toStrictEqual(vendorDataMock);
    });

    describe('inactive productManagerUser', () => {
        beforeEach(() => {
            jest.spyOn(apollo, 'useQuery').mockImplementation(
                () =>
                    ({
                        error: undefined,
                        loading: false,
                        data: createMockDataFromServer({
                            productManagerUser: {
                                id: '888',
                                firstName: 'John',
                                lastName: 'Doe',
                                active: false,
                            },
                        }),
                    }) as apollo.QueryResult<unknown, apollo.OperationVariables>
            );
        });

        test('shows inactive product manager name with (inactive) in info table', () => {
            const { getAllByText } = renderInAppContext(<LabelForm />);
            expect(getAllByText('John Doe (inactive)').length).toBeGreaterThan(
                0
            );
        });
    });
});
