mirror of
https://github.com/giancarloerra/socraticode.git
synced 2026-07-03 14:05:21 +02:00
130 lines
4.1 KiB
TypeScript
130 lines
4.1 KiB
TypeScript
// SPDX-License-Identifier: AGPL-3.0-only
|
|
// Copyright (C) 2026 Giancarlo Erra - Altaire Limited
|
|
import { beforeAll, describe, expect, it } from "vitest";
|
|
import {
|
|
ensureOllamaContainerReady,
|
|
ensureQdrantReady,
|
|
isOllamaImagePresent,
|
|
isOllamaRunning,
|
|
isQdrantImagePresent,
|
|
isQdrantRunning,
|
|
resetOllamaContainerReadinessCache,
|
|
resetQdrantReadinessCache,
|
|
isDockerAvailable as srcIsDockerAvailable,
|
|
} from "../../src/services/docker.js";
|
|
import {
|
|
ensureOllamaReady,
|
|
isModelAvailable,
|
|
isOllamaAvailable,
|
|
resetOllamaReadinessCache,
|
|
} from "../../src/services/ollama.js";
|
|
import { isDockerAvailable } from "../helpers/fixtures.js";
|
|
|
|
const dockerAvailable = isDockerAvailable();
|
|
|
|
describe.skipIf(!dockerAvailable)("docker service", () => {
|
|
beforeAll(() => {
|
|
resetQdrantReadinessCache();
|
|
});
|
|
|
|
describe("isDockerAvailable", () => {
|
|
it("returns true when Docker is running", async () => {
|
|
const result = await srcIsDockerAvailable();
|
|
expect(result).toBe(true);
|
|
});
|
|
});
|
|
|
|
describe("Qdrant container management", () => {
|
|
it("ensures Qdrant is ready (pulls image and starts container if needed)", async () => {
|
|
resetQdrantReadinessCache();
|
|
const result = await ensureQdrantReady();
|
|
|
|
expect(result).toBeDefined();
|
|
expect(typeof result.pulled).toBe("boolean");
|
|
expect(typeof result.started).toBe("boolean");
|
|
});
|
|
|
|
it("reports Qdrant image as present after ensure", async () => {
|
|
const present = await isQdrantImagePresent();
|
|
expect(present).toBe(true);
|
|
});
|
|
|
|
it("reports Qdrant as running after ensure", async () => {
|
|
const running = await isQdrantRunning();
|
|
expect(running).toBe(true);
|
|
});
|
|
|
|
it("returns cached result on second call (no re-pull or re-start)", async () => {
|
|
const result = await ensureQdrantReady();
|
|
// On second call, should not pull or start again (cached)
|
|
expect(result.pulled).toBe(false);
|
|
expect(result.started).toBe(false);
|
|
});
|
|
|
|
it("re-checks after cache reset", async () => {
|
|
resetQdrantReadinessCache();
|
|
const result = await ensureQdrantReady();
|
|
// Should succeed but not necessarily pull/start since it's already running
|
|
expect(result).toBeDefined();
|
|
});
|
|
});
|
|
});
|
|
|
|
describe.skipIf(!dockerAvailable)("ollama service", () => {
|
|
beforeAll(async () => {
|
|
resetOllamaReadinessCache();
|
|
// Ensure Qdrant is up first (so Docker is ready), then Ollama
|
|
await ensureQdrantReady();
|
|
});
|
|
|
|
describe("Ollama container management", () => {
|
|
it("ensures Ollama container is ready", async () => {
|
|
resetOllamaReadinessCache();
|
|
const result = await ensureOllamaContainerReady();
|
|
|
|
expect(result).toBeDefined();
|
|
expect(typeof result.pulled).toBe("boolean");
|
|
expect(typeof result.started).toBe("boolean");
|
|
});
|
|
|
|
it("reports Ollama image as present", async () => {
|
|
const present = await isOllamaImagePresent();
|
|
expect(present).toBe(true);
|
|
});
|
|
|
|
it("reports Ollama as running", async () => {
|
|
const running = await isOllamaRunning();
|
|
expect(running).toBe(true);
|
|
});
|
|
|
|
it("re-checks after Ollama container readiness cache reset", async () => {
|
|
resetOllamaContainerReadinessCache();
|
|
const result = await ensureOllamaContainerReady();
|
|
// Container is already running — should succeed without pulling or starting
|
|
expect(result).toBeDefined();
|
|
expect(typeof result.pulled).toBe("boolean");
|
|
expect(typeof result.started).toBe("boolean");
|
|
});
|
|
});
|
|
|
|
describe("Ollama model management", () => {
|
|
it("ensures Ollama (with model) is fully ready", async () => {
|
|
resetOllamaReadinessCache();
|
|
const result = await ensureOllamaReady();
|
|
|
|
expect(result).toBeDefined();
|
|
expect(typeof result.modelPulled).toBe("boolean");
|
|
});
|
|
|
|
it("reports Ollama as available (HTTP reachable)", async () => {
|
|
const available = await isOllamaAvailable();
|
|
expect(available).toBe(true);
|
|
});
|
|
|
|
it("reports the embedding model as available", async () => {
|
|
const available = await isModelAvailable();
|
|
expect(available).toBe(true);
|
|
});
|
|
});
|
|
});
|