UNPKG

systemprompt-mcp-core

Version:

A specialized Model Context Protocol (MCP) server that integrates with systemprompt.io to provide powerful prompt management capabilities. This server enables seamless creation, management, and versioning of system prompts and agents through MCP. It works

256 lines (255 loc) 9.62 kB
import { SystemPromptService } from "../systemprompt-service.js"; // Mock fetch const mockFetch = jest.fn(); global.fetch = mockFetch; describe("SystemPromptService", () => { let service; const mockApiKey = "test-api-key"; beforeEach(() => { jest.clearAllMocks(); process.env.SYSTEMPROMPT_API_KEY = mockApiKey; service = new SystemPromptService(); }); afterEach(() => { delete process.env.SYSTEMPROMPT_API_KEY; }); describe("createPrompt", () => { const validPromptData = { instruction: { static: "Test instruction", state: "Test state", dynamic: "Test dynamic", }, input: { name: "test_input", description: "Test input description", type: ["message"], }, output: { name: "test_output", description: "Test output description", type: ["message"], }, metadata: { title: "Test prompt", description: "Test description", tag: ["test"], }, }; it("should create a prompt successfully", async () => { const mockResponse = { id: "test-uuid", ...validPromptData, _link: "test-link", metadata: { ...validPromptData.metadata, created: "2024-01-01", updated: "2024-01-01", version: 1, status: "draft", author: "test", log_message: "Created", }, }; mockFetch.mockResolvedValueOnce({ ok: true, json: () => Promise.resolve(mockResponse), }); const result = await service.createPrompt(validPromptData); expect(mockFetch).toHaveBeenCalledWith("https://api.systemprompt.io/v1/prompt", { method: "POST", headers: { "Content-Type": "application/json", "api-key": mockApiKey, }, body: JSON.stringify(validPromptData), }); expect(result).toEqual(mockResponse); }); it("should handle API errors", async () => { const errorMessage = "Invalid input"; mockFetch.mockResolvedValueOnce({ ok: false, json: () => Promise.resolve({ message: errorMessage }), }); await expect(service.createPrompt(validPromptData)).rejects.toThrow(errorMessage); }); }); describe("editPrompt", () => { const uuid = "test-uuid"; const updateData = { instruction: { static: "Updated instruction", }, metadata: { title: "Updated title", description: "Test description", }, }; it("should edit a prompt successfully", async () => { const mockResponse = { id: uuid, instruction: { static: "Updated instruction" }, input: { name: "test_input", description: "Test input description", type: ["message"], }, output: { name: "test_output", description: "Test output description", type: ["message"], }, metadata: { title: "Updated title", description: "Test description", created: "2024-01-01", updated: "2024-01-01", version: 1, status: "draft", author: "test", log_message: "Updated", }, _link: "test-link", }; mockFetch.mockResolvedValueOnce({ ok: true, json: () => Promise.resolve(mockResponse), }); const result = await service.editPrompt(uuid, updateData); expect(mockFetch).toHaveBeenCalledWith(`https://api.systemprompt.io/v1/prompt/${uuid}`, { method: "PUT", headers: { "Content-Type": "application/json", "api-key": mockApiKey, }, body: JSON.stringify(updateData), }); expect(result).toEqual(mockResponse); }); it("should handle API errors", async () => { const errorMessage = "Prompt not found"; mockFetch.mockResolvedValueOnce({ ok: false, json: () => Promise.resolve({ message: errorMessage }), }); await expect(service.editPrompt(uuid, updateData)).rejects.toThrow(errorMessage); }); }); describe("createBlock", () => { const validBlockData = { content: "Test block content", prefix: "test_block", metadata: { title: "Test block", description: "Test description", tag: ["test"], }, }; it("should create a block successfully", async () => { const mockResponse = { id: "test-uuid", ...validBlockData, _link: "test-link", metadata: { ...validBlockData.metadata, created: "2024-01-01", updated: "2024-01-01", version: 1, status: "draft", author: "test", log_message: "Created", }, }; mockFetch.mockResolvedValueOnce({ ok: true, json: () => Promise.resolve(mockResponse), }); const result = await service.createBlock(validBlockData); expect(mockFetch).toHaveBeenCalledWith("https://api.systemprompt.io/v1/block", { method: "POST", headers: { "Content-Type": "application/json", "api-key": mockApiKey, }, body: JSON.stringify(validBlockData), }); expect(result).toEqual(mockResponse); }); it("should handle API errors", async () => { const errorMessage = "Invalid input"; mockFetch.mockResolvedValueOnce({ ok: false, json: () => Promise.resolve({ message: errorMessage }), }); await expect(service.createBlock(validBlockData)).rejects.toThrow(errorMessage); }); }); describe("editBlock", () => { const uuid = "test-uuid"; const updateData = { content: "Updated content", metadata: { title: "Updated title", description: "Test description", }, }; it("should edit a block successfully", async () => { const mockResponse = { id: uuid, content: "Updated content", metadata: { title: "Updated title", description: "Test description", created: "2024-01-01", updated: "2024-01-01", version: 1, status: "draft", author: "test", log_message: "Updated", }, _link: "test-link", }; mockFetch.mockResolvedValueOnce({ ok: true, json: () => Promise.resolve(mockResponse), }); const result = await service.editBlock(uuid, updateData); expect(mockFetch).toHaveBeenCalledWith(`https://api.systemprompt.io/v1/block/${uuid}`, { method: "PUT", headers: { "Content-Type": "application/json", "api-key": mockApiKey, }, body: JSON.stringify(updateData), }); expect(result).toEqual(mockResponse); }); it("should handle API errors", async () => { const errorMessage = "Block not found"; mockFetch.mockResolvedValueOnce({ ok: false, json: () => Promise.resolve({ message: errorMessage }), }); await expect(service.editBlock(uuid, updateData)).rejects.toThrow(errorMessage); }); }); describe("error handling", () => { it("should handle network errors", async () => { mockFetch.mockRejectedValueOnce(new Error("Network error")); await expect(service.createPrompt({})).rejects.toThrow("Network error"); }); it("should handle invalid JSON responses", async () => { mockFetch.mockResolvedValueOnce({ ok: false, json: () => Promise.reject(new Error("Invalid JSON")), }); await expect(service.createPrompt({})).rejects.toThrow("API request failed"); }); it("should handle missing API key", () => { delete process.env.SYSTEMPROMPT_API_KEY; const service = new SystemPromptService(); expect(service["apiKey"]).toBe(""); }); }); });