/** * The admin-scope preference matrix, after the two routes moved off AdminController * next to NotificationPreferencesService, which owns it. The 'admin' scope argument * they always passed is now written once, at the only place that uses it. */ import type { NotificationPreferencesService } from '../../../src/nest/notifications/notification-preferences.service'; import { AdminNotificationPreferencesController } from '../../../src/nest/notifications/notifications.controller'; import { NotificationsModule } from '../../../src/nest/notifications/notifications.module'; import type { User } from '../../../src/types'; import { expectRegisteredController } from '../../helpers/module-providers'; import { describe, it, expect, vi, beforeEach } from 'vitest'; const admin = { id: 1, role: 'admin' } as User; function controller() { const prefs = { getPreferencesMatrix: vi.fn(() => ({ rows: [{ event: 'trip_reminder' }] })), setAdminPreferences: vi.fn(), getInstanceDefaults: vi.fn(() => ({ defaults: { trip_invite: { email: 'off' } } })), setInstanceDefaults: vi.fn(), } as unknown as NotificationPreferencesService; return { c: new AdminNotificationPreferencesController(prefs), prefs }; } describe('AdminNotificationPreferencesController', () => { beforeEach(() => { vi.clearAllMocks(); }); it('ADMINPREF-001 GET asks for the admin scope, not the user one', async () => { const { c, prefs } = controller(); expect(await c.get(admin)).toEqual({ rows: [{ event: 'trip_reminder' }] }); expect(prefs.getPreferencesMatrix).toHaveBeenCalledWith(1, 'admin', 'admin'); }); it('ADMINPREF-002 PUT persists, then answers with the REFRESHED matrix', async () => { const { c, prefs } = controller(); // The admin panel renders straight from this response, so returning the write // result instead of a fresh read would leave it showing stale rows. expect(await c.set(admin, { trip_reminder: { email: true } } as never)).toEqual({ rows: [{ event: 'trip_reminder' }], }); expect(prefs.setAdminPreferences).toHaveBeenCalledWith(1, { trip_reminder: { email: true } }); expect(prefs.getPreferencesMatrix).toHaveBeenCalledWith(1, 'admin', 'admin'); }); it('ADMINPREF-003 the acting user drives the lookup, never a body field', async () => { const { c, prefs } = controller(); await c.get({ id: 7, role: 'admin' } as User); expect(prefs.getPreferencesMatrix).toHaveBeenCalledWith(7, 'admin', 'admin'); }); it('ADMINPREF-005 the defaults for users are read and written for the acting admin (#1536)', async () => { const { c, prefs } = controller(); expect(await c.getDefaults(admin)).toEqual({ defaults: { trip_invite: { email: 'off' } } }); expect(prefs.getInstanceDefaults).toHaveBeenCalledWith(1); expect(await c.setDefaults(admin, { defaults: { trip_invite: { email: 'off' } } } as never)).toEqual({ defaults: { trip_invite: { email: 'off' } }, }); expect(prefs.setInstanceDefaults).toHaveBeenCalledWith({ trip_invite: { email: 'off' } }); }); it('ADMINPREF-004 the class is listed in its module controllers', () => { expectRegisteredController(NotificationsModule, AdminNotificationPreferencesController); }); });