File size: 1,728 Bytes
6c3af4e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
765119d
 
 
 
 
 
 
 
 
 
 
 
6c3af4e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
import { beforeEach, describe, expect, it, vi } from "vitest";

describe("rejectedTokens", () => {
  beforeEach(() => {
    vi.resetModules();
  });

  it("refuses a token it recorded and nothing else", async () => {
    const { addRejectedToken, isRejectedToken } = await import(
      "./rejectedTokens"
    );

    expect(isRejectedToken("a")).toBe(false);
    addRejectedToken("a");
    expect(isRejectedToken("a")).toBe(true);
    expect(isRejectedToken("b")).toBe(false);
  });

  it("counts each distinct token once, however often it is recorded", async () => {
    const { addRejectedToken, getRejectedTokenCount } = await import(
      "./rejectedTokens"
    );

    addRejectedToken("a");
    addRejectedToken("a");
    addRejectedToken("b");

    expect(getRejectedTokenCount()).toBe(2);
  });

  it("evicts the oldest token once the cap is reached, so the set stays bounded", async () => {
    const { addRejectedToken, isRejectedToken, MAX_REJECTED_TOKENS } =
      await import("./rejectedTokens");

    for (let i = 0; i <= MAX_REJECTED_TOKENS; i++) {
      addRejectedToken(`token-${i}`);
    }

    expect(isRejectedToken("token-0")).toBe(false);
    expect(isRejectedToken(`token-${MAX_REJECTED_TOKENS}`)).toBe(true);
  });

  it("does not evict anything when an already recorded token is recorded again at the cap", async () => {
    const { addRejectedToken, isRejectedToken, MAX_REJECTED_TOKENS } =
      await import("./rejectedTokens");

    for (let i = 0; i < MAX_REJECTED_TOKENS; i++) {
      addRejectedToken(`token-${i}`);
    }
    addRejectedToken("token-5");

    expect(isRejectedToken("token-0")).toBe(true);
    expect(isRejectedToken(`token-${MAX_REJECTED_TOKENS - 1}`)).toBe(true);
  });
});