48 lines
2.9 KiB
JavaScript
48 lines
2.9 KiB
JavaScript
import test from 'node:test';
|
|||
|
|
import assert from 'node:assert/strict';
|
||
|
|
import { familyControlMode, familyControlReady, familyControlDangerous } from '../src/pages/family-control-policy.ts';
|
||
|
|
|
||
|
|
const draft = kind => ({ kind, acknowledged: false, confirmation: '' });
|
||
|
|
|
||
|
|
test('ordinary saves and authorized media access can execute without a second acknowledgement', () => {
|
||
|
|
for (const kind of ['household_create', 'fact_create', 'subject_update', 'device_twin_update', 'invitation_create', 'recording_play_address', 'recording_download_address', 'privacy_access_request', 'privacy_export_download', 'firmware_release_resume']) {
|
||
|
|
assert.equal(familyControlMode(kind), 'direct');
|
||
|
|
assert.equal(familyControlReady(draft(kind)), true);
|
||
|
|
assert.equal(familyControlDangerous(kind), false);
|
||
|
|
}
|
||
|
|
});
|
||
|
|
|
||
|
|
test('permission and device-impact actions still require a review surface', () => {
|
||
|
|
for (const kind of ['invitation_accept', 'recording_access_grant', 'sharing_grant_create', 'privacy_export_request', 'member_remove', 'consent_withdraw', 'firmware_key_register', 'firmware_key_revoke', 'firmware_rollout_start', 'firmware_release_retire', 'firmware_pause', 'firmware_rollback', 'device_diagnostics']) {
|
||
|
|
assert.equal(familyControlMode(kind), 'review', kind);
|
||
|
|
}
|
||
|
|
});
|
||
|
|
|
||
|
|
test('creating a subject never silently accepts data consent', () => {
|
||
|
|
assert.equal(familyControlMode('subject_create'), 'consent');
|
||
|
|
assert.equal(familyControlReady(draft('subject_create')), false);
|
||
|
|
assert.equal(familyControlReady({ ...draft('subject_create'), acknowledged: true }), true);
|
||
|
|
});
|
||
|
|
|
||
|
|
test('ownership transfer requires the exact named recipient, while removal needs a single review', () => {
|
||
|
|
const transfer = { ...draft('ownership_transfer'), item: { display_name: '测试家人' } };
|
||
|
|
assert.equal(familyControlMode(transfer.kind), 'typed');
|
||
|
|
for (const confirmation of ['', '测试', '另一位家人']) assert.equal(familyControlReady({ ...transfer, confirmation }), false);
|
||
|
|
assert.equal(familyControlReady({ ...transfer, confirmation: '测试家人' }), true);
|
||
|
|
assert.equal(familyControlReady({ ...transfer, confirmation: ' 测试家人 ' }), true);
|
||
|
|
assert.equal(familyControlReady({ ...draft('member_remove'), item: transfer.item }), true);
|
||
|
|
});
|
||
|
|
|
||
|
|
test('unchanged roles cannot be submitted even after confirming', () => {
|
||
|
|
const role = { ...draft('member_role_change'), item: { role: 'viewer' }, targetRole: 'viewer', acknowledged: true };
|
||
|
|
assert.equal(familyControlReady(role), false);
|
||
|
|
assert.equal(familyControlReady({ ...role, targetRole: 'editor', acknowledged: false }), true);
|
||
|
|
});
|
||
|
|
|
||
|
|
test('danger styling distinguishes granting access from losing it', () => {
|
||
|
|
assert.equal(familyControlDangerous('recording_access_grant'), false);
|
||
|
|
assert.equal(familyControlDangerous('recording_access_revoke'), true);
|
||
|
|
assert.equal(familyControlDangerous('ownership_transfer'), true);
|
||
|
|
assert.equal(familyControlDangerous('firmware_release_retire'), true);
|
||
|
|
});
|