import React from 'react';
import { screen } from '@testing-library/react';
import { renderInAppContext } from '@theorchard/suite-testing';
import { ContractTerms } from 'src/components/contract-detail/contract-terms';
import { USER_FEATURES } from 'src/constants';
import { ContractTermContext } from 'src/contexts/contract-term-context';
import { initialTermsState } from 'src/reducers/contract-term/contract-terms-details-reducer';

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

describe('<ContractTerms>', () => {
    const render = (contextValues: any, identity: any = {}) =>
        renderInAppContext(componentInContext(contextValues), {
            identity,
        });
    const contextValues = { state: initialTermsState, dispatch: jest.fn() };

    it('renders each of the ContractTermsDetails components', () => {
        render(contextValues);
        const labelContractTermsDetail = screen.getByTestId(
            'labelContractTermsDetail'
        );
        expect(labelContractTermsDetail).toBeDefined();
        const productContractTermsDetail = screen.getByTestId(
            'productContractTermsDetail'
        );
        expect(productContractTermsDetail).toBeDefined();
        const trackContractTermsDetail = screen.getByTestId(
            'trackContractTermsDetail'
        );
        expect(trackContractTermsDetail).toBeDefined();
    });
});

describe('<ContractTerms> with presentational', () => {
    const mockIdentity = {
        features: {
            [USER_FEATURES.ABACUS_SHOW_TRANSACTION_TYPE_PRESENTATIONAL_GROUPS]: true,
        },
    };

    const render = (contextValues: any, identity: any = {}) =>
        renderInAppContext(componentInContext(contextValues), {
            identity,
        });
    const contextValues = { state: initialTermsState, dispatch: jest.fn() };

    it('renders each of the ContractTermsDetailPresentational components', () => {
        render(contextValues, mockIdentity);
        const labelContractTermsDetailPresentational = screen.getByTestId(
            'labelContractTermsDetailPresentational'
        );
        expect(labelContractTermsDetailPresentational).toBeDefined();
        const productContractTermsDetailPresentational = screen.getByTestId(
            'productContractTermsDetailPresentational'
        );
        expect(productContractTermsDetailPresentational).toBeDefined();
        const trackContractTermsDetailPresentational = screen.getByTestId(
            'trackContractTermsDetailPresentational'
        );
        expect(trackContractTermsDetailPresentational).toBeDefined();
    });
});
