import React from 'react';
import { screen } from '@testing-library/react';
import { renderInAppContext } from '@theorchard/suite-testing';
import trackSearchResponse from 'src/__fixtures__/graphql/track-search-response.json';
import * as trackSearchQuery from 'src/apollo/queries/track-search';
import TrackExceptionForm from 'src/components/contract-terms-form/track-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}>
        <TrackExceptionForm />
    </ContractTermContext.Provider>
);

describe('<TrackExceptionForm> tests', () => {
    beforeEach(() => {
        jest.spyOn(trackSearchQuery, 'useTrackByIsrc').mockReturnValue({
            data: {
                // @ts-expect-error: fixture data doesn't exactly match type
                globalSoundRecordingByIsrc:
                    trackSearchResponse.globalSoundRecordingSearchES.items[0],
            },
            loading: false,
            getTrackByIsrc: jest.fn().mockReturnValue(trackSearchResponse),
        });
    });

    afterEach(jest.restoreAllMocks);

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

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

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

    it('renders list of conditions when attachments are present', () => {
        const state = { ...initialTermState, attachments: ['QMMZ200T0180'] };
        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();
    });
});
