From 150fe7a45aba14978ab7e8ce0893a39017f8e68b Mon Sep 17 00:00:00 2001 From: Zoe Date: Tue, 4 Feb 2020 11:25:19 +0000 Subject: [PATCH] Tests for MKeyVerificationConclusion --- .../messages/MKeyVerificationConclusion.js | 13 ++- .../MKeyVerificationConclusion-test.js | 110 ++++++++++++++++++ 2 files changed, 122 insertions(+), 1 deletion(-) create mode 100644 test/components/views/messages/MKeyVerificationConclusion-test.js diff --git a/src/components/views/messages/MKeyVerificationConclusion.js b/src/components/views/messages/MKeyVerificationConclusion.js index 1aaa79be63..76370ba148 100644 --- a/src/components/views/messages/MKeyVerificationConclusion.js +++ b/src/components/views/messages/MKeyVerificationConclusion.js @@ -32,6 +32,7 @@ export default class MKeyVerificationConclusion extends React.Component { if (request) { request.on("change", this._onRequestChanged); } + MatrixClientPeg.get().on("userTrustStatusChanged", this._onTrustChanged); } componentWillUnmount() { @@ -39,12 +40,22 @@ export default class MKeyVerificationConclusion extends React.Component { if (request) { request.off("change", this._onRequestChanged); } + MatrixClientPeg.removeListener("userTrustStatusChanged", this._onTrustChanged); } _onRequestChanged = () => { this.forceUpdate(); }; + _onTrustChanged = (userId, status) => { + const { mxEvent } = this.props; + const request = mxEvent.verificationRequest; + if (!request || request.otherUserId !== userId) { + return; + } + this.forceUpdate(); + }; + _shouldRender(mxEvent, request) { // normally should not happen if (!request) { @@ -66,7 +77,7 @@ export default class MKeyVerificationConclusion extends React.Component { // User isn't actually verified if (!MatrixClientPeg.get() - .checkUserTrust(mxEvent.verificationRequest.otherUserId) + .checkUserTrust(request.otherUserId) .isCrossSigningVerified()) { return false; } diff --git a/test/components/views/messages/MKeyVerificationConclusion-test.js b/test/components/views/messages/MKeyVerificationConclusion-test.js new file mode 100644 index 0000000000..c666a7aaa5 --- /dev/null +++ b/test/components/views/messages/MKeyVerificationConclusion-test.js @@ -0,0 +1,110 @@ +import React from 'react'; +import TestRenderer from 'react-test-renderer'; +import { EventEmitter } from 'events'; +import * as TestUtils from '../../../test-utils'; + +import { MatrixClientPeg } from '../../../../src/MatrixClientPeg'; +import { MatrixEvent } from 'matrix-js-sdk'; +import MKeyVerificationConclusion from '../../../../src/components/views/messages/MKeyVerificationConclusion'; + +class UserTrustLevel { + constructor(cs) { + this.cs = cs; + } + + isCrossSigningVerified() { + return this.cs; + } +} + +describe("MKeyVerificationConclusion", () => { + beforeEach(() => { + TestUtils.stubClient(); + const client = MatrixClientPeg.get(); + + const userTrust = new UserTrustLevel(true); + client.checkUserTrust = () => userTrust; + + const emitter = new EventEmitter(); + client.on = emitter.on.bind(emitter); + client.removeListener = emitter.removeListener.bind(emitter); + client.emit = emitter.emit.bind(emitter); + }); + + it("shouldn't render if there's no verificationRequest", () => { + const event = new MatrixEvent({}); + const renderer = TestRenderer.create( + , + ); + expect(renderer.toJSON()).toBeNull(); + }); + + it("shouldn't render if the verificationRequest is pending", () => { + const event = new MatrixEvent({}); + event.verificationRequest = new EventEmitter(); + event.verificationRequest.pending = true; + const renderer = TestRenderer.create( + , + ); + expect(renderer.toJSON()).toBeNull(); + }); + + it("shouldn't render if the event type is cancel but the request type isn't", () => { + const event = new MatrixEvent({ type: "m.key.verification.cancel" }); + event.verificationRequest = new EventEmitter(); + event.verificationRequest.cancelled = false; + const renderer = TestRenderer.create( + , + ); + expect(renderer.toJSON()).toBeNull(); + }); + + it("shouldn't render if the event type is done but the request type isn't", () => { + const event = new MatrixEvent({ type: "m.key.verification.done" }); + event.verificationRequest = new EventEmitter(); + event.verificationRequest.done = false; + const renderer = TestRenderer.create( + , + ); + expect(renderer.toJSON()).toBeNull(); + }); + + it("shouldn't render if the user isn't actually trusted", () => { + const client = MatrixClientPeg.get(); + const userTrust = new UserTrustLevel(false); + client.checkUserTrust = () => userTrust; + + const event = new MatrixEvent({ type: "m.key.verification.done" }); + event.verificationRequest = new EventEmitter(); + event.verificationRequest.done = true; + const renderer = TestRenderer.create( + , + ); + expect(renderer.toJSON()).toBeNull(); + }); + + it("should rerender appropriately if user trust status changes", () => { + const client = MatrixClientPeg.get(); + const userTrust = new UserTrustLevel(false); + client.checkUserTrust = () => userTrust; + + const event = new MatrixEvent({ type: "m.key.verification.done" }); + event.verificationRequest = new EventEmitter(); + event.verificationRequest.done = true; + event.verificationRequest.otherUserId = "@someuser:domain"; + const renderer = TestRenderer.create( + , + ); + expect(renderer.toJSON()).toBeNull(); + + client.checkUserTrust = () => new UserTrustLevel(true); + + /* Ensure we don't rerender for every trust status change of any user */ + client.emit("userTrustStatusChanged", "@anotheruser:domain"); + expect(renderer.toJSON()).toBeNull(); + + /* But when our user changes, we do rerender */ + client.emit("userTrustStatusChanged", event.verificationRequest.otherUserId); + expect(renderer.toJSON()).not.toBeNull(); + }); +});