Improve code coverage
This commit is contained in:
parent
0b40a50254
commit
0e56255f82
8 changed files with 118 additions and 10 deletions
|
@ -134,7 +134,7 @@ function hashProfileContent(content) {
|
||||||
* 1. Join the sim to the room if needed
|
* 1. Join the sim to the room if needed
|
||||||
* 2. Make an object of what the new room member state content would be, including uploading the profile picture if it hasn't been done before
|
* 2. Make an object of what the new room member state content would be, including uploading the profile picture if it hasn't been done before
|
||||||
* 3. Compare against the previously known state content, which is helpfully stored in the database
|
* 3. Compare against the previously known state content, which is helpfully stored in the database
|
||||||
* 4. If the state content has changes, send it to Matrix and update it in the database for next time
|
* 4. If the state content has changed, send it to Matrix and update it in the database for next time
|
||||||
* @param {import("discord-api-types/v10").APIUser} user
|
* @param {import("discord-api-types/v10").APIUser} user
|
||||||
* @param {Omit<import("discord-api-types/v10").APIGuildMember, "user">} member
|
* @param {Omit<import("discord-api-types/v10").APIGuildMember, "user">} member
|
||||||
* @returns {Promise<string>} mxid of the updated sim
|
* @returns {Promise<string>} mxid of the updated sim
|
||||||
|
|
|
@ -97,6 +97,22 @@ test("edit2changes: remove caption from image", async t => {
|
||||||
t.equal(promoteNextEvent, false)
|
t.equal(promoteNextEvent, false)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
test("edit2changes: change file type", async t => {
|
||||||
|
const {eventsToRedact, eventsToReplace, eventsToSend, promoteEvent, promoteNextEvent} = await editToChanges(data.message_update.changed_file_type, data.guild.general, {})
|
||||||
|
t.deepEqual(eventsToRedact, ["$51f4yqHinwnSbPEQ9dCgoyy4qiIJSX0QYYVUnvwyTCJ"])
|
||||||
|
t.deepEqual(eventsToSend, [{
|
||||||
|
$type: "m.room.message",
|
||||||
|
body: "📝 Uploaded file: https://cdn.discordapp.com/attachments/112760669178241024/1141501302497615912/gaze_into_my_dark_mind.txt (20 MB)",
|
||||||
|
format: "org.matrix.custom.html",
|
||||||
|
formatted_body: "📝 Uploaded file: <a href=\"https://cdn.discordapp.com/attachments/112760669178241024/1141501302497615912/gaze_into_my_dark_mind.txt\">gaze_into_my_dark_mind.txt</a> (20 MB)",
|
||||||
|
"m.mentions": {},
|
||||||
|
msgtype: "m.text"
|
||||||
|
}])
|
||||||
|
t.deepEqual(eventsToReplace, [])
|
||||||
|
t.equal(promoteEvent, null)
|
||||||
|
t.equal(promoteNextEvent, true)
|
||||||
|
})
|
||||||
|
|
||||||
test("edit2changes: add caption back to that image", async t => {
|
test("edit2changes: add caption back to that image", async t => {
|
||||||
const {eventsToRedact, eventsToReplace, eventsToSend, promoteEvent, promoteNextEvent} = await editToChanges(data.message_update.added_caption_to_image, data.guild.general, {})
|
const {eventsToRedact, eventsToReplace, eventsToSend, promoteEvent, promoteNextEvent} = await editToChanges(data.message_update.added_caption_to_image, data.guild.general, {})
|
||||||
t.deepEqual(eventsToRedact, [])
|
t.deepEqual(eventsToRedact, [])
|
||||||
|
@ -136,7 +152,6 @@ test("edit2changes: stickers and attachments are not changed, only the content c
|
||||||
}])
|
}])
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
test("edit2changes: edit of reply to skull webp attachment with content", async t => {
|
test("edit2changes: edit of reply to skull webp attachment with content", async t => {
|
||||||
const {eventsToRedact, eventsToReplace, eventsToSend} = await editToChanges(data.message_update.edit_of_reply_to_skull_webp_attachment_with_content, data.guild.general, {})
|
const {eventsToRedact, eventsToReplace, eventsToSend} = await editToChanges(data.message_update.edit_of_reply_to_skull_webp_attachment_with_content, data.guild.general, {})
|
||||||
t.deepEqual(eventsToRedact, [])
|
t.deepEqual(eventsToRedact, [])
|
||||||
|
|
|
@ -40,6 +40,7 @@ async function compositeMatrixEmojis(mxcs) {
|
||||||
.resize(SIZE, SIZE, {fit: "contain", background: {r: 0, g: 0, b: 0, alpha: 0}})
|
.resize(SIZE, SIZE, {fit: "contain", background: {r: 0, g: 0, b: 0, alpha: 0}})
|
||||||
.png({compressionLevel: 0})
|
.png({compressionLevel: 0})
|
||||||
.toBuffer((err, buffer, info) => {
|
.toBuffer((err, buffer, info) => {
|
||||||
|
/* c8 ignore next */
|
||||||
if (err) return reject(err)
|
if (err) return reject(err)
|
||||||
resolve({info, buffer})
|
resolve({info, buffer})
|
||||||
})
|
})
|
||||||
|
@ -73,6 +74,7 @@ async function compositeMatrixEmojis(mxcs) {
|
||||||
}
|
}
|
||||||
}))
|
}))
|
||||||
|
|
||||||
|
// Calculate the size of the final composited image
|
||||||
const totalWidth = Math.min(buffers.length, IMAGES_ACROSS) * SIZE
|
const totalWidth = Math.min(buffers.length, IMAGES_ACROSS) * SIZE
|
||||||
const imagesDown = Math.ceil(buffers.length / IMAGES_ACROSS)
|
const imagesDown = Math.ceil(buffers.length / IMAGES_ACROSS)
|
||||||
const totalHeight = imagesDown * SIZE
|
const totalHeight = imagesDown * SIZE
|
||||||
|
@ -80,8 +82,15 @@ async function compositeMatrixEmojis(mxcs) {
|
||||||
let left = 0, top = 0
|
let left = 0, top = 0
|
||||||
for (const buffer of buffers) {
|
for (const buffer of buffers) {
|
||||||
if (Buffer.isBuffer(buffer)) {
|
if (Buffer.isBuffer(buffer)) {
|
||||||
|
// Composite the current buffer into the sprite sheet
|
||||||
comp.push({left, top, input: buffer})
|
comp.push({left, top, input: buffer})
|
||||||
;(left += SIZE) + SIZE > RESULT_WIDTH && (left = 0, top += SIZE)
|
// The next buffer should be placed one slot to the right
|
||||||
|
left += SIZE
|
||||||
|
// If we're out of space to fit the entire next buffer there, wrap to the next line
|
||||||
|
if (left + SIZE > RESULT_WIDTH) {
|
||||||
|
left = 0
|
||||||
|
top += SIZE
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -125,7 +125,7 @@ turndownService.addRule("emoji", {
|
||||||
// Also guess a suitable emoji based on the ID (if available) or name
|
// Also guess a suitable emoji based on the ID (if available) or name
|
||||||
let guess = null
|
let guess = null
|
||||||
const guessedName = node.getAttribute("title").replace(/^:|:$/g, "")
|
const guessedName = node.getAttribute("title").replace(/^:|:$/g, "")
|
||||||
for (const guild of discord?.guilds.values() || []) {
|
for (const guild of discord.guilds.values()) {
|
||||||
/** @type {{name: string, id: string, animated: number}[]} */
|
/** @type {{name: string, id: string, animated: number}[]} */
|
||||||
// @ts-ignore
|
// @ts-ignore
|
||||||
const emojis = guild.emojis
|
const emojis = guild.emojis
|
||||||
|
|
|
@ -1,9 +1,11 @@
|
||||||
|
const assert = require("assert").strict
|
||||||
const {test} = require("supertape")
|
const {test} = require("supertape")
|
||||||
const {eventToMessage} = require("./event-to-message")
|
const {eventToMessage} = require("./event-to-message")
|
||||||
const data = require("../../test/data")
|
const data = require("../../test/data")
|
||||||
const {MatrixServerError} = require("../../matrix/mreq")
|
const {MatrixServerError} = require("../../matrix/mreq")
|
||||||
const {db, select} = require("../../passthrough")
|
const {db, select} = require("../../passthrough")
|
||||||
|
|
||||||
|
/* c8 ignore next 7 */
|
||||||
function slow() {
|
function slow() {
|
||||||
if (process.argv.includes("--slow")) {
|
if (process.argv.includes("--slow")) {
|
||||||
return test
|
return test
|
||||||
|
@ -843,6 +845,7 @@ test("event2message: editing a rich reply to a sim user", async t => {
|
||||||
}, data.guild.general, {
|
}, data.guild.general, {
|
||||||
api: {
|
api: {
|
||||||
getEvent: (roomID, eventID) => {
|
getEvent: (roomID, eventID) => {
|
||||||
|
assert.ok(eventID === "$Fxy8SMoJuTduwReVkHZ1uHif9EuvNx36Hg79cltiA04" || eventID === "$v_Gtr-bzv9IVlSLBO5DstzwmiDd-GSFaNfHX66IupV8")
|
||||||
if (eventID === "$Fxy8SMoJuTduwReVkHZ1uHif9EuvNx36Hg79cltiA04") {
|
if (eventID === "$Fxy8SMoJuTduwReVkHZ1uHif9EuvNx36Hg79cltiA04") {
|
||||||
eventsFetched.push("past")
|
eventsFetched.push("past")
|
||||||
return mockGetEvent(t, "!fGgIymcYWOqjbSRUdV:cadence.moe", "$Fxy8SMoJuTduwReVkHZ1uHif9EuvNx36Hg79cltiA04", {
|
return mockGetEvent(t, "!fGgIymcYWOqjbSRUdV:cadence.moe", "$Fxy8SMoJuTduwReVkHZ1uHif9EuvNx36Hg79cltiA04", {
|
||||||
|
@ -870,8 +873,6 @@ test("event2message: editing a rich reply to a sim user", async t => {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
})(roomID, eventID)
|
})(roomID, eventID)
|
||||||
} else {
|
|
||||||
throw new Error(`This test wasn't meant to fetch event ID: ${eventID}`)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1920,9 +1921,9 @@ slow()("event2message: all unknown chess emojis are reuploaded as a sprite sheet
|
||||||
sender: "@cadence:cadence.moe",
|
sender: "@cadence:cadence.moe",
|
||||||
content: {
|
content: {
|
||||||
msgtype: "m.text",
|
msgtype: "m.text",
|
||||||
body: "testing :chess_good_move::chess_incorrect::chess_blund::chess_brilliant_move::chess_blundest::chess_draw_black:",
|
body: "testing :chess_good_move::chess_incorrect::chess_blund::chess_brilliant_move::chess_blundest::chess_draw_black::chess_good_move::chess_incorrect::chess_blund::chess_brilliant_move::chess_blundest::chess_draw_black:",
|
||||||
format: "org.matrix.custom.html",
|
format: "org.matrix.custom.html",
|
||||||
formatted_body: "testing <img data-mx-emoticon height=\"32\" src=\"mxc://cadence.moe/lHfmJpzgoNyNtYHdAmBHxXix\" title=\":chess_good_move:\" alt=\":chess_good_move:\"><img data-mx-emoticon height=\"32\" src=\"mxc://cadence.moe/MtRdXixoKjKKOyHJGWLsWLNU\" title=\":chess_incorrect:\" alt=\":chess_incorrect:\"><img data-mx-emoticon height=\"32\" src=\"mxc://cadence.moe/HXfFuougamkURPPMflTJRxGc\" title=\":chess_blund:\" alt=\":chess_blund:\"><img data-mx-emoticon height=\"32\" src=\"mxc://cadence.moe/ikYKbkhGhMERAuPPbsnQzZiX\" title=\":chess_brilliant_move:\" alt=\":chess_brilliant_move:\"><img data-mx-emoticon height=\"32\" src=\"mxc://cadence.moe/AYPpqXzVJvZdzMQJGjioIQBZ\" title=\":chess_blundest:\" alt=\":chess_blundest:\"><img data-mx-emoticon height=\"32\" src=\"mxc://cadence.moe/UVuzvpVUhqjiueMxYXJiFEAj\" title=\":chess_draw_black:\" alt=\":chess_draw_black:\">"
|
formatted_body: "testing <img data-mx-emoticon height=\"32\" src=\"mxc://cadence.moe/lHfmJpzgoNyNtYHdAmBHxXix\" title=\":chess_good_move:\" alt=\":chess_good_move:\"><img data-mx-emoticon height=\"32\" src=\"mxc://cadence.moe/MtRdXixoKjKKOyHJGWLsWLNU\" title=\":chess_incorrect:\" alt=\":chess_incorrect:\"><img data-mx-emoticon height=\"32\" src=\"mxc://cadence.moe/HXfFuougamkURPPMflTJRxGc\" title=\":chess_blund:\" alt=\":chess_blund:\"><img data-mx-emoticon height=\"32\" src=\"mxc://cadence.moe/ikYKbkhGhMERAuPPbsnQzZiX\" title=\":chess_brilliant_move:\" alt=\":chess_brilliant_move:\"><img data-mx-emoticon height=\"32\" src=\"mxc://cadence.moe/AYPpqXzVJvZdzMQJGjioIQBZ\" title=\":chess_blundest:\" alt=\":chess_blundest:\"><img data-mx-emoticon height=\"32\" src=\"mxc://cadence.moe/UVuzvpVUhqjiueMxYXJiFEAj\" title=\":chess_draw_black:\" alt=\":chess_draw_black:\"><img data-mx-emoticon height=\"32\" src=\"mxc://cadence.moe/lHfmJpzgoNyNtYHdAmBHxXix\" title=\":chess_good_move:\" alt=\":chess_good_move:\"><img data-mx-emoticon height=\"32\" src=\"mxc://cadence.moe/MtRdXixoKjKKOyHJGWLsWLNU\" title=\":chess_incorrect:\" alt=\":chess_incorrect:\"><img data-mx-emoticon height=\"32\" src=\"mxc://cadence.moe/HXfFuougamkURPPMflTJRxGc\" title=\":chess_blund:\" alt=\":chess_blund:\"><img data-mx-emoticon height=\"32\" src=\"mxc://cadence.moe/ikYKbkhGhMERAuPPbsnQzZiX\" title=\":chess_brilliant_move:\" alt=\":chess_brilliant_move:\"><img data-mx-emoticon height=\"32\" src=\"mxc://cadence.moe/AYPpqXzVJvZdzMQJGjioIQBZ\" title=\":chess_blundest:\" alt=\":chess_blundest:\"><img data-mx-emoticon height=\"32\" src=\"mxc://cadence.moe/UVuzvpVUhqjiueMxYXJiFEAj\" title=\":chess_draw_black:\" alt=\":chess_draw_black:\">"
|
||||||
},
|
},
|
||||||
event_id: "$Me6iE8C8CZyrDEOYYrXKSYRuuh_25Jj9kZaNrf7LKr4",
|
event_id: "$Me6iE8C8CZyrDEOYYrXKSYRuuh_25Jj9kZaNrf7LKr4",
|
||||||
room_id: "!maggESguZBqGBZtSnr:cadence.moe"
|
room_id: "!maggESguZBqGBZtSnr:cadence.moe"
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
// @ts-check
|
// @ts-check
|
||||||
|
|
||||||
const {test} = require("supertape")
|
const {test} = require("supertape")
|
||||||
const {eventSenderIsFromDiscord} = require("./utils")
|
const {eventSenderIsFromDiscord, getEventIDHash} = require("./utils")
|
||||||
|
|
||||||
test("sender type: matrix user", t => {
|
test("sender type: matrix user", t => {
|
||||||
t.notOk(eventSenderIsFromDiscord("@cadence:cadence.moe"))
|
t.notOk(eventSenderIsFromDiscord("@cadence:cadence.moe"))
|
||||||
|
@ -14,3 +14,12 @@ test("sender type: ooye bot", t => {
|
||||||
test("sender type: ooye puppet", t => {
|
test("sender type: ooye puppet", t => {
|
||||||
t.ok(eventSenderIsFromDiscord("@_ooye_sheep:cadence.moe"))
|
t.ok(eventSenderIsFromDiscord("@_ooye_sheep:cadence.moe"))
|
||||||
})
|
})
|
||||||
|
|
||||||
|
test("event hash: hash is the same each time", t => {
|
||||||
|
const eventID = "$example"
|
||||||
|
t.equal(getEventIDHash(eventID), getEventIDHash(eventID))
|
||||||
|
})
|
||||||
|
|
||||||
|
test("event hash: hash is different for different inputs", t => {
|
||||||
|
t.notEqual(getEventIDHash("$Ij3qo7NxMA4VPexlAiIx2CB9JbsiGhJeyt-2OvkAUe1"), getEventIDHash("$Ij3qo7NxMA4VPexlAiIx2CB9JbsiGhJeyt-2OvkAUe2"))
|
||||||
|
})
|
||||||
|
|
|
@ -48,6 +48,6 @@
|
||||||
"addbot": "node addbot.js",
|
"addbot": "node addbot.js",
|
||||||
"test": "cross-env FORCE_COLOR=true supertape --no-check-assertions-count --format tap test/test.js | tap-dot",
|
"test": "cross-env FORCE_COLOR=true supertape --no-check-assertions-count --format tap test/test.js | tap-dot",
|
||||||
"test-slow": "cross-env FORCE_COLOR=true supertape --no-check-assertions-count --format tap test/test.js -- --slow | tap-dot",
|
"test-slow": "cross-env FORCE_COLOR=true supertape --no-check-assertions-count --format tap test/test.js -- --slow | tap-dot",
|
||||||
"cover": "c8 --skip-full -r html -r text supertape --no-check-assertions-count --format fail test/test.js"
|
"cover": "c8 --skip-full -x db/migrations -x matrix/file.js -x matrix/api.js -x matrix/mreq.js -r html -r text supertape --no-check-assertions-count --format fail test/test.js -- --slow"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
74
test/data.js
74
test/data.js
|
@ -1665,6 +1665,80 @@ module.exports = {
|
||||||
tts: false,
|
tts: false,
|
||||||
type: 0
|
type: 0
|
||||||
},
|
},
|
||||||
|
changed_file_type: {
|
||||||
|
attachments: [
|
||||||
|
{
|
||||||
|
content_type: "text/plain",
|
||||||
|
filename: "gaze_into_my_dark_mind.txt",
|
||||||
|
size: 20102199,
|
||||||
|
url: "https://cdn.discordapp.com/attachments/112760669178241024/1141501302497615912/gaze_into_my_dark_mind.txt",
|
||||||
|
}
|
||||||
|
],
|
||||||
|
author: {
|
||||||
|
avatar: "47db1be7ab77e1d812a4573177af0692",
|
||||||
|
avatar_decoration: null,
|
||||||
|
discriminator: "0",
|
||||||
|
global_name: "wing",
|
||||||
|
id: "112890272819507200",
|
||||||
|
public_flags: 0,
|
||||||
|
username: ".wing."
|
||||||
|
},
|
||||||
|
channel_id: "112760669178241024",
|
||||||
|
components: [],
|
||||||
|
content: "",
|
||||||
|
edited_timestamp: "2023-08-17T00:13:18.620975+00:00",
|
||||||
|
embeds: [],
|
||||||
|
flags: 0,
|
||||||
|
guild_id: "112760669178241024",
|
||||||
|
id: "1141501302736695317",
|
||||||
|
member: {
|
||||||
|
avatar: null,
|
||||||
|
communication_disabled_until: null,
|
||||||
|
deaf: false,
|
||||||
|
flags: 0,
|
||||||
|
joined_at: "2015-11-08T12:25:38.461000+00:00",
|
||||||
|
mute: false,
|
||||||
|
nick: "windfucker",
|
||||||
|
pending: false,
|
||||||
|
premium_since: null,
|
||||||
|
roles: [
|
||||||
|
"204427286542417920",
|
||||||
|
"118924814567211009",
|
||||||
|
"222168467627835392",
|
||||||
|
"265239342648131584",
|
||||||
|
"303273332248412160",
|
||||||
|
"303319030163439616",
|
||||||
|
"305775031223320577",
|
||||||
|
"318243902521868288",
|
||||||
|
"349185088157777920",
|
||||||
|
"378402925128712193",
|
||||||
|
"391076926573510656",
|
||||||
|
"230462991751970827",
|
||||||
|
"392141548932038658",
|
||||||
|
"397533096012152832",
|
||||||
|
"454567553738473472",
|
||||||
|
"482658335536185357",
|
||||||
|
"482860581670486028",
|
||||||
|
"495384759074160642",
|
||||||
|
"638988388740890635",
|
||||||
|
"764071315388629012",
|
||||||
|
"373336013109461013",
|
||||||
|
"872274377150980116",
|
||||||
|
"1034022405275910164",
|
||||||
|
"790724320824655873",
|
||||||
|
"1040735082610167858",
|
||||||
|
"1123730787653660742",
|
||||||
|
"1070177137367208036"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
mention_everyone: false,
|
||||||
|
mention_roles: [],
|
||||||
|
mentions: [],
|
||||||
|
pinned: false,
|
||||||
|
timestamp: "2023-08-16T22:38:38.641000+00:00",
|
||||||
|
tts: false,
|
||||||
|
type: 0
|
||||||
|
},
|
||||||
edited_content_with_sticker_and_attachments: {
|
edited_content_with_sticker_and_attachments: {
|
||||||
id: "1106366167788044450",
|
id: "1106366167788044450",
|
||||||
type: 0,
|
type: 0,
|
||||||
|
|
Loading…
Reference in a new issue