tests: Implement MockLLMProvider for tier 2 integration tests

This commit is contained in:
2026-07-06 10:22:41 +05:30
parent 05e5d77c6d
commit 085d141903
3 changed files with 88 additions and 0 deletions

View File

@@ -1,3 +1,4 @@
export * from "./llm.js";
export * from "./config.js";
export * from "./providers/google-genai.js";
export * from "./providers/mock.js";

View File

@@ -0,0 +1,24 @@
import { z } from "zod";
import { ILLMProvider, LLMRequest, LLMResponse } from "../llm.js";
export class MockLLMProvider implements ILLMProvider {
providerName = "mock";
private callCount = 0;
constructor(private responses: unknown[]) {}
async generateStructuredResponse<T extends z.ZodTypeAny>(
request: LLMRequest<T>,
): Promise<LLMResponse<z.infer<T>>> {
const next = this.responses[this.callCount++];
if (next === undefined) {
return { success: false, error: "Mock responses exhausted" };
}
try {
const parsed = request.schema.parse(next);
return { success: true, data: parsed };
} catch (e) {
return { success: false, error: e instanceof Error ? e.message : String(e) };
}
}
}

View File

@@ -0,0 +1,63 @@
import { describe, test, expect } from "vitest";
import { z } from "zod";
import { MockLLMProvider } from "../src/providers/mock.js";
describe("MockLLMProvider Unit Tests (Tier 1)", () => {
test("returns parsed matching data for valid mock response", async () => {
const TestSchema = z.object({
name: z.string(),
age: z.number(),
});
const mockData = { name: "Alice", age: 30 };
const provider = new MockLLMProvider([mockData]);
const response = await provider.generateStructuredResponse({
systemPrompt: "system prompt",
userContext: "user context",
schema: TestSchema,
});
expect(response.success).toBe(true);
expect(response.data).toEqual(mockData);
});
test("returns failure for malformed mock response", async () => {
const TestSchema = z.object({
name: z.string(),
age: z.number(),
});
// age is a string instead of a number, which violates schema
const malformedData = { name: "Alice", age: "thirty" };
const provider = new MockLLMProvider([malformedData]);
const response = await provider.generateStructuredResponse({
systemPrompt: "system prompt",
userContext: "user context",
schema: TestSchema,
});
expect(response.success).toBe(false);
expect(response.error).toBeDefined();
expect(response.data).toBeUndefined();
});
test("returns failure when mock responses are exhausted", async () => {
const TestSchema = z.object({
name: z.string(),
});
const provider = new MockLLMProvider([]);
const response = await provider.generateStructuredResponse({
systemPrompt: "system prompt",
userContext: "user context",
schema: TestSchema,
});
expect(response.success).toBe(false);
expect(response.error).toBe("Mock responses exhausted");
expect(response.data).toBeUndefined();
});
});