UNPKG

@access-mcp/affinity-groups

Version:

MCP server for ACCESS-CI Affinity Groups API

217 lines (216 loc) 9.31 kB
import { describe, it, expect, beforeEach } from "vitest"; import { AffinityGroupsServer } from "../server.js"; /** * Integration tests for AffinityGroupsServer * These tests make real API calls to the ACCESS Support API */ describe("AffinityGroupsServer Integration Tests", () => { let server; beforeEach(() => { server = new AffinityGroupsServer(); }); describe("Real API Calls - List Groups", () => { it("should list all affinity groups", async () => { const result = await server["handleToolCall"]({ method: "tools/call", params: { name: "search_affinity_groups", arguments: {}, }, }); expect(result.content).toHaveLength(1); const content = result.content[0]; const responseData = JSON.parse(content.text); // Check universal response format expect(responseData).toHaveProperty("total"); expect(responseData).toHaveProperty("items"); expect(Array.isArray(responseData.items)).toBe(true); expect(responseData.total).toBeGreaterThan(0); // Verify group structure if we have groups if (responseData.items.length > 0) { const group = responseData.items[0]; expect(group).toHaveProperty("id"); expect(group).toHaveProperty("name"); } console.log(`✅ Found ${responseData.total} affinity groups`); }, 15000); }); describe("Real API Calls - Get Specific Group", () => { it("should get specific affinity group details", async () => { // First list groups to get a valid ID const listResult = await server["handleToolCall"]({ method: "tools/call", params: { name: "search_affinity_groups", arguments: {}, }, }); const listContent = listResult.content[0]; const listData = JSON.parse(listContent.text); if (listData.items.length > 0) { const groupId = listData.items[0].id; // Get specific group const result = await server["handleToolCall"]({ method: "tools/call", params: { name: "search_affinity_groups", arguments: { id: groupId, }, }, }); const content = result.content[0]; const responseData = JSON.parse(content.text); expect(responseData).toHaveProperty("total"); expect(responseData).toHaveProperty("items"); expect(responseData.items).toHaveLength(1); expect(responseData.items[0].id).toBe(groupId); console.log(`✅ Retrieved group ${groupId}: ${responseData.items[0].name}`); } }, 20000); }); describe("Real API Calls - Group with Events", () => { it("should get group with events included", async () => { // Get a group ID first const listResult = await server["handleToolCall"]({ method: "tools/call", params: { name: "search_affinity_groups", arguments: {}, }, }); const listContent = listResult.content[0]; const listData = JSON.parse(listContent.text); if (listData.items.length > 0) { const groupId = listData.items[0].id; // Get group with events const result = await server["handleToolCall"]({ method: "tools/call", params: { name: "search_affinity_groups", arguments: { id: groupId, include: "events", }, }, }); const content = result.content[0]; const responseData = JSON.parse(content.text); expect(responseData).toHaveProperty("total"); expect(responseData).toHaveProperty("items"); console.log(`✅ Retrieved group events for ${groupId}`); } }, 20000); }); describe("Real API Calls - Group with KB", () => { it("should get group with knowledge base included", async () => { // Get a group ID first const listResult = await server["handleToolCall"]({ method: "tools/call", params: { name: "search_affinity_groups", arguments: {}, }, }); const listContent = listResult.content[0]; const listData = JSON.parse(listContent.text); if (listData.items.length > 0) { const groupId = listData.items[0].id; // Get group with KB const result = await server["handleToolCall"]({ method: "tools/call", params: { name: "search_affinity_groups", arguments: { id: groupId, include: "kb", }, }, }); const content = result.content[0]; const responseData = JSON.parse(content.text); expect(responseData).toHaveProperty("total"); expect(responseData).toHaveProperty("items"); console.log(`✅ Retrieved group KB for ${groupId}`); } }, 20000); }); describe("Real API Calls - Group with All Resources", () => { it("should get group with all resources included", async () => { // Get a group ID first const listResult = await server["handleToolCall"]({ method: "tools/call", params: { name: "search_affinity_groups", arguments: {}, }, }); const listContent = listResult.content[0]; const listData = JSON.parse(listContent.text); if (listData.items.length > 0) { const groupId = listData.items[0].id; // Get group with all resources const result = await server["handleToolCall"]({ method: "tools/call", params: { name: "search_affinity_groups", arguments: { id: groupId, include: "all", }, }, }); const content = result.content[0]; const responseData = JSON.parse(content.text); // When include: "all", response structure is different expect(responseData).toHaveProperty("group"); expect(responseData).toHaveProperty("events"); expect(responseData).toHaveProperty("knowledge_base"); console.log(`✅ Retrieved all resources for ${groupId}`); } }, 25000); }); describe("Error Handling", () => { it("should handle invalid group ID gracefully", async () => { const result = await server["handleToolCall"]({ method: "tools/call", params: { name: "search_affinity_groups", arguments: { id: "nonexistent-group-id-xyz-123", }, }, }); const content = result.content[0]; const responseData = JSON.parse(content.text); // Should either return error or empty results if (responseData.error) { expect(responseData).toHaveProperty("error"); } else { expect(responseData).toHaveProperty("total"); expect(responseData).toHaveProperty("items"); } console.log("✅ Invalid group ID handled correctly"); }, 15000); }); describe("Resource Endpoint", () => { it("should fetch data through resource endpoint", async () => { const result = await server["handleResourceRead"]({ method: "resources/read", params: { uri: "accessci://affinity-groups", }, }); expect(result.contents).toHaveLength(1); expect(result.contents[0].mimeType).toBe("application/json"); const content = result.contents[0]; const textContent = "text" in content ? content.text : ""; const data = JSON.parse(textContent); expect(data).toHaveProperty("total"); expect(data).toHaveProperty("items"); expect(Array.isArray(data.items)).toBe(true); console.log("✅ Resource endpoint working correctly"); }, 15000); }); });