감사 상세를 무손실 압축하고 이전 기수 정리 처리량을 개선한다
This commit is contained in:
1 parent
da79013226
commit
078b9aa205
23 files changed
+504
-95
No files matched your search
@@ -0,0 +1,54 @@
|
||||
import { gzipSync } from 'node:zlib';
|
||||
import { describe, expect, it } from 'vitest';
|
||||
import { decodeAuditDecisionSteps, encodeAuditDecisionSteps } from '../src/playAuditDecisionCodec.js';
|
||||
|
||||
describe('lossless audit decision storage', () => {
|
||||
it('compresses repeated context while preserving every value and its order', () => {
|
||||
const steps = Array.from({ length: 128 }, (_, sequence) => ({
|
||||
sequence,
|
||||
phase: 'general',
|
||||
generalId: 51,
|
||||
nationId: 3,
|
||||
cityId: 12,
|
||||
year: 190,
|
||||
month: 7,
|
||||
kind: 'RNG',
|
||||
value: sequence / 128,
|
||||
text: '판단·줄바꿈\n따옴표 " 그대로',
|
||||
empty: null,
|
||||
}));
|
||||
const stored = encodeAuditDecisionSteps(steps);
|
||||
expect(Array.isArray(stored)).toBe(false);
|
||||
expect(Buffer.byteLength(JSON.stringify(stored))).toBeLessThan(Buffer.byteLength(JSON.stringify(steps)) / 3);
|
||||
expect(decodeAuditDecisionSteps(stored)).toEqual(steps);
|
||||
});
|
||||
it('keeps tiny and historical uncompressed arrays readable', () => {
|
||||
expect(encodeAuditDecisionSteps([])).toEqual([]);
|
||||
expect(decodeAuditDecisionSteps([{ marker: 'legacy', sequence: 0 }])).toEqual([
|
||||
{ marker: 'legacy', sequence: 0 },
|
||||
]);
|
||||
});
|
||||
it('rejects unknown versions, bad base64, truncated gzip and invalid contents', () => {
|
||||
for (const value of [
|
||||
null,
|
||||
{},
|
||||
{ encoding: 'gzip-json-v2', data: '' },
|
||||
{ encoding: 'gzip-json-v1', data: '%%%' },
|
||||
{ encoding: 'gzip-json-v1', data: 'YQ==' },
|
||||
{ encoding: 'gzip-json-v1', data: gzipSync('{}').toString('base64') },
|
||||
{ encoding: 'gzip-json-v1', data: gzipSync(JSON.stringify(Array(129).fill(null))).toString('base64') },
|
||||
])
|
||||
expect(() => decodeAuditDecisionSteps(value)).toThrow();
|
||||
expect(() => encodeAuditDecisionSteps(Array(129).fill(null))).toThrow();
|
||||
});
|
||||
it('bounds decompression and preserves oversized raw records rather than truncating them', () => {
|
||||
const steps = [{ text: 'x'.repeat(16 * 1024 * 1024) }];
|
||||
expect(encodeAuditDecisionSteps(steps)).toEqual(steps);
|
||||
expect(() =>
|
||||
decodeAuditDecisionSteps({
|
||||
encoding: 'gzip-json-v1',
|
||||
data: gzipSync(JSON.stringify(steps)).toString('base64'),
|
||||
})
|
||||
).toThrow('Corrupt');
|
||||
});
|
||||
});
|
||||
Reference in new issue
Block a user