api-key-vacuum-filter-build.test.ts 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. import { describe, expect, test, vi } from "vitest";
  2. describe("buildVacuumFilterFromKeyStrings", () => {
  3. test("应去重并忽略空字符串,且覆盖所有 key", async () => {
  4. const { buildVacuumFilterFromKeyStrings } = await import(
  5. "@/lib/security/api-key-vacuum-filter"
  6. );
  7. const vf = buildVacuumFilterFromKeyStrings({
  8. keyStrings: ["k1", "k2", "k1", ""],
  9. fingerprintBits: 32,
  10. maxKickSteps: 500,
  11. seed: Buffer.from("unit-test-seed"),
  12. });
  13. expect(vf.size()).toBe(2);
  14. expect(vf.has("k1")).toBe(true);
  15. expect(vf.has("k2")).toBe(true);
  16. });
  17. test("空数组输入:应返回空 filter", async () => {
  18. const { buildVacuumFilterFromKeyStrings } = await import(
  19. "@/lib/security/api-key-vacuum-filter"
  20. );
  21. const vf = buildVacuumFilterFromKeyStrings({
  22. keyStrings: [],
  23. fingerprintBits: 32,
  24. maxKickSteps: 500,
  25. seed: Buffer.from("unit-test-seed"),
  26. });
  27. expect(vf.size()).toBe(0);
  28. });
  29. test("全空字符串:应返回空 filter", async () => {
  30. const { buildVacuumFilterFromKeyStrings } = await import(
  31. "@/lib/security/api-key-vacuum-filter"
  32. );
  33. const vf = buildVacuumFilterFromKeyStrings({
  34. keyStrings: ["", "", ""],
  35. fingerprintBits: 32,
  36. maxKickSteps: 500,
  37. seed: Buffer.from("unit-test-seed"),
  38. });
  39. expect(vf.size()).toBe(0);
  40. });
  41. test("构建失败时应扩容重试", async () => {
  42. vi.resetModules();
  43. const maxItemsSeen: number[] = [];
  44. vi.doMock("@/lib/vacuum-filter/vacuum-filter", () => {
  45. class VacuumFilter {
  46. private readonly maxItems: number;
  47. constructor(options: { maxItems: number }) {
  48. this.maxItems = options.maxItems;
  49. maxItemsSeen.push(options.maxItems);
  50. }
  51. add(_keyString: string): boolean {
  52. // 强制第一次失败(maxItems=128),第二次成功(maxItems=ceil(128*1.6)=205)
  53. return this.maxItems >= 205;
  54. }
  55. }
  56. return { VacuumFilter };
  57. });
  58. const { buildVacuumFilterFromKeyStrings } = await import(
  59. "@/lib/security/api-key-vacuum-filter"
  60. );
  61. buildVacuumFilterFromKeyStrings({
  62. keyStrings: ["k1"],
  63. fingerprintBits: 32,
  64. maxKickSteps: 500,
  65. seed: Buffer.from("unit-test-seed"),
  66. });
  67. expect(maxItemsSeen).toEqual([128, 205]);
  68. vi.doUnmock("@/lib/vacuum-filter/vacuum-filter");
  69. vi.resetModules();
  70. });
  71. });