Skip to main content
Glama
clearCache.test.ts10.5 kB
/** * Unit tests for the clearCache handler */ import { describe, it, expect, beforeEach } from 'vitest'; import { handleClearCache } from '../../src/handlers/clearCache.js'; import { McpError } from '../../src/types/core.js'; import { mockApiClient, mockLogger, resetAllMocks, createMockRequest } from '../setup.js'; describe('handleClearCache', () => { beforeEach(() => { resetAllMocks(); }); describe('Parameter validation', () => { it('should throw error when cache_type is invalid', () => { const request = createMockRequest('clear_cache', { cache_type: 'invalid' }); expect(() => { handleClearCache(request, mockApiClient as any, mockLogger.logInfo, mockLogger.logWarn, mockLogger.logError); }).toThrow(McpError); expect(mockLogger.logWarn).toHaveBeenCalledWith( 'Invalid cache_type parameter: invalid', expect.objectContaining({ requestId: 'clearCache', validValues: expect.any(Array) }) ); }); it('should throw error when cache_type is non-string', () => { const request = createMockRequest('clear_cache', { cache_type: 123 }); expect(() => { handleClearCache(request, mockApiClient as any, mockLogger.logInfo, mockLogger.logWarn, mockLogger.logError); }).toThrow(McpError); expect(mockLogger.logWarn).toHaveBeenCalledWith( 'Invalid cache_type parameter - must be a string', expect.objectContaining({ requestId: 'clearCache', value: 123 }) ); }); }); describe('Cache clearing functionality', () => { it('should successfully clear cards cache', () => { const request = createMockRequest('clear_cache', { cache_type: 'cards' }); const result = handleClearCache(request, mockApiClient as any, mockLogger.logInfo, mockLogger.logWarn, mockLogger.logError); expect(mockApiClient.clearCardsCache).toHaveBeenCalled(); expect(result.content[0].text).toContain('Cards cache cleared successfully'); expect(result.content[0].text).toContain('cards_cache_empty'); }); it('should successfully clear dashboards cache', () => { const request = createMockRequest('clear_cache', { cache_type: 'dashboards' }); const result = handleClearCache(request, mockApiClient as any, mockLogger.logInfo, mockLogger.logWarn, mockLogger.logError); expect(mockApiClient.clearDashboardsCache).toHaveBeenCalled(); expect(result.content[0].text).toContain('Dashboards cache cleared successfully'); }); it('should successfully clear tables cache', () => { const request = createMockRequest('clear_cache', { cache_type: 'tables' }); const result = handleClearCache(request, mockApiClient as any, mockLogger.logInfo, mockLogger.logWarn, mockLogger.logError); expect(mockApiClient.clearTablesCache).toHaveBeenCalled(); expect(result.content[0].text).toContain('Tables cache cleared successfully'); }); it('should successfully clear databases cache', () => { const request = createMockRequest('clear_cache', { cache_type: 'databases' }); const result = handleClearCache(request, mockApiClient as any, mockLogger.logInfo, mockLogger.logWarn, mockLogger.logError); expect(mockApiClient.clearDatabasesCache).toHaveBeenCalled(); expect(result.content[0].text).toContain('Databases cache cleared successfully'); }); it('should successfully clear collections cache', () => { const request = createMockRequest('clear_cache', { cache_type: 'collections' }); const result = handleClearCache(request, mockApiClient as any, mockLogger.logInfo, mockLogger.logWarn, mockLogger.logError); expect(mockApiClient.clearCollectionsCache).toHaveBeenCalled(); expect(result.content[0].text).toContain('Collections cache cleared successfully'); }); it('should successfully clear fields cache', () => { const request = createMockRequest('clear_cache', { cache_type: 'fields' }); const result = handleClearCache(request, mockApiClient as any, mockLogger.logInfo, mockLogger.logWarn, mockLogger.logError); expect(mockApiClient.clearFieldsCache).toHaveBeenCalled(); expect(result.content[0].text).toContain('Fields cache cleared successfully'); }); it('should successfully clear cards-list cache', () => { const request = createMockRequest('clear_cache', { cache_type: 'cards-list' }); const result = handleClearCache(request, mockApiClient as any, mockLogger.logInfo, mockLogger.logWarn, mockLogger.logError); expect(mockApiClient.clearCardsListCache).toHaveBeenCalled(); expect(result.content[0].text).toContain('Cards list cache cleared successfully'); }); it('should successfully clear dashboards-list cache', () => { const request = createMockRequest('clear_cache', { cache_type: 'dashboards-list' }); const result = handleClearCache(request, mockApiClient as any, mockLogger.logInfo, mockLogger.logWarn, mockLogger.logError); expect(mockApiClient.clearDashboardsListCache).toHaveBeenCalled(); expect(result.content[0].text).toContain('Dashboards list cache cleared successfully'); }); it('should successfully clear tables-list cache', () => { const request = createMockRequest('clear_cache', { cache_type: 'tables-list' }); const result = handleClearCache(request, mockApiClient as any, mockLogger.logInfo, mockLogger.logWarn, mockLogger.logError); expect(mockApiClient.clearTablesListCache).toHaveBeenCalled(); expect(result.content[0].text).toContain('Tables list cache cleared successfully'); }); it('should successfully clear databases-list cache', () => { const request = createMockRequest('clear_cache', { cache_type: 'databases-list' }); const result = handleClearCache(request, mockApiClient as any, mockLogger.logInfo, mockLogger.logWarn, mockLogger.logError); expect(mockApiClient.clearDatabasesListCache).toHaveBeenCalled(); expect(result.content[0].text).toContain('Databases list cache cleared successfully'); }); it('should successfully clear collections-list cache', () => { const request = createMockRequest('clear_cache', { cache_type: 'collections-list' }); const result = handleClearCache(request, mockApiClient as any, mockLogger.logInfo, mockLogger.logWarn, mockLogger.logError); expect(mockApiClient.clearCollectionsListCache).toHaveBeenCalled(); expect(result.content[0].text).toContain('Collections list cache cleared successfully'); }); it('should successfully clear all-lists cache', () => { const request = createMockRequest('clear_cache', { cache_type: 'all-lists' }); const result = handleClearCache(request, mockApiClient as any, mockLogger.logInfo, mockLogger.logWarn, mockLogger.logError); expect(mockApiClient.clearListCaches).toHaveBeenCalled(); expect(result.content[0].text).toContain('All list caches cleared successfully'); }); it('should successfully clear all-individual cache', () => { const request = createMockRequest('clear_cache', { cache_type: 'all-individual' }); const result = handleClearCache(request, mockApiClient as any, mockLogger.logInfo, mockLogger.logWarn, mockLogger.logError); expect(mockApiClient.clearCardsCache).toHaveBeenCalled(); expect(mockApiClient.clearDashboardsCache).toHaveBeenCalled(); expect(mockApiClient.clearTablesCache).toHaveBeenCalled(); expect(mockApiClient.clearDatabasesCache).toHaveBeenCalled(); expect(mockApiClient.clearCollectionsCache).toHaveBeenCalled(); expect(mockApiClient.clearFieldsCache).toHaveBeenCalled(); expect(result.content[0].text).toContain('All individual item caches cleared successfully'); }); }); describe('Default values', () => { it('should use "all" as default cache_type when not specified', () => { const request = createMockRequest('clear_cache', {}); const result = handleClearCache(request, mockApiClient as any, mockLogger.logInfo, mockLogger.logWarn, mockLogger.logError); expect(mockApiClient.clearAllCache).toHaveBeenCalled(); expect(result.content[0].text).toContain('All caches cleared successfully'); }); }); describe('Response formatting', () => { it('should include cache information in response', () => { const request = createMockRequest('clear_cache', { cache_type: 'cards' }); const result = handleClearCache(request, mockApiClient as any, mockLogger.logInfo, mockLogger.logWarn, mockLogger.logError); expect(result.content[0].text).toContain('cache_type'); expect(result.content[0].text).toContain('cache_status'); expect(result.content[0].text).toContain('next_fetch_will_be'); expect(result.content[0].text).toContain('cache_info'); }); it('should include cache explanation in response', () => { const request = createMockRequest('clear_cache', { cache_type: 'all' }); const result = handleClearCache(request, mockApiClient as any, mockLogger.logInfo, mockLogger.logWarn, mockLogger.logError); expect(result.content[0].text).toContain('Unified cache system'); expect(result.content[0].text).toContain('individual'); expect(result.content[0].text).toContain('lists'); }); }); describe('Logging', () => { it('should log success information', () => { const request = createMockRequest('clear_cache', { cache_type: 'cards' }); handleClearCache(request, mockApiClient as any, mockLogger.logInfo, mockLogger.logWarn, mockLogger.logError); expect(mockLogger.logInfo).toHaveBeenCalledWith( 'Cards cache cleared successfully (individual items only)' ); }); }); describe('Valid cache types', () => { const validCacheTypes = [ 'all', 'cards', 'dashboards', 'tables', 'databases', 'collections', 'fields', 'cards-list', 'dashboards-list', 'tables-list', 'databases-list', 'collections-list', 'all-lists', 'all-individual', ]; validCacheTypes.forEach(cacheType => { it(`should accept valid cache_type: ${cacheType}`, () => { const request = createMockRequest('clear_cache', { cache_type: cacheType }); expect(() => { handleClearCache(request, mockApiClient as any, mockLogger.logInfo, mockLogger.logWarn, mockLogger.logError); }).not.toThrow(); }); }); }); });

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/jerichosequitin/Metabase'

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