62 lines
2.3 KiB
JavaScript
62 lines
2.3 KiB
JavaScript
import { describe, expect, test } from "vitest";
|
|
import { stringToBase64URL, stringFromBase64URL, stringFromUTF8, codepointToUTF8, } from "./base64url";
|
|
const EXAMPLES = [
|
|
"a",
|
|
"ab",
|
|
"abc",
|
|
"abcd",
|
|
"hello world",
|
|
"нешто на кирилица",
|
|
"something with emojis 🤙🏾 ",
|
|
"Supabaseは、オープンソースの Firebase 代替製品です。エンタープライズグレードのオープンソースツールを使って、Firebase の機能を構築しています。",
|
|
];
|
|
describe("stringToBase64URL", () => {
|
|
EXAMPLES.forEach((example) => {
|
|
test(`encode "${example}"`, () => {
|
|
expect(stringToBase64URL(example)).toEqual(Buffer.from(example).toString("base64url"));
|
|
});
|
|
});
|
|
});
|
|
describe("stringFromBase64URL", () => {
|
|
EXAMPLES.forEach((example) => {
|
|
test(`decode "${example}"`, () => {
|
|
expect(stringFromBase64URL("\r\t\n " + Buffer.from(example).toString("base64url"))).toEqual(example);
|
|
});
|
|
});
|
|
test("decode with invalid Base64-URL character", () => {
|
|
expect(() => {
|
|
stringFromBase64URL("*");
|
|
}).toThrow(new Error(`Invalid Base64-URL character "*" at position 0`));
|
|
});
|
|
});
|
|
const BAD_UTF8 = [
|
|
[0xf8], // 11111000
|
|
[0xff], // 11111111
|
|
[0x80], // 10000000
|
|
[0xf8, 1], // 11110000 00000001
|
|
[0xe0, 1], // 11100000 00000001
|
|
[0xc0, 1], // 11100000 00000001
|
|
];
|
|
describe("stringFromUTF8", () => {
|
|
BAD_UTF8.forEach((example) => {
|
|
test(`should recognize bad UTF-8 sequence ${example.map((x) => x.toString(16)).join(" ")}`, () => {
|
|
expect(() => {
|
|
const state = { utf8seq: 0, codepoint: 0 };
|
|
example.forEach((byte) => {
|
|
stringFromUTF8(byte, state, () => { });
|
|
});
|
|
}).toThrow(new Error("Invalid UTF-8 sequence"));
|
|
});
|
|
});
|
|
});
|
|
describe("codepointToUTF8", () => {
|
|
test("invalid codepoints above 0x10ffff", () => {
|
|
const invalidCodepoint = 0x10ffff + 1;
|
|
expect(() => {
|
|
codepointToUTF8(invalidCodepoint, () => {
|
|
throw new Error("Should not becalled");
|
|
});
|
|
}).toThrow(new Error(`Unrecognized Unicode codepoint: ${invalidCodepoint.toString(16)}`));
|
|
});
|
|
});
|
|
//# sourceMappingURL=base64url.test.js.map
|