sse-endpoint.test.ts•2.89 kB
import { randomUUID } from "node:crypto";
import { describe, expect, it, vi } from "vitest";
// Mock the S3Client for SSE endpoint tests
vi.mock("@aws-sdk/client-s3", async () => {
const actual = await vi.importActual("@aws-sdk/client-s3");
return {
...actual,
S3Client: vi.fn().mockImplementation(() => ({
send: vi.fn().mockResolvedValue({ Buckets: [] }),
config: {},
middlewareStack: { clone: () => ({ use: () => {} }) },
destroy: () => {},
})),
};
});
describe("SSE Endpoint Configuration", () => {
it("should verify StreamableHTTPServerTransport configuration", async () => {
// Test that the transport is configured correctly for SSE
const { StreamableHTTPServerTransport } = await import(
"@modelcontextprotocol/sdk/server/streamableHttp.js"
);
expect(StreamableHTTPServerTransport).toBeDefined();
expect(typeof StreamableHTTPServerTransport).toBe("function");
});
it("should test MCP transport configuration options", () => {
// Test the configuration options for StreamableHTTPServerTransport
const config = {
sessionIdGenerator: () => randomUUID(),
enableJsonResponse: false, // Use SSE mode
};
expect(typeof config.sessionIdGenerator).toBe("function");
expect(config.enableJsonResponse).toBe(false);
const sessionId = config.sessionIdGenerator();
expect(sessionId).toMatch(/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/);
});
it("should test SSE headers configuration", () => {
const sseHeaders = {
"Content-Type": "text/event-stream",
"Cache-Control": "no-cache",
Connection: "keep-alive",
"Access-Control-Allow-Origin": "*",
"Access-Control-Allow-Headers": "Last-Event-ID",
};
expect(sseHeaders["Content-Type"]).toBe("text/event-stream");
expect(sseHeaders["Cache-Control"]).toBe("no-cache");
expect(sseHeaders.Connection).toBe("keep-alive");
expect(sseHeaders["Access-Control-Allow-Origin"]).toBe("*");
});
it("should test session ID generation", () => {
const generateSessionId = () => randomUUID();
const sessionId1 = generateSessionId();
const sessionId2 = generateSessionId();
expect(sessionId1).toBeDefined();
expect(sessionId2).toBeDefined();
expect(sessionId1).not.toBe(sessionId2);
expect(sessionId1).toMatch(/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/);
});
it("should verify TransformStream for SSE data flow", () => {
const { readable, writable } = new TransformStream();
const writer = writable.getWriter();
const reader = readable.getReader();
expect(writer).toBeDefined();
expect(reader).toBeDefined();
expect(typeof writer.write).toBe("function");
expect(typeof reader.read).toBe("function");
// Clean up
writer.releaseLock();
reader.releaseLock();
});
});