From fbf51dab645bb88e5ceaef671af9ab43cdf913c5 Mon Sep 17 00:00:00 2001 From: Cadence Ember Date: Fri, 19 Jan 2024 12:39:41 +1300 Subject: [PATCH] Complete code coverage for mxutils --- d2m/event-dispatcher.js | 27 +++++++++--------- m2d/converters/utils.js | 2 +- m2d/converters/utils.test.js | 53 +++++++++++++++++++++++++++++++++++- 3 files changed, 66 insertions(+), 16 deletions(-) diff --git a/d2m/event-dispatcher.js b/d2m/event-dispatcher.js index 6c872fb..3544064 100644 --- a/d2m/event-dispatcher.js +++ b/d2m/event-dispatcher.js @@ -26,9 +26,11 @@ const updatePins = sync.require("./actions/update-pins") /** @type {import("../matrix/api")}) */ const api = sync.require("../matrix/api") /** @type {import("../discord/utils")} */ -const utils = sync.require("../discord/utils") +const dUtils = sync.require("../discord/utils") /** @type {import("../discord/discord-command-handler")}) */ const discordCommandHandler = sync.require("../discord/discord-command-handler") +/** @type {import("../m2d/converters/utils")} */ +const mxUtils = require("../m2d/converters/utils") /** @type {any} */ // @ts-ignore bad types from semaphore const Semaphore = require("@chriscdn/promise-semaphore") @@ -68,20 +70,17 @@ module.exports = { stackLines = stackLines.slice(0, cloudstormLine - 2) } } - let formattedBody = "\u26a0 Bridged event from Discord not delivered" - + `
Gateway event: ${gatewayMessage.t}` - + `
${e.toString()}` + + const builder = new mxUtils.MatrixStringBuilder() + builder.addLine("\u26a0 Bridged event from Discord not delivered", "\u26a0 Bridged event from Discord not delivered") + builder.addLine(`Gateway event: ${gatewayMessage.t}`) + builder.addLine(e.toString()) if (stackLines) { - formattedBody += `
Error trace` - + `
${stackLines.join("\n")}
` + builder.addLine(`Error trace:\n${stackLines.join("\n")}`, `
Error trace
${stackLines.join("\n")}
`) } - formattedBody += `
Original payload` - + `
${util.inspect(gatewayMessage.d, false, 4, false)}
`, + builder.addLine("", `
Original payload
${util.inspect(gatewayMessage.d, false, 4, false)}
`) api.sendEvent(roomID, "m.room.message", { - msgtype: "m.text", - body: "\u26a0 Bridged event from Discord not delivered. See formatted content for full details.", - format: "org.matrix.custom.html", - formatted_body: formattedBody, + ...builder.get(), "moe.cadence.ooye.error": { source: "discord", payload: gatewayMessage @@ -113,7 +112,7 @@ module.exports = { const member = guild.members.find(m => m.user?.id === client.user.id) if (!member) return if (!("permission_overwrites" in channel)) continue - const permissions = utils.getPermissions(member.roles, guild.roles, client.user.id, channel.permission_overwrites) + const permissions = dUtils.getPermissions(member.roles, guild.roles, client.user.id, channel.permission_overwrites) const wants = BigInt(1 << 10) | BigInt(1 << 16) // VIEW_CHANNEL + READ_MESSAGE_HISTORY if ((permissions & wants) !== wants) continue // We don't have permission to look back in this channel @@ -162,7 +161,7 @@ module.exports = { const lastPin = updatePins.convertTimestamp(channel.last_pin_timestamp) // Permissions check - const permissions = utils.getPermissions(member.roles, guild.roles, client.user.id, channel.permission_overwrites) + const permissions = dUtils.getPermissions(member.roles, guild.roles, client.user.id, channel.permission_overwrites) const wants = BigInt(1 << 10) | BigInt(1 << 16) // VIEW_CHANNEL + READ_MESSAGE_HISTORY if ((permissions & wants) !== wants) continue // We don't have permission to look up the pins in this channel diff --git a/m2d/converters/utils.js b/m2d/converters/utils.js index b820864..8a83a07 100644 --- a/m2d/converters/utils.js +++ b/m2d/converters/utils.js @@ -72,7 +72,7 @@ class MatrixStringBuilder { /** * @param {string} body - * @param {string} formattedBody + * @param {string} [formattedBody] * @param {any} [condition] */ add(body, formattedBody, condition = true) { diff --git a/m2d/converters/utils.test.js b/m2d/converters/utils.test.js index 9d039fe..76fd824 100644 --- a/m2d/converters/utils.test.js +++ b/m2d/converters/utils.test.js @@ -1,7 +1,10 @@ // @ts-check +const e = new Error("Custom error") + const {test} = require("supertape") -const {eventSenderIsFromDiscord, getEventIDHash} = require("./utils") +const {eventSenderIsFromDiscord, getEventIDHash, MatrixStringBuilder} = require("./utils") +const util = require("util") test("sender type: matrix user", t => { t.notOk(eventSenderIsFromDiscord("@cadence:cadence.moe")) @@ -23,3 +26,51 @@ test("event hash: hash is the same each time", t => { test("event hash: hash is different for different inputs", t => { t.notEqual(getEventIDHash("$Ij3qo7NxMA4VPexlAiIx2CB9JbsiGhJeyt-2OvkAUe1"), getEventIDHash("$Ij3qo7NxMA4VPexlAiIx2CB9JbsiGhJeyt-2OvkAUe2")) }) + +test("MatrixStringBuilder: add, addLine, add same text", t => { + const gatewayMessage = {t: "MY_MESSAGE", d: {display: "Custom message data"}} + let stackLines = e.stack?.split("\n") + + const builder = new MatrixStringBuilder() + builder.addLine("\u26a0 Bridged event from Discord not delivered", "\u26a0 Bridged event from Discord not delivered") + builder.addLine(`Gateway event: ${gatewayMessage.t}`) + builder.addLine(e.toString()) + if (stackLines) { + stackLines = stackLines.slice(0, 2) + stackLines[1] = stackLines[1].replace(/\\/g, "/").replace(/(\s*at ).*(\/m2d\/)/, "$1.$2") + builder.addLine(`Error trace:`, `
Error trace`) + builder.add(`\n${stackLines.join("\n")}`, `
${stackLines.join("\n")}
`) + } + builder.addLine("", `
Original payload
${util.inspect(gatewayMessage.d, false, 4, false)}
`) + + t.deepEqual(builder.get(), { + msgtype: "m.text", + body: "\u26a0 Bridged event from Discord not delivered" + + "\nGateway event: MY_MESSAGE" + + "\nError: Custom error" + + "\nError trace:" + + "\nError: Custom error" + + "\n at ./m2d/converters/utils.test.js:3:11)\n", + format: "org.matrix.custom.html", + formatted_body: "\u26a0 Bridged event from Discord not delivered" + + "
Gateway event: MY_MESSAGE" + + "
Error: Custom error" + + "
Error trace
Error: Custom error\n    at ./m2d/converters/utils.test.js:3:11)
" + + `
Original payload
{ display: 'Custom message data' }
` + }) +}) + +test("MatrixStringBuilder: complete code coverage", t => { + const builder = new MatrixStringBuilder() + builder.add("Line 1") + builder.addParagraph("Line 2") + builder.add("Line 3") + builder.addParagraph("Line 4") + + t.deepEqual(builder.get(), { + msgtype: "m.text", + body: "Line 1\n\nLine 2Line 3\n\nLine 4", + format: "org.matrix.custom.html", + formatted_body: "Line 1

Line 2

Line 3

Line 4

" + }) +})