// noinspection DuplicatedCode import type { StoryObj } from '@storybook/web-components'; import { expect, within } from '@storybook/test'; import '../custom-element/custom-element.js'; type TProps = { title: string; tag: string; attributes: string; slot: string; payload:string; }; type Story = StoryObj; function render(args: TProps) { const { title, tag, attributes, slot, payload} = args; return `
${ title } <${ tag } ${attributes}>${ payload }
`; } const meta = { title: 'slots' , render }; export default meta; export const Regular:Story = { args: { title: 'custom-element' , tag: 'my-component' , slot: `Hello World` , payload: `πŸ‹` } , play: async ({canvasElement}) => { const titleText = Regular.args!.title as string; const canvas = within(canvasElement); await canvas.findByText(titleText); const el = canvasElement; expect(el.querySelectorAll('my-component').length).to.equal(1); expect(el.querySelector('my-component').innerHTML).to.include(`Hello World`); } }; export const NamedSlot:Story = { args: { title: 'named slot' , tag: 'dce-1-slot' , slot: ` πŸ₯¦` , payload: `πŸ₯•` } , play: async ({canvasElement}) => { const titleText = NamedSlot.args!.title as string; const canvas = within(canvasElement); await canvas.findByText(titleText); const el = canvasElement; expect(el.querySelectorAll('dce-1-slot').length).to.equal(1); expect(el.querySelector('dce-1-slot').innerText).to.equal(`πŸ₯•`); } }; export const DoubleSlot:Story = { args: { title: 'same slot can be used multiple times in template' , tag: 'dce-2-slots' , slot: ` πŸ˜ƒ and again: πŸ˜ƒ` , payload: `πŸ₯•` } , play: async ({canvasElement}) => { const titleText = DoubleSlot.args!.title as string; const canvas = within(canvasElement); await canvas.findByText(titleText); const el = canvasElement; expect(el.querySelectorAll('dce-2-slots').length).to.equal(1); expect(el.querySelector('dce-2-slots').innerText).to.equal(`πŸ₯• and again: πŸ₯•`); } }; export const NamedUnnamedDefaultSlot:Story = { args: { title: 'named and un-named default slot' , tag: 'dce-4-slot' , slot: `#1 πŸ˜ƒ
#2 πŸ˜ƒ` , payload: `πŸ₯•` } , play: async ({canvasElement}) => { const titleText = NamedUnnamedDefaultSlot.args!.title as string; const canvas = within(canvasElement); await canvas.findByText(titleText); const el = canvasElement; expect(el.querySelectorAll('dce-4-slot').length).to.equal(1); expect(el.querySelector('dce-4-slot').innerText).to.include(`#1 πŸ₯•`); expect(el.querySelector('dce-4-slot').innerText).to.include(`#2 πŸ₯•`); } }; export const NamedDefaultSlot:Story = { args: { title: 'two named default slot' , tag: 'dce-3-slot' , slot: `#1 πŸ˜ƒ
#2 πŸ˜ƒ` , payload: `πŸ₯•` } , play: async ({canvasElement}) => { const titleText = NamedDefaultSlot.args!.title as string; const canvas = within(canvasElement); await canvas.findByText(titleText); const el = canvasElement; expect(el.querySelectorAll('dce-3-slot').length).to.equal(1); expect(el.querySelector('dce-3-slot').innerText).to.include(`#1 πŸ₯•`); expect(el.querySelector('dce-3-slot').innerText).to.include(`#2 πŸ₯•`); } }; export const DefaultSlot:Story = { args: { title: 'default slot' , tag: 'greet-element' , slot: ` Hello World!` , payload: `πŸ‘‹` } , play: async ({canvasElement}) => { const titleText = DefaultSlot.args!.title as string; const canvas = within(canvasElement); await canvas.findByText(titleText); const el = canvasElement; expect(el.querySelectorAll('greet-element').length).to.equal(1); expect(el.querySelector('greet-element').innerText).to.include(`πŸ‘‹ World!`); } }; export const TemplateWithAttributesAndCondition:Story = { args: { title: 'πŸ’ͺ DCE template' , tag: 'pokemon-tile' , attributes: ` title="bulbasaur" data-smile="πŸ‘Ό" pokemon-id="1" ` , slot: ` ` , payload: `

Bulbasaur is a cute PokΓ©mon born with a large seed firmly affixed to its back; the seed grows in size as the PokΓ©mon does.

` } , play: async ({canvasElement}) => { const titleText = TemplateWithAttributesAndCondition.args!.title as string; const canvas = within(canvasElement); await canvas.findByText(titleText); const el = canvasElement; expect(el.querySelectorAll('pokemon-tile').length).to.equal(1); const p = el.querySelector('pokemon-tile'); expect(p.querySelector('img').src).to.equal('https://unpkg.com/pokeapi-sprites@2.0.2/sprites/pokemon/other/dream-world/1.svg'); expect(p.querySelector('h3').innerText).to.equal('bulbasaur'); expect(p.innerText).to.include('Smile as: πŸ‘Ό'); expect(p.querySelector('[slot="description"]').innerText).to.include('Bulbasaur is a cute PokΓ©mon'); } }; //#region unit tests /* istanbul ignore else -- @preserve */ if( 'test' === import.meta.env.MODE && !import.meta.url.includes('skiptest') ) { const mod = await import('./slots.test.stories.ts?skiptest'); const { testStoryBook } = await import('./testStoryBook') const { describe } = await import('vitest') describe(meta.title, () => testStoryBook( mod, meta ) ); } //#endregion