UNPKG

@dbs-portal/tool-mock

Version:

API mocking toolkit using MSW for DBS Portal development workflows

415 lines (313 loc) 8.97 kB
# API Reference - @dbs-portal/tool-mock Complete API reference for the DBS Portal MSW mocking toolkit. ## Core Setup ### setupMocks(options?) Sets up MSW based on the current environment with automatic detection. ```typescript import { setupMocks } from '@dbs-portal/tool-mock' await setupMocks({ config: { enabled: true, mode: 'development', logging: true, delay: [100, 300], }, handlers: [/* custom handlers */], start: true, // Start immediately }) ``` **Parameters:** - `options.config` - Mock configuration overrides - `options.handlers` - Additional request handlers - `options.start` - Whether to start MSW immediately (default: true) ### teardownMocks() Cleanly shuts down MSW and cleans up resources. ```typescript import { teardownMocks } from '@dbs-portal/tool-mock' await teardownMocks() ``` ### autoSetupMocks(handlers?) Convenience function that automatically sets up MSW based on environment variables. ```typescript import { autoSetupMocks } from '@dbs-portal/tool-mock' await autoSetupMocks([ // Optional custom handlers ]) ``` ## Configuration ### MockConfig Interface ```typescript interface MockConfig { enabled: boolean mode: 'development' | 'testing' | 'storybook' | 'disabled' baseUrl?: string delay?: number | [number, number] logging?: boolean handlers?: RequestHandler[] errorSimulation?: ErrorSimulationConfig } ``` ### updateMockConfig(config) Updates the global mock configuration. ```typescript import { updateMockConfig } from '@dbs-portal/tool-mock' updateMockConfig({ delay: [200, 500], logging: false, errorSimulation: { networkErrorRate: 0.01, serverErrorRate: 0.005, }, }) ``` ### getMockConfig() Returns the current mock configuration. ```typescript import { getMockConfig } from '@dbs-portal/tool-mock' const config = getMockConfig() console.log('Current delay:', config.delay) ``` ## Handler Factories ### createCrudHandlers(options) Creates a complete set of CRUD handlers for a resource. ```typescript import { createCrudHandlers } from '@dbs-portal/tool-mock' const userHandlers = createCrudHandlers({ basePath: '/api/users', dataFactory: (overrides = {}) => ({ id: generateId(), email: 'user@example.com', firstName: 'John', lastName: 'Doe', createdAt: new Date().toISOString(), ...overrides, }), initialData: [ { id: '1', email: 'admin@example.com', firstName: 'Admin', lastName: 'User' }, ], pagination: { defaultPageSize: 10, maxPageSize: 100, }, validate: (data) => { const errors = [] if (!data.email) errors.push('Email is required') if (!data.firstName) errors.push('First name is required') return errors.length > 0 ? errors : null }, }) ``` **Generated Endpoints:** - `GET /api/users` - List with pagination and filtering - `GET /api/users/:id` - Get single item - `POST /api/users` - Create new item - `PUT /api/users/:id` - Update existing item - `PATCH /api/users/:id` - Partial update - `DELETE /api/users/:id` - Delete item ### createAuthHandlers(basePath) Creates authentication-related handlers. ```typescript import { createAuthHandlers } from '@dbs-portal/tool-mock' const authHandlers = createAuthHandlers('/api/auth', { users: [ { id: '1', email: 'admin@example.com', password: 'password', roles: ['admin'], permissions: ['users:read', 'users:write'], }, ], tokenExpiry: '1h', refreshTokenExpiry: '7d', }) ``` **Generated Endpoints:** - `POST /api/auth/login` - User authentication - `POST /api/auth/logout` - User logout - `POST /api/auth/refresh` - Token refresh - `GET /api/auth/me` - Current user info - `POST /api/auth/register` - User registration (optional) ### createHandler(method, path, options) Creates a single custom handler with built-in utilities. ```typescript import { createHandler } from '@dbs-portal/tool-mock' const customHandler = createHandler('GET', '/api/custom', { response: (request) => ({ success: true, data: { message: 'Custom response' }, timestamp: new Date().toISOString(), }), delay: [100, 200], status: 200, headers: { 'X-Custom-Header': 'value' }, }) ``` ## Data Factories ### createDataFactory(template) Creates a reusable data factory function. ```typescript import { createDataFactory, generateId } from '@dbs-portal/tool-mock' const userFactory = createDataFactory((overrides = {}) => ({ id: generateId(), email: `user${Math.random()}@example.com`, firstName: 'John', lastName: 'Doe', isActive: true, createdAt: new Date().toISOString(), updatedAt: new Date().toISOString(), ...overrides, })) // Usage const user1 = userFactory() const user2 = userFactory({ firstName: 'Jane', email: 'jane@example.com' }) ``` ### createListFactory(itemFactory, count?) Creates a factory for generating lists of items. ```typescript import { createListFactory } from '@dbs-portal/tool-mock' const userListFactory = createListFactory(userFactory, 10) // Generate 10 users const users = userListFactory() // Generate 5 users with overrides const customUsers = userListFactory(5, { isActive: false }) ``` ### Built-in Generators ```typescript import { generateId, generateEmail, generateName, generateDate, generateBoolean, generateNumber, generateString, } from '@dbs-portal/tool-mock' const mockData = { id: generateId(), // UUID v4 email: generateEmail(), // random@example.com name: generateName(), // Random first/last name birthDate: generateDate('1980-01-01', '2000-12-31'), isActive: generateBoolean(0.8), // 80% chance of true score: generateNumber(0, 100), description: generateString(50, 200), // Random string 50-200 chars } ``` ## Response Building ### mockResponseBuilder() Fluent API for building complex mock responses. ```typescript import { mockResponseBuilder } from '@dbs-portal/tool-mock' const response = mockResponseBuilder() .data({ users: userListFactory(5) }) .status(200) .headers({ 'X-Total-Count': '5' }) .delay([100, 300]) .build() ``` ### Pagination Helpers ```typescript import { createPaginatedResponse } from '@dbs-portal/tool-mock' const paginatedUsers = createPaginatedResponse({ items: userListFactory(50), page: 1, pageSize: 10, total: 50, }) ``` ### Error Responses ```typescript import { createErrorResponse } from '@dbs-portal/tool-mock' const errorResponse = createErrorResponse({ code: 'VALIDATION_ERROR', message: 'Invalid input data', details: { email: ['Email is required'], firstName: ['First name must be at least 2 characters'], }, status: 400, }) ``` ## Integration Utilities ### createMockAwareApiClient(config) Creates an API client with MSW integration. ```typescript import { createMockAwareApiClient } from '@dbs-portal/tool-mock' const apiClient = await createMockAwareApiClient({ baseURL: '/api', enableMocking: true, mockConfig: { mode: 'development', logging: true, delay: 200, }, mockHandlers: [ ...userHandlers, ...authHandlers, ], }) // Check if mocking is active if (apiClient.isMocking()) { console.log('Using mocked responses') } ``` ### withMockAuth(handlers, authConfig?) Wraps handlers with authentication requirements. ```typescript import { withMockAuth } from '@dbs-portal/tool-mock' const protectedHandlers = withMockAuth(userHandlers, { requireAuth: true, requiredRoles: ['admin'], requiredPermissions: ['users:read'], }) ``` ## Testing Utilities ### setupMSWTesting(handlers) Sets up MSW for testing environments. ```typescript import { setupMSWTesting } from '@dbs-portal/tool-mock' const msw = setupMSWTesting([ ...userHandlers, ...authHandlers, ]) // In test files beforeAll(() => msw.listen()) afterEach(() => msw.resetHandlers()) afterAll(() => msw.close()) ``` ### mockApiCall(endpoint, response) Utility for mocking individual API calls in tests. ```typescript import { mockApiCall } from '@dbs-portal/tool-mock' test('should handle user creation', async () => { mockApiCall('POST', '/api/users', { success: true, data: userFactory({ id: 'new-user' }), }) // Test implementation }) ``` ## Environment Detection ### isMockingEnabled() Checks if mocking is enabled in the current environment. ```typescript import { isMockingEnabled } from '@dbs-portal/tool-mock' if (isMockingEnabled()) { console.log('Mocking is active') } ``` ### getMockingMode() Returns the current mocking mode. ```typescript import { getMockingMode } from '@dbs-portal/tool-mock' const mode = getMockingMode() // 'development' | 'testing' | 'storybook' | 'disabled' ``` ### getEnvironmentInfo() Returns detailed environment information. ```typescript import { getEnvironmentInfo } from '@dbs-portal/tool-mock' const envInfo = getEnvironmentInfo() console.log('Environment:', envInfo.environment) // 'browser' | 'node' console.log('Should mock:', envInfo.shouldMock) console.log('Mode:', envInfo.mode) ```