104 lines
4.4 KiB
TypeScript
104 lines
4.4 KiB
TypeScript
import test from "node:test";
|
|
import assert from "node:assert/strict";
|
|
|
|
const { parseExtraApiKeys } = await import("../../src/shared/utils/parseApiKeys.ts");
|
|
|
|
// ─── Core parsing ──────────────────────────────────────────────────────────
|
|
|
|
test("parses newline-separated keys into an added array", () => {
|
|
const result = parseExtraApiKeys("sk-key1\nsk-key2\nsk-key3", []);
|
|
assert.deepEqual(result.added, ["sk-key1", "sk-key2", "sk-key3"]);
|
|
assert.equal(result.duplicates, 0);
|
|
});
|
|
|
|
test("handles CRLF line endings", () => {
|
|
const result = parseExtraApiKeys("sk-key1\r\nsk-key2\r\nsk-key3", []);
|
|
assert.deepEqual(result.added, ["sk-key1", "sk-key2", "sk-key3"]);
|
|
assert.equal(result.duplicates, 0);
|
|
});
|
|
|
|
test("trims leading and trailing whitespace from each key", () => {
|
|
const result = parseExtraApiKeys(" sk-key1 \n\t sk-key2 \t\n sk-key3", []);
|
|
assert.deepEqual(result.added, ["sk-key1", "sk-key2", "sk-key3"]);
|
|
assert.equal(result.duplicates, 0);
|
|
});
|
|
|
|
// ─── Empty / blank line handling ───────────────────────────────────────────
|
|
|
|
test("ignores blank lines between keys", () => {
|
|
const result = parseExtraApiKeys("sk-key1\n\n\nsk-key2\n\n", []);
|
|
assert.deepEqual(result.added, ["sk-key1", "sk-key2"]);
|
|
assert.equal(result.duplicates, 0);
|
|
});
|
|
|
|
test("ignores whitespace-only lines", () => {
|
|
const result = parseExtraApiKeys("sk-key1\n \n\t\nsk-key2", []);
|
|
assert.deepEqual(result.added, ["sk-key1", "sk-key2"]);
|
|
assert.equal(result.duplicates, 0);
|
|
});
|
|
|
|
test("returns empty result for an empty string", () => {
|
|
const result = parseExtraApiKeys("", []);
|
|
assert.deepEqual(result.added, []);
|
|
assert.equal(result.duplicates, 0);
|
|
});
|
|
|
|
test("returns empty result for a whitespace-only string", () => {
|
|
const result = parseExtraApiKeys(" \n \n ", []);
|
|
assert.deepEqual(result.added, []);
|
|
assert.equal(result.duplicates, 0);
|
|
});
|
|
|
|
// ─── Single key ────────────────────────────────────────────────────────────
|
|
|
|
test("handles a single key with no newlines", () => {
|
|
const result = parseExtraApiKeys("sk-onlyone", []);
|
|
assert.deepEqual(result.added, ["sk-onlyone"]);
|
|
assert.equal(result.duplicates, 0);
|
|
});
|
|
|
|
// ─── Duplicate detection ───────────────────────────────────────────────────
|
|
|
|
test("counts duplicates against the existing keys list", () => {
|
|
const result = parseExtraApiKeys("sk-key1\nsk-key2", ["sk-key1"]);
|
|
assert.deepEqual(result.added, ["sk-key2"]);
|
|
assert.equal(result.duplicates, 1);
|
|
});
|
|
|
|
test("deduplicates repeated keys within the pasted input", () => {
|
|
const result = parseExtraApiKeys("sk-key1\nsk-key2\nsk-key1", []);
|
|
assert.deepEqual(result.added, ["sk-key1", "sk-key2"]);
|
|
assert.equal(result.duplicates, 1);
|
|
});
|
|
|
|
test("counts a key appearing three times in input as two duplicates", () => {
|
|
const result = parseExtraApiKeys("sk-abc\nsk-abc\nsk-abc", []);
|
|
assert.deepEqual(result.added, ["sk-abc"]);
|
|
assert.equal(result.duplicates, 2);
|
|
});
|
|
|
|
test("returns empty added array when all pasted keys already exist", () => {
|
|
const result = parseExtraApiKeys("sk-key1\nsk-key2", ["sk-key1", "sk-key2"]);
|
|
assert.deepEqual(result.added, []);
|
|
assert.equal(result.duplicates, 2);
|
|
});
|
|
|
|
test("handles a mix of new keys and duplicates from existing list", () => {
|
|
const result = parseExtraApiKeys("sk-old\nsk-new1\nsk-old\nsk-new2", ["sk-old"]);
|
|
assert.deepEqual(result.added, ["sk-new1", "sk-new2"]);
|
|
assert.equal(result.duplicates, 2); // sk-old appears in existing AND is repeated in paste
|
|
});
|
|
|
|
// ─── Existing list edge cases ──────────────────────────────────────────────
|
|
|
|
test("works correctly when existing list is empty", () => {
|
|
const result = parseExtraApiKeys("sk-a\nsk-b", []);
|
|
assert.deepEqual(result.added, ["sk-a", "sk-b"]);
|
|
assert.equal(result.duplicates, 0);
|
|
});
|
|
|
|
test("preserves insertion order for added keys", () => {
|
|
const result = parseExtraApiKeys("sk-z\nsk-a\nsk-m", []);
|
|
assert.deepEqual(result.added, ["sk-z", "sk-a", "sk-m"]);
|
|
});
|