Skip to main content
Glama

documcp

by tosin2013
readme-best-practices.test.ts9.54 kB
import { readmeBestPractices } from "../../src/tools/readme-best-practices.js"; import { formatMCPResponse } from "../../src/types/api.js"; import { writeFile, mkdir, rm } from "fs/promises"; import { join } from "path"; describe("readmeBestPractices", () => { const testDir = join(process.cwd(), "test-readme-best-practices-temp"); beforeEach(async () => { // Create test directory await mkdir(testDir, { recursive: true }); }); afterEach(async () => { // Clean up test directory try { await rm(testDir, { recursive: true, force: true }); } catch (error) { // Ignore cleanup errors } }); describe("Basic Functionality", () => { test("should analyze README best practices with default parameters", async () => { const readmePath = join(testDir, "README.md"); await writeFile( readmePath, `# Test Library ## Description This is a test library for analyzing best practices. ## Installation \`\`\`bash npm install test-library \`\`\` ## Usage \`\`\`javascript const lib = require('test-library'); \`\`\` ## API Reference Function documentation here. ## Contributing Please read CONTRIBUTING.md. ## License MIT License `, ); const result = await readmeBestPractices({ readme_path: readmePath, }); expect(result.success).toBe(true); expect(result.data).toBeDefined(); expect(result.data!.bestPracticesReport).toBeDefined(); expect(result.metadata).toBeDefined(); }); test("should handle different project types", async () => { const readmePath = join(testDir, "README.md"); await writeFile(readmePath, "# Application\n\nA web application."); const result = await readmeBestPractices({ readme_path: readmePath, project_type: "application", }); expect(result.success).toBe(true); expect(result.data).toBeDefined(); }); test("should generate templates when requested", async () => { const outputDir = join(testDir, "output"); await mkdir(outputDir, { recursive: true }); const result = await readmeBestPractices({ readme_path: join(testDir, "nonexistent.md"), generate_template: true, output_directory: outputDir, project_type: "library", }); expect(result.success).toBe(true); expect(result.data).toBeDefined(); }); test("should handle different target audiences", async () => { const readmePath = join(testDir, "README.md"); await writeFile(readmePath, "# Advanced Tool\n\nFor expert users."); const result = await readmeBestPractices({ readme_path: readmePath, target_audience: "advanced", }); expect(result.success).toBe(true); expect(result.data).toBeDefined(); }); }); describe("Error Handling", () => { test("should handle missing README file without template generation", async () => { const result = await readmeBestPractices({ readme_path: join(testDir, "nonexistent.md"), generate_template: false, }); expect(result.success).toBe(false); expect(result.error).toBeDefined(); expect(result.error!.code).toBe("README_NOT_FOUND"); }); test("should handle invalid project type", async () => { const readmePath = join(testDir, "README.md"); await writeFile(readmePath, "# Test"); const result = await readmeBestPractices({ readme_path: readmePath, project_type: "invalid_type" as any, }); expect(result.success).toBe(false); expect(result.error).toBeDefined(); }); test("should handle invalid target audience", async () => { const readmePath = join(testDir, "README.md"); await writeFile(readmePath, "# Test"); const result = await readmeBestPractices({ readme_path: readmePath, target_audience: "invalid_audience" as any, }); expect(result.success).toBe(false); expect(result.error).toBeDefined(); }); }); describe("Best Practices Analysis", () => { test("should evaluate checklist items", async () => { const readmePath = join(testDir, "README.md"); await writeFile( readmePath, `# Complete Library ## Table of Contents - [Installation](#installation) - [Usage](#usage) ## Description Detailed description of the library. ## Installation Installation instructions here. ## Usage Usage examples here. ## API Reference API documentation. ## Examples Code examples. ## Contributing Contributing guidelines. ## License MIT License ## Support Support information. `, ); const result = await readmeBestPractices({ readme_path: readmePath, project_type: "library", }); expect(result.success).toBe(true); expect(result.data!.bestPracticesReport.checklist).toBeDefined(); expect(Array.isArray(result.data!.bestPracticesReport.checklist)).toBe( true, ); expect(result.data!.bestPracticesReport.checklist.length).toBeGreaterThan( 0, ); }); test("should calculate overall score and grade", async () => { const readmePath = join(testDir, "README.md"); await writeFile(readmePath, "# Basic Project\n\nMinimal content."); const result = await readmeBestPractices({ readme_path: readmePath, }); expect(result.success).toBe(true); expect( result.data!.bestPracticesReport.overallScore, ).toBeGreaterThanOrEqual(0); expect(result.data!.bestPracticesReport.overallScore).toBeLessThanOrEqual( 100, ); expect(result.data!.bestPracticesReport.grade).toBeDefined(); }); test("should provide recommendations", async () => { const readmePath = join(testDir, "README.md"); await writeFile(readmePath, "# Incomplete Project"); const result = await readmeBestPractices({ readme_path: readmePath, }); expect(result.success).toBe(true); expect(result.data!.recommendations).toBeDefined(); expect(Array.isArray(result.data!.recommendations)).toBe(true); expect(result.data!.nextSteps).toBeDefined(); expect(Array.isArray(result.data!.nextSteps)).toBe(true); }); test("should provide summary metrics", async () => { const readmePath = join(testDir, "README.md"); await writeFile( readmePath, `# Project ## Description Basic description. ## Installation Install steps. `, ); const result = await readmeBestPractices({ readme_path: readmePath, }); expect(result.success).toBe(true); expect(result.data!.bestPracticesReport.summary).toBeDefined(); expect( result.data!.bestPracticesReport.summary.criticalIssues, ).toBeGreaterThanOrEqual(0); expect( result.data!.bestPracticesReport.summary.importantIssues, ).toBeGreaterThanOrEqual(0); expect( result.data!.bestPracticesReport.summary.sectionsPresent, ).toBeGreaterThanOrEqual(0); expect( result.data!.bestPracticesReport.summary.totalSections, ).toBeGreaterThan(0); }); }); describe("Template Generation", () => { test("should generate README template when file is missing", async () => { const outputDir = join(testDir, "template-output"); await mkdir(outputDir, { recursive: true }); const result = await readmeBestPractices({ readme_path: join(testDir, "missing.md"), generate_template: true, output_directory: outputDir, project_type: "tool", include_community_files: true, }); expect(result.success).toBe(true); expect(result.data).toBeDefined(); }); test("should handle template generation without community files", async () => { const outputDir = join(testDir, "no-community-output"); await mkdir(outputDir, { recursive: true }); const result = await readmeBestPractices({ readme_path: join(testDir, "missing.md"), generate_template: true, output_directory: outputDir, include_community_files: false, }); expect(result.success).toBe(true); expect(result.data).toBeDefined(); }); }); describe("Response Format", () => { test("should return MCPToolResponse structure", async () => { const readmePath = join(testDir, "README.md"); await writeFile(readmePath, "# Test Project"); const result = await readmeBestPractices({ readme_path: readmePath, }); expect(result.success).toBeDefined(); expect(result.metadata).toBeDefined(); expect(result.metadata.toolVersion).toBe("1.0.0"); expect(result.metadata.executionTime).toBeGreaterThanOrEqual(0); expect(result.metadata.timestamp).toBeDefined(); expect(result.metadata.analysisId).toBeDefined(); }); test("should format properly with formatMCPResponse", async () => { const readmePath = join(testDir, "README.md"); await writeFile(readmePath, "# Test Project"); const result = await readmeBestPractices({ readme_path: readmePath, }); // Test that the result can be formatted without errors const formatted = formatMCPResponse(result); expect(formatted.content).toBeDefined(); expect(Array.isArray(formatted.content)).toBe(true); expect(formatted.content.length).toBeGreaterThan(0); expect(formatted.isError).toBe(false); }); }); });

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/tosin2013/documcp'

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