Second template axis (org identity: letterhead, footer, signature, margins) server-side: OrgTemplateStore with JSON version history, publish/rollback, sent-brief version pinning, admin role + capability, 5 admin endpoints, org-logo upload category. FE seam widened only (Role/Capability unions, interceptor); WP-24/26 consume it. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
32 lines
1.2 KiB
TypeScript
32 lines
1.2 KiB
TypeScript
import { describe, it, expect } from 'vitest';
|
|
import { parseMe } from './me.adapter';
|
|
|
|
describe('parseMe (trust boundary)', () => {
|
|
it('parses a known capability list', () => {
|
|
const r = parseMe({ capabilities: ['brief:approve', 'brief:reject', 'brief:send'] });
|
|
expect(r).toEqual({ ok: true, value: ['brief:approve', 'brief:reject', 'brief:send'] });
|
|
});
|
|
|
|
it('parses an empty list (drafter — no capabilities)', () => {
|
|
expect(parseMe({ capabilities: [] })).toEqual({ ok: true, value: [] });
|
|
});
|
|
|
|
it('recognizes the admin org-template capability (WP-23)', () => {
|
|
expect(parseMe({ capabilities: ['orgtemplate:edit'] })).toEqual({
|
|
ok: true,
|
|
value: ['orgtemplate:edit'],
|
|
});
|
|
});
|
|
|
|
it('drops unrecognized capability strings instead of rejecting the response', () => {
|
|
const r = parseMe({ capabilities: ['brief:approve', 'unknown:future-thing'] });
|
|
expect(r).toEqual({ ok: true, value: ['brief:approve'] });
|
|
});
|
|
|
|
it('rejects malformed responses instead of trusting them', () => {
|
|
expect(parseMe(null).ok).toBe(false);
|
|
expect(parseMe({}).ok).toBe(false);
|
|
expect(parseMe({ capabilities: 'brief:approve' }).ok).toBe(false);
|
|
});
|
|
});
|