import React from 'react';
import { render } from '@testing-library/react';
import { FEATURE_PRODUCT_BUILDER_SURVEY_BANNER } from 'src/constants';
import IdentityContext from 'src/context';
import { PRODUCT_BUILDER_SURVEY_BANNER, PageBanner } from '../page-banner';

jest.mock('@theorchard/suite-frontend', () => ({
    __esModule: true,
    ...jest.requireActual('@theorchard/suite-frontend'),
}));

describe('<PageBanner>', () => {
    const defaultProps = {
        location: { pathname: '/' },
    };

    const renderComponent = (identity: any, props: any = {}) =>
        render(
            <IdentityContext.Provider value={{ identity } as any}>
                <PageBanner {...(defaultProps as any)} {...(props as any)} />
            </IdentityContext.Provider>
        );

    describe.each([
        [
            'location is not permitted',
            { hasFeatureFlag: (): boolean => false },
            { location: { pathname: '/test' } },
        ],
        [
            'user is not authorized',
            {
                id: 1,
                hasPermission: (): boolean => false,
                hasFeatureControl: (): boolean => false,
                hasFeatureFlag: (): boolean => false,
            },
            undefined,
        ],
    ])('%s', (_, identity, props) => {
        test('returns null', () => {
            const { container } = renderComponent(identity, props);
            expect(container.firstChild).toBeNull();
        });
    });

    describe('Product Builder Survey Banner', () => {
        const identity = {
            id: 1,
            hasFeatureFlag: (feat: string) =>
                feat === FEATURE_PRODUCT_BUILDER_SURVEY_BANNER,
            hasFeatureControl: () => false,
        };

        test.each(['/project/new-create', '/catalog', '/projects'])(
            'renders Banner on %s',
            pathname => {
                const { container } = renderComponent(identity, {
                    location: { pathname },
                });
                expect(
                    container.querySelector('.Product-builder-survey')
                ).toBeInTheDocument();
            }
        );

        test('does not render Banner on non project page', () => {
            const { container } = renderComponent(identity, {
                location: { pathname: '/analytics/splash' },
            });
            expect(
                container.querySelector('.Product-builder-survey')
            ).toBeNull();
        });

        test('does not render if Banner dismissed', () => {
            document.cookie = `${PRODUCT_BUILDER_SURVEY_BANNER}=false`;

            const { container } = renderComponent(identity, {
                location: { pathname: '/project/new-create' },
            });
            expect(
                container.querySelector('.Product-builder-survey')
            ).toBeNull();
        });
    });
});
