124 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			TypeScript
		
	
	
			
		
		
	
	
			124 lines
		
	
	
		
			4.8 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 React from "react";
 | |
| import { fireEvent, render, RenderResult, waitFor } from "@testing-library/react";
 | |
| 
 | |
| import PreferencesUserSettingsTab from "../../../../../../src/components/views/settings/tabs/user/PreferencesUserSettingsTab";
 | |
| import { MatrixClientPeg } from "../../../../../../src/MatrixClientPeg";
 | |
| import { mockPlatformPeg, stubClient } from "../../../../../test-utils";
 | |
| import SettingsStore from "../../../../../../src/settings/SettingsStore";
 | |
| import { SettingLevel } from "../../../../../../src/settings/SettingLevel";
 | |
| import MatrixClientBackedController from "../../../../../../src/settings/controllers/MatrixClientBackedController";
 | |
| 
 | |
| describe("PreferencesUserSettingsTab", () => {
 | |
|     beforeEach(() => {
 | |
|         mockPlatformPeg();
 | |
|     });
 | |
| 
 | |
|     const renderTab = (): RenderResult => {
 | |
|         return render(<PreferencesUserSettingsTab closeSettingsFn={() => {}} />);
 | |
|     };
 | |
| 
 | |
|     describe("send read receipts", () => {
 | |
|         beforeEach(() => {
 | |
|             stubClient();
 | |
|             jest.spyOn(SettingsStore, "setValue");
 | |
|             jest.spyOn(SettingsStore, "canSetValue").mockReturnValue(true);
 | |
|             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, "doesServerSupportUnstableFeature").mockResolvedValue(false);
 | |
|             jest.spyOn(client, "isVersionSupported").mockImplementation(async (version: string) => {
 | |
|                 if (version === "v1.4") return val;
 | |
|                 return false;
 | |
|             });
 | |
|             MatrixClientBackedController.matrixClient = client;
 | |
|         };
 | |
| 
 | |
|         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 | null,
 | |
|             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", null, 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", null, SettingLevel.ACCOUNT, false);
 | |
|             });
 | |
|         });
 | |
| 
 | |
|         describe("without server support", () => {
 | |
|             beforeEach(() => {
 | |
|                 mockIsVersionSupported(false);
 | |
|             });
 | |
| 
 | |
|             it("is forcibly enabled", async () => {
 | |
|                 const toggle = getToggle();
 | |
|                 await waitFor(() => {
 | |
|                     expect(toggle).toHaveAttribute("aria-checked", "true");
 | |
|                     expect(toggle).toHaveAttribute("aria-disabled", "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();
 | |
|             });
 | |
|         });
 | |
|     });
 | |
| });
 |