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 @@
+
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();