38 lines
1.5 KiB
TypeScript
38 lines
1.5 KiB
TypeScript
import { describe, expect, it } from 'vitest';
|
|
|
|
import { createApiInputPayloadIdentity } from '../src/inputEventBoundary.js';
|
|
|
|
describe('API input-event payload identity', () => {
|
|
it('hashes canonical JSON independently of object key order', () => {
|
|
expect(
|
|
createApiInputPayloadIdentity({
|
|
second: [{ z: true, a: 1 }],
|
|
first: 'value',
|
|
})
|
|
).toEqual(
|
|
createApiInputPayloadIdentity({
|
|
first: 'value',
|
|
second: [{ a: 1, z: true }],
|
|
})
|
|
);
|
|
});
|
|
|
|
it('distinguishes changed values and array order', () => {
|
|
const original = createApiInputPayloadIdentity({ value: 1, items: ['a', 'b'] });
|
|
expect(createApiInputPayloadIdentity({ value: 2, items: ['a', 'b'] })).not.toEqual(original);
|
|
expect(createApiInputPayloadIdentity({ value: 1, items: ['b', 'a'] })).not.toEqual(original);
|
|
});
|
|
|
|
it('stores only a bounded digest envelope for a large or private payload', () => {
|
|
const privatePayload = { dataUrl: `data:image/png;base64,${'A'.repeat(100_000)}`, text: 'private-message' };
|
|
const identity = createApiInputPayloadIdentity(privatePayload);
|
|
|
|
expect(identity).toEqual({
|
|
version: 1,
|
|
digest: expect.stringMatching(/^sha256:[0-9a-f]{64}$/u),
|
|
});
|
|
expect(JSON.stringify(identity)).not.toContain('private-message');
|
|
expect(JSON.stringify(identity).length).toBeLessThan(128);
|
|
});
|
|
});
|