Skip to main content
Glama
kongyo2

EVE University Wiki MCP Server

server.test.ts13.8 kB
import { describe, expect, it, vi, beforeEach, afterEach } from "vitest"; import { FastMCP } from "fastmcp"; import { EveWikiClient } from "./eve-wiki-client.js"; // Mock the EveWikiClient vi.mock("./eve-wiki-client.js"); describe("EVE University Wiki MCP Server", () => { let mockEveWikiClient: any; let server: FastMCP; beforeEach(() => { // Reset all mocks vi.clearAllMocks(); // Create mock client with all methods mockEveWikiClient = { search: vi.fn(), getArticle: vi.fn(), getSummary: vi.fn(), getSections: vi.fn(), getLinks: vi.fn(), getRelatedTopics: vi.fn(), }; // Mock the constructor (EveWikiClient as any).mockImplementation(() => mockEveWikiClient); // Create server for testing (we'll test the client methods directly) server = new FastMCP({ name: "EVE University Wiki", version: "1.0.0", }); }); afterEach(() => { vi.restoreAllMocks(); }); describe("Server Configuration", () => { it("should have correct server metadata", () => { expect(server).toBeDefined(); // Note: We can't easily test the server name/version without accessing internals // This would require the server to expose these properties }); }); describe("Tool: search_eve_wiki", () => { it("should search EVE Wiki successfully", async () => { const mockResults = [ { title: "Rifter", snippet: "The Rifter is a Minmatar frigate", pageid: 123, wordcount: 500, timestamp: "2023-01-01T00:00:00Z" } ]; mockEveWikiClient.search.mockResolvedValue(mockResults); // We need to test the tool execution logic directly // Since we can't easily access the server's tools, we'll test the client method const result = await mockEveWikiClient.search("Rifter", 10); expect(mockEveWikiClient.search).toHaveBeenCalledWith("Rifter", 10); expect(result).toEqual(mockResults); }); it("should handle search errors gracefully", async () => { const error = new Error("Network error"); mockEveWikiClient.search.mockRejectedValue(error); await expect(mockEveWikiClient.search("test", 10)).rejects.toThrow("Network error"); }); it("should validate search parameters", () => { // Test parameter validation logic const validParams = { query: "Rifter", limit: 10 }; const invalidParams = { query: "", limit: -1 }; // These would be validated by Zod schema in the actual server expect(validParams.query).toBeTruthy(); expect(validParams.limit).toBeGreaterThan(0); expect(validParams.limit).toBeLessThanOrEqual(50); expect(invalidParams.query).toBeFalsy(); expect(invalidParams.limit).toBeLessThan(1); }); it("should respect limit boundaries", () => { // Test limit validation expect(1).toBeGreaterThanOrEqual(1); expect(1).toBeLessThanOrEqual(50); expect(50).toBeLessThanOrEqual(50); expect(10).toBe(10); // default value }); it("should return archived note when search results are from Wayback Machine", () => { const mockArchivedResults = [ { title: "Rifter (Archived)", snippet: "Archived content...", pageid: -1, // Archived result }, ]; const hasArchivedResults = mockArchivedResults.some(r => r.pageid === -1); const response = { query: "Rifter", results: mockArchivedResults, note: hasArchivedResults ? "Some results are from Internet Archive Wayback Machine" : undefined, }; expect(response.note).toContain("Internet Archive Wayback Machine"); expect(response.results[0].pageid).toBe(-1); }); }); describe("Tool: get_eve_wiki_article", () => { it("should get article successfully", async () => { const mockArticle = { title: "Rifter", content: "The Rifter is a Minmatar frigate ship...", pageid: 123, revid: 456, timestamp: "2023-01-01T00:00:00Z" }; mockEveWikiClient.getArticle.mockResolvedValue(mockArticle); const result = await mockEveWikiClient.getArticle("Rifter"); expect(mockEveWikiClient.getArticle).toHaveBeenCalledWith("Rifter"); expect(result).toEqual(mockArticle); }); it("should handle article not found", async () => { const error = new Error('Article "NonExistent" not found'); mockEveWikiClient.getArticle.mockRejectedValue(error); await expect(mockEveWikiClient.getArticle("NonExistent")).rejects.toThrow('Article "NonExistent" not found'); }); it("should limit content length in response", () => { const longContent = "a".repeat(20000); const limitedContent = longContent.substring(0, 10000); expect(limitedContent.length).toBe(10000); expect(limitedContent.length).toBeLessThan(longContent.length); }); it("should return correct source when article is from Wayback Machine", () => { const mockArticle = { title: "Rifter (Archived)", content: "Archived content...", pageid: -1, timestamp: "2023-01-01T00:00:00Z", }; const isArchived = mockArticle.pageid === -1; const response = { ...mockArticle, source: isArchived ? "wayback_machine" : "live_wiki", note: isArchived ? "Content retrieved from Internet Archive Wayback Machine" : undefined, }; expect(response.source).toBe("wayback_machine"); expect(response.note).toContain("Internet Archive Wayback Machine"); }); }); describe("Tool: get_eve_wiki_summary", () => { it("should get summary successfully", async () => { const mockSummary = "The Rifter is a Minmatar frigate known for its speed and agility."; mockEveWikiClient.getSummary.mockResolvedValue(mockSummary); const result = await mockEveWikiClient.getSummary("Rifter"); expect(mockEveWikiClient.getSummary).toHaveBeenCalledWith("Rifter"); expect(result).toBe(mockSummary); }); it("should return correct source when summary is from Wayback Machine", () => { const mockSummary = "Archived summary (Retrieved from archived version)"; const isArchived = mockSummary.includes( "(Retrieved from archived version)", ); const response = { title: "Rifter", summary: mockSummary, source: isArchived ? "wayback_machine" : "live_wiki", }; expect(response.source).toBe("wayback_machine"); }); it("should handle summary errors", async () => { const error = new Error("Failed to get summary"); mockEveWikiClient.getSummary.mockRejectedValue(error); await expect(mockEveWikiClient.getSummary("test")).rejects.toThrow("Failed to get summary"); }); }); describe("Tool: get_eve_wiki_sections", () => { it("should get sections successfully", async () => { const mockSections = [ { title: "Overview", level: 1, index: 1 }, { title: "Fitting", level: 2, index: 2 }, { title: "Combat", level: 2, index: 3 } ]; mockEveWikiClient.getSections.mockResolvedValue(mockSections); const result = await mockEveWikiClient.getSections("Rifter"); expect(mockEveWikiClient.getSections).toHaveBeenCalledWith("Rifter"); expect(result).toEqual(mockSections); }); it("should handle empty sections", async () => { mockEveWikiClient.getSections.mockResolvedValue([]); const result = await mockEveWikiClient.getSections("EmptyArticle"); expect(result).toEqual([]); }); }); describe("Tool: get_eve_wiki_links", () => { it("should get links successfully", async () => { const mockLinks = [ "Minmatar", "Frigate", "Ship fitting", "PvP", "Faction warfare" ]; mockEveWikiClient.getLinks.mockResolvedValue(mockLinks); const result = await mockEveWikiClient.getLinks("Rifter"); expect(mockEveWikiClient.getLinks).toHaveBeenCalledWith("Rifter"); expect(result).toEqual(mockLinks); }); it("should limit links to 100 in response", () => { const manyLinks = Array.from({ length: 200 }, (_, i) => `Link ${i}`); const limitedLinks = manyLinks.slice(0, 100); expect(limitedLinks.length).toBe(100); expect(limitedLinks.length).toBeLessThan(manyLinks.length); }); }); describe("Tool: get_eve_wiki_related_topics", () => { it("should get related topics successfully", async () => { const mockRelatedTopics = [ "Slasher", "Breacher", "Burst", "Minmatar ships" ]; mockEveWikiClient.getRelatedTopics.mockResolvedValue(mockRelatedTopics); const result = await mockEveWikiClient.getRelatedTopics("Rifter", 10); expect(mockEveWikiClient.getRelatedTopics).toHaveBeenCalledWith("Rifter", 10); expect(result).toEqual(mockRelatedTopics); }); it("should validate limit parameter", () => { // Test limit validation for related topics expect(1).toBeGreaterThanOrEqual(1); expect(20).toBeLessThanOrEqual(20); expect(10).toBe(10); // default value }); }); describe("Error Handling", () => { it("should format error messages consistently", () => { const error = new Error("Test error"); const formattedError = `Error searching EVE Wiki: ${error}`; expect(formattedError).toBe("Error searching EVE Wiki: Error: Test error"); }); it("should handle different error types", () => { const networkError = new Error("Network timeout"); const apiError = new Error("API rate limit exceeded"); const parseError = new Error("Invalid JSON response"); expect(networkError.message).toBe("Network timeout"); expect(apiError.message).toBe("API rate limit exceeded"); expect(parseError.message).toBe("Invalid JSON response"); }); }); describe("JSON Response Formatting", () => { it("should format search results correctly", () => { const query = "Rifter"; const results = [{ title: "Rifter", snippet: "Test" }]; const formatted = JSON.stringify({ query: query, results: results, }, null, 2); expect(formatted).toContain('"query": "Rifter"'); expect(formatted).toContain('"results"'); expect(JSON.parse(formatted)).toEqual({ query: query, results: results, }); }); it("should format article response correctly", () => { const article = { title: "Rifter", content: "Long content...", pageid: 123, timestamp: "2023-01-01T00:00:00Z" }; const formatted = JSON.stringify({ title: article.title, content: article.content.substring(0, 10000), pageid: article.pageid, timestamp: article.timestamp, }, null, 2); const parsed = JSON.parse(formatted); expect(parsed.title).toBe("Rifter"); expect(parsed.pageid).toBe(123); expect(parsed.timestamp).toBe("2023-01-01T00:00:00Z"); }); }); describe("Tool Annotations", () => { it("should have correct annotations for all tools", () => { // Test that all tools should have these annotations const expectedAnnotations = { openWorldHint: true, readOnlyHint: true, }; expect(expectedAnnotations.openWorldHint).toBe(true); expect(expectedAnnotations.readOnlyHint).toBe(true); }); it("should have descriptive titles", () => { const toolTitles = [ "Search EVE University Wiki", "Get EVE University Wiki Article", "Get EVE University Wiki Summary", "Get EVE University Wiki Sections", "Get EVE University Wiki Links", "Get Related EVE University Wiki Topics" ]; toolTitles.forEach(title => { expect(title).toContain("EVE University Wiki"); expect(title.length).toBeGreaterThan(10); }); }); }); });

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/kongyo2/EVE-University-Wiki-MCP-Server'

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