78 lines
2.8 KiB
TypeScript
78 lines
2.8 KiB
TypeScript
/**
|
|
* Which step a merchant is walked through, and what skipping does.
|
|
*
|
|
* The rule that matters: skipping moves the guidance on, it never marks work
|
|
* done. A shop whose catalogue is unpriced does not start selling because
|
|
* somebody pressed "Skip for now", and a card that implied otherwise would be
|
|
* worse than no card.
|
|
*/
|
|
import assert from 'node:assert/strict';
|
|
import { test, beforeEach } from 'node:test';
|
|
import { focusStep, isPaused } from './setupProgress';
|
|
import type { SetupStep, SetupStepId } from './setupSteps';
|
|
|
|
const step = (id: SetupStepId, done: boolean): SetupStep => ({
|
|
id,
|
|
title: id,
|
|
todo: '',
|
|
cta: '',
|
|
done,
|
|
href: '/',
|
|
});
|
|
|
|
const steps = [
|
|
step('profile', false),
|
|
step('people', false),
|
|
step('branch', true),
|
|
step('products', false),
|
|
];
|
|
|
|
beforeEach(() => {
|
|
// `localStorage` does not exist under the test runner, and the module must
|
|
// survive that — a private window and a browser refusing site data reach the
|
|
// same code path.
|
|
delete (globalThis as { localStorage?: unknown }).localStorage;
|
|
});
|
|
|
|
test('the focus is the first step that is neither done nor skipped', () => {
|
|
assert.equal(focusStep(steps, [])?.id, 'profile');
|
|
assert.equal(focusStep(steps, ['profile'])?.id, 'people');
|
|
assert.equal(focusStep(steps, ['profile', 'people'])?.id, 'products');
|
|
});
|
|
|
|
// Done steps are stepped over whether or not they were skipped — 'branch' is
|
|
// already complete and never becomes the focus.
|
|
test('a completed step is never focused', () => {
|
|
assert.notEqual(focusStep(steps, ['profile', 'people'])?.id, 'branch');
|
|
});
|
|
|
|
test('skipping everything outstanding leaves nothing to focus', () => {
|
|
assert.equal(focusStep(steps, ['profile', 'people', 'products']), null);
|
|
assert.equal(isPaused(steps, ['profile', 'people', 'products']), true);
|
|
});
|
|
|
|
/*
|
|
Paused is not finished. Every outstanding step being skipped means the merchant
|
|
waved the guidance past — the work is still undone, which is why the card shows
|
|
a resume line rather than disappearing.
|
|
*/
|
|
test('paused is false while any outstanding step is unskipped', () => {
|
|
assert.equal(isPaused(steps, ['profile']), false);
|
|
assert.equal(isPaused(steps, []), false);
|
|
});
|
|
|
|
// A shop with nothing left to do is not "paused" either — there is simply
|
|
// nothing outstanding to have skipped.
|
|
test('a finished shop is not reported as paused', () => {
|
|
const finished = [step('profile', true), step('people', true)];
|
|
assert.equal(isPaused(finished, []), false);
|
|
assert.equal(isPaused(finished, ['profile']), false);
|
|
});
|
|
|
|
// Storage the browser refuses must not take the page down, and must fail
|
|
// towards showing the guidance rather than silently hiding it.
|
|
test('unavailable storage reads as nothing skipped', async () => {
|
|
const { skippedSteps } = await import('./setupProgress');
|
|
assert.deepEqual(skippedSteps(1141), []);
|
|
});
|