Skip to main content
Glama
CloudflareAPIClient.test.jsβ€’7.87 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const vitest_1 = require("vitest"); const CloudflareConfig_1 = require("../config/CloudflareConfig"); const CloudflareAPIClient_1 = require("./CloudflareAPIClient"); // Mock fetch globally global.fetch = vitest_1.vi.fn(); (0, vitest_1.describe)('CloudflareAPIClient', () => { let client; let config; (0, vitest_1.beforeEach)(() => { config = new CloudflareConfig_1.CloudflareConfig('test-account-id', 'test-api-token'); client = new CloudflareAPIClient_1.CloudflareAPIClient(config); vitest_1.vi.clearAllMocks(); }); (0, vitest_1.describe)('constructor', () => { (0, vitest_1.it)('should create client with config', () => { (0, vitest_1.expect)(client).toBeInstanceOf(CloudflareAPIClient_1.CloudflareAPIClient); }); }); (0, vitest_1.describe)('query()', () => { (0, vitest_1.it)('should execute SQL query successfully', async () => { const mockResponse = { success: true, result: [ { success: true, results: [ { id: 1, name: 'test' }, { id: 2, name: 'test2' }, ], meta: { duration: 10, rows_read: 2, }, }, ], errors: [], messages: [], }; global.fetch.mockResolvedValue({ ok: true, status: 200, json: async () => mockResponse, }); const result = await client.query('db-123', 'SELECT * FROM users'); (0, vitest_1.expect)(result.success).toBe(true); (0, vitest_1.expect)(result.results).toHaveLength(2); (0, vitest_1.expect)(result.meta?.duration).toBe(10); }); (0, vitest_1.it)('should include authentication headers', async () => { const mockResponse = { success: true, result: [{ success: true, results: [] }], errors: [], messages: [], }; global.fetch.mockResolvedValue({ ok: true, json: async () => mockResponse, }); await client.query('db-123', 'SELECT 1'); (0, vitest_1.expect)(global.fetch).toHaveBeenCalledWith(vitest_1.expect.stringContaining('/d1/database/db-123/query'), vitest_1.expect.objectContaining({ headers: vitest_1.expect.objectContaining({ 'Authorization': 'Bearer test-api-token', 'Content-Type': 'application/json', }), })); }); (0, vitest_1.it)('should send SQL in request body', async () => { const mockResponse = { success: true, result: [{ success: true, results: [] }], errors: [], messages: [], }; global.fetch.mockResolvedValue({ ok: true, json: async () => mockResponse, }); await client.query('db-123', 'SELECT * FROM users WHERE id = 1'); (0, vitest_1.expect)(global.fetch).toHaveBeenCalledWith(vitest_1.expect.any(String), vitest_1.expect.objectContaining({ method: 'POST', body: JSON.stringify({ sql: 'SELECT * FROM users WHERE id = 1' }), })); }); (0, vitest_1.it)('should throw error for HTTP error response', async () => { global.fetch.mockResolvedValue({ ok: false, status: 404, statusText: 'Not Found', json: async () => ({ success: false, errors: [{ code: 7003, message: 'Database not found' }], }), }); await (0, vitest_1.expect)(client.query('invalid-db', 'SELECT 1')).rejects.toThrow(CloudflareAPIClient_1.CloudflareAPIError); }); (0, vitest_1.it)('should throw error when API returns success: false', async () => { global.fetch.mockResolvedValue({ ok: true, status: 200, json: async () => ({ success: false, result: [], errors: [{ code: 1000, message: 'SQL syntax error' }], messages: [], }), }); await (0, vitest_1.expect)(client.query('db-123', 'INVALID SQL')).rejects.toThrow('D1 query failed'); }); (0, vitest_1.it)('should handle network errors', async () => { global.fetch.mockRejectedValue(new Error('Network error')); await (0, vitest_1.expect)(client.query('db-123', 'SELECT 1')).rejects.toThrow('Network error'); }); }); (0, vitest_1.describe)('getDatabaseInfo()', () => { (0, vitest_1.it)('should get database information', async () => { const mockResponse = { success: true, result: { uuid: 'db-123', name: 'my-database', version: '1.0', }, errors: [], messages: [], }; global.fetch.mockResolvedValue({ ok: true, json: async () => mockResponse, }); const info = await client.getDatabaseInfo('db-123'); (0, vitest_1.expect)(info).toEqual({ uuid: 'db-123', name: 'my-database', version: '1.0', }); }); (0, vitest_1.it)('should use GET method', async () => { const mockResponse = { success: true, result: {}, errors: [], messages: [], }; global.fetch.mockResolvedValue({ ok: true, json: async () => mockResponse, }); await client.getDatabaseInfo('db-123'); (0, vitest_1.expect)(global.fetch).toHaveBeenCalledWith(vitest_1.expect.stringContaining('/d1/database/db-123'), vitest_1.expect.objectContaining({ method: 'GET', })); }); (0, vitest_1.it)('should throw error for failed request', async () => { global.fetch.mockResolvedValue({ ok: false, status: 403, statusText: 'Forbidden', json: async () => ({ success: false, errors: [{ code: 10000, message: 'Authentication failed' }], }), }); await (0, vitest_1.expect)(client.getDatabaseInfo('db-123')).rejects.toThrow(CloudflareAPIClient_1.CloudflareAPIError); }); }); (0, vitest_1.describe)('CloudflareAPIError', () => { (0, vitest_1.it)('should include status code in error', () => { const error = new CloudflareAPIClient_1.CloudflareAPIError('Test error', 404); (0, vitest_1.expect)(error.message).toBe('Test error'); (0, vitest_1.expect)(error.statusCode).toBe(404); (0, vitest_1.expect)(error.name).toBe('CloudflareAPIError'); }); (0, vitest_1.it)('should include errors array', () => { const errors = [{ code: 1000, message: 'Error message' }]; const error = new CloudflareAPIClient_1.CloudflareAPIError('Test error', 400, errors); (0, vitest_1.expect)(error.errors).toEqual(errors); }); }); }); //# sourceMappingURL=CloudflareAPIClient.test.js.map

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/semanticintent/semantic-d1-mcp'

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