Skip to main content
Glama

1MCP Server

registry-versions.test.ts14.3 kB
import { TestFixtures } from '@test/e2e/fixtures/TestFixtures.js'; import { CliTestRunner, CommandTestEnvironment } from '@test/e2e/utils/index.js'; import { afterEach, beforeEach, describe, expect, it } from 'vitest'; describe('Registry Versions Command E2E', () => { let environment: CommandTestEnvironment; let runner: CliTestRunner; beforeEach(async () => { environment = new CommandTestEnvironment(TestFixtures.createTestScenario('registry-versions-test', 'basic')); await environment.setup(); runner = new CliTestRunner(environment); }); afterEach(async () => { await environment.cleanup(); }); describe('Basic Versions Functionality', () => { it('should handle 404 error for non-existent server ID', async () => { const result = await runner.runRegistryCommand('versions', { args: ['file-system'], expectError: true, timeout: 20000, }); runner.assertFailure(result); runner.assertOutputContains(result, 'Failed to fetch versions for server with ID: file-system'); }); it('should handle 404 error in table format (default)', async () => { const result = await runner.runRegistryCommand('versions', { args: ['file-system'], expectError: true, timeout: 20000, }); runner.assertFailure(result); runner.assertOutputContains(result, 'Failed to fetch versions for server with ID: file-system'); }); it('should handle 404 error in detailed format', async () => { const result = await runner.runRegistryCommand('versions', { args: ['file-system', '--format=detailed'], expectError: true, timeout: 20000, }); runner.assertFailure(result); runner.assertOutputContains(result, 'Failed to fetch versions for server with ID: file-system'); }); it('should handle 404 error in JSON format', async () => { const result = await runner.runRegistryCommand('versions', { args: ['file-system', '--format=json'], expectError: true, timeout: 20000, }); runner.assertFailure(result); runner.assertOutputContains(result, 'Failed to fetch versions for server with ID: file-system'); }); }); describe('Version Information Content', () => { it('should handle 404 error for comprehensive version metadata', async () => { const result = await runner.runRegistryCommand('versions', { args: ['file-system', '--format=json'], expectError: true, timeout: 20000, }); runner.assertFailure(result); runner.assertOutputContains(result, 'Failed to fetch versions for server with ID: file-system'); }); it('should handle 404 error for semantic version numbers', async () => { const result = await runner.runRegistryCommand('versions', { args: ['file-system'], expectError: true, timeout: 20000, }); runner.assertFailure(result); runner.assertOutputContains(result, 'Failed to fetch versions for server with ID: file-system'); }); it('should handle 404 error for release dates', async () => { const result = await runner.runRegistryCommand('versions', { args: ['file-system'], expectError: true, timeout: 20000, }); runner.assertFailure(result); runner.assertOutputContains(result, 'Failed to fetch versions for server with ID: file-system'); }); it('should handle 404 error for download statistics', async () => { const result = await runner.runRegistryCommand('versions', { args: ['file-system'], expectError: true, timeout: 20000, }); runner.assertFailure(result); runner.assertOutputContains(result, 'Failed to fetch versions for server with ID: file-system'); }); }); describe('Output Format Validation', () => { it('should handle 404 error for table output', async () => { const result = await runner.runRegistryCommand('versions', { args: ['file-system', '--format=table'], expectError: true, timeout: 20000, }); runner.assertFailure(result); runner.assertOutputContains(result, 'Failed to fetch versions for server with ID: file-system'); }); it('should handle 404 error for detailed output', async () => { const result = await runner.runRegistryCommand('versions', { args: ['file-system', '--format=detailed'], expectError: true, timeout: 20000, }); runner.assertFailure(result); runner.assertOutputContains(result, 'Failed to fetch versions for server with ID: file-system'); }); it('should handle 404 error for JSON output', async () => { const result = await runner.runRegistryCommand('versions', { args: ['file-system', '--format=json'], expectError: true, timeout: 20000, }); runner.assertFailure(result); runner.assertOutputContains(result, 'Failed to fetch versions for server with ID: file-system'); }); it('should handle 404 error across multiple format requests', async () => { const resultTable = await runner.runRegistryCommand('versions', { args: ['file-system', '--format=table'], expectError: true, timeout: 20000, }); const resultJson = await runner.runRegistryCommand('versions', { args: ['file-system', '--format=json'], expectError: true, timeout: 20000, }); runner.assertFailure(resultTable); runner.assertFailure(resultJson); runner.assertOutputContains(resultTable, 'Failed to fetch versions for server with ID: file-system'); runner.assertOutputContains(resultJson, 'Failed to fetch versions for server with ID: file-system'); }); }); describe('Version Sorting and Ordering', () => { it('should handle 404 error for version sorting', async () => { const result = await runner.runRegistryCommand('versions', { args: ['file-system', '--format=json'], expectError: true, timeout: 20000, }); runner.assertFailure(result); runner.assertOutputContains(result, 'Failed to fetch versions for server with ID: file-system'); }); it('should handle 404 error for latest version identification', async () => { const result = await runner.runRegistryCommand('versions', { args: ['file-system', '--format=json'], expectError: true, timeout: 20000, }); runner.assertFailure(result); runner.assertOutputContains(result, 'Failed to fetch versions for server with ID: file-system'); }); }); describe('Error Handling', () => { it('should handle non-existent server ID', async () => { const result = await runner.runRegistryCommand('versions', { args: ['non-existent-server-xyz-12345'], expectError: true, timeout: 20000, }); runner.assertFailure(result); runner.assertOutputContains(result, 'Failed to fetch versions for server with ID: non-existent-server-xyz-12345'); }); it('should handle empty server ID', async () => { const result = await runner.runRegistryCommand('versions', { args: [''], expectError: true, timeout: 20000, }); runner.assertFailure(result); runner.assertOutputContains(result, 'Failed to fetch versions for server with ID: '); }); it('should handle missing server ID', async () => { const result = await runner.runRegistryCommand('versions', { expectError: true, timeout: 20000, }); runner.assertFailure(result); runner.assertOutputContains(result, 'Not enough non-option arguments', true); runner.assertOutputContains(result, 'need at least 1', true); }); it('should handle invalid output format', async () => { const result = await runner.runRegistryCommand('versions', { args: ['file-system', '--format=invalid'], expectError: true, timeout: 20000, }); runner.assertFailure(result); runner.assertOutputContains(result, 'Invalid values', true); runner.assertOutputContains(result, 'Given: "invalid"', true); }); it('should handle network timeout', async () => { const result = await runner.runRegistryCommand('versions', { args: ['file-system'], expectError: true, timeout: 5000, // Short timeout }); runner.assertFailure(result); runner.assertOutputContains(result, 'Failed to fetch versions for server with ID: file-system'); }); it('should handle special characters in server ID', async () => { const result = await runner.runRegistryCommand('versions', { args: ['test@#$%^&*()'], expectError: true, timeout: 20000, }); runner.assertFailure(result); runner.assertOutputContains(result, 'Failed to fetch versions for server with ID: test@#$%^&*()'); // Should handle gracefully without crashing expect(result.exitCode !== 0).toBe(true); }); }); describe('Help Command', () => { it('should show help for versions command', async () => { const result = await runner.runRegistryCommand('versions', { args: ['--help'], }); runner.assertSuccess(result); runner.assertOutputContains(result, 'List all versions'); runner.assertOutputContains(result, 'Positionals:'); runner.assertOutputContains(result, 'server-id'); runner.assertOutputContains(result, 'Options:'); runner.assertOutputContains(result, '--format'); // Should show examples runner.assertOutputMatches(result, /Examples?:/); }); }); describe('Performance and Reliability', () => { it('should complete 404 error handling within reasonable time', async () => { const startTime = Date.now(); const result = await runner.runRegistryCommand('versions', { args: ['file-system'], expectError: true, timeout: 30000, // 30 second timeout }); const duration = Date.now() - startTime; runner.assertFailure(result); // Should complete within 20 seconds under normal conditions expect(duration).toBeLessThan(20000); runner.assertOutputContains(result, 'Failed to fetch versions for server with ID: file-system'); }); it('should handle repeated 404 errors consistently', async () => { const results = []; // Run multiple versions requests for (let i = 0; i < 3; i++) { const result = await runner.runRegistryCommand('versions', { args: ['file-system'], expectError: true, timeout: 20000, }); results.push(result); runner.assertFailure(result); } // All should fail with consistent error messages results.forEach((result) => { expect(result.exitCode).not.toBe(0); runner.assertOutputContains(result, 'Failed to fetch versions for server with ID: file-system'); }); }); it('should handle 404 errors efficiently across multiple requests', async () => { const result1 = await runner.runRegistryCommand('versions', { args: ['file-system'], expectError: true, timeout: 20000, }); const startTime = Date.now(); const result2 = await runner.runRegistryCommand('versions', { args: ['file-system'], expectError: true, timeout: 20000, }); const duration = Date.now() - startTime; runner.assertFailure(result1); runner.assertFailure(result2); // Second request should complete quickly even with error expect(duration).toBeLessThan(10000); // Both should contain error information runner.assertOutputContains(result1, 'Failed to fetch versions for server with ID: file-system'); runner.assertOutputContains(result2, 'Failed to fetch versions for server with ID: file-system'); }); it('should handle 404 errors efficiently with timeout', async () => { const result = await runner.runRegistryCommand('versions', { args: ['file-system'], expectError: true, timeout: 30000, }); runner.assertFailure(result); runner.assertOutputContains(result, 'Failed to fetch versions for server with ID: file-system'); // Output should contain error message but not be excessive expect(result.stdout.length).toBeGreaterThan(10); expect(result.stdout.length).toBeLessThan(5000); }); }); describe('Data Quality and Validation', () => { it('should handle 404 error for semantic version validation', async () => { const result = await runner.runRegistryCommand('versions', { args: ['file-system', '--format=json'], expectError: true, timeout: 20000, }); runner.assertFailure(result); runner.assertOutputContains(result, 'Failed to fetch versions for server with ID: file-system'); }); it('should handle 404 error for release date validation', async () => { const result = await runner.runRegistryCommand('versions', { args: ['file-system', '--format=json'], expectError: true, timeout: 20000, }); runner.assertFailure(result); runner.assertOutputContains(result, 'Failed to fetch versions for server with ID: file-system'); }); it('should handle 404 error for download count validation', async () => { const result = await runner.runRegistryCommand('versions', { args: ['file-system', '--format=json'], expectError: true, timeout: 20000, }); runner.assertFailure(result); runner.assertOutputContains(result, 'Failed to fetch versions for server with ID: file-system'); }); it('should handle 404 error for latest version flag validation', async () => { const result = await runner.runRegistryCommand('versions', { args: ['file-system', '--format=json'], expectError: true, timeout: 20000, }); runner.assertFailure(result); runner.assertOutputContains(result, 'Failed to fetch versions for server with ID: file-system'); }); }); });

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