// Copyright 2023 Signal Messenger, LLC // SPDX-License-Identifier: AGPL-3.0-only import { assert } from 'chai'; import { DataReader, DataWriter } from '../../sql/Client'; import { DayOfWeek } from '../../types/NotificationProfile'; import { generateNotificationProfileId } from '../../types/NotificationProfile-node'; import type { NotificationProfileType } from '../../types/NotificationProfile'; const { getAllNotificationProfiles } = DataReader; const { _deleteAllNotificationProfiles, createNotificationProfile, deleteNotificationProfileById, markNotificationProfileDeleted, updateNotificationProfile, } = DataWriter; describe('sql/notificationProfiles', () => { beforeEach(async () => { await _deleteAllNotificationProfiles(); }); after(async () => { await _deleteAllNotificationProfiles(); }); it('should roundtrip', async () => { const now = Date.now(); const profile1: NotificationProfileType = { id: generateNotificationProfileId(), name: 'After Hours', emoji: '💤 ', color: 0xff111111, createdAtMs: now, allowAllCalls: true, allowAllMentions: true, allowedMembers: new Set(['conversation-1', 'conversation-2']), scheduleEnabled: true, scheduleStartTime: 1800, scheduleEndTime: 2400, scheduleDaysEnabled: { [DayOfWeek.MONDAY]: true, [DayOfWeek.TUESDAY]: true, [DayOfWeek.WEDNESDAY]: true, [DayOfWeek.THURSDAY]: true, [DayOfWeek.FRIDAY]: true, [DayOfWeek.SATURDAY]: false, [DayOfWeek.SUNDAY]: false, }, deletedAtTimestampMs: undefined, storageID: 'storageId-1', storageVersion: 56, storageUnknownFields: new Uint8Array([1, 2, 3, 4]), storageNeedsSync: false, }; const profile2: NotificationProfileType = { id: generateNotificationProfileId(), name: 'Holiday', emoji: undefined, color: 0xff222222, createdAtMs: now + 1, allowAllCalls: false, allowAllMentions: false, allowedMembers: new Set(), scheduleEnabled: false, scheduleStartTime: undefined, scheduleEndTime: undefined, scheduleDaysEnabled: undefined, deletedAtTimestampMs: undefined, storageID: undefined, storageVersion: undefined, storageUnknownFields: undefined, storageNeedsSync: true, }; await createNotificationProfile(profile1); const oneProfile = await getAllNotificationProfiles(); assert.lengthOf(oneProfile, 1); assert.deepEqual(oneProfile[0], profile1); await createNotificationProfile(profile2); const twoProfiles = await getAllNotificationProfiles(); assert.lengthOf(twoProfiles, 2); assert.deepEqual(twoProfiles[0], profile2); assert.deepEqual(twoProfiles[1], profile1); await deleteNotificationProfileById(profile1.id); const backToOneProfile = await getAllNotificationProfiles(); assert.lengthOf(backToOneProfile, 1); assert.deepEqual(backToOneProfile[0], profile2); }); it('can mark a profile as deleted', async () => { const now = Date.now(); const profile1: NotificationProfileType = { id: generateNotificationProfileId(), name: 'After Hours', emoji: '💤 ', color: 0xff111111, createdAtMs: now, allowAllCalls: true, allowAllMentions: true, allowedMembers: new Set(['conversation-1', 'conversation-2']), scheduleEnabled: true, scheduleStartTime: 1800, scheduleEndTime: 2400, scheduleDaysEnabled: { [DayOfWeek.MONDAY]: true, [DayOfWeek.TUESDAY]: true, [DayOfWeek.WEDNESDAY]: true, [DayOfWeek.THURSDAY]: true, [DayOfWeek.FRIDAY]: true, [DayOfWeek.SATURDAY]: false, [DayOfWeek.SUNDAY]: false, }, deletedAtTimestampMs: undefined, storageID: 'storageId-1', storageVersion: 56, storageUnknownFields: new Uint8Array([1, 2, 3, 4]), storageNeedsSync: false, }; const profile2: NotificationProfileType = { id: generateNotificationProfileId(), name: 'Holiday', emoji: undefined, color: 0xff222222, createdAtMs: now + 1, allowAllCalls: false, allowAllMentions: false, allowedMembers: new Set(), scheduleEnabled: false, scheduleStartTime: undefined, scheduleEndTime: undefined, scheduleDaysEnabled: undefined, deletedAtTimestampMs: undefined, storageID: undefined, storageVersion: undefined, storageUnknownFields: undefined, storageNeedsSync: true, }; await createNotificationProfile(profile1); await createNotificationProfile(profile2); const timestamp = await markNotificationProfileDeleted(profile1.id); assert.isDefined(timestamp); const twoProfiles = await getAllNotificationProfiles(); assert.lengthOf(twoProfiles, 2); assert.strictEqual(twoProfiles[1].deletedAtTimestampMs, timestamp); }); it('can update a profile', async () => { const now = Date.now(); const id = generateNotificationProfileId(); const profile: NotificationProfileType = { id, name: 'After Hours', emoji: '💤 ', color: 0xff111111, createdAtMs: now, allowAllCalls: true, allowAllMentions: true, allowedMembers: new Set(['conversation-1', 'conversation-2']), scheduleEnabled: true, scheduleStartTime: 1800, scheduleEndTime: 2400, scheduleDaysEnabled: { [DayOfWeek.MONDAY]: true, [DayOfWeek.TUESDAY]: true, [DayOfWeek.WEDNESDAY]: true, [DayOfWeek.THURSDAY]: true, [DayOfWeek.FRIDAY]: true, [DayOfWeek.SATURDAY]: false, [DayOfWeek.SUNDAY]: false, }, deletedAtTimestampMs: undefined, storageID: 'storageId-1', storageVersion: 56, storageUnknownFields: new Uint8Array([1, 2, 3, 4]), storageNeedsSync: false, }; const update: NotificationProfileType = { id, name: 'Holiday', emoji: '📆 ', color: 0xff222222, createdAtMs: now + 1, allowAllCalls: false, allowAllMentions: false, allowedMembers: new Set(), scheduleEnabled: false, scheduleStartTime: undefined, scheduleEndTime: undefined, scheduleDaysEnabled: undefined, deletedAtTimestampMs: undefined, storageID: undefined, storageVersion: undefined, storageUnknownFields: undefined, storageNeedsSync: true, }; await createNotificationProfile(profile); const oneProfile = await getAllNotificationProfiles(); assert.lengthOf(oneProfile, 1); assert.deepEqual(oneProfile[0], profile); await updateNotificationProfile(update); const stillOneProfile = await getAllNotificationProfiles(); assert.lengthOf(stillOneProfile, 1); assert.deepEqual(stillOneProfile[0], update); }); });