Skip to main content
Glama
defaults.test.ts5.73 kB
import { describe, it, expect, vi, beforeEach, afterEach } from "vitest"; import * as fs from "fs"; import * as path from "path"; import * as url from "url"; import { processDefaultsResources } from "../../../src/resources/defaults"; // Mock modules vi.mock("fs"); vi.mock("path"); vi.mock("url"); describe("Defaults Resources Module", () => { // Setup mocks beforeEach(() => { // Mock url.fileURLToPath vi.mocked(url.fileURLToPath).mockReturnValue("/mock/path/resources"); // Mock path.dirname vi.mocked(path.dirname).mockReturnValue("/mock/path"); // Mock path.join vi.mocked(path.join).mockImplementation((...paths) => paths.join("/")); // Mock fs.readFileSync vi.mocked(fs.readFileSync).mockReturnValue(JSON.stringify({ "typescript_docs": "https://example.com/typescript/llms.txt", "react_docs": "https://example.com/react/llms.txt", "nodejs_docs": "https://example.com/nodejs/llms.txt" })); // Mock fetch global.fetch = vi.fn().mockImplementation(async (url) => { return { text: async () => `Mock content for ${url}` }; }); }); afterEach(() => { vi.resetAllMocks(); }); it("should process defaults resources correctly", () => { const resources = processDefaultsResources(); // Should have the expected number of resources expect(resources).toHaveLength(3); // Verify the first resource has expected properties const typescriptResource = resources.find(r => r.id === "typescript_docs"); expect(typescriptResource).toBeDefined(); expect(typescriptResource?.name).toBe("Typescript Docs"); expect(typescriptResource?.description).toBe("Typescript docs llms.txt"); expect(typescriptResource?.mimetype).toBe("text/plain"); expect(typescriptResource?.uri).toBe("https://example.com/typescript/llms.txt"); // Verify that handler function exists expect(typescriptResource?.handler).toBeInstanceOf(Function); }); it("should transform resource name correctly", () => { const resources = processDefaultsResources(); // Check that names are correctly transformed const reactResource = resources.find(r => r.id === "react_docs"); expect(reactResource?.name).toBe("React Docs"); const nodejsResource = resources.find(r => r.id === "nodejs_docs"); expect(nodejsResource?.name).toBe("Nodejs Docs"); }); it("should handle resource handler calls correctly", async () => { const resources = processDefaultsResources(); const typescriptResource = resources.find(r => r.id === "typescript_docs"); // Call the handler with a mock URL const mockUrl = new URL("https://example.com/typescript/llms.txt"); const result = await typescriptResource?.handler(mockUrl); // Verify handler result structure expect(result).toBeDefined(); if (result) { expect(result.contents).toHaveLength(1); expect(result.contents[0].uri).toBe("https://example.com/typescript/llms.txt"); expect(result.contents[0].text).toBe("Mock content for https://example.com/typescript/llms.txt"); } }); it("should handle fetch errors in handler", async () => { // Modify fetch mock to throw an error global.fetch = vi.fn().mockImplementation(async () => { throw new Error("Network error"); }); const resources = processDefaultsResources(); const typescriptResource = resources.find(r => r.id === "typescript_docs"); // Call the handler with a mock URL const mockUrl = new URL("https://example.com/typescript/llms.txt"); // Should catch and propagate the error await expect(typescriptResource?.handler(mockUrl)).rejects.toThrow("Network error"); }); it("should handle file system errors", () => { // Modify fs.readFileSync to throw an error vi.mocked(fs.readFileSync).mockImplementation(() => { throw new Error("File not found"); }); // Should throw an error when the defaults file is not found expect(() => processDefaultsResources()).toThrow("File not found"); }); it("should handle JSON parsing errors", () => { // Modify fs.readFileSync to return invalid JSON vi.mocked(fs.readFileSync).mockReturnValue("{ invalid json"); // Should throw an error when the JSON is invalid expect(() => processDefaultsResources()).toThrow(); }); it("should handle empty resources", () => { // Modify fs.readFileSync to return empty object vi.mocked(fs.readFileSync).mockReturnValue("{}"); const resources = processDefaultsResources(); // Should return empty array expect(resources).toHaveLength(0); }); it("should handle complex resource names with multiple words", () => { // Setup more complex resource names vi.mocked(fs.readFileSync).mockReturnValue(JSON.stringify({ "complex_resource_name_with_multiple_words": "https://example.com/complex/llms.txt", "hyphenated_resource_name": "https://example.com/hyphenated/llms.txt" })); const resources = processDefaultsResources(); // Check the complex resource name transformation const complexResource = resources.find(r => r.id === "complex_resource_name_with_multiple_words"); expect(complexResource?.name).toBe("Complex Resource Name With Multiple Words"); expect(complexResource?.description).toBe("Complex resource name with multiple words llms.txt"); const hyphenatedResource = resources.find(r => r.id === "hyphenated_resource_name"); expect(hyphenatedResource?.name).toBe("Hyphenated Resource Name"); expect(hyphenatedResource?.description).toBe("Hyphenated resource name llms.txt"); }); });

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/maverickg59/sushimcp'

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