mirror of https://github.com/vector-im/riot-web
				
				
				
			Always allow enabling sending read receipts (#9367)
Co-authored-by: Michael Telatynski <7t3chguy@gmail.com>pull/28788/head^2
							parent
							
								
									13458250bc
								
							
						
					
					
						commit
						6b1ee13c28
					
				| 
						 | 
				
			
			@ -214,7 +214,10 @@ export default class PreferencesUserSettingsTab extends React.Component<IProps,
 | 
			
		|||
                        { _t("Share your activity and status with others.") }
 | 
			
		||||
                    </span>
 | 
			
		||||
                    <SettingsFlag
 | 
			
		||||
                        disabled={!this.state.disablingReadReceiptsSupported}
 | 
			
		||||
                        disabled={
 | 
			
		||||
                            !this.state.disablingReadReceiptsSupported
 | 
			
		||||
                            && SettingsStore.getValue("sendReadReceipts") // Make sure the feature can always be enabled
 | 
			
		||||
                        }
 | 
			
		||||
                        disabledDescription={_t("Your server doesn't support disabling sending read receipts.")}
 | 
			
		||||
                        name="sendReadReceipts"
 | 
			
		||||
                        level={SettingLevel.ACCOUNT}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -0,0 +1,121 @@
 | 
			
		|||
/*
 | 
			
		||||
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 "@testing-library/jest-dom";
 | 
			
		||||
 | 
			
		||||
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";
 | 
			
		||||
 | 
			
		||||
describe("PreferencesUserSettingsTab", () => {
 | 
			
		||||
    beforeEach(() => {
 | 
			
		||||
        mockPlatformPeg();
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    const renderTab = (): RenderResult => {
 | 
			
		||||
        return render(<PreferencesUserSettingsTab closeSettingsFn={() => {}} />);
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    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();
 | 
			
		||||
            });
 | 
			
		||||
        });
 | 
			
		||||
    });
 | 
			
		||||
});
 | 
			
		||||
| 
						 | 
				
			
			@ -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: [] }),
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue