diff --git a/src/components/breadcrumb/breadcrumb.test.ts b/src/components/breadcrumb/breadcrumb.test.ts index b3c65045..fdd5641e 100644 --- a/src/components/breadcrumb/breadcrumb.test.ts +++ b/src/components/breadcrumb/breadcrumb.test.ts @@ -1,13 +1,120 @@ -import { expect, fixture, html, waitUntil } from '@open-wc/testing'; -// import sinon from 'sinon'; +import { expect, fixture, html } from '@open-wc/testing'; import '../../../dist/shoelace.js'; import type SlBreadcrumb from './breadcrumb'; describe('', () => { - it('should render a component', async () => { - const el = await fixture(html` `); + let el: SlBreadcrumb; - expect(el).to.exist; + describe('when provided a standard list of el-breadcrumb-item children and no parameters', async () => { + before(async () => { + el = await fixture(html` + + Catalog + Clothing + Women's + Shirts & Tops + + `); + }); + + it('should render a component that passes accessibility test', async () => { + await expect(el).to.be.accessible(); + }); + + it('should render sl-icon as separator', async () => { + expect(el.querySelectorAll('sl-icon').length).to.eq(4); + }); + + it('should attach aria-current "page" on the last breadcrumb item.', async () => { + const breadcrumbItems = el.querySelectorAll('sl-breadcrumb-item'); + const lastNode = breadcrumbItems[3]; + expect(lastNode).attribute('aria-current', 'page'); + }); + }); + + describe('when provided a standard list of el-breadcrumb-item children and an element in the slot "seperator" to support Custom Separators', async () => { + before(async () => { + el = await fixture(html` + + / + First + Second + Third + + `); + }); + + it('should render a component that passes accessibility test', async () => { + await expect(el).to.be.accessible(); + }); + + it('should accept "separator" as an assigned child in the shadow root', async () => { + const slot = el.shadowRoot.querySelector('slot[name=separator]'); + const childNodes = slot.assignedNodes({ flatten: true }); + + expect(childNodes.length).to.eq(1); + }); + + it('should replace the sl-icon separator with the provided separator', async () => { + expect(el.querySelectorAll('.replacement-separator').length).to.eq(4); + expect(el.querySelectorAll('sl-icon').length).to.eq(0); + }); + }); + + describe('when provided a standard list of el-breadcrumb-item children and an element in the slot "prefix" to support prefix icons', async () => { + before(async () => { + el = await fixture(html` + + + / + Home + + First + Second + Third + + `); + }); + + it('should render a component that passes accessibility test', async () => { + await expect(el).to.be.accessible(); + }); + + it.skip('should accept "prefix" as an assigned child in the shadow root', () => { + // TODO: I suspect this test doesn't work because the slot resides inside the breadcrumb-item not the breadcrumb list + const slot = el.shadowRoot.querySelector('slot[name=prefix]'); + const childNodes = slot.assignedNodes({ flatten: true }); + + expect(childNodes.length).to.eq(1); + }); + }); + + describe('when provided a standard list of el-breadcrumb-item children and an element in the slot "suffix" to support suffix icons', async () => { + before(async () => { + el = await fixture(html` + + First + Second + Third + + / + Security + + + `); + }); + + it('should render a component that passes accessibility test', async () => { + await expect(el).to.be.accessible(); + }); + + it.skip('should accept "suffix" as an assigned child in the shadow root', () => { + // TODO: I suspect this test doesn't work because the slot resides inside the breadcrumb-item not the breadcrumb list + const slot = el.shadowRoot.querySelector('slot[name=suffix]'); + const childNodes = slot.assignedNodes({ flatten: true }); + + expect(childNodes.length).to.eq(1); + }); }); });