import React from 'react';
import { screen } from '@testing-library/react';
import { renderInAppContext } from '@theorchard/suite-testing';
import { contractDetails as mockContract } from 'src/__fixtures__/graphql/contract-details';
import { ContractTermCondition } from 'src/components/contract-detail/contract-term-condition';
import { ContractTermContext } from 'src/contexts/contract-term-context';
import { initialTermsState } from 'src/reducers/contract-term/contract-terms-details-reducer';

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

describe('<ContractTermCondition>', () => {
    const contractTermCondition =
        mockContract.abacusContract.contractTerms[0].conditions[0];
    const state = {
        ...initialTermsState,
        stores: { 1: 'Spotify', 2: '121 Music' },
        transactionTypes: {
            1: { txnTypeCode: 'DR', txnTypeName: 'Downloaded Ringtones' },
            2: { txnTypeCode: 'EQ', txnTypeName: 'Equity' },
        },
    };
    const contextValues = { state, dispatch: jest.fn() };
    const render = (props: any) =>
        renderInAppContext(componentInContext(contextValues, props));

    let props = { contractTermCondition };

    it('renders ContractTermCondition', () => {
        const { container } = render(props);
        expect(container).toBeDefined();
        expect(
            container.querySelector('.ContractTermConditionsCondition')
        ).toBeDefined();
    });

    it('renders country names', () => {
        render(props);
        expect(
            screen.getByText('United States of America, Italy')
        ).toBeDefined();
    });

    it('renders services', () => {
        render(props);
        expect(screen.getByText('Spotify, 121 Music')).toBeDefined();
    });

    it('renders transaction types', () => {
        render(props);
        expect(
            screen.getByText('DR - Downloaded Ringtones, EQ - Equity')
        ).toBeDefined();
    });

    it('render conditions for null values', () => {
        const condition = {
            conditions: {
                countries: null,
                stores: null,
                transactionTypes: null,
            },
            contractTermConditionId: 1958,
            contractTermId: 1958,
            priority: 1,
            termRate: 80,
        };
        // @ts-expect-error fixture type doesn't exactly match
        props = { contractTermCondition: condition };
        render(props);
        expect(screen.getAllByText('All')).toBeDefined();
    });
});
