mirror of
https://github.com/seemueller-io/sumpin.git
synced 2025-09-08 22:56:46 +00:00

- 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.
159 lines
5.0 KiB
TypeScript
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"]);
|
|
});
|
|
});
|