refactor: centralize wechat notification dispatch
This commit is contained in:
@@ -0,0 +1,126 @@
|
||||
import assert from 'node:assert/strict';
|
||||
import test from 'node:test';
|
||||
import { createNotificationDispatcher } from './notification-dispatcher.mjs';
|
||||
|
||||
test('notification dispatcher forwards recharge success text unchanged', async () => {
|
||||
const sent = [];
|
||||
const dedupeKeys = [];
|
||||
const logs = [];
|
||||
const dispatcher = createNotificationDispatcher({
|
||||
async sendWechatTextToUser(userId, text) {
|
||||
sent.push({ userId, text });
|
||||
},
|
||||
logger: {
|
||||
info(message, payload) {
|
||||
logs.push({ message, payload });
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
const sentOk = await dispatcher.sendRechargeSuccess({
|
||||
userId: 'user-1',
|
||||
title: '充值成功',
|
||||
body: '你已成功充值 ¥25.00,余额已更新。',
|
||||
dedupeKey: (dedupeKeys.push('recharge:order-1'), 'recharge:order-1'),
|
||||
});
|
||||
|
||||
assert.equal(sentOk, true);
|
||||
assert.deepEqual(dedupeKeys, ['recharge:order-1']);
|
||||
assert.deepEqual(sent, [
|
||||
{ userId: 'user-1', text: '充值成功\n你已成功充值 ¥25.00,余额已更新。' },
|
||||
]);
|
||||
assert.deepEqual(logs, [
|
||||
{
|
||||
message: 'Notification dispatch:',
|
||||
payload: {
|
||||
type: 'recharge_success',
|
||||
userId: 'user-1',
|
||||
dedupeKey: 'recharge:order-1',
|
||||
sent: true,
|
||||
},
|
||||
},
|
||||
]);
|
||||
});
|
||||
|
||||
test('notification dispatcher forwards schedule notification text unchanged', async () => {
|
||||
const sent = [];
|
||||
const logs = [];
|
||||
const dispatcher = createNotificationDispatcher({
|
||||
async sendWechatTextToUser(userId, text) {
|
||||
sent.push({ userId, text });
|
||||
},
|
||||
logger: {
|
||||
info(message, payload) {
|
||||
logs.push({ message, payload });
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
const sentOk = await dispatcher.sendScheduleNotification({
|
||||
userId: 'user-2',
|
||||
text: '【待办提醒】开会\n提醒时间:09:00',
|
||||
});
|
||||
|
||||
assert.equal(sentOk, true);
|
||||
assert.deepEqual(sent, [
|
||||
{ userId: 'user-2', text: '【待办提醒】开会\n提醒时间:09:00' },
|
||||
]);
|
||||
assert.deepEqual(logs, [
|
||||
{
|
||||
message: 'Notification dispatch:',
|
||||
payload: {
|
||||
type: 'schedule_notification',
|
||||
userId: 'user-2',
|
||||
dedupeKey: null,
|
||||
sent: true,
|
||||
},
|
||||
},
|
||||
]);
|
||||
});
|
||||
|
||||
test('notification dispatcher returns false when wechat sender is unavailable', async () => {
|
||||
const logs = [];
|
||||
const dispatcher = createNotificationDispatcher({
|
||||
logger: {
|
||||
info(message, payload) {
|
||||
logs.push({ message, payload });
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
assert.equal(
|
||||
await dispatcher.sendRechargeSuccess({
|
||||
userId: 'user-3',
|
||||
title: '充值成功',
|
||||
body: '余额已更新。',
|
||||
}),
|
||||
false,
|
||||
);
|
||||
assert.equal(
|
||||
await dispatcher.sendScheduleNotification({
|
||||
userId: 'user-3',
|
||||
text: '【待办提醒】开会',
|
||||
}),
|
||||
false,
|
||||
);
|
||||
assert.deepEqual(logs, [
|
||||
{
|
||||
message: 'Notification dispatch:',
|
||||
payload: {
|
||||
type: 'recharge_success',
|
||||
userId: 'user-3',
|
||||
dedupeKey: null,
|
||||
sent: false,
|
||||
},
|
||||
},
|
||||
{
|
||||
message: 'Notification dispatch:',
|
||||
payload: {
|
||||
type: 'schedule_notification',
|
||||
userId: 'user-3',
|
||||
dedupeKey: null,
|
||||
sent: false,
|
||||
},
|
||||
},
|
||||
]);
|
||||
});
|
||||
Reference in New Issue
Block a user