diff --git a/src/components/views/settings/tabs/user/PreferencesUserSettingsTab.tsx b/src/components/views/settings/tabs/user/PreferencesUserSettingsTab.tsx index 1519e39a0d..4e19924857 100644 --- a/src/components/views/settings/tabs/user/PreferencesUserSettingsTab.tsx +++ b/src/components/views/settings/tabs/user/PreferencesUserSettingsTab.tsx @@ -214,7 +214,10 @@ export default class PreferencesUserSettingsTab extends React.Component { + beforeEach(() => { + mockPlatformPeg(); + }); + + const renderTab = (): RenderResult => { + return render( {}} />); + }; + + describe("send read receipts", () => { + beforeEach(() => { + stubClient(); + jest.spyOn(SettingsStore, "setValue"); + jest.spyOn(window, "matchMedia").mockReturnValue({ matches: false } as MediaQueryList); + }); + + afterEach(() => { + jest.resetAllMocks(); + }); + + const getToggle = () => renderTab().getByRole("switch", { name: "Send read receipts" }); + + const mockIsVersionSupported = (val: boolean) => { + const client = MatrixClientPeg.get(); + jest.spyOn(client, "isVersionSupported").mockImplementation(async (version: string) => { + if (version === "v1.4") return val; + }); + }; + + const mockGetValue = (val: boolean) => { + const copyOfGetValueAt = SettingsStore.getValueAt; + + SettingsStore.getValueAt = (level: SettingLevel, name: string, roomId?: string, isExplicit?: boolean) => { + if (name === "sendReadReceipts") return val; + return copyOfGetValueAt(level, name, roomId, isExplicit); + }; + }; + + const expectSetValueToHaveBeenCalled = ( + name: string, + roomId: string, + level: SettingLevel, + value: boolean, + ) => expect(SettingsStore.setValue).toHaveBeenCalledWith(name, roomId, level, value); + + describe("with server support", () => { + beforeEach(() => { + mockIsVersionSupported(true); + }); + + it("can be enabled", async () => { + mockGetValue(false); + const toggle = getToggle(); + + await waitFor(() => expect(toggle).toHaveAttribute("aria-disabled", "false")); + fireEvent.click(toggle); + expectSetValueToHaveBeenCalled("sendReadReceipts", undefined, SettingLevel.ACCOUNT, true); + }); + + it("can be disabled", async () => { + mockGetValue(true); + const toggle = getToggle(); + + await waitFor(() => expect(toggle).toHaveAttribute("aria-disabled", "false")); + fireEvent.click(toggle); + expectSetValueToHaveBeenCalled("sendReadReceipts", undefined, SettingLevel.ACCOUNT, false); + }); + }); + + describe("without server support", () => { + beforeEach(() => { + mockIsVersionSupported(false); + }); + + it("can be enabled", async () => { + mockGetValue(false); + const toggle = getToggle(); + + await waitFor(() => expect(toggle).toHaveAttribute("aria-disabled", "false")); + fireEvent.click(toggle); + expectSetValueToHaveBeenCalled("sendReadReceipts", undefined, SettingLevel.ACCOUNT, true); + }); + + it("cannot be disabled", async () => { + mockGetValue(true); + const toggle = getToggle(); + + await waitFor(() => expect(toggle).toHaveAttribute("aria-disabled", "true")); + fireEvent.click(toggle); + expect(SettingsStore.setValue).not.toHaveBeenCalled(); + }); + }); + }); +}); diff --git a/test/test-utils/test-utils.ts b/test/test-utils/test-utils.ts index 0647f2604d..2e01f3a4d8 100644 --- a/test/test-utils/test-utils.ts +++ b/test/test-utils/test-utils.ts @@ -160,6 +160,7 @@ export function createTestClient(): MatrixClient { getIdentityAccount: jest.fn().mockResolvedValue({}), getTerms: jest.fn().mockResolvedValueOnce(undefined), doesServerSupportUnstableFeature: jest.fn().mockResolvedValue(undefined), + isVersionSupported: jest.fn().mockResolvedValue(undefined), getPushRules: jest.fn().mockResolvedValue(undefined), getPushers: jest.fn().mockResolvedValue({ pushers: [] }), getThreePids: jest.fn().mockResolvedValue({ threepids: [] }),