Skip to main content
Glama
server.test.ts7.39 kB
import { describe, expect, it } from "vitest"; import type { GrammarlyOptimizeResult } from "../../src/grammarlyOptimizer"; import { formatAsMarkdown } from "../../src/server"; describe("formatAsMarkdown", () => { const baseResult: GrammarlyOptimizeResult = { final_text: "Optimized text content", ai_detection_percent: 8, plagiarism_percent: 2, thresholds_met: true, iterations_used: 2, notes: "Optimization completed successfully", history: [], live_url: null, }; describe("basic formatting", () => { it("includes status emoji for thresholds met", () => { const result = formatAsMarkdown(baseResult); expect(result).toContain("✅"); }); it("includes warning emoji when thresholds not met", () => { const result = formatAsMarkdown({ ...baseResult, thresholds_met: false, }); expect(result).toContain("⚠️"); }); it("formats AI detection percentage", () => { const result = formatAsMarkdown(baseResult); expect(result).toContain("| AI Detection | 8% |"); }); it("formats plagiarism percentage", () => { const result = formatAsMarkdown(baseResult); expect(result).toContain("| Plagiarism | 2% |"); }); it("includes iterations used", () => { const result = formatAsMarkdown(baseResult); expect(result).toContain("| Iterations Used | 2 |"); }); it("includes notes section", () => { const result = formatAsMarkdown(baseResult); expect(result).toContain("## Notes"); expect(result).toContain("Optimization completed successfully"); }); it("includes final text in code block", () => { const result = formatAsMarkdown(baseResult); expect(result).toContain("## Final Text"); expect(result).toContain("```"); expect(result).toContain("Optimized text content"); }); }); describe("null score handling", () => { it("displays N/A for null AI detection", () => { const result = formatAsMarkdown({ ...baseResult, ai_detection_percent: null, }); expect(result).toContain("| AI Detection | N/A |"); }); it("displays N/A for null plagiarism", () => { const result = formatAsMarkdown({ ...baseResult, plagiarism_percent: null, }); expect(result).toContain("| Plagiarism | N/A |"); }); it("displays N/A for both null scores", () => { const result = formatAsMarkdown({ ...baseResult, ai_detection_percent: null, plagiarism_percent: null, }); expect(result).toContain("| AI Detection | N/A |"); expect(result).toContain("| Plagiarism | N/A |"); }); }); describe("live URL handling", () => { it("includes live preview link when URL provided", () => { const result = formatAsMarkdown({ ...baseResult, live_url: "https://example.com/session/123", }); expect(result).toContain("| Live Preview |"); expect(result).toContain("[Browser Session](https://example.com/session/123)"); }); it("omits live preview row when URL is null", () => { const result = formatAsMarkdown(baseResult); expect(result).not.toContain("Live Preview"); }); }); describe("iteration history", () => { it("omits history section when empty", () => { const result = formatAsMarkdown(baseResult); expect(result).not.toContain("## Iteration History"); }); it("includes history table when entries exist", () => { const result = formatAsMarkdown({ ...baseResult, history: [ { iteration: 1, ai_detection_percent: 25, plagiarism_percent: 5, note: "Initial scoring", }, { iteration: 2, ai_detection_percent: 8, plagiarism_percent: 2, note: "After rewrite", }, ], }); expect(result).toContain("## Iteration History"); expect(result).toContain("| Iteration | AI % | Plagiarism % | Note |"); expect(result).toContain("| 1 | 25% | 5% | Initial scoring |"); expect(result).toContain("| 2 | 8% | 2% | After rewrite |"); }); it("handles null scores in history", () => { const result = formatAsMarkdown({ ...baseResult, history: [ { iteration: 1, ai_detection_percent: null, plagiarism_percent: null, note: "Premium unavailable", }, ], }); expect(result).toContain("| 1 | N/A | N/A | Premium unavailable |"); }); it("truncates long notes to 60 characters", () => { const longNote = "This is a very long note that exceeds sixty characters and should be truncated"; const result = formatAsMarkdown({ ...baseResult, history: [ { iteration: 1, ai_detection_percent: 10, plagiarism_percent: 3, note: longNote, }, ], }); // Should truncate to 57 chars + "..." // "This is a very long note that exceeds sixty characters an" = 57 chars expect(result).toContain("This is a very long note that exceeds sixty characters an..."); expect(result).not.toContain(longNote); }); it("keeps short notes as-is", () => { const shortNote = "Short note"; const result = formatAsMarkdown({ ...baseResult, history: [ { iteration: 1, ai_detection_percent: 10, plagiarism_percent: 3, note: shortNote, }, ], }); expect(result).toContain(`| ${shortNote} |`); }); }); describe("markdown structure", () => { it("starts with header", () => { const result = formatAsMarkdown(baseResult); expect(result.startsWith("# Grammarly Optimization Result")).toBe(true); }); it("includes summary section", () => { const result = formatAsMarkdown(baseResult); expect(result).toContain("## Summary"); }); it("includes table formatting", () => { const result = formatAsMarkdown(baseResult); expect(result).toContain("| Metric | Value |"); expect(result).toContain("|--------|-------|"); }); it("ends with final text code block", () => { const result = formatAsMarkdown(baseResult); const lines = result.trim().split("\n"); expect(lines[lines.length - 1]).toBe("```"); }); }); describe("edge cases", () => { it("handles zero scores", () => { const result = formatAsMarkdown({ ...baseResult, ai_detection_percent: 0, plagiarism_percent: 0, }); expect(result).toContain("| AI Detection | 0% |"); expect(result).toContain("| Plagiarism | 0% |"); }); it("handles 100% scores", () => { const result = formatAsMarkdown({ ...baseResult, ai_detection_percent: 100, plagiarism_percent: 100, }); expect(result).toContain("| AI Detection | 100% |"); expect(result).toContain("| Plagiarism | 100% |"); }); it("handles zero iterations", () => { const result = formatAsMarkdown({ ...baseResult, iterations_used: 0, }); expect(result).toContain("| Iterations Used | 0 |"); }); it("handles empty notes", () => { const result = formatAsMarkdown({ ...baseResult, notes: "", }); expect(result).toContain("## Notes"); }); it("handles empty final text", () => { const result = formatAsMarkdown({ ...baseResult, final_text: "", }); expect(result).toContain("## Final Text"); expect(result).toContain("```\n\n```"); }); it("handles special characters in text", () => { const result = formatAsMarkdown({ ...baseResult, final_text: "Text with `backticks` and | pipes | and **markdown**", }); expect(result).toContain("Text with `backticks` and | pipes | and **markdown**"); }); }); });

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/BjornMelin/grammarly-mcp'

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