This commit is contained in:
Bastian Wagner
2026-06-29 15:25:14 +02:00
parent cadb198949
commit 9519409ec7
4 changed files with 267 additions and 38 deletions

View File

@@ -1,3 +1,4 @@
import { Logger } from '@nestjs/common';
import { ConfigService } from '@nestjs/config';
import { UserEntity } from '../auth/user.entity';
import { MailService } from '../mail/mail.service';
@@ -20,7 +21,14 @@ describe('TaskDigestService', () => {
sendTaskDigestEmail: jest.fn().mockResolvedValue(undefined),
};
taskPushService = {
sendTaskDigest: jest.fn().mockResolvedValue(undefined),
sendTaskDigest: jest
.fn()
.mockResolvedValue({
enabled: true,
subscriptionCount: 1,
sentCount: 1,
failedCount: 0,
}),
};
service = new TaskDigestService(
usersRepository as never,
@@ -154,6 +162,65 @@ describe('TaskDigestService', () => {
expect(taskPushService.sendTaskDigest).not.toHaveBeenCalled();
});
it('sends a test digest without marking the regular digest processed', async () => {
await saveUser({ taskDigestPreference: 'none' });
const result = await service.sendTestDigest('owner-1');
expect(mailService.sendTaskDigestEmail).toHaveBeenCalledWith(
'owner@example.com',
expect.objectContaining({
displayName: 'Owner',
todayTasks: [
{
title: 'Test-Benachrichtigung',
notes:
'Diese Aufgabe wurde nur fuer den Benachrichtigungstest erzeugt.',
dueDate: expect.any(String),
},
],
overdueTasks: [],
}),
);
expect(taskPushService.sendTaskDigest).toHaveBeenCalledWith(
'owner-1',
expect.objectContaining({
todayTasks: [
expect.objectContaining({ title: 'Test-Benachrichtigung' }),
],
}),
);
expect(result.mail.sent).toBe(true);
expect(result.push).toEqual({
enabled: true,
subscriptionCount: 1,
sentCount: 1,
failedCount: 0,
sent: true,
});
expect(result.usedFallbackTask).toBe(true);
expect(
(await usersRepository.findOne({ where: { id: 'owner-1' } }))
?.taskDigestMorningProcessedDate,
).toBeNull();
});
it('returns separate mail and push status for test digest failures', async () => {
jest.spyOn(Logger.prototype, 'error').mockImplementation(() => undefined);
await saveUser();
await saveTask({ id: 'today-task' });
jest
.mocked(mailService.sendTaskDigestEmail)
.mockRejectedValueOnce(new Error('smtp down'));
const result = await service.sendTestDigest('owner-1');
expect(taskPushService.sendTaskDigest).toHaveBeenCalledTimes(1);
expect(result.mail).toEqual({ sent: false, error: 'smtp down' });
expect(result.push.sent).toBe(true);
expect(result.usedFallbackTask).toBe(false);
});
async function saveUser(overrides: Partial<UserEntity> = {}) {
return usersRepository.save({
id: overrides.id ?? 'owner-1',