/home/techb158/trellopowerup.abdallabala.com/test
Edit: /home/techb158/trellopowerup.abdallabala.com/test/assessmentAnalytics.test.mjs (5127B)
import assert from 'node:assert/strict';
import test from 'node:test';
import { buildBoardCsv, buildBoardReviewQueueFromSummary, buildBoardSummaryFromAssessments, buildReviewQueueCsv, decorateAssessment } from '../src/assessmentAnalytics.js';
const now = new Date('2026-07-07T12:00:00.000Z');
function assessment({ id, cardId = 'card-1', score, deploymentReady = true, createdAt = '2026-07-07T10:00:00.000Z' }) {
return {
id,
boardId: 'board-1',
cardId,
createdAt,
input: {
projectTypology: 'incremental',
lifecyclePhase: 'testing_evaluation',
measurementMaturity: 'measured',
risks: [{ title: 'Model drift', dimension: 'technical' }]
},
score: {
score,
status: score >= 70 ? 'high' : 'medium',
interpretation: 'Risk interpretation',
gate: {
deploymentReady,
blockingReasons: deploymentReady ? [] : ['Legal review incomplete']
}
}
};
}
test('review signal flags blocked, worsened, and stale assessments', () => {
const current = assessment({
id: 'current',
score: 75,
deploymentReady: false,
createdAt: '2026-06-01T12:00:00.000Z'
});
const previous = assessment({ id: 'previous', score: 40, createdAt: '2026-05-15T12:00:00.000Z' });
const decorated = decorateAssessment(current, previous, { now, reviewStaleDays: 30 });
assert.equal(decorated.trend, 'worse');
assert.equal(decorated.previousScore, 40);
assert.equal(decorated.scoreDelta, 35);
assert.equal(decorated.review.needed, true);
assert.equal(decorated.review.stale, true);
assert.equal(decorated.review.ageDays, 36);
assert.deepEqual(decorated.review.reasons, [
'Deployment gate blocked',
'Risk score worsened',
'Assessment older than 30 days'
]);
});
test('board summary counts review-needed and stale latest assessments', () => {
const assessments = [
assessment({ id: 'card-a-new', cardId: 'card-a', score: 75, deploymentReady: false, createdAt: '2026-06-01T12:00:00.000Z' }),
assessment({ id: 'card-a-old', cardId: 'card-a', score: 40, createdAt: '2026-05-15T12:00:00.000Z' }),
assessment({ id: 'card-b-new', cardId: 'card-b', score: 20, createdAt: '2026-07-07T10:00:00.000Z' })
];
const summary = buildBoardSummaryFromAssessments('board-1', assessments, { now, reviewStaleDays: 30 });
assert.equal(summary.cardCount, 2);
assert.equal(summary.reviewNeeded, 1);
assert.equal(summary.staleAssessments, 1);
assert.equal(summary.reviewStaleDays, 30);
assert.equal(summary.latestAssessments[0].review.needed, true);
});
test('board CSV export includes review signal columns and values', () => {
const summary = buildBoardSummaryFromAssessments('board-1', [
assessment({ id: 'card-a-new', cardId: 'card-a', score: 75, deploymentReady: false, createdAt: '2026-06-01T12:00:00.000Z' }),
assessment({ id: 'card-a-old', cardId: 'card-a', score: 40, createdAt: '2026-05-15T12:00:00.000Z' })
], { now, reviewStaleDays: 30 });
const csv = buildBoardCsv(summary);
assert.match(csv, /"review_needed","review_reasons","recommended_actions","assessment_age_days","stale_assessment"/);
assert.match(csv, /"true","Deployment gate blocked; Risk score worsened; Assessment older than 30 days","Resolve deployment gate blockers before release.; Review changed assumptions and update the mitigation plan.; Refresh the assessment and confirm current controls.","36","true"/);
});
test('board review queue returns only review-needed cards in urgency order', () => {
const summary = buildBoardSummaryFromAssessments('board-1', [
assessment({ id: 'stale-only', cardId: 'card-stale', score: 90, createdAt: '2026-06-01T12:00:00.000Z' }),
assessment({ id: 'blocked', cardId: 'card-blocked', score: 50, deploymentReady: false, createdAt: '2026-07-07T10:00:00.000Z' }),
assessment({ id: 'clear', cardId: 'card-clear', score: 20, createdAt: '2026-07-07T10:00:00.000Z' }),
assessment({ id: 'worse-new', cardId: 'card-worse', score: 70, createdAt: '2026-07-07T10:00:00.000Z' }),
assessment({ id: 'worse-old', cardId: 'card-worse', score: 40, createdAt: '2026-07-06T10:00:00.000Z' })
], { now, reviewStaleDays: 30 });
const queue = buildBoardReviewQueueFromSummary(summary);
assert.equal(queue.count, 3);
assert.deepEqual(queue.items.map((item) => item.cardId), ['card-blocked', 'card-worse', 'card-stale']);
assert.equal(queue.items.every((item) => item.review.needed), true);
});
test('review queue CSV export includes only queue items', () => {
const summary = buildBoardSummaryFromAssessments('board-1', [
assessment({ id: 'blocked', cardId: 'card-blocked', score: 50, deploymentReady: false, createdAt: '2026-07-07T10:00:00.000Z' }),
assessment({ id: 'clear', cardId: 'card-clear', score: 20, createdAt: '2026-07-07T10:00:00.000Z' })
], { now, reviewStaleDays: 30 });
const queue = buildBoardReviewQueueFromSummary(summary);
const csv = buildReviewQueueCsv(queue);
assert.match(csv, /"board_id","card_id","assessment_id"/);
assert.match(csv, /"board-1","card-blocked","blocked"/);
assert.doesNotMatch(csv, /card-clear/);
});