import React from 'react';
import { fireEvent, screen, waitFor } from '@testing-library/react';
import { renderInAppContext } from '@theorchard/suite-testing';
import { StatementPeriodAdjustmentFileUsers } from 'src/__fixtures__/graphql/statement-period-adjustment-file';
import { StatementPeriodAdjustmentFileUserActions } from 'src/apollo/definitions/globalTypes';
import * as adjustmentQuery from 'src/apollo/queries/adjustment';
import AdjustmentsFileUsersSelect, {
    AdjustmentsFileUsersSelectPropTypes,
} from 'src/components/adjustments/adjustments-file-users-select';

describe('<AdjustmentsFileUsersSelect/>', () => {
    const render = (props: AdjustmentsFileUsersSelectPropTypes) =>
        renderInAppContext(<AdjustmentsFileUsersSelect {...props} />);

    const props: AdjustmentsFileUsersSelectPropTypes = {
        action: StatementPeriodAdjustmentFileUserActions.UPLOADED_FILE,
        isDisabled: false,
        onChange: jest.fn(),
        value: '',
    };

    afterEach(jest.restoreAllMocks);

    beforeEach(() => {
        jest.spyOn(
            adjustmentQuery,
            'useStatementPeriodAdjustmentFilesUsers'
        ).mockReturnValue({
            data: StatementPeriodAdjustmentFileUsers,
            loading: false,
            error: undefined,
        });
    });

    it('renders "Added By" filter', () => {
        render(props);

        expect(screen.getByText('Added By')).toBeDefined();
        expect(screen.getByRole('combobox', { hidden: true })).toBeDefined();
    });

    it('renders user options in dropdown', async () => {
        render(props);

        const addedBySelect = screen.getByRole('combobox', {
            hidden: true,
        });
        fireEvent.click(addedBySelect);

        await waitFor(() => {
            expect(screen.getByText('Adjustments Script')).toBeDefined();
            expect(screen.getByText('Test User')).toBeDefined();
            expect(screen.getByText('Joe User')).toBeDefined();
        });
    });

    it('renders selected value', () => {
        render({ ...props, value: 'baaff429-a8a8-4a33-b113-11d626cab263' });

        expect(screen.getByText('Joe User')).toBeDefined();
    });
});
