tududi/backend/tests/integration/notification-preferences.test.js
Chris 819faf0d18
Feat telegram notifications (#692)
* Add telegram notifications

* fixup! Add telegram notifications

* Cleanup
2025-12-09 20:26:53 +02:00

224 lines
9 KiB
JavaScript

const request = require('supertest');
const app = require('../../app');
const { User } = require('../../models');
const { createTestUser } = require('../helpers/testUtils');
describe('Notification Preferences', () => {
let user, agent;
beforeEach(async () => {
user = await createTestUser({
email: `test_${Date.now()}@example.com`,
});
// Create authenticated agent
agent = request.agent(app);
await agent.post('/api/login').send({
email: user.email,
password: 'password123',
});
});
describe('GET /api/profile - notification_preferences', () => {
it('should include notification_preferences in profile response', async () => {
const response = await agent.get('/api/profile');
expect(response.status).toBe(200);
expect(response.body).toHaveProperty('notification_preferences');
});
it('should return default notification_preferences for new users', async () => {
const response = await agent.get('/api/profile');
expect(response.status).toBe(200);
expect(response.body.notification_preferences).toEqual({
dueTasks: {
inApp: true,
email: false,
push: false,
telegram: false,
},
overdueTasks: {
inApp: true,
email: false,
push: false,
telegram: false,
},
dueProjects: {
inApp: true,
email: false,
push: false,
telegram: false,
},
overdueProjects: {
inApp: true,
email: false,
push: false,
telegram: false,
},
deferUntil: {
inApp: true,
email: false,
push: false,
telegram: false,
},
});
});
it('should return saved notification_preferences', async () => {
const preferences = {
dueTasks: { inApp: false, email: false, push: false },
overdueTasks: { inApp: true, email: false, push: false },
dueProjects: { inApp: false, email: false, push: false },
overdueProjects: { inApp: true, email: false, push: false },
deferUntil: { inApp: true, email: false, push: false },
};
await User.update(
{ notification_preferences: preferences },
{ where: { id: user.id } }
);
const response = await agent.get('/api/profile');
expect(response.status).toBe(200);
expect(response.body.notification_preferences).toEqual(preferences);
});
});
describe('PATCH /api/profile - notification_preferences', () => {
it('should update notification preferences', async () => {
const preferences = {
dueTasks: { inApp: false, email: false, push: false },
overdueTasks: { inApp: true, email: false, push: false },
dueProjects: { inApp: false, email: false, push: false },
overdueProjects: { inApp: true, email: false, push: false },
deferUntil: { inApp: true, email: false, push: false },
};
const response = await agent
.patch('/api/profile')
.send({ notification_preferences: preferences });
expect(response.status).toBe(200);
expect(response.body.notification_preferences).toEqual(preferences);
// Verify it was saved to database
const updatedUser = await User.findByPk(user.id);
expect(updatedUser.notification_preferences).toEqual(preferences);
});
it('should allow partial notification preference updates', async () => {
// Set initial preferences
const initialPreferences = {
dueTasks: { inApp: true, email: false, push: false },
overdueTasks: { inApp: true, email: false, push: false },
dueProjects: { inApp: true, email: false, push: false },
overdueProjects: { inApp: true, email: false, push: false },
deferUntil: { inApp: true, email: false, push: false },
};
await agent
.patch('/api/profile')
.send({ notification_preferences: initialPreferences });
// Update only some types
const updatedPreferences = {
dueTasks: { inApp: false, email: false, push: false },
overdueTasks: { inApp: false, email: false, push: false },
dueProjects: { inApp: true, email: false, push: false },
overdueProjects: { inApp: true, email: false, push: false },
deferUntil: { inApp: true, email: false, push: false },
};
const response = await agent
.patch('/api/profile')
.send({ notification_preferences: updatedPreferences });
expect(response.status).toBe(200);
expect(response.body.notification_preferences).toEqual(
updatedPreferences
);
});
it('should allow setting preferences to null', async () => {
// First set some preferences
await agent.patch('/api/profile').send({
notification_preferences: {
dueTasks: { inApp: false, email: false, push: false },
overdueTasks: { inApp: true, email: false, push: false },
dueProjects: { inApp: false, email: false, push: false },
overdueProjects: { inApp: true, email: false, push: false },
deferUntil: { inApp: true, email: false, push: false },
},
});
// Then set to null
const response = await agent
.patch('/api/profile')
.send({ notification_preferences: null });
expect(response.status).toBe(200);
expect(response.body.notification_preferences).toBeNull();
});
it('should not affect other profile fields', async () => {
const preferences = {
dueTasks: { inApp: false, email: false, push: false },
overdueTasks: { inApp: true, email: false, push: false },
dueProjects: { inApp: false, email: false, push: false },
overdueProjects: { inApp: true, email: false, push: false },
deferUntil: { inApp: true, email: false, push: false },
};
const response = await agent
.patch('/api/profile')
.send({ notification_preferences: preferences });
expect(response.status).toBe(200);
expect(response.body.email).toBe(user.email);
expect(response.body.appearance).toBe(user.appearance);
expect(response.body.language).toBe(user.language);
});
it('should require authentication', async () => {
const preferences = {
dueTasks: { inApp: false, email: false, push: false },
overdueTasks: { inApp: true, email: false, push: false },
dueProjects: { inApp: false, email: false, push: false },
overdueProjects: { inApp: true, email: false, push: false },
deferUntil: { inApp: true, email: false, push: false },
};
const response = await request(app)
.patch('/api/profile')
.send({ notification_preferences: preferences });
expect(response.status).toBe(401);
expect(response.body.error).toBe('Authentication required');
});
it('should work with other profile updates in same request', async () => {
const updateData = {
appearance: 'dark',
language: 'es',
notification_preferences: {
dueTasks: { inApp: false, email: false, push: false },
overdueTasks: { inApp: true, email: false, push: false },
dueProjects: { inApp: false, email: false, push: false },
overdueProjects: { inApp: true, email: false, push: false },
deferUntil: { inApp: true, email: false, push: false },
},
};
const response = await agent.patch('/api/profile').send(updateData);
expect(response.status).toBe(200);
expect(response.body.appearance).toBe('dark');
expect(response.body.language).toBe('es');
expect(response.body.notification_preferences).toEqual(
updateData.notification_preferences
);
});
});
});