@sadikkhan02/test-utils
官方测试工具和适配器契约测试框架 NotifyKit.
提供共享fixture、内存模拟提供程序、安全的本地Redis帮助程序和标准化的 适配器合同套件 (runAdapterContractTests),所有官方和社区提供程序适配器都需要。
安装
npm install --save-dev @sadikkhan02/test-utils vitest
1. 适配器契约测试套件
每个NotifyKit适配器(电子邮件、短信、推送)都必须符合标准的提供者接口和错误分类契约。使用 runAdapterContractTests,您可以在几分钟内验证自定义适配器。
示例:运行契约套件
import { describe, it, expect, vi } from 'vitest';
import { runAdapterContractTests } from '@sadikkhan02/test-utils';
import { MyEmailProvider, metadata } from '../src/index.js';
runAdapterContractTests({
providerName: 'my-email',
channel: 'email',
metadata,
createSuccessProvider: () => new MyEmailProvider({ mockTransport: true }),
createAuthFailingProvider: () => new MyEmailProvider({ authError: true }),
createNetworkFailingProvider: () => new MyEmailProvider({ networkError: true }),
validOptions: {
to: '[email protected]',
from: '[email protected]',
subject: 'Welcome',
html: '<h1>Welcome!</h1>',
},
invalidOptions: {
to: '',
from: '',
subject: '',
html: '',
},
sampleSecret: 'my-secret-key-12345',
});
什么 runAdapterContractTests 断言
- 元数据的一致性:验证
metadata.name,metadata.channel,非空requiredEnv. - 提供者的身份:检查
provider.name === metadata.name并确保规范的交付方法(sendEmail,sendSms,或者sendPush)被实现。 - 交付成功:断言
{ success: true, messageId: string }成功交付。 - 永久故障分类:断言
{ success: false, retryable: false }与可操作的error关于身份验证/凭证失败。 - 暂态故障分类:断言
{ success: false, retryable: true }与可操作的error在网络/超时失败时。 - 畸形输入安全:断言提供程序返回
{ success: false, retryable: false }优雅地处理格式错误的输入,而不会抛出未处理的异常。 - 零凭证暴露验证原始秘密、承载令牌和私钥头在返回的错误消息中永远不会泄露。
2. 内存中模拟提供程序
在应用程序单元和集成测试中轻松模拟通知传递,无需网络I/O或凭据:
import {
createMockEmailProvider,
createMockSmsProvider,
createMockPushProvider,
} from '@sadikkhan02/test-utils';
const mockEmail = createMockEmailProvider({ name: 'test-smtp' });
const mockSms = createMockSmsProvider({ name: 'test-sms' });
// Send a test email
await mockEmail.sendEmail({
to: '[email protected]',
from: '[email protected]',
subject: 'Test',
html: '<p>Test</p>',
});
// Inspect recorded calls
console.log(mockEmail.calls.length); // 1
console.log(mockEmail.calls[0].to); // '[email protected]'
// Simulate failure
mockEmail.setResult({ success: false, error: 'Rate limit exceeded', retryable: true });
3. 确定性测试装置
生成一致的、模式有效的接收者、作业和结果:
import {
createTestRecipient,
createTestNotificationJob,
createMockProviderResult,
} from '@sadikkhan02/test-utils';
const emailRecipient = createTestRecipient('email', { email: '[email protected]' });
const smsRecipient = createTestRecipient('sms');
const pushRecipient = createTestRecipient('push');
const job = createTestNotificationJob('email', {
templateId: 'order-confirmed',
variables: { orderId: '123' },
});
4. 安全的本地Redis帮手
当使用真正的Redis运行集成测试时,防止对远程或生产实例的意外执行:
import { isSafeLocalRedisUrl, cleanupTestRedis } from '@sadikkhan02/test-utils';
// Fails closed if REDIS_URL is not 127.0.0.1 or localhost
await cleanupTestRedis();
许可证
麻省理工学院