397777089e
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
39 lines
1.9 KiB
JavaScript
39 lines
1.9 KiB
JavaScript
import { describe, it, expect } from 'vitest';
|
|
import { buildVerifyReceipt } from './produce-verify-receipt.mjs';
|
|
import { verifyReceiptSig } from './verify-receipt.mjs';
|
|
|
|
const KEY = 'signer-key';
|
|
const FP = 'a'.repeat(64);
|
|
|
|
describe('buildVerifyReceipt (producer pure core)', () => {
|
|
it('сюита не прошла → {ok:false, reason:suite-not-passed}, расписки нет', () => {
|
|
expect(buildVerifyReceipt({ codeFingerprint: FP, suitePassed: false, signerKey: KEY }))
|
|
.toEqual({ ok: false, reason: 'suite-not-passed' });
|
|
});
|
|
it('нет ключа подписанта → {ok:false, reason:no-signer-key} (fail-CLOSE)', () => {
|
|
expect(buildVerifyReceipt({ codeFingerprint: FP, suitePassed: true, signerKey: '' }))
|
|
.toEqual({ ok: false, reason: 'no-signer-key' });
|
|
});
|
|
it('сюита прошла + ключ → подписанная расписка occurrence=lastOccurrence+1', () => {
|
|
const r = buildVerifyReceipt({ codeFingerprint: FP, suitePassed: true, lastOccurrence: 4, signerKey: KEY });
|
|
expect(r.ok).toBe(true);
|
|
expect(r.receipt.occurrence).toBe(5);
|
|
expect(r.receipt.code_fingerprint).toBe(FP);
|
|
expect(verifyReceiptSig(r.receipt, KEY)).toBe(true);
|
|
});
|
|
});
|
|
|
|
import { stagedFingerprint } from './produce-verify-receipt.mjs';
|
|
|
|
describe('stagedFingerprint (детерминирован, порядок файлов не важен)', () => {
|
|
it('одинаковая карта {путь:содержимое} → одинаковый хеш независимо от порядка', () => {
|
|
const a = stagedFingerprint({ 'b.js': '2', 'a.js': '1' });
|
|
const b = stagedFingerprint({ 'a.js': '1', 'b.js': '2' });
|
|
expect(a).toBe(b);
|
|
expect(a).toMatch(/^[0-9a-f]{64}$/);
|
|
});
|
|
it('изменение содержимого → другой хеш', () => {
|
|
expect(stagedFingerprint({ 'a.js': '1' })).not.toBe(stagedFingerprint({ 'a.js': '2' }));
|
|
});
|
|
});
|