From 0d367a7c7e2f8a52826ef0d2ba2c2f11af7559d3 Mon Sep 17 00:00:00 2001 From: Kerry Date: Wed, 27 Sep 2023 13:03:38 +1300 Subject: [PATCH] Fix: sync intentional mentions push rules with legacy rules (#11667) * fix monitorSyncedPushRules when primary rule is disabled * sync intentional mentions rules * remove debug log --- .../VectorPushRulesDefinitions.ts | 2 + src/utils/pushRules/monitorSyncedPushRules.ts | 6 +- .../structures/LoggedInView-test.tsx | 62 ++++++++++++++++++- 3 files changed, 67 insertions(+), 3 deletions(-) diff --git a/src/notifications/VectorPushRulesDefinitions.ts b/src/notifications/VectorPushRulesDefinitions.ts index fb81ac799ee..5eb4d6030cf 100644 --- a/src/notifications/VectorPushRulesDefinitions.ts +++ b/src/notifications/VectorPushRulesDefinitions.ts @@ -111,6 +111,7 @@ export const VectorPushRulesDefinitions: Record definition.ruleToVectorState(syncedRule) !== primaryRuleVectorState, + (syncedRule) => + syncedRule.enabled !== primaryRule.enabled || + definition.ruleToVectorState(syncedRule) !== primaryRuleVectorState, ); if (outOfSyncRules.length) { @@ -71,7 +73,7 @@ const monitorSyncedRule = async ( matrixClient, // eslint-disable-next-line camelcase, @typescript-eslint/naming-convention outOfSyncRules.map(({ rule_id }) => rule_id), - primaryRule.actions, + primaryRule.enabled ? primaryRule.actions : undefined, ); } }; diff --git a/test/components/structures/LoggedInView-test.tsx b/test/components/structures/LoggedInView-test.tsx index 36598c9c986..a8cf7ffb344 100644 --- a/test/components/structures/LoggedInView-test.tsx +++ b/test/components/structures/LoggedInView-test.tsx @@ -16,7 +16,7 @@ limitations under the License. import React from "react"; import { render, RenderResult } from "@testing-library/react"; -import { ConditionKind, EventType, IPushRule, MatrixEvent, ClientEvent } from "matrix-js-sdk/src/matrix"; +import { ConditionKind, EventType, IPushRule, MatrixEvent, ClientEvent, PushRuleKind } from "matrix-js-sdk/src/matrix"; import { MediaHandler } from "matrix-js-sdk/src/webrtc/mediaHandler"; import { logger } from "matrix-js-sdk/src/logger"; @@ -81,6 +81,11 @@ describe("", () => { enabled: true, } as IPushRule; + const oneToOneRuleDisabled = { + ...oneToOneRule, + enabled: false, + }; + const groupRule = { conditions: [{ kind: ConditionKind.EventMatch, key: "type", pattern: "m.room.message" }], actions: StandardActions.ACTION_NOTIFY, @@ -221,6 +226,36 @@ describe("", () => { ); }); + it("updates all mismatched rules from synced rules when primary rule is disabled", async () => { + setPushRules([ + // poll 1-1 rules are synced with oneToOneRule + oneToOneRuleDisabled, // off + pollStartOneToOne, // on + pollEndOneToOne, // loud + // poll group rules are synced with groupRule + groupRule, // on + pollStartGroup, // loud + ]); + + getComponent(); + + await flushPromises(); + + // set to match primary rule + expect(mockClient.setPushRuleEnabled).toHaveBeenCalledWith( + "global", + PushRuleKind.Underride, + pollStartOneToOne.rule_id, + false, + ); + expect(mockClient.setPushRuleEnabled).toHaveBeenCalledWith( + "global", + PushRuleKind.Underride, + pollEndOneToOne.rule_id, + false, + ); + }); + it("catches and logs errors while updating a rule", async () => { mockClient.setPushRuleActions.mockRejectedValueOnce("oups").mockResolvedValueOnce({}); @@ -302,6 +337,31 @@ describe("", () => { ); }); + it("updates all mismatched rules from synced rules on a change to push rules account data when primary rule is disabled", async () => { + // setup a push rule state with mismatched rules + setPushRules([ + // poll 1-1 rules are synced with oneToOneRule + oneToOneRuleDisabled, // off + pollEndOneToOne, // loud + ]); + + getComponent(); + + await flushPromises(); + + mockClient.setPushRuleEnabled.mockClear(); + + mockClient.emit(ClientEvent.AccountData, pushRulesEvent); + + // set to match primary rule + expect(mockClient.setPushRuleEnabled).toHaveBeenCalledWith( + "global", + "underride", + pollEndOneToOne.rule_id, + false, + ); + }); + it("stops listening to account data events on unmount", () => { // setup a push rule state with mismatched rules setPushRules([