File size: 2,364 Bytes
91ee702
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
import { describe, it, expect, vi, beforeEach, afterEach } from "vitest";

vi.mock("../../config.js", () => ({
  getConfig: vi.fn(() => ({
    session: { ttl_minutes: 1, cleanup_interval_minutes: 1 },
  })),
}));

import {
  createSession,
  validateSession,
  deleteSession,
  getSessionCount,
  startSessionCleanup,
  stopSessionCleanup,
  _resetForTest,
} from "../dashboard-session.js";

beforeEach(() => {
  _resetForTest();
});

afterEach(() => {
  stopSessionCleanup();
  _resetForTest();
});

describe("dashboard-session", () => {
  it("createSession returns a session with id", () => {
    const session = createSession();
    expect(session.id).toBeTruthy();
    expect(typeof session.id).toBe("string");
    expect(session.expiresAt).toBeGreaterThan(Date.now());
  });

  it("validateSession returns true for valid session", () => {
    const session = createSession();
    expect(validateSession(session.id)).toBe(true);
  });

  it("validateSession returns false for nonexistent session", () => {
    expect(validateSession("nonexistent")).toBe(false);
  });

  it("validateSession returns false for expired session", () => {
    const session = createSession();
    // Manually expire it
    vi.spyOn(Date, "now").mockReturnValue(session.expiresAt + 1);
    expect(validateSession(session.id)).toBe(false);
    vi.restoreAllMocks();
  });

  it("deleteSession invalidates the session", () => {
    const session = createSession();
    expect(validateSession(session.id)).toBe(true);
    deleteSession(session.id);
    expect(validateSession(session.id)).toBe(false);
  });

  it("getSessionCount tracks correctly", () => {
    expect(getSessionCount()).toBe(0);
    createSession();
    createSession();
    expect(getSessionCount()).toBe(2);
  });

  it("cleanup removes expired sessions", () => {
    vi.useFakeTimers();
    const baseTime = Date.now();

    const s1 = createSession();
    const s2 = createSession();
    expect(getSessionCount()).toBe(2);

    // Expire both sessions (ttl_minutes=1 → 60_000ms)
    vi.setSystemTime(baseTime + 60_001);

    // Start cleanup and advance to trigger interval (cleanup_interval_minutes=1 → 60_000ms)
    startSessionCleanup();
    vi.advanceTimersByTime(60_001);

    expect(validateSession(s1.id)).toBe(false);
    expect(validateSession(s2.id)).toBe(false);

    vi.useRealTimers();
  });
});