import { render } from '@stencil/vitest'; import type { MockInstance } from 'vitest'; describe('ontario-step-indicator', () => { let warnSpy: MockInstance; beforeEach(() => { warnSpy = vi.spyOn(console, 'warn').mockImplementation(() => undefined); }); afterEach(() => { warnSpy.mockRestore(); }); describe('renders', () => { it('the default output', async () => { const page = await render(``); expect(page.root).toMatchSnapshot(); }); it('the step output shape', async () => { const page = await render( ``, ); expect(page.root).toMatchSnapshot(); }); it('the percentage output shape with a back link', async () => { const page = await render( ``, ); expect(page.root).toMatchSnapshot(); }); it('step mode by default', async () => { const page = await render(``); expect(page.root?.shadowRoot?.querySelector('.ontario-h4')?.textContent?.replace(/\s+/g, ' ').trim()).toBe( 'Step ? of ?', ); expect(warnSpy).toHaveBeenCalledTimes(0); }); it('a placeholder when currentStep is missing', async () => { const page = await render(``); expect(page.root?.shadowRoot?.querySelector('.ontario-h4')?.textContent?.replace(/\s+/g, ' ').trim()).toBe( 'Step ? of 5', ); }); it('a placeholder when numberOfSteps is missing', async () => { const page = await render(``); expect(page.root?.shadowRoot?.querySelector('.ontario-h4')?.textContent?.replace(/\s+/g, ' ').trim()).toBe( 'Step 2 of ?', ); }); it('percentage mode when percentageComplete is defined', async () => { const page = await render(``); expect(page.root?.shadowRoot?.querySelector('.ontario-h4')?.textContent?.replace(/\s+/g, ' ').trim()).toBe( '70% complete', ); }); it('percentage mode when percentageComplete is 0', async () => { const page = await render(``); expect(page.root?.shadowRoot?.querySelector('.ontario-h4')?.textContent?.replace(/\s+/g, ' ').trim()).toBe( '0% complete', ); }); it('a back link when backButtonUrl is provided', async () => { const page = await render( ``, ); const link = page.root?.shadowRoot?.querySelector('a'); const button = page.root?.shadowRoot?.querySelector('button'); expect(link).not.toBeNull(); expect(link?.getAttribute('href')).toBe('https://designsystem.ontario.ca/'); expect(button).toBeNull(); expect(warnSpy).toHaveBeenCalledTimes(0); }); it('a back button when only customOnClick is provided', async () => { const page = await render( ``, ); page.instance.showBackButton = true; page.instance.customOnClick = vi.fn(); page.instance.backButtonUrl = undefined; warnSpy.mockClear(); page.instance.componentWillLoad(); await page.waitForChanges(); const link = page.root?.shadowRoot?.querySelector('a'); const button = page.root?.shadowRoot?.querySelector('button'); expect(button).not.toBeNull(); expect(link).toBeNull(); expect(warnSpy).toHaveBeenCalledTimes(0); }); }); describe('warns', () => { it('when percentage and step props are mixed', async () => { const page = await render( ``, ); expect(warnSpy).toHaveBeenCalledTimes(1); expect(page.root?.shadowRoot?.querySelector('.ontario-h4')?.textContent?.replace(/\s+/g, ' ').trim()).toBe( '70% complete', ); }); it('when currentStep is missing', async () => { const page = await render(``); expect(warnSpy).toHaveBeenCalledTimes(1); expect(page.root?.shadowRoot?.querySelector('.ontario-h4')?.textContent?.replace(/\s+/g, ' ').trim()).toBe( 'Step ? of 5', ); }); it('when numberOfSteps is missing', async () => { const page = await render(``); expect(warnSpy).toHaveBeenCalledTimes(1); expect(page.root?.shadowRoot?.querySelector('.ontario-h4')?.textContent?.replace(/\s+/g, ' ').trim()).toBe( 'Step 2 of ?', ); }); it('when a back button has no backButtonUrl or customOnClick', async () => { const page = await render( ``, ); expect(page.root?.shadowRoot?.querySelector('button')).not.toBeNull(); expect(warnSpy).toHaveBeenCalledTimes(1); }); it('when backButtonUrl and customOnClick are both provided', async () => { const page = await render( ``, ); page.instance.customOnClick = vi.fn(); warnSpy.mockClear(); page.instance.componentWillLoad(); await page.waitForChanges(); expect(warnSpy).toHaveBeenCalledTimes(1); expect(page.root?.shadowRoot?.querySelector('a')).not.toBeNull(); expect(page.root?.shadowRoot?.querySelector('button')).toBeNull(); }); }); describe('prefers', () => { it('percentage mode when percentage and step props are mixed', async () => { const page = await render( ``, ); expect(page.root?.shadowRoot?.querySelector('.ontario-h4')?.textContent?.replace(/\s+/g, ' ').trim()).toBe( '70% complete', ); }); it('the anchor when backButtonUrl and customOnClick are both provided', async () => { const page = await render( ``, ); page.instance.customOnClick = vi.fn(); warnSpy.mockClear(); page.instance.componentWillLoad(); await page.waitForChanges(); expect(page.root?.shadowRoot?.querySelector('a')).not.toBeNull(); expect(page.root?.shadowRoot?.querySelector('button')).toBeNull(); }); }); });