102 lines
3.3 KiB
JavaScript
102 lines
3.3 KiB
JavaScript
import assert from 'node:assert/strict';
|
|
import test from 'node:test';
|
|
import {
|
|
assessmentReady,
|
|
diagnosticReady,
|
|
forces,
|
|
newCompetitivenessDraft,
|
|
readCompetitivenessDraft,
|
|
} from '../../resources/js/lib/cluster-competitiveness.ts';
|
|
|
|
function complete() {
|
|
const draft = newCompetitivenessDraft('cluster-a', 'Energia');
|
|
draft.region = 'Distrito de demonstração';
|
|
for (const force of forces)
|
|
Object.assign(draft.forces[force], {
|
|
pressure: 'medium',
|
|
evidence: 'Observação de demonstração',
|
|
source: 'Fonte de demonstração, p. 2',
|
|
period: '2025',
|
|
rationale: 'Pressão fundamentada na observação',
|
|
limitations: 'Amostra parcial',
|
|
opportunity: 'Investigar capacidade de armazenamento',
|
|
});
|
|
return draft;
|
|
}
|
|
|
|
void test('ausência de dados permanece indeterminada nas cinco forças independentes', () => {
|
|
const draft = newCompetitivenessDraft('cluster-a', 'Energia');
|
|
assert.equal(forces.length, 5);
|
|
assert.equal(diagnosticReady(draft), false);
|
|
draft.forces.buyers.evidence = 'Observação';
|
|
assert.equal(draft.forces.suppliers.evidence, '');
|
|
assert.ok(forces.every((force) => draft.forces[force].pressure === ''));
|
|
});
|
|
|
|
void test('classificação exige todos os fundamentos; âmbito é necessário para o diagnóstico', () => {
|
|
const draft = complete();
|
|
assert.equal(diagnosticReady(draft), true);
|
|
for (const field of [
|
|
'evidence',
|
|
'source',
|
|
'period',
|
|
'rationale',
|
|
'limitations',
|
|
'opportunity',
|
|
]) {
|
|
const row = { ...draft.forces.buyers, [field]: ' ' };
|
|
assert.equal(assessmentReady(row), false, field);
|
|
}
|
|
draft.region = '';
|
|
assert.equal(diagnosticReady(draft), false);
|
|
});
|
|
|
|
void test('ficheiro conserva rascunhos, dados e incertezas sem modificar o original', () => {
|
|
const draft = complete();
|
|
draft.forces.entrants.pressure = '';
|
|
const restored = readCompetitivenessDraft(
|
|
JSON.stringify(draft),
|
|
'cluster-a',
|
|
);
|
|
assert.deepEqual(restored, draft);
|
|
restored.forces.buyers.source = 'Outra fonte';
|
|
assert.notEqual(restored.forces.buyers.source, draft.forces.buyers.source);
|
|
assert.equal(diagnosticReady(restored), false);
|
|
});
|
|
|
|
void test('recuperação rejeita outro cluster, versões, forças ausentes e campos inválidos', () => {
|
|
assert.throws(() =>
|
|
readCompetitivenessDraft(JSON.stringify(complete()), 'cluster-b'),
|
|
);
|
|
for (const mutate of [
|
|
(d) => {
|
|
d.version = 2;
|
|
},
|
|
(d) => {
|
|
delete d.forces.buyers;
|
|
},
|
|
(d) => {
|
|
d.forces.buyers.pressure = 'zero';
|
|
},
|
|
(d) => {
|
|
d.forces.buyers.source = 42;
|
|
},
|
|
(d) => {
|
|
d.forces.buyers.source = 'x'.repeat(5001);
|
|
},
|
|
(d) => {
|
|
d.region = null;
|
|
},
|
|
]) {
|
|
const draft = complete();
|
|
mutate(draft);
|
|
assert.throws(() =>
|
|
readCompetitivenessDraft(JSON.stringify(draft), 'cluster-a'),
|
|
);
|
|
}
|
|
assert.throws(() => readCompetitivenessDraft('null', 'cluster-a'));
|
|
assert.throws(() =>
|
|
readCompetitivenessDraft('x'.repeat(250001), 'cluster-a'),
|
|
);
|
|
});
|