pwa notifications

This commit is contained in:
Bastian Wagner
2026-06-29 14:52:33 +02:00
parent 8fdee223c0
commit a033c50c25
18 changed files with 780 additions and 26 deletions

View File

@@ -3,12 +3,14 @@ import { UserEntity } from '../auth/user.entity';
import { MailService } from '../mail/mail.service';
import { InMemoryRepository } from '../testing/in-memory-repository';
import { TaskDigestService } from './task-digest.service';
import { TaskPushService } from './task-push.service';
import { UserTaskEntity } from './user-task.entity';
describe('TaskDigestService', () => {
let usersRepository: InMemoryRepository<UserEntity>;
let tasksRepository: InMemoryRepository<UserTaskEntity>;
let mailService: Pick<MailService, 'sendTaskDigestEmail'>;
let taskPushService: Pick<TaskPushService, 'sendTaskDigest'>;
let service: TaskDigestService;
beforeEach(() => {
@@ -17,6 +19,9 @@ describe('TaskDigestService', () => {
mailService = {
sendTaskDigestEmail: jest.fn().mockResolvedValue(undefined),
};
taskPushService = {
sendTaskDigest: jest.fn().mockResolvedValue(undefined),
};
service = new TaskDigestService(
usersRepository as never,
tasksRepository as never,
@@ -25,6 +30,7 @@ describe('TaskDigestService', () => {
TASK_DIGEST_TIMEZONE: 'Europe/Budapest',
}),
mailService as MailService,
taskPushService as TaskPushService,
);
});
@@ -69,6 +75,25 @@ describe('TaskDigestService', () => {
],
},
);
expect(taskPushService.sendTaskDigest).toHaveBeenCalledWith('owner-1', {
slot: 'morning',
date: '2026-06-29',
tasksUrl: 'http://client.test/tasks',
todayTasks: [
{
title: 'Heute',
notes: undefined,
dueDate: '2026-06-29',
},
],
overdueTasks: [
{
title: 'Alt',
notes: undefined,
dueDate: '2026-06-28',
},
],
});
expect(
(await usersRepository.findOne({ where: { id: 'owner-1' } }))
?.taskDigestMorningProcessedDate,
@@ -82,6 +107,7 @@ describe('TaskDigestService', () => {
await service.processDueDigests(new Date('2026-06-29T07:00:00.000Z'));
expect(mailService.sendTaskDigestEmail).not.toHaveBeenCalled();
expect(taskPushService.sendTaskDigest).not.toHaveBeenCalled();
expect(
(await usersRepository.findOne({ where: { id: 'owner-1' } }))
?.taskDigestMorningProcessedDate,
@@ -111,6 +137,7 @@ describe('TaskDigestService', () => {
await service.processDueDigests(new Date('2026-06-29T13:00:00.000Z'));
expect(mailService.sendTaskDigestEmail).toHaveBeenCalledTimes(1);
expect(taskPushService.sendTaskDigest).toHaveBeenCalledTimes(1);
expect(mailService.sendTaskDigestEmail).toHaveBeenCalledWith(
'both@example.com',
expect.objectContaining({ slot: 'afternoon' }),
@@ -124,6 +151,7 @@ describe('TaskDigestService', () => {
await service.processDueDigests(new Date('2026-06-29T08:30:00.000Z'));
expect(mailService.sendTaskDigestEmail).not.toHaveBeenCalled();
expect(taskPushService.sendTaskDigest).not.toHaveBeenCalled();
});
async function saveUser(overrides: Partial<UserEntity> = {}) {