import React from 'react';
import { fireEvent, screen } from '@testing-library/react';
import { renderInAppContext } from '@theorchard/suite-testing';
import { songWritersResponse } from 'lib/test/mocks/songWriters';
import * as songWriterSearch from 'src/data/queries/songWritersSearch/songWritersSearch';
import SongWriterSelector, { Props } from '../songWriterSelector';

describe('SongWriterSelector', () => {
    const defaultProps: Props = {
        defaultValue: null,
        onChange: jest.fn(),
    };

    const renderComponent = (customProps: Partial<Props> = {}) => {
        const props = {
            ...defaultProps,
            ...customProps,
        };
        return renderInAppContext(<SongWriterSelector {...props} />);
    };

    beforeEach(() => {
        jest.spyOn(
            songWriterSearch,
            'usePublishingSongWriters'
        ).mockReturnValue(songWritersResponse);
    });

    test('renders full list of default options', () => {
        const { container } = renderComponent();

        fireEvent.mouseDown(screen.getByText('Songwriters...'));

        expect(
            container.querySelectorAll('.Select__menu .Select__option')
        ).toHaveLength(5);
        expect(screen.getAllByText('Gustav Tomas Skjerdal Wood')).toHaveLength(
            2
        );
        expect(screen.getAllByText('Mohamed Ait Aadi')).toHaveLength(1);
        expect(screen.getAllByText('Steven Catanzaro')).toHaveLength(1);
        expect(screen.getAllByText('Luke Alexander Bond')).toHaveLength(1);
    });

    test('renders list with filtered by agreement id options', () => {
        const { container } = renderComponent({
            excludeFilter: {
                agreementIds: [
                    '208c15a7-cb95-43ff-9734-afb2b7bc5fec',
                    '5567493d-e557-4903-93a3-018a093b353b',
                ],
            },
        });
        const element = container
            .getElementsByClassName('SongWriterSelector')
            .item(0);
        expect(element).toBeVisible();

        fireEvent.mouseDown(screen.getByText('Songwriters...'));

        expect(
            container.querySelectorAll('.Select__menu .Select__option')
        ).toHaveLength(3);
        expect(screen.getAllByText('Gustav Tomas Skjerdal Wood')).toHaveLength(
            1
        );
        expect(screen.getAllByText('Mohamed Ait Aadi')).toHaveLength(1);
        expect(screen.getAllByText('Steven Catanzaro')).toHaveLength(1);
    });
});
