Files
Termix/src/backend/tests/hosts/terminal/session-manager.test.ts
T

153 lines
4.1 KiB
TypeScript
Raw Normal View History

+2
2026-06-16 15:59:53 -05:00
import { describe, it, expect, vi, beforeEach } from "vitest";
// Stub all external imports before loading the module under test
+8
2026-07-19 12:29:52 -05:00
const mockCreate = vi.fn().mockResolvedValue({ id: 1 });
const mockUpdateEnded = vi.fn().mockResolvedValue(undefined);
+2
2026-06-16 15:59:53 -05:00
+8
2026-07-19 12:29:52 -05:00
vi.mock("../../../database/db/index.js", () => ({
getDb: () => ({}),
}));
vi.mock("../../../database/repositories/factory.js", () => ({
createCurrentSessionRecordingRepository: () => ({
create: mockCreate,
updateEnded: mockUpdateEnded,
+2
2026-06-16 15:59:53 -05:00
}),
}));
+8
2026-07-19 12:29:52 -05:00
vi.mock("../../../utils/logger.js", () => ({
+2
2026-06-16 15:59:53 -05:00
sshLogger: {
info: vi.fn(),
warn: vi.fn(),
error: vi.fn(),
debug: vi.fn(),
},
}));
// Mock individual fs.promises methods via a stub object
const mockMkdir = vi.fn().mockResolvedValue(undefined);
const mockWriteFile = vi.fn().mockResolvedValue(undefined);
+8
2026-07-19 12:29:52 -05:00
const mockAppendFile = vi.fn().mockResolvedValue(undefined);
const mockUnlink = vi.fn().mockResolvedValue(undefined);
+2
2026-06-16 15:59:53 -05:00
vi.mock("fs", () => ({
default: {
promises: {
mkdir: mockMkdir,
writeFile: mockWriteFile,
+8
2026-07-19 12:29:52 -05:00
appendFile: mockAppendFile,
+2
2026-06-16 15:59:53 -05:00
readFile: vi.fn(),
+8
2026-07-19 12:29:52 -05:00
unlink: mockUnlink,
+2
2026-06-16 15:59:53 -05:00
},
},
promises: {
mkdir: mockMkdir,
writeFile: mockWriteFile,
+8
2026-07-19 12:29:52 -05:00
appendFile: mockAppendFile,
+2
2026-06-16 15:59:53 -05:00
readFile: vi.fn(),
+8
2026-07-19 12:29:52 -05:00
unlink: mockUnlink,
+2
2026-06-16 15:59:53 -05:00
},
}));
+8
2026-07-19 12:29:52 -05:00
const { sessionManager } =
await import("../../../hosts/terminal/session-manager.js");
+2
2026-06-16 15:59:53 -05:00
describe("TerminalSessionManager - session logging", () => {
beforeEach(() => {
vi.clearAllMocks();
// Re-apply resolved values after clearAllMocks
mockMkdir.mockResolvedValue(undefined);
mockWriteFile.mockResolvedValue(undefined);
+8
2026-07-19 12:29:52 -05:00
mockCreate.mockResolvedValue({ id: 1 });
mockUpdateEnded.mockResolvedValue(undefined);
+2
2026-06-16 15:59:53 -05:00
});
it("createSession stores sessionLoggingEnabled=true by default", () => {
const id = sessionManager.createSession("u1", 1, "host", 80, 24);
const session = sessionManager.getSession(id);
expect(session?.sessionLoggingEnabled).toBe(true);
sessionManager.destroySession(id);
});
it("createSession stores sessionLoggingEnabled=false when passed", () => {
const id = sessionManager.createSession(
"u1",
1,
"host",
80,
24,
undefined,
false,
);
const session = sessionManager.getSession(id);
expect(session?.sessionLoggingEnabled).toBe(false);
sessionManager.destroySession(id);
});
it("does not write log file when sessionLoggingEnabled=false", async () => {
const id = sessionManager.createSession(
"u1",
1,
"host",
80,
24,
undefined,
false,
);
sessionManager.bufferOutput(id, "some output");
sessionManager.destroySession(id);
await new Promise((r) => setTimeout(r, 20));
expect(mockWriteFile).not.toHaveBeenCalled();
});
it("writes log file and inserts DB row when sessionLoggingEnabled=true", async () => {
const id = sessionManager.createSession(
"u1",
1,
"host",
80,
24,
undefined,
true,
);
sessionManager.bufferOutput(id, "terminal output data");
sessionManager.destroySession(id);
await new Promise((r) => setTimeout(r, 20));
expect(mockWriteFile).toHaveBeenCalledOnce();
+8
2026-07-19 12:29:52 -05:00
expect(mockCreate).toHaveBeenCalledOnce();
+2
2026-06-16 15:59:53 -05:00
});
it("does not write log file when buffer is empty", async () => {
const id = sessionManager.createSession(
"u1",
1,
"host",
80,
24,
undefined,
true,
);
sessionManager.destroySession(id);
await new Promise((r) => setTimeout(r, 20));
expect(mockWriteFile).not.toHaveBeenCalled();
});
it("bufferOutput trims old data when exceeding 512KB", () => {
const id = sessionManager.createSession(
"u1",
1,
"host",
80,
24,
undefined,
false,
);
const chunk = "x".repeat(300 * 1024);
sessionManager.bufferOutput(id, chunk);
sessionManager.bufferOutput(id, chunk);
const session = sessionManager.getSession(id);
expect(session!.outputBufferBytes).toBeLessThanOrEqual(512 * 1024);
sessionManager.destroySession(id);
});
});