// noinspection DuplicatedCode import type { StoryObj } from '@storybook/web-components'; import { expect, userEvent, within } from '@storybook/test'; import '../custom-element/custom-element.js'; type TProps = { title: string; tag: string; template: string; payload: string }; type Story = StoryObj; function sleep(ms: number) { return new Promise((resolve) => setTimeout(resolve, ms)); } function render(args: TProps) { const { title, tag, template, payload } = args; return `
${title} ${payload}
`; } const meta = { title: 'xslt/conditionals', render }; export default meta; export const IfTrue: Story = { args: { title: 'xsl:if - condition is true', tag: 'if-true-test', template: ` Message is visible `, payload: `` }, play: async ({ canvasElement }) => { const canvas = within(canvasElement); await sleep(50); const result = await canvas.findByTestId('result'); expect(result).toBeInTheDocument(); expect(result).toHaveTextContent('Message is visible'); } }; export const IfFalse: Story = { args: { title: 'xsl:if - condition is false', tag: 'if-false-test', template: ` Should not appear Fallback content `, payload: `` }, play: async ({ canvasElement }) => { const canvas = within(canvasElement); await sleep(50); const fallback = await canvas.findByTestId('fallback'); expect(fallback).toBeInTheDocument(); expect(canvasElement.querySelector('[data-testid="hidden-result"]')).toBeNull(); } }; export const IfNotExists: Story = { args: { title: 'xsl:if - attribute not exists', tag: 'if-not-exists-test', template: ` No attribute provided Attribute exists `, payload: `` }, play: async ({ canvasElement }) => { const canvas = within(canvasElement); await sleep(50); const result = await canvas.findByTestId('result'); expect(result).toBeInTheDocument(); expect(result).toHaveTextContent('No attribute provided'); expect(canvasElement.querySelector('[data-testid="has-attr"]')).toBeNull(); } }; export const ChooseWhenOtherwise: Story = { args: { title: 'xsl:choose/when/otherwise - basic switch', tag: 'choose-basic-test', template: ` Operation succeeded Operation failed Unknown status `, payload: `` }, play: async ({ canvasElement }) => { const canvas = within(canvasElement); await sleep(50); const result = await canvas.findByTestId('result'); expect(result).toBeInTheDocument(); expect(result).toHaveTextContent('Operation succeeded'); expect(result).toHaveClass('success'); } }; export const ChooseSecondWhen: Story = { args: { title: 'xsl:choose - second when branch', tag: 'choose-second-test', template: ` Operation succeeded Operation failed Unknown status `, payload: `` }, play: async ({ canvasElement }) => { const canvas = within(canvasElement); await sleep(50); const result = await canvas.findByTestId('result'); expect(result).toBeInTheDocument(); expect(result).toHaveTextContent('Operation failed'); expect(result).toHaveClass('error'); } }; export const ChooseOtherwise: Story = { args: { title: 'xsl:choose - otherwise fallback', tag: 'choose-otherwise-test', template: ` Operation succeeded Operation failed Unknown status `, payload: `` }, play: async ({ canvasElement }) => { const canvas = within(canvasElement); await sleep(50); const result = await canvas.findByTestId('result'); expect(result).toBeInTheDocument(); expect(result).toHaveTextContent('Unknown status'); expect(result).toHaveClass('unknown'); } }; export const ChooseNoAttribute: Story = { args: { title: 'xsl:choose - no attribute provided', tag: 'choose-no-attr-test', template: ` High priority Low priority Default priority `, payload: `` }, play: async ({ canvasElement }) => { const canvas = within(canvasElement); await sleep(50); const result = await canvas.findByTestId('result'); expect(result).toBeInTheDocument(); expect(result).toHaveTextContent('Default priority'); } }; export const NestedConditions: Story = { args: { title: 'Nested conditionals', tag: 'nested-cond-test', template: ` Active user Inactive user Not a user `, payload: `` }, play: async ({ canvasElement }) => { const canvas = within(canvasElement); await sleep(50); const result = await canvas.findByTestId('result'); expect(result).toBeInTheDocument(); expect(result).toHaveTextContent('Active user'); } }; export const NestedConditionsInactive: Story = { args: { title: 'Nested conditionals - inactive user', tag: 'nested-cond-inactive-test', template: ` Active user Inactive user Not a user `, payload: `` }, play: async ({ canvasElement }) => { const canvas = within(canvasElement); await sleep(50); const result = await canvas.findByTestId('result'); expect(result).toBeInTheDocument(); expect(result).toHaveTextContent('Inactive user'); } }; export const NumericComparison: Story = { args: { title: 'Numeric comparison in conditions', tag: 'numeric-cond-test', template: ` Many items Some items No items `, payload: `` }, play: async ({ canvasElement }) => { const canvas = within(canvasElement); await sleep(50); const result = await canvas.findByTestId('result'); expect(result).toBeInTheDocument(); expect(result).toHaveTextContent('Many items'); } }; export const NumericComparisonLow: Story = { args: { title: 'Numeric comparison - low value', tag: 'numeric-cond-low-test', template: ` Many items Some items No items `, payload: `` }, play: async ({ canvasElement }) => { const canvas = within(canvasElement); await sleep(50); const result = await canvas.findByTestId('result'); expect(result).toBeInTheDocument(); expect(result).toHaveTextContent('Some items'); } }; export const BooleanAndCondition: Story = { args: { title: 'Boolean AND condition', tag: 'and-cond-test', template: ` Admin panel access granted Access denied `, payload: `` }, play: async ({ canvasElement }) => { const canvas = within(canvasElement); await sleep(50); const result = await canvas.findByTestId('result'); expect(result).toBeInTheDocument(); expect(result).toHaveTextContent('Admin panel access granted'); } }; export const BooleanOrCondition: Story = { args: { title: 'Boolean OR condition', tag: 'or-cond-test', template: ` Elevated privileges Standard user `, payload: `` }, play: async ({ canvasElement }) => { const canvas = within(canvasElement); await sleep(50); const result = await canvas.findByTestId('result'); expect(result).toBeInTheDocument(); expect(result).toHaveTextContent('Elevated privileges'); } }; export const MultipleInstances: Story = { args: { title: 'Multiple instances with different conditions', tag: 'multi-instance-test', template: ` `, payload: ` ` }, play: async ({ canvasElement }) => { const canvas = within(canvasElement); await sleep(50); const btn1 = await canvas.findByTestId('btn1-primary'); expect(btn1).toHaveTextContent('Primary Button'); expect(btn1).toHaveClass('primary'); const btn2 = await canvas.findByTestId('btn2-secondary'); expect(btn2).toHaveTextContent('Secondary Button'); expect(btn2).toHaveClass('secondary'); const btn3 = await canvas.findByTestId('btn3-otherwise'); expect(btn3).toHaveTextContent('Default Button'); expect(btn3).toHaveClass('default'); } }; export const MultipleIfOrderingIssue: Story = { args: { title: 'KNOWN ISSUE: Multiple IF blocks - out of order', tag: 'multi-if-order-issue', template: `

▶ !A ◀
T1
`, payload: ` ` }, play: async ({ canvasElement }) => { const canvas = within(canvasElement); // Initially ▶\s+◀ should be visible, !A should not const container = await canvas.findByTestId('whole-text'); expect(container.textContent).to.toMatch(/▶\s+◀/); // check A - show !A const toggleA = await canvas.findByTestId('toggle-a'); debugger; await userEvent.click(toggleA); expect( await await canvas.findByTestId('t-1')).toBeInTheDocument(); // !A is rendered expect(container.textContent).to.toMatch(/\!A/); // !A afer ▶ expect(container.textContent).to.toMatch(/▶\s+\!A/); // !A before ◀ expect(container.textContent).to.toMatch(/\!A\s+◀/); } }; //#region unit tests /* istanbul ignore else -- @preserve */ if ('test' === import.meta.env.MODE && !import.meta.url.includes('skiptest')) { const mod = await import('./xslt-conditionals.test.stories.ts?skiptest'); const { testStoryBook } = await import('./testStoryBook'); const { describe } = await import('vitest'); describe(meta.title, () => testStoryBook(mod, meta)); } //#endregion