Files
sumpin/__tests__/generate-template.test.ts
geoffsee bbc9d8d971 Implement more tests
- Add comprehensive unit tests and CI pipeline

- Introduced unit tests for `agent-wrapper`, `cli`, and `generate-template` modules covering key functionality like structure, integration, argument parsing, filename handling, and error scenarios.

- Implemented a new CI workflow with Bun and Rust testing.
2025-07-11 17:09:30 -04:00

159 lines
5.0 KiB
TypeScript

import { expect, test, describe, mock, beforeEach } from "bun:test";
// Since mocking external modules is complex in this environment,
// let's create unit tests for the internal logic and structure validation
// without actually calling OpenAI API
describe("generate-template module structure", () => {
test("should export generateHierarchy function", async () => {
const module = await import("../generate-template");
expect(typeof module.generateHierarchy).toBe("function");
});
test("should export Hierarchy interface type", async () => {
// Test that we can import the type (compilation test)
const module = await import("../generate-template");
expect(module).toBeDefined();
});
});
// Test the validation logic by creating a mock version
describe("hierarchy validation logic", () => {
function validateHierarchy(data: any): boolean {
return !!(data.version && data.domain && data.structure && data.structure.length > 0);
}
test("should validate complete hierarchy data", () => {
const validHierarchy = {
version: "v1",
domain: "Technology",
structure: ["Domain", "Specialization", "Role", "Responsibility"],
description: "A technology hierarchy",
commonSkills: ["Programming"],
commonTools: ["IDE"],
examples: ["Web Development"]
};
expect(validateHierarchy(validHierarchy)).toBe(true);
});
test("should reject hierarchy missing version", () => {
const invalidHierarchy = {
domain: "Technology",
structure: ["Domain", "Specialization", "Role", "Responsibility"],
description: "A technology hierarchy",
commonSkills: ["Programming"],
commonTools: ["IDE"],
examples: ["Web Development"]
};
expect(validateHierarchy(invalidHierarchy)).toBe(false);
});
test("should reject hierarchy missing domain", () => {
const invalidHierarchy = {
version: "v1",
structure: ["Domain", "Specialization", "Role", "Responsibility"],
description: "A technology hierarchy",
commonSkills: ["Programming"],
commonTools: ["IDE"],
examples: ["Web Development"]
};
expect(validateHierarchy(invalidHierarchy)).toBe(false);
});
test("should reject hierarchy missing structure", () => {
const invalidHierarchy = {
version: "v1",
domain: "Technology",
description: "A technology hierarchy",
commonSkills: ["Programming"],
commonTools: ["IDE"],
examples: ["Web Development"]
};
expect(validateHierarchy(invalidHierarchy)).toBe(false);
});
test("should reject hierarchy with empty structure", () => {
const invalidHierarchy = {
version: "v1",
domain: "Technology",
structure: [],
description: "A technology hierarchy",
commonSkills: ["Programming"],
commonTools: ["IDE"],
examples: ["Web Development"]
};
expect(validateHierarchy(invalidHierarchy)).toBe(false);
});
});
// Test JSON parsing logic
describe("JSON parsing logic", () => {
function parseHierarchyResponse(raw: string): any {
try {
return JSON.parse(raw);
} catch {
// Attempt to salvage JSON embedded in text
const match = raw.match(/\{[\s\S]*\}/);
if (!match) throw new Error("Failed to parse JSON from LLM response");
return JSON.parse(match[0]);
}
}
test("should parse valid JSON", () => {
const jsonString = JSON.stringify({
version: "v1",
domain: "Technology",
structure: ["Domain"],
description: "Test"
});
const result = parseHierarchyResponse(jsonString);
expect(result.version).toBe("v1");
expect(result.domain).toBe("Technology");
});
test("should extract JSON from text wrapper", () => {
const hierarchyData = {
version: "v1",
domain: "Technology",
structure: ["Domain"],
description: "Test"
};
const wrappedJson = `Here is your JSON: ${JSON.stringify(hierarchyData)} Hope this helps!`;
const result = parseHierarchyResponse(wrappedJson);
expect(result.version).toBe("v1");
expect(result.domain).toBe("Technology");
});
test("should throw error for invalid JSON", () => {
const invalidJson = "This is not JSON at all";
expect(() => parseHierarchyResponse(invalidJson)).toThrow("Failed to parse JSON from LLM response");
});
test("should handle nested JSON structures", () => {
const complexHierarchy = {
version: "v2",
domain: "Healthcare",
structure: ["Domain", "Industry", "Profession", "Field", "Role", "Task"],
description: "Complex healthcare hierarchy",
commonSkills: ["Patient Care", "Medical Knowledge"],
commonTools: ["EMR", "Medical Devices"],
examples: ["Emergency Medicine", "Surgery"]
};
const jsonString = JSON.stringify(complexHierarchy);
const result = parseHierarchyResponse(jsonString);
expect(result.version).toBe("v2");
expect(result.structure).toHaveLength(6);
expect(result.commonSkills).toEqual(["Patient Care", "Medical Knowledge"]);
});
});