f96fdcb3b9
Lock health recording behind confirm-only state machines, reject public publishes for the health category, and ship the 14-day experiment Page Data templates with tests. Co-authored-by: Cursor <cursoragent@cursor.com>
56 lines
2.4 KiB
JavaScript
56 lines
2.4 KiB
JavaScript
import assert from 'node:assert/strict';
|
|
import fs from 'node:fs';
|
|
import path from 'node:path';
|
|
import test from 'node:test';
|
|
import { fileURLToPath } from 'node:url';
|
|
import { evaluatePageDataHtmlContent } from './mindspace-page-data-finish-guard.mjs';
|
|
import {
|
|
HEALTH_P0_CREATE_TABLE_SQL,
|
|
HEALTH_P0_DATASET_NAME,
|
|
assertHealthP0HtmlContract,
|
|
buildHealthP0BindSpecs,
|
|
buildHealthP0DatasetRegistration,
|
|
} from './health-p0-experiment.mjs';
|
|
import { assertSymptomRecord } from './health-symptoms.mjs';
|
|
import { isMemindHealthEnabled } from './health-feature.mjs';
|
|
|
|
const root = path.dirname(fileURLToPath(import.meta.url));
|
|
|
|
test('feature flag is off by default', () => {
|
|
assert.equal(isMemindHealthEnabled({}), false);
|
|
assert.equal(isMemindHealthEnabled({ MEMIND_HEALTH_ENABLED: 'true' }), true);
|
|
});
|
|
|
|
test('P0 dataset registration matches insert columns and split pages', () => {
|
|
const dataset = buildHealthP0DatasetRegistration();
|
|
assert.equal(dataset.name, HEALTH_P0_DATASET_NAME);
|
|
assert.ok(HEALTH_P0_CREATE_TABLE_SQL.includes('deleted_at TIMESTAMPTZ'));
|
|
assert.ok(dataset.columns.insert.includes('am_systolic'));
|
|
const binds = buildHealthP0BindSpecs({ password: '88888888' });
|
|
assert.equal(binds.participant.accessMode, 'public');
|
|
assert.equal(binds.researcher.accessMode, 'password');
|
|
assert.equal(binds.participant.datasets[HEALTH_P0_DATASET_NAME].read, false);
|
|
assert.equal(binds.researcher.datasets[HEALTH_P0_DATASET_NAME].insert, false);
|
|
});
|
|
|
|
test('P0 HTML pages satisfy Page Data contracts', () => {
|
|
const participant = fs.readFileSync(path.join(root, 'templates/health-p0-log.html'), 'utf8');
|
|
const researcher = fs.readFileSync(path.join(root, 'templates/health-p0-admin.html'), 'utf8');
|
|
assert.deepEqual(assertHealthP0HtmlContract(participant, { role: 'participant' }).issues, []);
|
|
assert.deepEqual(assertHealthP0HtmlContract(researcher, { role: 'researcher' }).issues, []);
|
|
assert.deepEqual(
|
|
evaluatePageDataHtmlContent(participant, { relativePath: 'public/health-p0-log.html' }).issues,
|
|
[],
|
|
);
|
|
assert.deepEqual(
|
|
evaluatePageDataHtmlContent(researcher, { relativePath: 'public/health-p0-admin.html' }).issues,
|
|
[],
|
|
);
|
|
});
|
|
|
|
test('symptoms require an explicit none or a severity', () => {
|
|
assert.equal(assertSymptomRecord({ code: '无' }).ok, true);
|
|
assert.equal(assertSymptomRecord({ code: 'dizziness', severity: 2 }).ok, true);
|
|
assert.equal(assertSymptomRecord({ code: 'dizziness' }).ok, false);
|
|
});
|