Skip to main content
Glama
key-term-extractor.test.ts7.29 kB
/** * Unit tests for KeyTermExtractor * * Tests key term extraction from problem statements for generating * problem-specific insights in reasoning streams. * * Requirements: 4.1, 4.2, 4.3, 4.4, 15.3, 15.4 */ import { beforeEach, describe, expect, it } from "vitest"; import { KeyTermExtractor } from "../../../reasoning/key-term-extractor.js"; describe("KeyTermExtractor", () => { let extractor: KeyTermExtractor; beforeEach(() => { extractor = new KeyTermExtractor(); }); describe("Primary Subject Extraction", () => { it("should extract primary subject from problem description", () => { const result = extractor.extract("Optimize database query performance"); expect(result.primarySubject).toBeDefined(); expect(result.primarySubject?.length).toBeGreaterThan(0); }); it("should identify database as primary subject in database problems", () => { const result = extractor.extract("Improve database performance for user queries"); expect(result.primarySubject?.toLowerCase()).toContain("database"); }); it("should identify user as primary subject in user-related problems", () => { const result = extractor.extract("Enhance user experience in checkout flow"); expect(result.primarySubject?.toLowerCase()).toContain("user"); }); it("should identify API as primary subject in API problems", () => { const result = extractor.extract("Design REST API for authentication service"); // The extractor may identify "design rest" or "api" as primary subject // Check that API is at least in the terms expect(result.terms.some((t) => t.toLowerCase().includes("api"))).toBe(true); }); }); describe("Domain Term Extraction", () => { it("should extract performance-related domain terms", () => { const result = extractor.extract( "Optimize query performance and reduce latency in the system" ); expect(result.domainTerms).toContain("performance"); }); it("should extract security-related domain terms", () => { const result = extractor.extract( "Implement authentication and authorization for API endpoints" ); expect(result.domainTerms.some((t) => t === "security" || t === "authentication")).toBe(true); }); it("should extract user-related domain terms", () => { const result = extractor.extract("Improve user engagement and customer retention"); expect(result.domainTerms.some((t) => t === "user" || t === "customer")).toBe(true); }); it("should extract data-related domain terms", () => { const result = extractor.extract("Build data pipeline for analytics dashboard"); expect(result.domainTerms.some((t) => t === "data" || t === "analytics")).toBe(true); }); }); describe("Action Verb Extraction", () => { it("should extract improve as action verb", () => { const result = extractor.extract("Improve system performance"); expect(result.actionVerbs).toContain("improve"); }); it("should extract optimize as action verb", () => { const result = extractor.extract("Optimize database queries"); expect(result.actionVerbs).toContain("optimize"); }); it("should extract build as action verb", () => { const result = extractor.extract("Build a notification service"); expect(result.actionVerbs).toContain("build"); }); it("should extract multiple action verbs", () => { const result = extractor.extract("Design, implement, and deploy the new feature"); expect(result.actionVerbs.length).toBeGreaterThanOrEqual(2); }); }); describe("Noun Phrase Extraction", () => { it("should extract compound noun phrases", () => { const result = extractor.extract("Implement user authentication system"); expect(result.nounPhrases.length).toBeGreaterThan(0); }); it("should extract technical noun phrases", () => { const result = extractor.extract("Design REST API with rate limiting"); expect(result.nounPhrases.some((p) => p.toLowerCase().includes("api"))).toBe(true); }); }); describe("Context Integration", () => { it("should include context terms in extraction", () => { const result = extractor.extract( "Fix the bug", "The bug occurs in the authentication module when users try to log in" ); expect(result.terms.length).toBeGreaterThan(2); expect(result.domainTerms.length).toBeGreaterThan(0); }); it("should extract domain terms from context", () => { const result = extractor.extract( "Improve performance", "Current latency is 500ms, target is 100ms" ); expect(result.domainTerms).toContain("performance"); }); }); describe("Format Terms for Insight", () => { it("should format terms for use in insights", () => { const keyTerms = extractor.extract("Optimize database query performance"); const formatted = extractor.formatTermsForInsight(keyTerms, 3); expect(formatted).toBeDefined(); expect(formatted.length).toBeGreaterThan(0); }); it("should limit number of terms in formatted output", () => { const keyTerms = extractor.extract( "Design, implement, and deploy a scalable microservices architecture with authentication, authorization, caching, and monitoring" ); const formatted = extractor.formatTermsForInsight(keyTerms, 2); // Should not have more than 2 terms (plus possible conjunctions) const termCount = formatted.split(/,|and/).length; expect(termCount).toBeLessThanOrEqual(3); }); it("should return fallback for empty key terms", () => { const keyTerms = extractor.extract(""); const formatted = extractor.formatTermsForInsight(keyTerms, 3); // Returns grammatically correct fallback instead of empty string expect(formatted).toBe("the system"); }); }); describe("Edge Cases", () => { it("should handle empty problem description", () => { const result = extractor.extract(""); expect(result.terms).toEqual([]); // primarySubject can be null or undefined for empty input expect(result.primarySubject == null).toBe(true); expect(result.domainTerms).toEqual([]); expect(result.actionVerbs).toEqual([]); expect(result.nounPhrases).toEqual([]); }); it("should handle problem with only stop words", () => { const result = extractor.extract("the a an and or but"); expect(result.terms.length).toBe(0); }); it("should handle very short problem descriptions", () => { const result = extractor.extract("Fix bug"); expect(result).toBeDefined(); expect(result.actionVerbs).toContain("fix"); }); it("should handle problem with special characters", () => { const result = extractor.extract("Optimize O(n²) algorithm performance"); expect(result).toBeDefined(); expect(result.domainTerms).toContain("performance"); }); it("should handle problem with numbers", () => { const result = extractor.extract("Reduce latency from 500ms to 100ms"); expect(result).toBeDefined(); expect(result.actionVerbs).toContain("reduce"); }); }); });

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/keyurgolani/ThoughtMcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server