import React from 'react';
import { screen } from '@testing-library/react';
import { renderInAppContext } from '@theorchard/suite-testing';
import {
    AbacusContractMechDeductionAdminType,
    AbacusContractMechDeductionTerritory,
} from 'src/apollo/definitions/globalTypes';
import {
    ContractMechanicalDeductionFormFields,
    ContractMechanicalDeductionFormFieldsPropTypes,
} from 'src/components/contract-mechanical-deduction-shared/contract-mechanical-deduction-form-fields';

describe('<ContractMechanicalDeductionFormFields />', () => {
    const defaultProps: ContractMechanicalDeductionFormFieldsPropTypes = {
        contractMechanicalDeduction: {
            adminFee: '',
            adminType: AbacusContractMechDeductionAdminType.CUSTOMER,
            isAdminFeeSelected: false,
            mechanicalType: [],
            territory: AbacusContractMechDeductionTerritory.USA,
        },
        setContractMechanicalDeduction: jest.fn(),
        errors: {},
        setErrors: jest.fn(),
        setIsServerError: jest.fn(),
    };

    const render = (
        props: ContractMechanicalDeductionFormFieldsPropTypes = defaultProps
    ) =>
        renderInAppContext(
            <ContractMechanicalDeductionFormFields {...props} />
        );

    it('renders form labels', () => {
        render();

        expect(screen.getByText('Product Types')).toBeInTheDocument();
        expect(
            screen.getByText('Who Pays For The Deductions?')
        ).toBeInTheDocument();
        expect(screen.getByText('Admin Fee')).toBeInTheDocument();
    });

    it('renders Product Types', () => {
        render();

        expect(screen.getByText('Digital Downloads')).toBeInTheDocument();
        expect(screen.getByText('Physical')).toBeInTheDocument();
    });

    it('renders Admin Types', () => {
        render();

        expect(screen.getByText('Customer')).toBeInTheDocument();
        expect(screen.getByText('Business')).toBeInTheDocument();
        expect(screen.getByText('Both')).toBeInTheDocument();
    });

    it('renders "Customer" admin type selected', () => {
        render();
        const adminTypes = screen.getAllByTestId('AdminTypesOptions');
        expect(adminTypes[0]).toBeChecked();
        expect(adminTypes[1]).not.toBeChecked();
        expect(adminTypes[2]).not.toBeChecked();
    });

    it('renders Admin Fee options', () => {
        render();

        expect(screen.getByText('No')).toBeInTheDocument();
        expect(screen.getByText('Yes')).toBeInTheDocument();
    });

    it('renders "No" admin fee option selected', () => {
        render();

        const adminFeeOptions = screen.getAllByTestId('AdminFeeOptions');
        expect(adminFeeOptions[0]).toBeChecked();
        expect(adminFeeOptions[1]).not.toBeChecked();
    });
});
