// CRITICALimport { describe, it, expect, beforeEach, afterEach, vi } from "vitest";import { Hono } from "hono";import { registerSystemRoutes } from "./system";import type { AppContext } from "../types/context";import type { Config } from "../config/env"; describe("System Routes", () => { let app: Hono; const originalFetch = globalThis.fetch; beforeEach(() => { // Mock fetch to avoid real network requests in tests globalThis.fetch = vi.fn().mockRejectedValue(new Error("Network unavailable")) as unknown as typeof fetch; app = new Hono(); // Create minimal mock context const mockConfig: Config = { host: "0.0.0.0", port: 8080, inference_port: 8000, data_dir: "./data", db_path: ":memory:", models_dir: "/models", }; const mockContext = { config: mockConfig, logger: { info: vi.fn(), warn: vi.fn(), error: vi.fn(), debug: vi.fn(), }, eventManager: { subscribe: vi.fn(), broadcast: vi.fn(), }, launchState: { launching: null, setLaunching: vi.fn(), clearLaunching: vi.fn(), }, metrics: { requestsTotal: { inc: vi.fn() }, requestDuration: { observe: vi.fn() }, }, metricsRegistry: { metrics: vi.fn().mockReturnValue(""), }, processManager: { findInferenceProcess: vi.fn().mockResolvedValue(null), launchModel: vi.fn(), evictModel: vi.fn(), }, stores: { recipeStore: { list: vi.fn().mockReturnValue([]), get: vi.fn(), save: vi.fn(), delete: vi.fn(), }, chatStore: { listSessions: vi.fn().mockReturnValue([]), getSession: vi.fn(), createSession: vi.fn(), deleteSession: vi.fn(), }, peakMetricsStore: { get: vi.fn(), update: vi.fn(), list: vi.fn().mockReturnValue([]), }, lifetimeMetricsStore: { getAll: vi.fn().mockReturnValue({}), addTokens: vi.fn(), addPromptTokens: vi.fn(), addCompletionTokens: vi.fn(), addRequests: vi.fn(), }, mcpStore: { list: vi.fn().mockReturnValue([]), get: vi.fn(), save: vi.fn(), delete: vi.fn(), }, }, } as unknown as AppContext; registerSystemRoutes(app, mockContext); }); afterEach(() => { globalThis.fetch = originalFetch; }); describe("GET /health", () => { it("returns health status", async () => { const res = await app.request("/health"); expect(res.status).toBe(200); const json = await res.json(); expect(json).toHaveProperty("status"); expect(json).toHaveProperty("inference_ready"); }); }); describe("GET /gpus", () => { it("returns GPU information", async () => { const res = await app.request("/gpus"); expect(res.status).toBe(200); const json = await res.json(); expect(Array.isArray(json.gpus)).toBe(true); }); }); describe("GET /config", () => { it("returns system configuration", async () => { const res = await app.request("/config"); expect(res.status).toBe(200); const json = await res.json(); expect(json).toHaveProperty("config"); expect(json.config).toHaveProperty("port"); expect(json.config).toHaveProperty("inference_port"); expect(json).toHaveProperty("services"); expect(json).toHaveProperty("environment"); }); });});
// CRITICAL
import { describe, it, expect, beforeEach, afterEach, vi } from "vitest";
import { Hono } from "hono";
import { registerSystemRoutes } from "./system";
import type { AppContext } from "../types/context";
import type { Config } from "../config/env";
describe("System Routes", () => {
let app: Hono;
const originalFetch = globalThis.fetch;
beforeEach(() => {
// Mock fetch to avoid real network requests in tests
globalThis.fetch = vi.fn().mockRejectedValue(new Error("Network unavailable")) as unknown as typeof fetch;
app = new Hono();
// Create minimal mock context
const mockConfig: Config = {
host: "0.0.0.0",
port: 8080,
inference_port: 8000,
data_dir: "./data",
db_path: ":memory:",
models_dir: "/models",
};
const mockContext = {
config: mockConfig,
logger: {
info: vi.fn(),
warn: vi.fn(),
error: vi.fn(),
debug: vi.fn(),
},
eventManager: {
subscribe: vi.fn(),
broadcast: vi.fn(),
},
launchState: {
launching: null,
setLaunching: vi.fn(),
clearLaunching: vi.fn(),
},
metrics: {
requestsTotal: { inc: vi.fn() },
requestDuration: { observe: vi.fn() },
},
metricsRegistry: {
metrics: vi.fn().mockReturnValue(""),
},
processManager: {
findInferenceProcess: vi.fn().mockResolvedValue(null),
launchModel: vi.fn(),
evictModel: vi.fn(),
},
stores: {
recipeStore: {
list: vi.fn().mockReturnValue([]),
get: vi.fn(),
save: vi.fn(),
delete: vi.fn(),
},
chatStore: {
listSessions: vi.fn().mockReturnValue([]),
getSession: vi.fn(),
createSession: vi.fn(),
deleteSession: vi.fn(),
},
peakMetricsStore: {
get: vi.fn(),
update: vi.fn(),
list: vi.fn().mockReturnValue([]),
},
lifetimeMetricsStore: {
getAll: vi.fn().mockReturnValue({}),
addTokens: vi.fn(),
addPromptTokens: vi.fn(),
addCompletionTokens: vi.fn(),
addRequests: vi.fn(),
},
mcpStore: {
list: vi.fn().mockReturnValue([]),
get: vi.fn(),
save: vi.fn(),
delete: vi.fn(),
},
},
} as unknown as AppContext;
registerSystemRoutes(app, mockContext);
});
afterEach(() => {
globalThis.fetch = originalFetch;
});
describe("GET /health", () => {
it("returns health status", async () => {
const res = await app.request("/health");
expect(res.status).toBe(200);
const json = await res.json();
expect(json).toHaveProperty("status");
expect(json).toHaveProperty("inference_ready");
});
});
describe("GET /gpus", () => {
it("returns GPU information", async () => {
const res = await app.request("/gpus");
expect(res.status).toBe(200);
const json = await res.json();
expect(Array.isArray(json.gpus)).toBe(true);
});
});
describe("GET /config", () => {
it("returns system configuration", async () => {
const res = await app.request("/config");
expect(res.status).toBe(200);
const json = await res.json();
expect(json).toHaveProperty("config");
expect(json.config).toHaveProperty("port");
expect(json.config).toHaveProperty("inference_port");
expect(json).toHaveProperty("services");
expect(json).toHaveProperty("environment");
});
});
});