@dbs-portal/tool-mock
Version:
API mocking toolkit using MSW for DBS Portal development workflows
415 lines (313 loc) • 8.97 kB
Markdown
# 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)
```