Files
TREK/client/src/components/Demo/useDemoLock.test.ts
T
Maurice d800e64f93 feat(demo): lock the demo account's settings under a striped demo overlay
The demo account can look at its Account tab, API keys, MCP configuration,
own AI connection and language, but not change them, and the server already
refuses each of those writes. DemoLock renders such a section dimmed and out
of reach under diagonal stripes in theme tokens, with a small Demo mode badge
and one line saying why; useDemoAccountLock decides, on the desktop settings
and the phone screens alike (a new pair in feature-pairs.json).

Locked: the whole Account tab (profile, password, 2FA, passkeys, deletion),
API keys, the MCP card with its tokens and connected apps, connecting an own
AI model and the language picker, which shows English. The admin of a demo
instance sees everything unlocked, 2FA included, so the old instance wide
"Not available in demo mode" line under 2FA and its key are gone from all
locales.
2026-10-24 23:22:15 +00:00

36 lines
1.7 KiB
TypeScript

import { renderHook } from '@testing-library/react';
import { beforeEach, describe, expect, it } from 'vitest';
import { buildUser } from '../../../tests/helpers/factories';
import { resetAllStores, seedStore } from '../../../tests/helpers/store';
import { useAuthStore } from '../../store/authStore';
import { useDemoAccountLock } from './useDemoLock';
beforeEach(() => resetAllStores());
describe('useDemoAccountLock', () => {
it('FE-HOOK-DEMOLOCK-001: locks the demo account on a demo instance', () => {
seedStore(useAuthStore, { demoMode: true, user: buildUser({ email: 'demo@trek.app' }) });
expect(renderHook(() => useDemoAccountLock()).result.current).toBe(true);
});
it('FE-HOOK-DEMOLOCK-002: knows the address the demo account had before the rename', () => {
seedStore(useAuthStore, { demoMode: true, user: buildUser({ email: 'demo@nomad.app' }) });
expect(renderHook(() => useDemoAccountLock()).result.current).toBe(true);
});
it('FE-HOOK-DEMOLOCK-003: leaves the admin of a demo instance alone', () => {
seedStore(useAuthStore, { demoMode: true, user: buildUser({ email: 'admin@trek.app', role: 'admin' }) });
expect(renderHook(() => useDemoAccountLock()).result.current).toBe(false);
});
it('FE-HOOK-DEMOLOCK-004: leaves the demo address alone on an instance that is not a demo', () => {
seedStore(useAuthStore, { demoMode: false, user: buildUser({ email: 'demo@trek.app' }) });
expect(renderHook(() => useDemoAccountLock()).result.current).toBe(false);
});
it('FE-HOOK-DEMOLOCK-005: is off while nobody is signed in', () => {
seedStore(useAuthStore, { demoMode: true, user: null });
expect(renderHook(() => useDemoAccountLock()).result.current).toBe(false);
});
});