Skip to main content
Glama

Cosmic MCP Server

by patgpt
setup.tsโ€ข7.08 kB
// Test Setup for Bun Test Framework - Updated for MCP SDK import type { CosmicMedia, CosmicObject, CosmicObjectType, } from '@/types/cosmic.types'; import logger from '@/utils/logger'; import { afterAll, afterEach, beforeAll, beforeEach, mock } from 'bun:test'; // Global test setup beforeAll(async () => { logger.info('Starting test suite'); // Set environment variables for testing process.env['NODE_ENV'] = 'test'; process.env['COSMIC_BUCKET_SLUG'] = 'test-bucket'; process.env['COSMIC_READ_KEY'] = 'test-read-key'; process.env['COSMIC_WRITE_KEY'] = 'test-write-key'; process.env['DEBUG'] = 'true'; }); afterAll(async () => { logger.info('Test suite completed'); }); // Test case setup beforeEach(async () => { // Reset any global state before each test }); afterEach(async () => { // Cleanup after each test }); // Mock Data export const mockCosmicObject: CosmicObject = { id: 'test-object-id', slug: 'test-object-slug', title: 'Test Object', content: 'Test content', bucket: 'test-bucket', type_slug: 'test-type', status: 'published', created_at: '2023-01-01T00:00:00.000Z', modified_at: '2023-01-01T00:00:00.000Z', metadata: { test_field: 'test_value', }, locale: 'en', published_at: '2023-01-01T00:00:00.000Z', }; export const mockCosmicObjectType: CosmicObjectType = { id: 'test-type-id', slug: 'test-type', title: 'Test Type', singular: 'Test Type', bucket: 'test-bucket', created_at: '2023-01-01T00:00:00.000Z', modified_at: '2023-01-01T00:00:00.000Z', metafields: [], options: { slug_field: true, content_editor: false, }, emoji: '๐Ÿงช', localization: false, locales: [], priority_locale: '', order: 0, folder: '', singleton: false, }; export const mockCosmicMedia: CosmicMedia = { id: 'test-media-id', name: 'test-image.jpg', original_name: 'test-image.jpg', size: 1024, type: 'image/jpeg', bucket: 'test-bucket', created_at: '2023-01-01T00:00:00.000Z', location: 'https://cdn.cosmicjs.com/test-image.jpg', url: 'https://cdn.cosmicjs.com/test-image.jpg', imgix_url: 'https://cosmic-s3.imgix.net/test-image.jpg', folder: '', alt_text: 'Test image', caption: 'Test caption', metadata: { width: 800, height: 600, }, }; // Mock Cosmic Client const mockObjectsFindOne = mock((query: any): any => { // Always return a chainable object for findOne // The real Cosmic SDK always returns a chainable object regardless of input const chainable: any = { props: mock(() => chainable), status: mock(() => chainable), depth: mock(() => chainable), then: mock((onFulfilled: any) => { // Return the appropriate result based on the test scenario let result: { object: CosmicObject | null } = { object: mockCosmicObject, }; // Handle cases where we want to simulate "not found" if ( query?.id === 'nonexistent-id' || query?.slug === 'nonexistent-slug' ) { result = { object: null }; } return Promise.resolve(result).then(onFulfilled); }), catch: mock((onRejected: any) => Promise.resolve().catch(onRejected)), }; return chainable; }); const mockObjectsFind = mock((query: any) => { const chainable: any = { props: mock(() => chainable), sort: mock(() => chainable), limit: mock(() => chainable), skip: mock(() => chainable), status: mock(() => chainable), depth: mock(() => chainable), then: mock((onFulfilled: any) => { const result = { objects: [mockCosmicObject], total: 1, limit: query?.limit || 100, skip: query?.skip || 0, }; return Promise.resolve(result).then(onFulfilled); }), catch: mock((onRejected: any) => Promise.resolve().catch(onRejected)), }; return chainable; }); const mockObjectsInsertOne = mock((data: any) => { return Promise.resolve({ object: { ...mockCosmicObject, ...data, id: 'new-object-id', }, }); }); const mockObjectsUpdateOne = mock((id: string, data: any) => { return Promise.resolve({ object: { ...mockCosmicObject, ...data, id, }, }); }); const mockObjectsDeleteOne = mock((id: string) => { return Promise.resolve({ message: 'Object deleted successfully' }); }); // Mock object types const mockObjectTypesFind = mock(() => { return Promise.resolve({ object_types: [mockCosmicObjectType], total: 1, }); }); const mockObjectTypesFindOne = mock((slug: string) => { return Promise.resolve({ object_type: mockCosmicObjectType, }); }); const mockObjectTypesInsertOne = mock((data: any) => { return Promise.resolve({ object_type: { ...mockCosmicObjectType, ...data, id: 'new-type-id', }, }); }); const mockObjectTypesUpdateOne = mock((slug: string, data: any) => { return Promise.resolve({ object_type: { ...mockCosmicObjectType, ...data, slug, }, }); }); const mockObjectTypesDeleteOne = mock((slug: string) => { return Promise.resolve({ message: 'Object type deleted successfully' }); }); // Mock media operations const mockMediaFind = mock(() => { const chainable: any = { limit: mock(() => chainable), skip: mock(() => chainable), then: mock((onFulfilled: any) => { const result = { media: [mockCosmicMedia], total: 1, limit: 100, skip: 0, }; return Promise.resolve(result).then(onFulfilled); }), catch: mock((onRejected: any) => Promise.resolve().catch(onRejected)), }; return chainable; }); const mockMediaFindOne = mock((query: any) => { return Promise.resolve({ media: mockCosmicMedia, }); }); const mockMediaInsertOne = mock((data: any) => { return Promise.resolve({ media: { ...mockCosmicMedia, ...data, id: 'new-media-id', }, }); }); const mockMediaUpdateOne = mock((id: string, data: any) => { return Promise.resolve({ media: { ...mockCosmicMedia, ...data, id, }, }); }); const mockMediaDeleteOne = mock((id: string) => { return Promise.resolve({ message: 'Media deleted successfully' }); }); // Export the complete mock client export const mockCosmicClient = { objects: { findOne: mockObjectsFindOne, find: mockObjectsFind, insertOne: mockObjectsInsertOne, updateOne: mockObjectsUpdateOne, deleteOne: mockObjectsDeleteOne, }, objectTypes: { find: mockObjectTypesFind, findOne: mockObjectTypesFindOne, insertOne: mockObjectTypesInsertOne, updateOne: mockObjectTypesUpdateOne, deleteOne: mockObjectTypesDeleteOne, }, media: { find: mockMediaFind, findOne: mockMediaFindOne, insertOne: mockMediaInsertOne, updateOne: mockMediaUpdateOne, deleteOne: mockMediaDeleteOne, }, }; // Legacy export for backward compatibility with service tests export const createMockCosmicClient = () => mockCosmicClient; // Mock the Cosmic SDK mock.module('@cosmicjs/sdk', () => ({ createBucketClient: mock(() => mockCosmicClient), }));

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/patgpt/cosmic-mcp'

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