测试与贡献
Unicall 的测试原则是:CI 只跑 mock 网络请求,不真实调用外部通知服务;真实推送通过本地手动脚本完成。
本地命令
在 SDK 仓库中运行:
bash
pnpm install
pnpm build
pnpm test
pnpm typecheck文档站本地启动:
bash
pnpm install
pnpm docs:dev默认地址:
text
http://127.0.0.1:5173新增 Provider
新增 Provider 建议按这个顺序做:
- 在
src/providers/<name>/实现 Provider 和 Factory。 - Provider 实现共享
NotificationProvider接口。 - URL 参数解析放在 Provider 内部,Runtime 不感知渠道细节。
- 把 Factory 注册到
createDefaultProviderRegistry()。 - 在
src/index.ts导出公开 API。 - 新增
test/providers/<name>.test.ts,mock 网络请求。 - 新增
examples/templates/<name>-*.ts模板 demo。 - 新增
scripts/send/<name>.ts手动推送脚本。 - 更新
unicall.config.example.mjs和.env.example。 - 更新文档站 Provider 页面。
Provider 文件应保持独立,避免互相依赖。
mock 测试
测试必须拦截网络请求:
ts
import { afterEach, describe, expect, it, vi } from 'vitest';
afterEach(() => {
vi.restoreAllMocks();
});
it('发送消息到 provider', async () => {
vi.stubGlobal(
'fetch',
vi.fn(async () =>
new Response(JSON.stringify({ code: 200 }), {
status: 200,
headers: { 'content-type': 'application/json' }
})
)
);
// 调用 Provider 或 Runtime,并断言 fetch 参数。
});不要在测试里读取真实 .env.local,也不要真实访问外部服务。
手动推送脚本
真实推送脚本统一读取 JS 配置结构:
bash
pnpm exec tsx scripts/send/pushplus.ts --profile default脚本应遵守:
- 读取
unicall.config.local.mjs;不存在时回退unicall.config.example.mjs。 - 支持
--profile。 - 真实敏感值来自
process.env.UNICALL_<CHANNEL>_<PROFILE>_<FIELD>。 - 日志里只输出脱敏值,不打印完整 token、secret、password。
- 模板内容来自
examples/templates或配置文件中的templates。
配置与 Secret
可提交:
unicall.config.example.mjs.env.example- 文档示例里的占位符
不可提交:
unicall.config.local.mjs.env.local- 任何真实 token、password、secret、appToken、喵码
文档同步
当 Provider 行为变化时,需要同步检查:
- URL 格式和参数表。
- 环境变量命名。
- 消息格式映射和降级规则。
- 手动脚本命令和模板 demo。
- 浏览器安全边界。
文档示例应与测试脚本和 unicall.config.example.mjs 保持一致。