mirror of https://github.com/vector-im/riot-web
105 lines
4.1 KiB
TypeScript
105 lines
4.1 KiB
TypeScript
/*
|
|
Copyright 2022 The Matrix.org Foundation C.I.C.
|
|
|
|
Licensed under the Apache License, Version 2.0 (the "License");
|
|
you may not use this file except in compliance with the License.
|
|
You may obtain a copy of the License at
|
|
|
|
http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
Unless required by applicable law or agreed to in writing, software
|
|
distributed under the License is distributed on an "AS IS" BASIS,
|
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
See the License for the specific language governing permissions and
|
|
limitations under the License.
|
|
*/
|
|
|
|
import { MatrixEvent } from "matrix-js-sdk/src/models/event";
|
|
import { mocked } from "jest-mock";
|
|
|
|
import {
|
|
localNotificationsAreSilenced,
|
|
getLocalNotificationAccountDataEventType,
|
|
createLocalNotificationSettingsIfNeeded,
|
|
deviceNotificationSettingsKeys,
|
|
} from "../../src/utils/notifications";
|
|
import SettingsStore from "../../src/settings/SettingsStore";
|
|
import { getMockClientWithEventEmitter } from "../test-utils/client";
|
|
|
|
jest.mock("../../src/settings/SettingsStore");
|
|
|
|
describe('notifications', () => {
|
|
let accountDataStore = {};
|
|
let mockClient;
|
|
let accountDataEventKey;
|
|
|
|
beforeEach(() => {
|
|
jest.clearAllMocks();
|
|
mockClient = getMockClientWithEventEmitter({
|
|
isGuest: jest.fn().mockReturnValue(false),
|
|
getAccountData: jest.fn().mockImplementation(eventType => accountDataStore[eventType]),
|
|
setAccountData: jest.fn().mockImplementation((eventType, content) => {
|
|
accountDataStore[eventType] = new MatrixEvent({
|
|
type: eventType,
|
|
content,
|
|
});
|
|
}),
|
|
});
|
|
accountDataStore = {};
|
|
accountDataEventKey = getLocalNotificationAccountDataEventType(mockClient.deviceId);
|
|
mocked(SettingsStore).getValue.mockReturnValue(false);
|
|
});
|
|
|
|
describe('createLocalNotification', () => {
|
|
it('creates account data event', async () => {
|
|
await createLocalNotificationSettingsIfNeeded(mockClient);
|
|
const event = mockClient.getAccountData(accountDataEventKey);
|
|
expect(event?.getContent().is_silenced).toBe(true);
|
|
});
|
|
|
|
it('does not do anything for guests', async () => {
|
|
mockClient.isGuest.mockReset().mockReturnValue(true);
|
|
await createLocalNotificationSettingsIfNeeded(mockClient);
|
|
const event = mockClient.getAccountData(accountDataEventKey);
|
|
expect(event).toBeFalsy();
|
|
});
|
|
|
|
it.each(deviceNotificationSettingsKeys)(
|
|
'unsilenced for existing sessions when %s setting is truthy',
|
|
async (settingKey) => {
|
|
mocked(SettingsStore)
|
|
.getValue
|
|
.mockImplementation((key) => {
|
|
return key === settingKey;
|
|
});
|
|
|
|
await createLocalNotificationSettingsIfNeeded(mockClient);
|
|
const event = mockClient.getAccountData(accountDataEventKey);
|
|
expect(event?.getContent().is_silenced).toBe(false);
|
|
});
|
|
|
|
it("does not override an existing account event data", async () => {
|
|
mockClient.setAccountData(accountDataEventKey, {
|
|
is_silenced: false,
|
|
});
|
|
|
|
await createLocalNotificationSettingsIfNeeded(mockClient);
|
|
const event = mockClient.getAccountData(accountDataEventKey);
|
|
expect(event?.getContent().is_silenced).toBe(false);
|
|
});
|
|
});
|
|
|
|
describe('localNotificationsAreSilenced', () => {
|
|
it('defaults to false when no setting exists', () => {
|
|
expect(localNotificationsAreSilenced(mockClient)).toBeFalsy();
|
|
});
|
|
it('checks the persisted value', () => {
|
|
mockClient.setAccountData(accountDataEventKey, { is_silenced: true });
|
|
expect(localNotificationsAreSilenced(mockClient)).toBeTruthy();
|
|
|
|
mockClient.setAccountData(accountDataEventKey, { is_silenced: false });
|
|
expect(localNotificationsAreSilenced(mockClient)).toBeFalsy();
|
|
});
|
|
});
|
|
});
|