From 4b3705d3f0b8c63ad67812bc3c26c6dbe524024f Mon Sep 17 00:00:00 2001
From: Richard van der Hoff <1389908+richvdh@users.noreply.github.com>
Date: Wed, 30 Nov 2022 13:03:47 +0000
Subject: [PATCH] Add a test for verifying without existing DM (#9619)

A regression test for https://github.com/vector-im/element-web/issues/23819.
---
 cypress/e2e/crypto/crypto.spec.ts | 29 +++++++++++++++++++++++++++++
 cypress/support/bot.ts            |  1 +
 cypress/support/login.ts          |  1 +
 3 files changed, 31 insertions(+)

diff --git a/cypress/e2e/crypto/crypto.spec.ts b/cypress/e2e/crypto/crypto.spec.ts
index 650f8d585c3..2cfb7ba1a82 100644
--- a/cypress/e2e/crypto/crypto.spec.ts
+++ b/cypress/e2e/crypto/crypto.spec.ts
@@ -91,6 +91,17 @@ const bobJoin = function(this: CryptoTestContext) {
     cy.contains(".mx_TextualEvent", "Bob joined the room").should("exist");
 };
 
+/** configure the given MatrixClient to auto-accept any invites */
+function autoJoin(client: MatrixClient) {
+    cy.window({ log: false }).then(async win => {
+        client.on(win.matrixcs.RoomMemberEvent.Membership, (event, member) => {
+            if (member.membership === "invite" && member.userId === client.getUserId()) {
+                client.joinRoom(member.roomId);
+            }
+        });
+    });
+}
+
 const handleVerificationRequest = (request: VerificationRequest): Chainable<EmojiMapping[]> => {
     return cy.wrap(new Promise<EmojiMapping[]>((resolve) => {
         const onShowSas = (event: ISasEvent) => {
@@ -174,4 +185,22 @@ describe("Cryptography", function() {
         testMessages.call(this);
         verify.call(this);
     });
+
+    it("should allow verification when there is no existing DM", function(this: CryptoTestContext) {
+        cy.bootstrapCrossSigning();
+        autoJoin(this.bob);
+
+        /* we need to have a room with the other user present, so we can open the verification panel */
+        let roomId: string;
+        cy.createRoom({ name: "TestRoom", invite: [this.bob.getUserId()] }).then(_room1Id => {
+            roomId = _room1Id;
+            cy.log(`Created test room ${roomId}`);
+            cy.visit(`/#/room/${roomId}`);
+            // wait for Bob to join the room, otherwise our attempt to open his user details may race
+            // with his join.
+            cy.contains(".mx_TextualEvent", "Bob joined the room").should("exist");
+        });
+
+        verify.call(this);
+    });
 });
diff --git a/cypress/support/bot.ts b/cypress/support/bot.ts
index 26f0aa497e4..6161b11cdfb 100644
--- a/cypress/support/bot.ts
+++ b/cypress/support/bot.ts
@@ -78,6 +78,7 @@ Cypress.Commands.add("getBot", (synapse: SynapseInstance, opts: CreateBotOpts):
     const username = Cypress._.uniqueId("userId_");
     const password = Cypress._.uniqueId("password_");
     return cy.registerUser(synapse, username, password, opts.displayName).then(credentials => {
+        cy.log(`Registered bot user ${username} with displayname ${opts.displayName}`);
         return cy.window({ log: false }).then(win => {
             const cli = new win.matrixcs.MatrixClient({
                 baseUrl: synapse.baseUrl,
diff --git a/cypress/support/login.ts b/cypress/support/login.ts
index 6c441589415..4e1e50456f5 100644
--- a/cypress/support/login.ts
+++ b/cypress/support/login.ts
@@ -103,6 +103,7 @@ Cypress.Commands.add("initTestUser", (synapse: SynapseInstance, displayName: str
     return cy.registerUser(synapse, username, password, displayName).then(() => {
         return cy.loginUser(synapse, username, password);
     }).then(response => {
+        cy.log(`Registered test user ${username} with displayname ${displayName}`);
         cy.window({ log: false }).then(win => {
             // Seed the localStorage with the required credentials
             win.localStorage.setItem("mx_hs_url", synapse.baseUrl);