Skip to main content
Glama

mcp-gsheets

sample-tool.test.ts4.51 kB
import { describe, it, expect, vi, beforeEach } from 'vitest'; import { mockSheetsAPI, resetMocks, setupErrorResponse } from '../mocks/google-sheets'; import { createGoogleApiError } from '../helpers/test-utils'; // This is a sample integration test showing how to use the mocks // Replace with actual tool imports when testing real tools describe('Sample Integration Test', () => { beforeEach(() => { resetMocks(); vi.clearAllMocks(); }); describe('successful operations', () => { it('should get values from spreadsheet', async () => { // Mock is already set up with default response const result = await mockSheetsAPI.spreadsheets.values.get({ spreadsheetId: 'test-id', range: 'A1:C3', }); expect(result.data.values).toHaveLength(3); expect(result.data.range).toBe('Sheet1!A1:C3'); expect(mockSheetsAPI.spreadsheets.values.get).toHaveBeenCalledOnce(); }); it('should update values in spreadsheet', async () => { const values = [['New', 'Data'], ['Row', '2']]; const result = await mockSheetsAPI.spreadsheets.values.update({ spreadsheetId: 'test-id', range: 'A1:B2', requestBody: { values }, }); expect(result.data.updatedCells).toBe(9); expect(mockSheetsAPI.spreadsheets.values.update).toHaveBeenCalledWith({ spreadsheetId: 'test-id', range: 'A1:B2', requestBody: { values }, }); }); it('should batch get values', async () => { const result = await mockSheetsAPI.spreadsheets.values.batchGet({ spreadsheetId: 'test-id', ranges: ['A1:B2', 'C1:D2'], }); expect(result.data.valueRanges).toHaveLength(2); expect(result.data.valueRanges[0].range).toBe('Sheet1!A1:B2'); expect(result.data.valueRanges[1].range).toBe('Sheet2!C1:D2'); }); }); describe('error handling', () => { it('should handle 404 not found error', async () => { const error = createGoogleApiError(404, 'Requested entity was not found'); setupErrorResponse('spreadsheets.values.get', error); await expect(mockSheetsAPI.spreadsheets.values.get({ spreadsheetId: 'non-existent', range: 'A1', })).rejects.toEqual(error); }); it('should handle 403 permission denied error', async () => { const error = createGoogleApiError(403, 'The caller does not have permission'); setupErrorResponse('spreadsheets.values.update', error); await expect(mockSheetsAPI.spreadsheets.values.update({ spreadsheetId: 'test-id', range: 'A1', requestBody: { values: [['test']] }, })).rejects.toEqual(error); }); it('should handle 429 rate limit error', async () => { const error = createGoogleApiError(429, 'Quota exceeded'); setupErrorResponse('spreadsheets.values.batchGet', error); await expect(mockSheetsAPI.spreadsheets.values.batchGet({ spreadsheetId: 'test-id', ranges: ['A1'], })).rejects.toEqual(error); }); }); describe('custom mock responses', () => { it('should allow custom mock implementation', async () => { // Override default mock for specific test mockSheetsAPI.spreadsheets.values.get.mockResolvedValueOnce({ data: { range: 'CustomSheet!X1:Z100', majorDimension: 'COLUMNS', values: Array(100).fill(['X', 'Y', 'Z']), }, }); const result = await mockSheetsAPI.spreadsheets.values.get({ spreadsheetId: 'test-id', range: 'X1:Z100', }); expect(result.data.majorDimension).toBe('COLUMNS'); expect(result.data.values).toHaveLength(100); }); it('should chain multiple custom responses', async () => { mockSheetsAPI.spreadsheets.values.get .mockResolvedValueOnce({ data: { values: [['First']] } }) .mockResolvedValueOnce({ data: { values: [['Second']] } }) .mockResolvedValueOnce({ data: { values: [['Third']] } }); const results = await Promise.all([ mockSheetsAPI.spreadsheets.values.get({ spreadsheetId: 'id', range: 'A1' }), mockSheetsAPI.spreadsheets.values.get({ spreadsheetId: 'id', range: 'A2' }), mockSheetsAPI.spreadsheets.values.get({ spreadsheetId: 'id', range: 'A3' }), ]); expect(results[0].data.values[0][0]).toBe('First'); expect(results[1].data.values[0][0]).toBe('Second'); expect(results[2].data.values[0][0]).toBe('Third'); }); }); });

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/freema/mcp-gsheets'

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