diff --git a/src/lib/layout/wizard.svelte b/src/lib/layout/wizard.svelte index 2b002f5ba..53be0048a 100644 --- a/src/lib/layout/wizard.svelte +++ b/src/lib/layout/wizard.svelte @@ -12,6 +12,7 @@ +

-

- -

+ {#if $$slots.subtitle} +

+ +

+ {/if}
diff --git a/src/lib/mock/wizard.step1.test.svelte b/src/lib/mock/wizard.step1.test.svelte index 65878a86c..48ef8cd02 100644 --- a/src/lib/mock/wizard.step1.test.svelte +++ b/src/lib/mock/wizard.step1.test.svelte @@ -1,10 +1,19 @@ - + step-1 sub-title-1 - - + + diff --git a/src/lib/mock/wizard.step2.test.svelte b/src/lib/mock/wizard.step2.test.svelte index 880e84ae1..8e8dcd21a 100644 --- a/src/lib/mock/wizard.step2.test.svelte +++ b/src/lib/mock/wizard.step2.test.svelte @@ -1,10 +1,11 @@ step-2 sub-title-2 - - + + diff --git a/src/lib/stores/wizard.ts b/src/lib/stores/wizard.ts index 88167f4bf..76602df78 100644 --- a/src/lib/stores/wizard.ts +++ b/src/lib/stores/wizard.ts @@ -4,12 +4,14 @@ import { writable } from 'svelte/store'; export type WizardStore = { show: boolean; component?: typeof SvelteComponent; + interceptor?: () => Promise; }; function createWizardStore() { const { subscribe, update } = writable({ show: false, - component: null + component: null, + interceptor: null }); return { @@ -21,6 +23,13 @@ function createWizardStore() { return n; }), + setInterceptor: (callback: WizardStore['interceptor']) => { + update((n) => { + n.interceptor = callback; + + return n; + }); + }, hide: () => update((n) => { n.show = false; diff --git a/tests/unit/layout/wizard.test.ts b/tests/unit/layout/wizard.test.ts index f0aa058f6..b985b96d1 100644 --- a/tests/unit/layout/wizard.test.ts +++ b/tests/unit/layout/wizard.test.ts @@ -2,6 +2,7 @@ import '@testing-library/jest-dom'; import { render } from '@testing-library/svelte'; import { wizard } from '../../../src/lib/stores/wizard'; import { tick } from 'svelte'; +import userEvent from '@testing-library/user-event'; import WizardComponent from '../../../src/lib/mock/wizard.test.svelte'; import WizardContainer from '../../../src/lib/mock/wizard.container.test.svelte'; @@ -44,15 +45,15 @@ test('shows wizard and hides it', async () => { }); test('shows next step with submit', async () => { - const { getByTestId, getByRole, queryByText } = render(WizardContainer); + const { container, getByRole, queryByText } = render(WizardContainer); wizard.start(WizardComponent); await tick(); const form = getByRole('form') as HTMLFormElement; const step1 = queryByText('step-1'); - const step1Required = getByTestId('step-1-required'); - const step1Optional = getByTestId('step-1-optional'); + const step1Required = container.querySelector('#step-1-required'); + const step1Optional = container.querySelector('#step-1-optional'); expect(step1).toBeInTheDocument(); expect(step1Required).toBeInTheDocument(); @@ -64,8 +65,53 @@ test('shows next step with submit', async () => { expect(step1).not.toBeInTheDocument(); const step2 = queryByText('step-2'); - const step2First = getByTestId('step-2-first'); - const step2Second = getByTestId('step-2-second'); + const step2First = container.querySelector('#step-2-first'); + const step2Second = container.querySelector('#step-2-second'); + + expect(step2).toBeInTheDocument(); + expect(step2First).toBeInTheDocument(); + expect(step2Second).toBeInTheDocument(); + + form.submit(); + await tick(); + + expect(form).not.toBeInTheDocument(); + expect(step1).not.toBeInTheDocument(); + expect(step2).not.toBeInTheDocument(); +}); + +test('intercepts submit', async () => { + const { container, getByRole, queryByText } = render(WizardContainer); + + wizard.start(WizardComponent); + await tick(); + + const form = getByRole('form') as HTMLFormElement; + const step1 = queryByText('step-1'); + const step1Required = container.querySelector('#step-1-required'); + const step1Optional = container.querySelector('#step-1-optional'); + + expect(step1).toBeInTheDocument(); + expect(step1Required).toBeInTheDocument(); + expect(step1Optional).toBeInTheDocument(); + + await userEvent.type(step1Required, 'fail'); + form.submit(); + await tick(); + + expect(step1).toBeInTheDocument(); + expect(step1Required).toBeInTheDocument(); + expect(step1Optional).toBeInTheDocument(); + + await userEvent.type(step1Required, 'works'); + form.submit(); + await tick(); + + expect(step1).not.toBeInTheDocument(); + + const step2 = queryByText('step-2'); + const step2First = container.querySelector('#step-2-first'); + const step2Second = container.querySelector('#step-2-second'); expect(step2).toBeInTheDocument(); expect(step2First).toBeInTheDocument();