/** * requestEnhancer.test.ts — Unit test S39 RequestEnhancer * * Copertura (10 test): * 1. enhanceRequest: ritorna EnhancedRequest valido * 2. code_fix breve → enhanced ha detailSuffix * 3. debug → suggerimenti include "stack trace" * 4. refactor → suggerimento rischio alta priorità * 5. full_app → modelTier premium nel classification * 6. richiesta lunga (>200 char) → nessun suffix aggiunto * 7. getHighPrioritySuggestions: solo suggerimenti high * 8. hasActionableSuggestions: true per debug * 9. hasActionableSuggestions: false per domanda semplice * 10. DI _setTestEnhancer: custom enhancer usato * * SESSIONE: S39 — TaskClassifier + ConfidenceEngine + RequestEnhancer */ import { describe, it, expect, afterEach } from "vitest"; import { enhanceRequest, getHighPrioritySuggestions, hasActionableSuggestions, _setTestEnhancer, _resetEnhancer, } from "@/lib/requestEnhancer"; afterEach(() => { _resetEnhancer(); }); describe("enhanceRequest", () => { it("1. ritorna EnhancedRequest con tutti i campi obbligatori", () => { const r = enhanceRequest("Fix questo bug"); expect(r.original).toBe("Fix questo bug"); expect(typeof r.enhanced).toBe("string"); expect(r.enhanced.length).toBeGreaterThan(0); expect(Array.isArray(r.suggestions)).toBe(true); expect(typeof r.hasChanges).toBe("boolean"); expect(r.confidence).toBeGreaterThan(0); expect(r.classification).toBeDefined(); }); it("2. code_fix breve → enhanced contiene hint su file/errore", () => { const r = enhanceRequest("fix questa funzione"); expect(r.hasChanges).toBe(true); expect(r.enhanced.length).toBeGreaterThan("fix questa funzione".length); }); it("3. debug → suggestions include riferimento a stack trace", () => { const r = enhanceRequest("non funziona, crasha"); const texts = r.suggestions.map(s => s.message.toLowerCase()); expect(texts.some(t => t.includes("stack") || t.includes("errore") || t.includes("error"))).toBe(true); }); it("4. refactor → suggerimento rischio ad alta priorità", () => { const r = enhanceRequest("Refactor il modulo di autenticazione"); const highRisk = r.suggestions.filter(s => s.priority === "high" && s.kind === "risk"); expect(highRisk.length).toBeGreaterThan(0); }); it("5. full_app → classification.modelTier = premium", () => { const r = enhanceRequest("Crea un'app completa da zero con React e TypeScript"); expect(r.classification.modelTier).toBe("premium"); expect(r.classification.needsPlan).toBe(true); }); it("6. richiesta lunga >200 char → nessun suffix aggiunto (già abbastanza dettagliata)", () => { const long = "Fix questo bug. ".repeat(15); // >200 chars const r = enhanceRequest(long); expect(r.enhanced.trim()).toBe(long.trim()); }); }); describe("getHighPrioritySuggestions", () => { it("7. debug → almeno 1 suggerimento high priority", () => { const sug = getHighPrioritySuggestions("Il componente non funziona, crasha all'avvio"); expect(sug.length).toBeGreaterThan(0); expect(sug.every(s => s.priority === "high")).toBe(true); }); it("7b. tutti i suggerimenti ritornati sono high priority", () => { const sug = getHighPrioritySuggestions("refactor questo modulo enorme"); for (const s of sug) { expect(s.priority).toBe("high"); } }); }); describe("hasActionableSuggestions", () => { it("8. debug → hasActionableSuggestions=true", () => { expect(hasActionableSuggestions("Il codice non funziona crasha ovunque")).toBe(true); }); it("9. domanda banale → hasActionableSuggestions=false", () => { expect(hasActionableSuggestions("Ciao, come stai?")).toBe(false); }); }); describe("DI _setTestEnhancer", () => { it("10. custom enhancer viene usato al posto del default", () => { _setTestEnhancer((original, cls) => ({ original, enhanced: "CUSTOM: " + original, classification: cls, suggestions: [], hasChanges: true, confidence: 1.0, })); const r = enhanceRequest("test"); expect(r.enhanced).toBe("CUSTOM: test"); expect(r.confidence).toBe(1.0); }); });