Files
memind/wechat/handlers/push-subscription.test.mjs
john bb6aa75b3b
Memind CI / Test, build, and release guards (push) Successful in 4m14s
feat(wechat): add secret codes for morning subscribe and news push
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-20 19:10:27 +08:00

194 lines
5.7 KiB
JavaScript

import test from 'node:test';
import assert from 'node:assert/strict';
import { createPushSubscriptionPendingStore } from '../push-subscription-pending.mjs';
import { formatPushSubscriptionCommittedReply } from '../push-subscription-service.mjs';
import { handlePushSubscriptionMessages } from './push-subscription.mjs';
test('handlePushSubscriptionMessages commits morning subscription on reply 1', async () => {
const store = createPushSubscriptionPendingStore();
const calls = [];
const scheduleService = {
async listItems() {
return [];
},
async findActiveItemByMetadataSource() {
return null;
},
async createItem(payload) {
calls.push(['createItem', payload]);
return { id: 'item-1', ...payload };
},
async createReminder(payload) {
calls.push(['createReminder', payload]);
return { id: 'rem-1', ...payload };
},
};
await store.setPending({ appId: 'wx-app', openid: 'openid-a' });
const reply = await handlePushSubscriptionMessages({
appId: 'wx-app',
openid: 'openid-a',
text: '1 7点',
pendingStore: store,
scheduleService,
boundUser: { userId: 'user-1' },
});
assert.equal(reply, formatPushSubscriptionCommittedReply({
catalogItem: { id: 1, emoji: '☀️', label: '早安问候' },
hour: 7,
minute: 0,
}));
assert.equal(calls[0][1].metadata.source, 'wechat_push:morning');
assert.equal(calls[0][1].metadata.dailyHour, 7);
});
test('handlePushSubscriptionMessages commits news subscription when delivery is ready', async () => {
const calls = [];
const reply = await handlePushSubscriptionMessages({
text: '2 7点',
boundUser: { userId: 'user-1' },
scheduleService: {
async listItems() {
return [];
},
async findActiveItemByMetadataSource() {
return null;
},
async createItem(payload) {
calls.push(['createItem', payload]);
return { id: 'item-news', ...payload };
},
async createReminder(payload) {
calls.push(['createReminder', payload]);
return { id: 'rem-news', ...payload };
},
},
});
assert.match(reply, /每日新闻早报/u);
assert.equal(calls[0][1].metadata.source, 'wechat_push:news');
assert.equal(calls[0][1].metadata.dailyHour, 7);
});
test('handlePushSubscriptionMessages commits weather subscription with default city', async () => {
const calls = [];
const reply = await handlePushSubscriptionMessages({
text: '3 上海',
boundUser: { userId: 'user-1' },
scheduleService: {
async listItems() {
return [];
},
async findActiveItemByMetadataSource() {
return null;
},
async createItem(payload) {
calls.push(['createItem', payload]);
return { id: 'item-weather', ...payload };
},
async createReminder(payload) {
calls.push(['createReminder', payload]);
return { id: 'rem-weather', ...payload };
},
},
});
assert.match(reply, /每日天气/u);
assert.match(reply, /上海/u);
assert.equal(calls[0][1].metadata.options.city, '上海');
});
test('handlePushSubscriptionMessages commits finance subscription', async () => {
const calls = [];
const reply = await handlePushSubscriptionMessages({
text: '4',
boundUser: { userId: 'user-1' },
scheduleService: {
async listItems() {
return [];
},
async findActiveItemByMetadataSource() {
return null;
},
async createItem(payload) {
calls.push(['createItem', payload]);
return { id: 'item-finance', ...payload };
},
async createReminder(payload) {
calls.push(['createReminder', payload]);
return { id: 'rem-finance', ...payload };
},
},
});
assert.match(reply, /财经市场/u);
assert.equal(calls[0][1].metadata.source, 'wechat_push:finance');
});
test('handlePushSubscriptionMessages lists active subscriptions', async () => {
const reply = await handlePushSubscriptionMessages({
text: '我的订阅',
boundUser: { userId: 'user-1' },
scheduleService: {
async listItems() {
return [{
id: 'item-1',
metadata: {
source: 'wechat_push:morning',
dailyHour: 8,
dailyMinute: 0,
},
}];
},
},
});
assert.match(reply, /你已开通/);
assert.match(reply, /早安问候/);
});
test('handlePushSubscriptionMessages returns help menu', async () => {
const reply = await handlePushSubscriptionMessages({ text: '订阅帮助' });
assert.match(reply, /每日推送订阅/);
assert.match(reply, /10 🎁 每日惊喜/);
});
test('handlePushSubscriptionMessages opens morning subscription on secret code 美丽心情', async () => {
const calls = [];
const reply = await handlePushSubscriptionMessages({
text: '美丽心情',
boundUser: { userId: 'user-1' },
scheduleService: {
async listItems() {
return [];
},
async findActiveItemByMetadataSource() {
return null;
},
async createItem(payload) {
calls.push(['createItem', payload]);
return { id: 'item-morning', ...payload };
},
async createReminder(payload) {
calls.push(['createReminder', payload]);
return { id: 'rem-morning', ...payload };
},
},
});
assert.match(reply, /已开启 ☀️ 早安问候/u);
assert.equal(calls[0][1].metadata.source, 'wechat_push:morning');
assert.equal(calls[0][1].metadata.dailyHour, 8);
});
test('handlePushSubscriptionMessages pushes news digest on secret code 新闻早报', async () => {
const reply = await handlePushSubscriptionMessages({
text: '新闻早报',
env: {},
});
assert.match(reply, /📰 每日新闻早报/u);
});