From c52084c58af47e65dcdd70d977c5ce6398f9834c Mon Sep 17 00:00:00 2001 From: gnuxie Date: Wed, 20 Oct 2021 11:44:25 +0100 Subject: [PATCH] Stop managing client from utils and require the caller to (tests) Specifically `onReactionTo` was starting and stopping the client argument it was given, which could be problematic if the caller didn't expect that or didn't want it to. --- test/integration/commands/commandUtils.ts | 3 +- .../integration/commands/redactCommandTest.ts | 39 +++++++++++++------ 2 files changed, 28 insertions(+), 14 deletions(-) diff --git a/test/integration/commands/commandUtils.ts b/test/integration/commands/commandUtils.ts index 3af1389..c1839a3 100644 --- a/test/integration/commands/commandUtils.ts +++ b/test/integration/commands/commandUtils.ts @@ -3,6 +3,7 @@ import { MatrixClient } from "matrix-bot-sdk"; /** * Returns a promise that resolves to an event that is reacting to the event produced by targetEventThunk. * @param client A MatrixClient that is already in the targetRoom that can be started to listen for the event produced by targetEventThunk. + * This function assumes that the start() has already been called on the client. * @param targetRoom The room to listen for the reaction in. * @param reactionKey The reaction key to wait for. * @param targetEventThunk A function that produces an event ID when called. This event ID is then used to listen for a reaction. @@ -18,7 +19,6 @@ export async function onReactionTo(client: MatrixClient, targetRoom: string, rea let targetCb; try { client.on('room.event', addEvent) - client.start(); const targetEventId = await targetEventThunk(); for (let event of reactionEvents) { const relates_to = event.content['m.relates_to']; @@ -38,7 +38,6 @@ export async function onReactionTo(client: MatrixClient, targetRoom: string, rea client.on('room.event', targetCb); }); } finally { - client.stop() client.removeListener('room.event', addEvent); if (targetCb) { client.removeListener('room.event', targetCb); diff --git a/test/integration/commands/redactCommandTest.ts b/test/integration/commands/redactCommandTest.ts index 581b37f..c7daaf3 100644 --- a/test/integration/commands/redactCommandTest.ts +++ b/test/integration/commands/redactCommandTest.ts @@ -6,7 +6,7 @@ import { getMessagesByUserIn } from "../../../src/utils"; import { LogService } from "matrix-bot-sdk"; import { onReactionTo } from "./commandUtils"; - describe("Test: The redaction command", async () => { + describe("Test: The redaction command", function () { it('Mjölnir redacts all of the events sent by a spammer when instructed to by giving their id and a room id.', async function() { this.timeout(20000); // Create a few users and a room. @@ -32,9 +32,15 @@ import { onReactionTo } from "./commandUtils"; await Promise.all([...Array(50).keys()].map((i) => moderator.sendMessage(targetRoom, {msgtype: 'm.text.', body: `Irrelevant Message #${i}`}))); await badUser.sendMessage(targetRoom, {msgtype: 'm.text', body: "Very Bad Stuff"}); - await onReactionTo(moderator, config.managementRoom, '✅', async () => { - return await moderator.sendMessage(config.managementRoom, { msgtype: 'm.text', body: `!mjolnir redact ${badUserId} ${targetRoom}` }); - }); + try { + moderator.start(); + await onReactionTo(moderator, config.managementRoom, '✅', async () => { + return await moderator.sendMessage(config.managementRoom, { msgtype: 'm.text', body: `!mjolnir redact ${badUserId} ${targetRoom}` }); + }); + } finally { + moderator.stop(); + } + await getMessagesByUserIn(moderator, badUserId, targetRoom, 1000, function(events) { events.map(e => { if (e.type === 'm.room.member') { @@ -55,7 +61,7 @@ import { onReactionTo } from "./commandUtils"; let moderator = await newTestUser(false, "moderator"); this.moderator = moderator; await moderator.joinRoom(config.managementRoom); - let targetRooms = []; + let targetRooms: string[] = []; for (let i = 0; i < 5; i++) { let targetRoom = await moderator.createRoom({ invite: [await badUser.getUserId(), mjolnirUserId]}); await moderator.setUserPowerLevel(mjolnirUserId, targetRoom, 100); @@ -73,9 +79,14 @@ import { onReactionTo } from "./commandUtils"; await badUser.sendMessage(targetRoom, {msgtype: 'm.text', body: "Very Bad Stuff"}); } - await onReactionTo(moderator, config.managementRoom, '✅', async () => { - return await moderator.sendMessage(config.managementRoom, { msgtype: 'm.text', body: `!mjolnir redact ${badUserId}` }); - }); + try { + moderator.start(); + await onReactionTo(moderator, config.managementRoom, '✅', async () => { + return await moderator.sendMessage(config.managementRoom, { msgtype: 'm.text', body: `!mjolnir redact ${badUserId}` }); + }); + } finally { + moderator.stop(); + } targetRooms.map(async targetRoom => { await getMessagesByUserIn(moderator, badUserId, targetRoom, 1000, function(events) { @@ -93,7 +104,6 @@ import { onReactionTo } from "./commandUtils"; this.timeout(20000); // Create a few users and a room. let badUser = await newTestUser(false, "spammer-needs-redacting"); - let badUserId = await badUser.getUserId(); const mjolnir = config.RUNTIME.client! let mjolnirUserId = await mjolnir.getUserId(); let moderator = await newTestUser(false, "moderator"); @@ -105,9 +115,14 @@ import { onReactionTo } from "./commandUtils"; moderator.sendMessage(config.managementRoom, {msgtype: 'm.text.', body: `!mjolnir rooms add ${targetRoom}`}); let eventToRedact = await badUser.sendMessage(targetRoom, {msgtype: 'm.text', body: "Very Bad Stuff"}); - await onReactionTo(moderator, config.managementRoom, '✅', async () => { - return await moderator.sendMessage(config.managementRoom, {msgtype: 'm.text', body: `!mjolnir redact https://matrix.to/#/${encodeURIComponent(targetRoom)}/${encodeURIComponent(eventToRedact)}`}); - }); + try { + moderator.start(); + await onReactionTo(moderator, config.managementRoom, '✅', async () => { + return await moderator.sendMessage(config.managementRoom, {msgtype: 'm.text', body: `!mjolnir redact https://matrix.to/#/${encodeURIComponent(targetRoom)}/${encodeURIComponent(eventToRedact)}`}); + }); + } finally { + moderator.stop(); + } let redactedEvent = await moderator.getEvent(targetRoom, eventToRedact); assert.equal(Object.keys(redactedEvent.content).length, 0, "This event should have been redacted");