Skip to main content
Glama
test-pagination-fix-simple.mjs7.11 kB
// Simple test to verify the pagination fix without requiring TypeScript compilation import assert from 'assert'; // Mock Graph Client for testing const mockGraphClient = { api: (path) => ({ version: () => ({ query: () => ({ header: () => ({ get: async () => { // Simulate a paginated response if (path.includes('nextLink')) { // No nextLink - this is the last page return { '@odata.context': 'https://graph.microsoft.com/v1.0/$metadata#users', value: [ { id: '3', displayName: 'User 3', userPrincipalName: 'user3@example.com' }, { id: '4', displayName: 'User 4', userPrincipalName: 'user4@example.com' } ] }; } else { return { '@odata.context': 'https://graph.microsoft.com/v1.0/$metadata#users', value: [ { id: '1', displayName: 'User 1', userPrincipalName: 'user1@example.com' }, { id: '2', displayName: 'User 2', userPrincipalName: 'user2@example.com' } ], '@odata.nextLink': 'https://graph.microsoft.com/v1.0/users?$skiptoken=nextpage' }; } }) }) }) }) }) }; // Mock the handleCallMicrosoftApi function with the fixed logic async function handleCallMicrosoftApi(graphClient, args) { const startTime = Date.now(); // Extract parameters with defaults const { apiType = 'graph', path = '/users', method = 'get', fetchAll = false, responseFormat = 'json', selectFields = [] } = args; // Capture console output to check for JSON parsing errors const originalConsoleError = console.error; const originalConsoleLog = console.log; let consoleOutput = ''; console.error = (message) => { consoleOutput += message; }; console.log = (message) => { consoleOutput += message; }; try { let responseData; if (apiType === 'graph') { let request = graphClient.api(path).version('v1.0'); if (method.toLowerCase() === 'get' && fetchAll) { // Initialize with empty array for collecting all items let allItems = []; let nextLink = null; // Get first page const firstPageResponse = await request.get(); // Store context from first page const odataContext = firstPageResponse['@odata.context']; // Add items from first page if (firstPageResponse.value && Array.isArray(firstPageResponse.value)) { allItems = [...firstPageResponse.value]; } // Get nextLink from first page nextLink = firstPageResponse['@odata.nextLink']; // Fetch subsequent pages while (nextLink) { // Use console.debug instead of console.log to avoid JSON parsing errors console.debug(`Fetching next page: ${nextLink}`); // Create a new request for the next page const nextPageResponse = await graphClient.api(nextLink).get(); // Add items from next page if (nextPageResponse.value && Array.isArray(nextPageResponse.value)) { allItems = [...allItems, ...nextPageResponse.value]; } // Update nextLink nextLink = nextPageResponse['@odata.nextLink']; } // Construct final response responseData = { '@odata.context': odataContext, value: allItems, totalCount: allItems.length, fetchedAt: new Date().toISOString() }; } else { responseData = await request.get(); } } // Restore console functions console.error = originalConsoleError; console.log = originalConsoleLog; const executionTime = Date.now() - startTime; let resultText = `Result for ${apiType} API - ${method.toUpperCase()} ${path}:\n`; resultText += `Execution time: ${executionTime}ms\n`; if (fetchAll && responseData.totalCount !== undefined) { resultText += `Total items fetched: ${responseData.totalCount}\n`; } resultText += `\n${JSON.stringify(responseData, null, 2)}`; return { content: [{ type: "text", text: resultText }], consoleOutput: consoleOutput }; } catch (error) { // Restore console functions console.error = originalConsoleError; console.log = originalConsoleLog; throw error; } } async function runTest() { console.log('Starting pagination fix validation test...'); try { // Define arguments to fetch all users, simulating the original scenario const args = { apiType: 'graph', fetchAll: true, method: 'get', path: '/users', responseFormat: 'json', selectFields: ["id", "displayName", "userPrincipalName"] }; // Execute the API call const result = await handleCallMicrosoftApi(mockGraphClient, args); // 1. Check for JSON parsing errors in console output assert.strictEqual(result.consoleOutput.includes('Unexpected token'), false, `Test failed: Found JSON parsing errors in console output: ${result.consoleOutput}`); console.log('✔ Test Passed: No JSON parsing errors were found in the console output.'); // 2. Check if the result content is valid assert.ok(result.content, 'Test failed: Result content is missing.'); assert.strictEqual(Array.isArray(result.content), true, 'Test failed: Result content is not an array.'); assert.strictEqual(result.content.length > 0, true, 'Test failed: Result content is empty.'); console.log('✔ Test Passed: Result content is valid and not empty.'); // 3. Check if the response was parsed correctly const responseText = result.content[0].text; let parsedResponse; try { parsedResponse = JSON.parse(responseText.substring(responseText.indexOf('{'))); } catch (e) { assert.fail(`Test failed: Could not parse the final JSON response. Error: ${e.message}`); } assert.ok(parsedResponse.value, 'Test failed: Parsed response does not contain a "value" property.'); assert.ok(Array.isArray(parsedResponse.value), 'Test failed: Parsed response "value" is not an array.'); assert.strictEqual(parsedResponse.value.length, 4, 'Test failed: Expected 4 users from pagination, got ' + parsedResponse.value.length); console.log(`✔ Test Passed: Successfully parsed the final JSON response and found ${parsedResponse.value.length} users from pagination.`); // 4. Verify that pagination worked correctly assert.strictEqual(parsedResponse.totalCount, 4, 'Test failed: Expected totalCount to be 4'); console.log('✔ Test Passed: Pagination worked correctly and combined results from multiple pages.'); console.log('✔ All validation checks passed. The pagination fix is working correctly.'); } catch (error) { console.error('Test failed with an unexpected error:', error); process.exit(1); } } runTest();

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/DynamicEndpoints/m365-core-mcp'

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