element-web-Github/test/unit-tests/stores/ReleaseAnnouncementStore-test.tsx
Michael Telatynski c05c429803
Absorb the matrix-react-sdk repository (#28192)
Co-authored-by: github-merge-queue <118344674+github-merge-queue@users.noreply.github.com>
Co-authored-by: github-merge-queue <github-merge-queue@users.noreply.github.com>
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Florian Duros <florian.duros@ormaz.fr>
Co-authored-by: Kim Brose <kim.brose@nordeck.net>
Co-authored-by: Florian Duros <florianduros@element.io>
Co-authored-by: R Midhun Suresh <hi@midhun.dev>
Co-authored-by: dbkr <986903+dbkr@users.noreply.github.com>
Co-authored-by: ElementRobot <releases@riot.im>
Co-authored-by: dbkr <dbkr@users.noreply.github.com>
Co-authored-by: David Baker <dbkr@users.noreply.github.com>
Co-authored-by: Michael Telatynski <7t3chguy@gmail.com>
Co-authored-by: Richard van der Hoff <1389908+richvdh@users.noreply.github.com>
Co-authored-by: David Langley <davidl@element.io>
Co-authored-by: Michael Weimann <michaelw@matrix.org>
Co-authored-by: Timshel <Timshel@users.noreply.github.com>
Co-authored-by: Sahil Silare <32628578+sahil9001@users.noreply.github.com>
Co-authored-by: Will Hunt <will@half-shot.uk>
Co-authored-by: Hubert Chathi <hubert@uhoreg.ca>
Co-authored-by: Andrew Ferrazzutti <andrewf@element.io>
Co-authored-by: Robin <robin@robin.town>
Co-authored-by: Tulir Asokan <tulir@maunium.net>
2024-10-16 13:31:55 +01:00

121 lines
4.8 KiB
TypeScript

/*
* Copyright 2024 New Vector Ltd.
* Copyright 2024 The Matrix.org Foundation C.I.C.
*
* SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only
* Please see LICENSE files in the repository root for full details.
*/
import { mocked } from "jest-mock";
import SettingsStore, { CallbackFn } from "../../../src/settings/SettingsStore";
import { Feature, ReleaseAnnouncementStore } from "../../../src/stores/ReleaseAnnouncementStore";
import { SettingLevel } from "../../../src/settings/SettingLevel";
jest.mock("../../../src/settings/SettingsStore");
describe("ReleaseAnnouncementStore", () => {
let releaseAnnouncementStore: ReleaseAnnouncementStore;
// Local settings
// Instead of using the real SettingsStore, we use a local settings object
// to avoid side effects between tests
let settings: Record<string, any> = {};
beforeEach(() => {
// Default settings
settings = {
feature_release_announcement: true,
releaseAnnouncementData: {},
};
const watchCallbacks: Array<CallbackFn> = [];
mocked(SettingsStore.getValue).mockImplementation((setting: string) => {
return settings[setting];
});
mocked(SettingsStore.setValue).mockImplementation(
(settingName: string, roomId: string | null, level: SettingLevel, value: any): Promise<void> => {
settings[settingName] = value;
// we don't care about the parameters, just call the callbacks
// @ts-ignore
watchCallbacks.forEach((cb) => cb());
return Promise.resolve();
},
);
mocked(SettingsStore.isLevelSupported).mockReturnValue(true);
mocked(SettingsStore.canSetValue).mockReturnValue(true);
mocked(SettingsStore.watchSetting).mockImplementation((settingName: string, roomId: null, callback: any) => {
watchCallbacks.push(callback);
return "watcherId";
});
releaseAnnouncementStore = new ReleaseAnnouncementStore();
});
/**
* Disables the release announcement feature.
*/
function disableReleaseAnnouncement() {
settings["feature_release_announcement"] = false;
}
/**
* Listens to the next release announcement change event.
*/
function listenReleaseAnnouncementChanged() {
return new Promise<Feature | null>((resolve) =>
releaseAnnouncementStore.once("releaseAnnouncementChanged", resolve),
);
}
it("should be a singleton", () => {
expect(ReleaseAnnouncementStore.instance).toBeDefined();
});
it("should return null when the release announcement is disabled", async () => {
disableReleaseAnnouncement();
expect(releaseAnnouncementStore.getReleaseAnnouncement()).toBeNull();
// Wait for the next release announcement change event
const promise = listenReleaseAnnouncementChanged();
// Call the next release announcement
// because the release announcement is disabled, the next release announcement should be null
await releaseAnnouncementStore.nextReleaseAnnouncement();
expect(await promise).toBeNull();
expect(releaseAnnouncementStore.getReleaseAnnouncement()).toBeNull();
});
it("should return the next feature when the next release announcement is called", async () => {
// Sanity check
expect(releaseAnnouncementStore.getReleaseAnnouncement()).toBe("threadsActivityCentre");
let promise = listenReleaseAnnouncementChanged();
await releaseAnnouncementStore.nextReleaseAnnouncement();
expect(await promise).toBe("pinningMessageList");
expect(releaseAnnouncementStore.getReleaseAnnouncement()).toBe("pinningMessageList");
promise = listenReleaseAnnouncementChanged();
await releaseAnnouncementStore.nextReleaseAnnouncement();
expect(await promise).toBeNull();
expect(releaseAnnouncementStore.getReleaseAnnouncement()).toBeNull();
const secondStore = new ReleaseAnnouncementStore();
// All the release announcements have been viewed, so it should be updated in the store account
// The release announcement viewing states should be share among all instances (devices in the same account)
expect(secondStore.getReleaseAnnouncement()).toBeNull();
});
it("should listen to release announcement data changes in the store", async () => {
const secondStore = new ReleaseAnnouncementStore();
expect(secondStore.getReleaseAnnouncement()).toBe("threadsActivityCentre");
const promise = listenReleaseAnnouncementChanged();
await secondStore.nextReleaseAnnouncement();
expect(await promise).toBe("pinningMessageList");
expect(releaseAnnouncementStore.getReleaseAnnouncement()).toBe("pinningMessageList");
});
});