mirror of
https://github.com/Sendouc/sendou.ink.git
synced 2026-10-01 15:48:23 -05:00
Move app to apps/web-react in pnpm workspace layout
This commit is contained in:
63
apps/web-react/app/utils/compression.test.ts
Normal file
63
apps/web-react/app/utils/compression.test.ts
Normal file
@@ -0,0 +1,63 @@
|
||||
import { describe, expect, test } from "vitest";
|
||||
import { compressToBase64, decompressFromBase64 } from "./compression";
|
||||
|
||||
describe("compressToBase64 & decompressFromBase64", () => {
|
||||
test("round-trips a string", () => {
|
||||
const value = JSON.stringify({ name: "trophy", mesh: [1, 2, 3] });
|
||||
|
||||
expect(decompressFromBase64(compressToBase64(value))).toBe(value);
|
||||
});
|
||||
|
||||
test("decompresses raw deflate produced by another implementation", () => {
|
||||
const compressed = "q1bKS8xNVbJSKinKL8ioVNJRyk0tzlCyijbUMdIxjq0FAA==";
|
||||
|
||||
expect(decompressFromBase64(compressed)).toBe(
|
||||
JSON.stringify({ name: "trophy", mesh: [1, 2, 3] }),
|
||||
);
|
||||
});
|
||||
|
||||
test("round-trips unicode content", () => {
|
||||
const value = "tröphy \u{1f3c6} テスト";
|
||||
|
||||
expect(decompressFromBase64(compressToBase64(value))).toBe(value);
|
||||
});
|
||||
|
||||
test("round-trips with the url safe alphabet", () => {
|
||||
const value = "a".repeat(1000) + JSON.stringify({ b: [4, 5, 6] });
|
||||
const compressed = compressToBase64(value, { urlSafe: true });
|
||||
|
||||
expect(compressed).not.toMatch(/[+/=]/);
|
||||
expect(decompressFromBase64(compressed)).toBe(value);
|
||||
});
|
||||
|
||||
test("returns null for corrupt input", () => {
|
||||
expect(decompressFromBase64("!!!not base64!!!")).toBeNull();
|
||||
expect(decompressFromBase64(btoa("not deflate data"))).toBeNull();
|
||||
expect(decompressFromBase64("")).toBeNull();
|
||||
});
|
||||
|
||||
test("returns null for truncated input", () => {
|
||||
const compressed = compressToBase64("some longer input to compress");
|
||||
|
||||
expect(decompressFromBase64(compressed.slice(0, 4))).toBeNull();
|
||||
});
|
||||
|
||||
test("returns null for a value inflating past maxDecompressedBytes", () => {
|
||||
const bomb = compressToBase64("a".repeat(10 * 1024 * 1024));
|
||||
|
||||
expect(bomb.length).toBeLessThan(64 * 1024);
|
||||
expect(
|
||||
decompressFromBase64(bomb, { maxDecompressedBytes: 64 * 1024 }),
|
||||
).toBeNull();
|
||||
});
|
||||
|
||||
test("allows a value exactly at maxDecompressedBytes", () => {
|
||||
const value = "a".repeat(1024);
|
||||
|
||||
expect(
|
||||
decompressFromBase64(compressToBase64(value), {
|
||||
maxDecompressedBytes: 1024,
|
||||
}),
|
||||
).toBe(value);
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user