"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
    return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const react_1 = __importDefault(require("react"));
const test_utilities_1 = require("../../test-utilities");
const Icon_1 = require("../Icon");
const Text_1 = require("../Text");
const Bookend_1 = require("../Bookend");
const Banner_1 = require("./Banner");
const defaultProps = {
    title: 'There was an error',
};
describe('<Banner />', () => {
    describe('children', () => {
        it('renders the children', () => {
            const banner = test_utilities_1.mountWithContext(<Banner_1.Banner {...defaultProps}>
          <Text_1.Text>Hello</Text_1.Text>
        </Banner_1.Banner>);
            expect(banner).toContainReactComponent(Text_1.Text);
            expect(banner).toContainReactComponent(Bookend_1.Bookend, {
                trailing: false,
            });
        });
    });
    describe('title', () => {
        it('renders the title', () => {
            const title = 'There was an error.';
            const banner = test_utilities_1.mountWithContext(<Banner_1.Banner title={title}/>);
            expect(banner).toContainReactText(title);
        });
    });
    describe('status', () => {
        it('renders the info <Icon /> by default', () => {
            const banner = test_utilities_1.mountWithContext(<Banner_1.Banner {...defaultProps}/>);
            expect(banner).toContainReactComponent(Icon_1.Icon, {
                source: 'info',
            });
        });
        it('renders the success <Icon /> if status is success', () => {
            const status = 'success';
            const banner = test_utilities_1.mountWithContext(<Banner_1.Banner {...defaultProps} status={status}/>);
            expect(banner).toContainReactComponent(Icon_1.Icon, {
                source: status,
            });
        });
        it('renders the warning <Icon /> if status is warning', () => {
            const status = 'warning';
            const banner = test_utilities_1.mountWithContext(<Banner_1.Banner {...defaultProps} status={status}/>);
            expect(banner).toContainReactComponent(Icon_1.Icon, {
                source: status,
            });
        });
        it('renders the critical <Icon /> if status is critical', () => {
            const status = 'critical';
            const banner = test_utilities_1.mountWithContext(<Banner_1.Banner {...defaultProps} status={status}/>);
            expect(banner).toContainReactComponent(Icon_1.Icon, {
                source: status,
            });
        });
        it('sets the status live region role by default', () => {
            const banner = test_utilities_1.mountWithContext(<Banner_1.Banner {...defaultProps}/>);
            expect(banner).toContainReactComponent('div', {
                role: 'status',
            });
        });
        it('sets the alert live region role if status is critical', () => {
            const status = 'critical';
            const banner = test_utilities_1.mountWithContext(<Banner_1.Banner {...defaultProps} status={status}/>);
            expect(banner).toContainReactComponent('div', {
                role: 'alert',
            });
        });
    });
    describe('collapsible', () => {
        it('renders a chevronDown button with the required aria attributes if collapsible', () => {
            const banner = test_utilities_1.mountWithContext(<Banner_1.Banner {...defaultProps} collapsible/>);
            expect(banner).toContainReactComponent('button', {
                'aria-pressed': false,
                'aria-expanded': false,
            });
            expect(banner).toContainReactComponent(Icon_1.Icon, {
                source: 'chevronDown',
            });
            expect(banner).toContainReactComponent(Bookend_1.Bookend, {
                trailing: true,
            });
        });
        it('hides the children if collapsible', () => {
            const banner = test_utilities_1.mountWithContext(<Banner_1.Banner {...defaultProps} collapsible>
          <Text_1.Text>Hello</Text_1.Text>
        </Banner_1.Banner>);
            expect(banner).not.toContainReactComponent(Text_1.Text);
        });
        it('renders a chevronUp button with the required aria attributes icon on button click if collapsible', () => {
            var _a;
            const banner = test_utilities_1.mountWithContext(<Banner_1.Banner {...defaultProps} collapsible/>);
            (_a = banner.find('button')) === null || _a === void 0 ? void 0 : _a.trigger('onClick');
            expect(banner).toContainReactComponent('button', {
                'aria-pressed': true,
                'aria-expanded': true,
            });
            expect(banner).toContainReactComponent(Icon_1.Icon, {
                source: 'chevronUp',
            });
            expect(banner).toContainReactComponent(Bookend_1.Bookend, {
                trailing: true,
            });
        });
        it('renders the children on button click if collapsible', () => {
            var _a;
            const banner = test_utilities_1.mountWithContext(<Banner_1.Banner {...defaultProps} collapsible>
          <Text_1.Text>Hello</Text_1.Text>
        </Banner_1.Banner>);
            (_a = banner.find('button')) === null || _a === void 0 ? void 0 : _a.trigger('onClick');
            expect(banner).toContainReactComponent(Text_1.Text);
        });
    });
    describe('iconHidden', () => {
        it('renders the <Icon /> by default', () => {
            const banner = test_utilities_1.mountWithContext(<Banner_1.Banner {...defaultProps}/>);
            expect(banner).toContainReactComponent(Icon_1.Icon);
            expect(banner).toContainReactComponent(Bookend_1.Bookend, {
                leading: true,
            });
        });
        it('does not render the <Icon /> if iconHidden', () => {
            const banner = test_utilities_1.mountWithContext(<Banner_1.Banner {...defaultProps} iconHidden/>);
            expect(banner).not.toContainReactComponent(Icon_1.Icon);
            expect(banner).toContainReactComponent(Bookend_1.Bookend, {
                leading: false,
            });
        });
    });
    describe('autofocus', () => {
        const rawCreateElement = document.createElement;
        const focusSpy = jest.fn();
        const createElementSpy = jest.spyOn(document, 'createElement');
        beforeEach(() => {
            createElementSpy.mockImplementation((...args) => {
                const result = rawCreateElement.apply(document, args);
                if (args[0].toLocaleLowerCase() === 'div') {
                    result.focus = focusSpy;
                }
                return result;
            });
        });
        afterEach(() => {
            focusSpy.mockReset();
        });
        afterAll(() => {
            createElementSpy.mockRestore();
        });
        it('does not focus the banner by default', () => {
            test_utilities_1.mountWithContext(<Banner_1.Banner {...defaultProps}/>);
            expect(focusSpy).not.toHaveBeenCalled();
        });
        it('focuses on the banner when autofocus is specified', () => {
            test_utilities_1.mountWithContext(<Banner_1.Banner {...defaultProps} autofocus/>);
            expect(focusSpy).toHaveBeenCalledTimes(1);
        });
        it('sets the tabIndex to -1', () => {
            const banner = test_utilities_1.mountWithContext(<Banner_1.Banner {...defaultProps} autofocus/>);
            expect(banner).toContainReactComponent('div', {
                tabIndex: -1,
            });
        });
    });
    describe('onDismiss()', () => {
        it('is called when the dismiss button is clicked', () => {
            var _a;
            const spy = jest.fn();
            const banner = test_utilities_1.mountWithContext(<Banner_1.Banner onDismiss={spy}/>);
            (_a = banner.find('button')) === null || _a === void 0 ? void 0 : _a.trigger('onClick');
            expect(spy).toHaveBeenCalled();
        });
        it('renders a close button', () => {
            const banner = test_utilities_1.mountWithContext(<Banner_1.Banner onDismiss={() => { }} {...defaultProps}/>);
            expect(banner).toContainReactComponent(Icon_1.Icon, {
                source: 'close',
            });
            expect(banner).toContainReactComponent(Icon_1.Icon);
            expect(banner).toContainReactComponent(Bookend_1.Bookend, {
                leading: true,
            });
        });
    });
});
