Files
socraticode/tests/integration/docker-ollama.test.ts
2026-02-28 17:06:21 +00:00

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);
});
});
});