feat(automation): add timezone-safe daily briefing dedupe
This commit is contained in:
@@ -14,6 +14,7 @@ function makeCronJob(overrides?: Partial<CronJobConfig>): CronJobConfig {
|
||||
message: 'Hello from cron',
|
||||
output: { channel: 'telegram', peer: '123' },
|
||||
enabled: true,
|
||||
once_per_local_day: false,
|
||||
...overrides,
|
||||
};
|
||||
}
|
||||
@@ -176,4 +177,38 @@ describe('CronScheduler', () => {
|
||||
const names = scheduler.getJobNames();
|
||||
expect(names).toEqual(['job-a', 'job-b']);
|
||||
});
|
||||
|
||||
it('dedupes once_per_local_day job within same local day', () => {
|
||||
const jobs = [makeCronJob({ once_per_local_day: true, timezone: 'America/New_York' })];
|
||||
scheduler = new CronScheduler(jobs, asCronChannelRegistry(mockChannelRegistry));
|
||||
|
||||
const messages: InboundMessage[] = [];
|
||||
scheduler.onMessage((msg: InboundMessage) => messages.push(msg));
|
||||
|
||||
const nowSpy = vi.spyOn(Date, 'now');
|
||||
nowSpy.mockReturnValueOnce(new Date('2026-02-16T13:00:00.000Z').getTime()); // 08:00 local
|
||||
scheduler.triggerJob('test-job');
|
||||
nowSpy.mockReturnValueOnce(new Date('2026-02-16T18:00:00.000Z').getTime()); // still same local day
|
||||
scheduler.triggerJob('test-job');
|
||||
nowSpy.mockRestore();
|
||||
|
||||
expect(messages).toHaveLength(1);
|
||||
});
|
||||
|
||||
it('allows once_per_local_day job on next local day', () => {
|
||||
const jobs = [makeCronJob({ once_per_local_day: true, timezone: 'America/New_York' })];
|
||||
scheduler = new CronScheduler(jobs, asCronChannelRegistry(mockChannelRegistry));
|
||||
|
||||
const messages: InboundMessage[] = [];
|
||||
scheduler.onMessage((msg: InboundMessage) => messages.push(msg));
|
||||
|
||||
const nowSpy = vi.spyOn(Date, 'now');
|
||||
nowSpy.mockReturnValueOnce(new Date('2026-02-16T13:00:00.000Z').getTime()); // 08:00 local
|
||||
scheduler.triggerJob('test-job');
|
||||
nowSpy.mockReturnValueOnce(new Date('2026-02-17T13:00:00.000Z').getTime()); // next local day
|
||||
scheduler.triggerJob('test-job');
|
||||
nowSpy.mockRestore();
|
||||
|
||||
expect(messages).toHaveLength(2);
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user