Skip to main content
Glama
index.ts•3.09 kB
import { vi } from "bun:test" /** * Mock fetch responses for testing */ export const mockFetchResponses = new Map<string, any>() /** * Mock fetch implementation */ export const mockFetch = vi.fn((url: string | URL, _init?: RequestInit) => { const urlString = url.toString() // Check if we have a mock response const mockResponse = mockFetchResponses.get(urlString) if (mockResponse) { if (mockResponse.error) { throw mockResponse.error } return { ok: mockResponse.ok ?? true, status: mockResponse.status ?? 200, statusText: mockResponse.statusText ?? "OK", headers: new Headers( mockResponse.headers || { "content-type": mockResponse.contentType || "application/json" } ), json: async () => mockResponse.json, text: async () => mockResponse.text || JSON.stringify(mockResponse.json), arrayBuffer: async () => mockResponse.arrayBuffer || new ArrayBuffer(0) } as Response } // Default 404 response return { ok: false, status: 404, statusText: "Not Found", headers: new Headers(), json: () => { throw new Error("Not Found") }, text: async () => "Not Found" } as Response }) /** * Reset all mocks */ export const resetMocks = () => { mockFetchResponses.clear() mockFetch.mockClear() } /** * Mock SQLite cache for testing */ export const createMockCache = <T>() => { const store = new Map<string, { value: T; expires: number }>() return { get: (key: string): T | null => { const entry = store.get(key) if (!entry) return null if (entry.expires < Date.now()) { store.delete(key) return null } return entry.value }, set: (key: string, value: T, ttl: number) => { store.set(key, { value, expires: Date.now() + ttl }) }, delete: (key: string) => { store.delete(key) }, clear: () => { store.clear() }, close: () => { // No-op for mock } } } /** * Mock rustdoc JSON response */ export const mockRustdocJson = { format_version: 30, root: "0:0", crate: { name: "test_crate", version: "1.0.0" }, index: { "0:0": { name: "test_crate", kind: "module", inner: { module: { items: ["0:1", "0:2"] } } }, "0:1": { name: "TestStruct", kind: "struct", inner: { struct: { kind: "plain", fields: [] } } }, "0:2": { name: "test_function", kind: "function", inner: { function: { decl: { inputs: [], output: null } } } } }, paths: { "0:0": { crate_id: 0, path: ["test_crate"] }, "0:1": { crate_id: 0, path: ["test_crate", "TestStruct"] }, "0:2": { crate_id: 0, path: ["test_crate", "test_function"] } } } /** * Mock crates.io search response */ export const mockCratesSearchResponse = (query: string, crates: any[] = []) => ({ crates: crates.length > 0 ? crates : [ { name: query, description: `A mock crate matching ${query}`, downloads: 1000000, recent_downloads: 50000, max_stable_version: "1.0.0" } ], meta: { total: crates.length || 1 } })

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/vexxvakan/mcp-docsrs'

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