import React from 'react';
import { fireEvent, render } from '@testing-library/react';
import { ApplicationBanner, Props, CLASSNAME } from '../applicationBanner';

describe('<ApplicationBanner>', () => {
    const defaultProps: Props = {
        title: 'TestTitle',
        subtitle: 'TestSubtitle',
        defaultBtnProps: {
            label: 'My SecondaryBtn',
            onClick: vi.fn(),
        },
    };

    const renderComponent = (props?: Partial<Props>) =>
        render(<ApplicationBanner {...defaultProps} {...props} />);

    describe('render with default props', () => {
        test('should render title and subtitle', () => {
            const { getByText } = renderComponent();

            expect(getByText(defaultProps.title)).toBeInTheDocument();
            expect(getByText(defaultProps.subtitle!)).toBeInTheDocument();
        });

        test('should render default button with label and triggers on click', () => {
            const { queryByTestId } = renderComponent();

            const defaultBtn = queryByTestId(`${CLASSNAME}-defaultBtn`);
            const defaultBtnLbl = defaultProps.defaultBtnProps?.label;

            expect(defaultBtn).toBeInTheDocument();
            expect(defaultBtn).toHaveTextContent(defaultBtnLbl!);

            fireEvent.click(defaultBtn!);
            expect(defaultProps.defaultBtnProps?.onClick).toHaveBeenCalled();
        });

        test('should not render primary button', () => {
            const { queryByTestId } = renderComponent();

            const primaryBtn = queryByTestId(`${CLASSNAME}-primaryBtn`);
            expect(primaryBtn).not.toBeInTheDocument();
        });

        test('render primary button when passed props', () => {
            const label = 'Test primary button';
            const { queryByTestId } = renderComponent({
                primaryBtnProps: {
                    label,
                    onClick: vi.fn(),
                },
            });

            const primaryBtn = queryByTestId(`${CLASSNAME}-primaryBtn`);

            expect(primaryBtn).toBeInTheDocument();
            expect(primaryBtn).toHaveTextContent(label);
        });
    });
});
