Skip to main content
Glama

1MCP Server

presetServerChangeDetector.test.ts8.39 kB
import { beforeEach, describe, expect, it } from 'vitest'; import { PresetServerChangeDetector } from './presetServerChangeDetector.js'; describe('PresetServerChangeDetector', () => { let detector: PresetServerChangeDetector; beforeEach(() => { detector = new PresetServerChangeDetector(); }); describe('detectChanges', () => { it('should detect no changes when no previous data exists', () => { const result = detector.detectChanges('test', ['server1', 'server2']); expect(result.hasChanged).toBe(false); expect(result.added).toEqual([]); expect(result.removed).toEqual([]); expect(result.unchanged).toEqual(['server1', 'server2']); }); it('should detect added servers', () => { detector.updateServerList('test', ['server1', 'server2']); const result = detector.detectChanges('test', ['server1', 'server2', 'server3']); expect(result.hasChanged).toBe(true); expect(result.added).toEqual(['server3']); expect(result.removed).toEqual([]); expect(result.unchanged).toEqual(['server1', 'server2']); }); it('should detect removed servers', () => { detector.updateServerList('test', ['server1', 'server2', 'server3']); const result = detector.detectChanges('test', ['server1', 'server2']); expect(result.hasChanged).toBe(true); expect(result.added).toEqual([]); expect(result.removed).toEqual(['server3']); expect(result.unchanged).toEqual(['server1', 'server2']); }); it('should detect both added and removed servers', () => { detector.updateServerList('test', ['server1', 'server2', 'server3']); const result = detector.detectChanges('test', ['server2', 'server4', 'server5']); expect(result.hasChanged).toBe(true); expect(result.added).toEqual(['server4', 'server5']); expect(result.removed).toEqual(['server1', 'server3']); expect(result.unchanged).toEqual(['server2']); }); it('should detect no changes when server lists are identical', () => { detector.updateServerList('test', ['server1', 'server2', 'server3']); const result = detector.detectChanges('test', ['server3', 'server1', 'server2']); // Different order expect(result.hasChanged).toBe(false); expect(result.added).toEqual([]); expect(result.removed).toEqual([]); expect(result.unchanged).toEqual(['server1', 'server2', 'server3']); }); it('should handle empty server lists', () => { detector.updateServerList('test', []); const result = detector.detectChanges('test', []); expect(result.hasChanged).toBe(false); expect(result.added).toEqual([]); expect(result.removed).toEqual([]); expect(result.unchanged).toEqual([]); }); it('should detect changes from empty to non-empty', () => { detector.updateServerList('test', []); const result = detector.detectChanges('test', ['server1', 'server2']); expect(result.hasChanged).toBe(true); expect(result.added).toEqual(['server1', 'server2']); expect(result.removed).toEqual([]); expect(result.unchanged).toEqual([]); }); it('should detect changes from non-empty to empty', () => { detector.updateServerList('test', ['server1', 'server2']); const result = detector.detectChanges('test', []); expect(result.hasChanged).toBe(true); expect(result.added).toEqual([]); expect(result.removed).toEqual(['server1', 'server2']); expect(result.unchanged).toEqual([]); }); }); describe('updateServerList', () => { it('should store server list for a preset', () => { detector.updateServerList('test', ['server1', 'server2']); expect(detector.hasPreset('test')).toBe(true); expect(detector.getPreviousServerList('test')).toEqual(['server1', 'server2']); }); it('should sort and store server list', () => { detector.updateServerList('test', ['server3', 'server1', 'server2']); expect(detector.getPreviousServerList('test')).toEqual(['server1', 'server2', 'server3']); }); it('should update existing preset', () => { detector.updateServerList('test', ['server1', 'server2']); detector.updateServerList('test', ['server3', 'server4']); expect(detector.getPreviousServerList('test')).toEqual(['server3', 'server4']); }); }); describe('getPreviousServerList', () => { it('should return empty array for non-existent preset', () => { expect(detector.getPreviousServerList('nonexistent')).toEqual([]); }); it('should return copy of stored list', () => { detector.updateServerList('test', ['server1', 'server2']); const list1 = detector.getPreviousServerList('test'); const list2 = detector.getPreviousServerList('test'); expect(list1).toEqual(['server1', 'server2']); expect(list2).toEqual(['server1', 'server2']); expect(list1).not.toBe(list2); // Should be different array instances }); }); describe('hasPreset', () => { it('should return false for non-existent preset', () => { expect(detector.hasPreset('nonexistent')).toBe(false); }); it('should return true for existing preset', () => { detector.updateServerList('test', ['server1']); expect(detector.hasPreset('test')).toBe(true); }); }); describe('removePreset', () => { it('should remove tracking for a preset', () => { detector.updateServerList('test', ['server1']); expect(detector.hasPreset('test')).toBe(true); detector.removePreset('test'); expect(detector.hasPreset('test')).toBe(false); expect(detector.getPreviousServerList('test')).toEqual([]); }); it('should handle removing non-existent preset', () => { detector.removePreset('nonexistent'); // Should not throw expect(detector.hasPreset('nonexistent')).toBe(false); }); }); describe('getTrackedPresets', () => { it('should return empty array when no presets tracked', () => { expect(detector.getTrackedPresets()).toEqual([]); }); it('should return sorted list of tracked presets', () => { detector.updateServerList('preset3', ['server1']); detector.updateServerList('preset1', ['server2']); detector.updateServerList('preset2', ['server3']); expect(detector.getTrackedPresets()).toEqual(['preset1', 'preset2', 'preset3']); }); }); describe('clear', () => { it('should remove all tracked presets', () => { detector.updateServerList('test1', ['server1']); detector.updateServerList('test2', ['server2']); expect(detector.getTrackedPresets()).toHaveLength(2); detector.clear(); expect(detector.getTrackedPresets()).toEqual([]); expect(detector.hasPreset('test1')).toBe(false); expect(detector.hasPreset('test2')).toBe(false); }); }); describe('getStats', () => { it('should return zero stats for empty detector', () => { const stats = detector.getStats(); expect(stats.totalPresets).toBe(0); expect(stats.totalUniqueServers).toBe(0); expect(stats.serverCounts).toEqual({}); }); it('should calculate stats correctly', () => { detector.updateServerList('preset1', ['server1', 'server2']); detector.updateServerList('preset2', ['server2', 'server3']); detector.updateServerList('preset3', ['server1']); const stats = detector.getStats(); expect(stats.totalPresets).toBe(3); expect(stats.totalUniqueServers).toBe(3); // server1, server2, server3 expect(stats.serverCounts).toEqual({ preset1: 2, preset2: 2, preset3: 1, }); }); }); describe('multiple presets', () => { it('should handle multiple presets independently', () => { detector.updateServerList('preset1', ['server1', 'server2']); detector.updateServerList('preset2', ['server3', 'server4']); const result1 = detector.detectChanges('preset1', ['server1', 'server3']); const result2 = detector.detectChanges('preset2', ['server3', 'server4']); expect(result1.hasChanged).toBe(true); expect(result1.added).toEqual(['server3']); expect(result1.removed).toEqual(['server2']); expect(result2.hasChanged).toBe(false); expect(result2.added).toEqual([]); expect(result2.removed).toEqual([]); }); }); });

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/1mcp-app/agent'

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