import React from 'react';
import { screen } from '@testing-library/react';
import { renderInAppContext } from '@theorchard/suite-testing';
import productResponse from 'src/__fixtures__/graphql/product-by-upc-response.json';
import * as contractTermQuery from 'src/apollo/queries/contract-term';
import * as productSearchQuery from 'src/apollo/queries/product-search';
import ProductExceptionForm from 'src/components/contract-terms-form/product-exception-form';
import { ContractTermContext } from 'src/contexts/contract-term-context';
import { initialTermState } from 'src/reducers/contract-term/contract-term-reducer';

const componentInContext = (contextValues: any) => (
    <ContractTermContext.Provider value={contextValues}>
        <ProductExceptionForm />
    </ContractTermContext.Provider>
);

describe('<ProductExceptionForm> tests', () => {
    beforeEach(() => {
        jest.spyOn(contractTermQuery, 'useContractTerms').mockReturnValue(
            [] as any
        );
        jest.spyOn(productSearchQuery, 'useProductByUpc').mockReturnValue({
            // @ts-expect-error: fixture data doesn't exactly match type
            data: productResponse,
            loading: false,
            getProductByUpc: jest.fn().mockReturnValue(productResponse),
        });
    });

    afterEach(jest.restoreAllMocks);

    const render = (contextValues: any) =>
        renderInAppContext(componentInContext(contextValues));

    it('renders <ProductExceptionForm>', () => {
        const contextValues = { state: initialTermState, dispatch: jest.fn() };
        render(contextValues);

        expect(screen.getByText('Product(s)')).toBeDefined();
    });

    it('renders list of conditions when attachments are present', () => {
        const state = { ...initialTermState, attachments: ['20000000052933'] };
        const contextValues = { state, dispatch: jest.fn() };
        render(contextValues);

        expect(screen.getByText('Transaction type')).toBeDefined();
        expect(screen.getByText('Service')).toBeDefined();
        expect(screen.getByText('Country')).toBeDefined();
        expect(screen.getByText("Label's share")).toBeDefined();
    });
});
