Files
archy/neode-ui/src/views/goals/__tests__/goalStepActions.test.ts
T
archipelagoandClaude Fable 5 73d181abea
Demo images / Build & push demo images (push) Failing after 1m56s
fix(setup): wizard navigation round-trips — back to Setup tab, goal-aware channels back button, configure launches the app
- "Back to Goals" now returns to Home's Setup tab (?tab=setup) instead of
  landing on the dashboard tab.
- The channels screen remembers when a setup wizard sent you there
  (?from=goal) — its back button reads "Back to Setup" and returns to the
  wizard; it also now uses the shared BackButton pill instead of a bare
  link.
- "Open & Configure" steps launch the actual app via the app launcher —
  iframe apps overlay on top of the wizard, tab-only apps (BTCPay,
  Nextcloud) open a tab, mobile uses the in-app browser — instead of
  routing to the app-details page.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-16 22:16:58 -04:00

48 lines
2.1 KiB
TypeScript

import { describe, expect, it } from 'vitest'
import { GOALS } from '@/data/goals'
import { goalStepRouteOverride } from '../goalStepActions'
import type { GoalStep } from '@/types/goals'
describe('goalStepActions', () => {
it('app-backed configure steps have no route override — they launch the app itself', () => {
expect(goalStepRouteOverride(step({ id: 'configure-filebrowser', appId: 'filebrowser' }))).toBeNull()
expect(goalStepRouteOverride(step({ id: 'configure-store', appId: 'btcpay-server' }))).toBeNull()
})
it('routes built-in identity and backup steps to their owning screens', () => {
expect(goalStepRouteOverride(step({ id: 'setup-nostr' }))).toBe('/dashboard/web5')
expect(goalStepRouteOverride(step({ id: 'export-identity' }))).toBe('/dashboard/web5/credentials')
expect(goalStepRouteOverride(step({ id: 'create-passphrase' }))).toBe('/dashboard/settings')
})
it('routes channel steps to the Lightning channels screen', () => {
expect(goalStepRouteOverride(step({ id: 'open-channel' }))).toBe('/dashboard/apps/lnd/channels')
expect(goalStepRouteOverride(step({ id: 'open-channels' }))).toBe('/dashboard/apps/lnd/channels')
expect(goalStepRouteOverride(step({ id: 'open-zeus-channel' }))).toBe('/dashboard/apps/lnd/channels')
})
it('keeps passive info steps without a target route', () => {
expect(goalStepRouteOverride(step({ id: 'sync-setup' }))).toBeNull()
})
it('gives every shipped configure step a destination — a route override or an app to launch', () => {
const configureSteps = GOALS.flatMap((goal) => goal.steps.filter((candidate) => candidate.action === 'configure'))
for (const candidate of configureSteps) {
const destination = goalStepRouteOverride(candidate) ?? candidate.appId ?? null
expect(destination, `configure step ${candidate.id} has no destination`).not.toBeNull()
}
})
})
function step(overrides: Partial<GoalStep>): GoalStep {
return {
id: 'step',
title: 'Step',
description: '',
action: 'configure',
isAutomatic: false,
...overrides,
}
}