/** * Template/Snippet Generation Tests * * Comprehensive tests for code snippet generation, sanitization, * and module type handling. */ import { describe, expect, it } from "vitest"; import type { Pattern } from "../src/schemas/pattern.js"; import { buildSnippet, generateUsageExample, sanitizeInput, } from "../src/template.js"; // Test fixtures const createMockPattern = (overrides: Partial = {}): Pattern => ({ id: "test-pattern", slug: "test-pattern", title: "Test Pattern", description: "A test pattern for unit testing", category: "error-handling", difficulty: "beginner", tags: ["test"], examples: [ { language: "typescript", code: `import { Effect } from "effect";\n\nconst example = Effect.succeed("input");\n\nexport { example };`, description: "Basic example", }, ], useCases: ["Testing"], ...overrides, }); describe("sanitizeInput", () => { it("should remove angle brackets", () => { const result = sanitizeInput(""); expect(result).not.toContain("<"); expect(result).not.toContain(">"); }); it("should remove backticks", () => { const result = sanitizeInput("`dangerous`"); expect(result).not.toContain("`"); }); it("should remove dollar signs", () => { const result = sanitizeInput("$variable"); expect(result).not.toContain("$"); }); it("should replace newlines with spaces", () => { const result = sanitizeInput("line1\nline2\r\nline3"); expect(result).not.toContain("\n"); expect(result).not.toContain("\r"); expect(result).toContain(" "); }); it("should trim whitespace", () => { const result = sanitizeInput(" test "); expect(result).toBe("test"); }); it("should limit length to 100 characters", () => { const longString = "a".repeat(200); const result = sanitizeInput(longString); expect(result.length).toBe(100); }); it("should handle empty string", () => { const result = sanitizeInput(""); expect(result).toBe(""); }); it("should handle normal text without changes", () => { const input = "normalText123"; const result = sanitizeInput(input); expect(result).toBe(input); }); it("should handle special characters that are allowed", () => { const input = "test-pattern_name.value"; const result = sanitizeInput(input); expect(result).toBe(input); }); it("should handle multiple dangerous characters at once", () => { const input = "
$var`code`
\ntest"; const result = sanitizeInput(input); expect(result).not.toContain("<"); expect(result).not.toContain(">"); expect(result).not.toContain("$"); expect(result).not.toContain("`"); expect(result).not.toContain("\n"); }); }); describe("buildSnippet", () => { describe("basic snippet generation", () => { it("should generate snippet with pattern header", () => { const pattern = createMockPattern(); const snippet = buildSnippet({ pattern }); expect(snippet).toContain(`// ${pattern.title}`); expect(snippet).toContain(`// Pattern ID: ${pattern.id}`); }); it("should include import statement", () => { const pattern = createMockPattern(); const snippet = buildSnippet({ pattern }); expect(snippet).toContain('import { Effect, pipe } from "effect"'); }); it("should include example code", () => { const pattern = createMockPattern(); const snippet = buildSnippet({ pattern }); expect(snippet).toContain("Effect.succeed"); }); it("should include example description if present", () => { const pattern = createMockPattern({ examples: [ { language: "typescript", code: "const test = 1;", description: "Test description", }, ], }); const snippet = buildSnippet({ pattern }); expect(snippet).toContain("// Test description"); }); }); describe("module type variations", () => { it("should generate ESM imports by default", () => { const pattern = createMockPattern(); const snippet = buildSnippet({ pattern }); expect(snippet).toContain('import { Effect, pipe } from "effect"'); expect(snippet).not.toContain("require"); }); it("should generate ESM when explicitly specified", () => { const pattern = createMockPattern(); const snippet = buildSnippet({ pattern, moduleType: "esm" }); expect(snippet).toContain('import { Effect, pipe } from "effect"'); }); it("should generate CJS requires when specified", () => { const pattern = createMockPattern(); const snippet = buildSnippet({ pattern, moduleType: "cjs" }); expect(snippet).toContain('const { Effect, pipe } = require("effect")'); // Note: The example code itself may contain import statements, // but the header should use require }); }); describe("custom name parameter", () => { it("should use custom name in generated code", () => { const pattern = createMockPattern(); const snippet = buildSnippet({ pattern, customName: "myCustomName" }); expect(snippet).toContain("myCustomName"); }); it("should sanitize custom name", () => { const pattern = createMockPattern(); const snippet = buildSnippet({ pattern, customName: "", }); expect(snippet).not.toContain("