| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255 |
- import { describe, expect, test, vi } from "vitest";
- vi.mock("@/lib/logger", () => ({
- logger: {
- trace: vi.fn(),
- debug: vi.fn(),
- info: vi.fn(),
- warn: vi.fn(),
- error: vi.fn(),
- },
- }));
- import {
- getSessionDisplayStatus,
- SESSION_DISPLAY_STATUS,
- type SessionStatusInput,
- } from "@/lib/session-status";
- describe("Session Status Logic", () => {
- describe("getSessionDisplayStatus", () => {
- test("IDLE: concurrentCount is 0 with no requests", () => {
- const input: SessionStatusInput = {
- concurrentCount: 0,
- requestCount: 0,
- status: "completed",
- };
- const result = getSessionDisplayStatus(input);
- expect(result.status).toBe(SESSION_DISPLAY_STATUS.IDLE);
- expect(result.label).toBe("IDLE");
- expect(result.pulse).toBe(false);
- expect(result.tooltipKey).toBe("status.idleTooltip");
- });
- test("IDLE: concurrentCount is 0 with completed requests", () => {
- const input: SessionStatusInput = {
- concurrentCount: 0,
- requestCount: 5,
- status: "completed",
- };
- const result = getSessionDisplayStatus(input);
- expect(result.status).toBe(SESSION_DISPLAY_STATUS.IDLE);
- expect(result.label).toBe("IDLE");
- expect(result.pulse).toBe(false);
- });
- test("INITIALIZING: first request still running (requestCount=0, concurrentCount>0)", () => {
- const input: SessionStatusInput = {
- concurrentCount: 1,
- requestCount: 0,
- status: "in_progress",
- };
- const result = getSessionDisplayStatus(input);
- expect(result.status).toBe(SESSION_DISPLAY_STATUS.INITIALIZING);
- expect(result.label).toBe("INIT");
- expect(result.pulse).toBe(true);
- expect(result.tooltipKey).toBe("status.initializingTooltip");
- expect(result.color).toContain("amber");
- });
- test("INITIALIZING: first request still running (requestCount=1, concurrentCount>0)", () => {
- const input: SessionStatusInput = {
- concurrentCount: 1,
- requestCount: 1,
- status: "in_progress",
- };
- const result = getSessionDisplayStatus(input);
- expect(result.status).toBe(SESSION_DISPLAY_STATUS.INITIALIZING);
- expect(result.label).toBe("INIT");
- expect(result.pulse).toBe(true);
- });
- test("IN_PROGRESS: has active requests after first (requestCount>1, concurrentCount>0)", () => {
- const input: SessionStatusInput = {
- concurrentCount: 2,
- requestCount: 5,
- status: "in_progress",
- };
- const result = getSessionDisplayStatus(input);
- expect(result.status).toBe(SESSION_DISPLAY_STATUS.IN_PROGRESS);
- expect(result.label).toBe("BUSY");
- expect(result.pulse).toBe(true);
- expect(result.tooltipKey).toBe("status.inProgressTooltip");
- expect(result.color).toContain("emerald");
- });
- test("IN_PROGRESS: single active request after first completed", () => {
- const input: SessionStatusInput = {
- concurrentCount: 1,
- requestCount: 2,
- status: "in_progress",
- };
- const result = getSessionDisplayStatus(input);
- expect(result.status).toBe(SESSION_DISPLAY_STATUS.IN_PROGRESS);
- expect(result.label).toBe("BUSY");
- expect(result.pulse).toBe(true);
- });
- test("ERROR: status is error takes priority", () => {
- const input: SessionStatusInput = {
- concurrentCount: 1,
- requestCount: 3,
- status: "error",
- };
- const result = getSessionDisplayStatus(input);
- expect(result.status).toBe(SESSION_DISPLAY_STATUS.IN_PROGRESS);
- expect(result.label).toBe("FAIL");
- expect(result.pulse).toBe(true);
- expect(result.tooltipKey).toBe("status.errorTooltip");
- expect(result.color).toContain("rose");
- });
- test("ERROR: status is error even with no concurrent requests", () => {
- const input: SessionStatusInput = {
- concurrentCount: 0,
- requestCount: 5,
- status: "error",
- };
- const result = getSessionDisplayStatus(input);
- expect(result.label).toBe("FAIL");
- expect(result.pulse).toBe(true);
- });
- test("handles undefined values with defaults", () => {
- const input: SessionStatusInput = {};
- const result = getSessionDisplayStatus(input);
- expect(result.status).toBe(SESSION_DISPLAY_STATUS.IDLE);
- expect(result.label).toBe("IDLE");
- expect(result.pulse).toBe(false);
- });
- test("handles partial input with only concurrentCount", () => {
- const input: SessionStatusInput = {
- concurrentCount: 1,
- };
- const result = getSessionDisplayStatus(input);
- expect(result.status).toBe(SESSION_DISPLAY_STATUS.INITIALIZING);
- expect(result.label).toBe("INIT");
- });
- test("handles partial input with only requestCount", () => {
- const input: SessionStatusInput = {
- requestCount: 10,
- };
- const result = getSessionDisplayStatus(input);
- expect(result.status).toBe(SESSION_DISPLAY_STATUS.IDLE);
- expect(result.label).toBe("IDLE");
- });
- test("high concurrency scenario", () => {
- const input: SessionStatusInput = {
- concurrentCount: 50,
- requestCount: 100,
- status: "in_progress",
- };
- const result = getSessionDisplayStatus(input);
- expect(result.status).toBe(SESSION_DISPLAY_STATUS.IN_PROGRESS);
- expect(result.label).toBe("BUSY");
- expect(result.pulse).toBe(true);
- });
- });
- describe("SESSION_DISPLAY_STATUS constants", () => {
- test("constants are uppercase strings", () => {
- expect(SESSION_DISPLAY_STATUS.IN_PROGRESS).toBe("IN_PROGRESS");
- expect(SESSION_DISPLAY_STATUS.IDLE).toBe("IDLE");
- expect(SESSION_DISPLAY_STATUS.INITIALIZING).toBe("INITIALIZING");
- });
- test("constants are readonly", () => {
- expect(Object.isFrozen(SESSION_DISPLAY_STATUS)).toBe(false);
- expect(typeof SESSION_DISPLAY_STATUS).toBe("object");
- });
- });
- describe("status transition scenarios", () => {
- test("session lifecycle: new -> initializing -> in_progress -> idle", () => {
- // New session, no requests yet
- const newSession: SessionStatusInput = {
- concurrentCount: 0,
- requestCount: 0,
- };
- expect(getSessionDisplayStatus(newSession).status).toBe(SESSION_DISPLAY_STATUS.IDLE);
- // First request starts
- const initializing: SessionStatusInput = {
- concurrentCount: 1,
- requestCount: 0,
- };
- expect(getSessionDisplayStatus(initializing).status).toBe(
- SESSION_DISPLAY_STATUS.INITIALIZING
- );
- // First request completes, second starts
- const inProgress: SessionStatusInput = {
- concurrentCount: 1,
- requestCount: 2,
- };
- expect(getSessionDisplayStatus(inProgress).status).toBe(SESSION_DISPLAY_STATUS.IN_PROGRESS);
- // All requests complete
- const idle: SessionStatusInput = {
- concurrentCount: 0,
- requestCount: 10,
- };
- expect(getSessionDisplayStatus(idle).status).toBe(SESSION_DISPLAY_STATUS.IDLE);
- });
- test("error can occur at any stage", () => {
- const errorDuringInit: SessionStatusInput = {
- concurrentCount: 1,
- requestCount: 0,
- status: "error",
- };
- expect(getSessionDisplayStatus(errorDuringInit).label).toBe("FAIL");
- const errorDuringProgress: SessionStatusInput = {
- concurrentCount: 3,
- requestCount: 10,
- status: "error",
- };
- expect(getSessionDisplayStatus(errorDuringProgress).label).toBe("FAIL");
- const errorAfterComplete: SessionStatusInput = {
- concurrentCount: 0,
- requestCount: 5,
- status: "error",
- };
- expect(getSessionDisplayStatus(errorAfterComplete).label).toBe("FAIL");
- });
- });
- });
|