Complete code coverage for mxutils
This commit is contained in:
		
							parent
							
								
									0237e6d8fd
								
							
						
					
					
						commit
						fbf51dab64
					
				
					 3 changed files with 66 additions and 16 deletions
				
			
		| 
						 | 
					@ -26,9 +26,11 @@ const updatePins = sync.require("./actions/update-pins")
 | 
				
			||||||
/** @type {import("../matrix/api")}) */
 | 
					/** @type {import("../matrix/api")}) */
 | 
				
			||||||
const api = sync.require("../matrix/api")
 | 
					const api = sync.require("../matrix/api")
 | 
				
			||||||
/** @type {import("../discord/utils")} */
 | 
					/** @type {import("../discord/utils")} */
 | 
				
			||||||
const utils = sync.require("../discord/utils")
 | 
					const dUtils = sync.require("../discord/utils")
 | 
				
			||||||
/** @type {import("../discord/discord-command-handler")}) */
 | 
					/** @type {import("../discord/discord-command-handler")}) */
 | 
				
			||||||
const discordCommandHandler = sync.require("../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
 | 
					/** @type {any} */ // @ts-ignore bad types from semaphore
 | 
				
			||||||
const Semaphore = require("@chriscdn/promise-semaphore")
 | 
					const Semaphore = require("@chriscdn/promise-semaphore")
 | 
				
			||||||
| 
						 | 
					@ -68,20 +70,17 @@ module.exports = {
 | 
				
			||||||
				stackLines = stackLines.slice(0, cloudstormLine - 2)
 | 
									stackLines = stackLines.slice(0, cloudstormLine - 2)
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		let formattedBody = "\u26a0 <strong>Bridged event from Discord not delivered</strong>"
 | 
					
 | 
				
			||||||
			+ `<br>Gateway event: ${gatewayMessage.t}`
 | 
							const builder = new mxUtils.MatrixStringBuilder()
 | 
				
			||||||
			+ `<br>${e.toString()}`
 | 
							builder.addLine("\u26a0 Bridged event from Discord not delivered", "\u26a0 <strong>Bridged event from Discord not delivered</strong>")
 | 
				
			||||||
 | 
							builder.addLine(`Gateway event: ${gatewayMessage.t}`)
 | 
				
			||||||
 | 
							builder.addLine(e.toString())
 | 
				
			||||||
		if (stackLines) {
 | 
							if (stackLines) {
 | 
				
			||||||
			formattedBody += `<br><details><summary>Error trace</summary>`
 | 
								builder.addLine(`Error trace:\n${stackLines.join("\n")}`, `<details><summary>Error trace</summary><pre>${stackLines.join("\n")}</pre></details>`)
 | 
				
			||||||
				+ `<pre>${stackLines.join("\n")}</pre></details>`
 | 
					 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		formattedBody += `<details><summary>Original payload</summary>`
 | 
							builder.addLine("", `<details><summary>Original payload</summary><pre>${util.inspect(gatewayMessage.d, false, 4, false)}</pre></details>`)
 | 
				
			||||||
			+ `<pre>${util.inspect(gatewayMessage.d, false, 4, false)}</pre></details>`,
 | 
					 | 
				
			||||||
		api.sendEvent(roomID, "m.room.message", {
 | 
							api.sendEvent(roomID, "m.room.message", {
 | 
				
			||||||
			msgtype: "m.text",
 | 
								...builder.get(),
 | 
				
			||||||
			body: "\u26a0 Bridged event from Discord not delivered. See formatted content for full details.",
 | 
					 | 
				
			||||||
			format: "org.matrix.custom.html",
 | 
					 | 
				
			||||||
			formatted_body: formattedBody,
 | 
					 | 
				
			||||||
			"moe.cadence.ooye.error": {
 | 
								"moe.cadence.ooye.error": {
 | 
				
			||||||
				source: "discord",
 | 
									source: "discord",
 | 
				
			||||||
				payload: gatewayMessage
 | 
									payload: gatewayMessage
 | 
				
			||||||
| 
						 | 
					@ -113,7 +112,7 @@ module.exports = {
 | 
				
			||||||
			const member = guild.members.find(m => m.user?.id === client.user.id)
 | 
								const member = guild.members.find(m => m.user?.id === client.user.id)
 | 
				
			||||||
			if (!member) return
 | 
								if (!member) return
 | 
				
			||||||
			if (!("permission_overwrites" in channel)) continue
 | 
								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
 | 
								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
 | 
								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)
 | 
								const lastPin = updatePins.convertTimestamp(channel.last_pin_timestamp)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			// Permissions check
 | 
								// 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
 | 
								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
 | 
								if ((permissions & wants) !== wants) continue // We don't have permission to look up the pins in this channel
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -72,7 +72,7 @@ class MatrixStringBuilder {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/**
 | 
						/**
 | 
				
			||||||
	 * @param {string} body
 | 
						 * @param {string} body
 | 
				
			||||||
	 * @param {string} formattedBody
 | 
						 * @param {string} [formattedBody]
 | 
				
			||||||
	 * @param {any} [condition]
 | 
						 * @param {any} [condition]
 | 
				
			||||||
	 */
 | 
						 */
 | 
				
			||||||
	add(body, formattedBody, condition = true) {
 | 
						add(body, formattedBody, condition = true) {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,7 +1,10 @@
 | 
				
			||||||
// @ts-check
 | 
					// @ts-check
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const e = new Error("Custom error")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const {test} = require("supertape")
 | 
					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 => {
 | 
					test("sender type: matrix user", t => {
 | 
				
			||||||
	t.notOk(eventSenderIsFromDiscord("@cadence:cadence.moe"))
 | 
						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 => {
 | 
					test("event hash: hash is different for different inputs", t => {
 | 
				
			||||||
	t.notEqual(getEventIDHash("$Ij3qo7NxMA4VPexlAiIx2CB9JbsiGhJeyt-2OvkAUe1"), getEventIDHash("$Ij3qo7NxMA4VPexlAiIx2CB9JbsiGhJeyt-2OvkAUe2"))
 | 
						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 <strong>Bridged event from Discord not delivered</strong>")
 | 
				
			||||||
 | 
						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:`, `<details><summary>Error trace</summary>`)
 | 
				
			||||||
 | 
							builder.add(`\n${stackLines.join("\n")}`, `<pre>${stackLines.join("\n")}</pre></details>`)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						builder.addLine("", `<details><summary>Original payload</summary><pre>${util.inspect(gatewayMessage.d, false, 4, false)}</pre></details>`)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						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 <strong>Bridged event from Discord not delivered</strong>"
 | 
				
			||||||
 | 
								+ "<br>Gateway event: MY_MESSAGE"
 | 
				
			||||||
 | 
								+ "<br>Error: Custom error"
 | 
				
			||||||
 | 
								+ "<br><details><summary>Error trace</summary><pre>Error: Custom error\n    at ./m2d/converters/utils.test.js:3:11)</pre></details>"
 | 
				
			||||||
 | 
								+ `<details><summary>Original payload</summary><pre>{ display: 'Custom message data' }</pre></details>`
 | 
				
			||||||
 | 
						})
 | 
				
			||||||
 | 
					})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					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<p>Line 2</p>Line 3<p>Line 4</p>"
 | 
				
			||||||
 | 
						})
 | 
				
			||||||
 | 
					})
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue