const {test} = require("supertape") const {messageToEvent} = require("./message-to-event") const data = require("../../test/data") const Ty = require("../../types") /** * @param {string} roomID * @param {string} eventID * @returns {(roomID: string, eventID: string) => Promise>} */ function mockGetEvent(t, roomID_in, eventID_in, outer) { return async function(roomID, eventID) { t.equal(roomID, roomID_in) t.equal(eventID, eventID_in) return new Promise(resolve => { setTimeout(() => { resolve({ event_id: eventID_in, room_id: roomID_in, origin_server_ts: 1680000000000, unsigned: { age: 2245, transaction_id: "$local.whatever" }, ...outer }) }) }) } } test("message2event embeds: nothing but a field", async t => { const events = await messageToEvent(data.message_with_embeds.nothing_but_a_field, data.guild.general, {}) t.deepEqual(events, [{ $type: "m.room.message", "m.mentions": {}, msgtype: "m.notice", body: "> ### Amanda 🎵#2192 :online:" + "\n> willow tree, branch 0" + "\n> **❯ Uptime:**\n> 3m 55s\n> **❯ Memory:**\n> 64.45MB", format: "org.matrix.custom.html", formatted_body: '

Amanda 🎵#2192 \":online:\"' + '
willow tree, branch 0
' + '
❯ Uptime:
3m 55s' + '
❯ Memory:
64.45MB

' }]) }) test("message2event embeds: reply with just an embed", async t => { const events = await messageToEvent(data.message_with_embeds.reply_with_only_embed, data.guild.general, {}) t.deepEqual(events, [{ $type: "m.room.message", msgtype: "m.notice", "m.mentions": {}, body: "> ## ⏺️ dynastic (@dynastic) https://twitter.com/i/user/719631291747078145" + "\n> \n> ## https://twitter.com/i/status/1707484191963648161" + "\n> \n> does anyone know where to find that one video of the really mysterious yam-like object being held up to a bunch of random objects, like clocks, and they have unexplained impossible reactions to it?" + "\n> \n> ### Retweets" + "\n> 119" + "\n> \n> ### Likes" + "\n> 5581" + "\n> — Twitter", format: "org.matrix.custom.html", formatted_body: '

⏺️ dynastic (@dynastic)

' + '

https://twitter.com/i/status/1707484191963648161' + '

does anyone know where to find that one video of the really mysterious yam-like object being held up to a bunch of random objects, like clocks, and they have unexplained impossible reactions to it?' + '

Retweets
119

Likes
5581

— Twitter
' }]) }) test("message2event embeds: image embed and attachment", async t => { const events = await messageToEvent(data.message_with_embeds.image_embed_and_attachment, data.guild.general, {}, { api: { async getJoinedMembers(roomID) { return {joined: []} } } }) t.deepEqual(events, [{ $type: "m.room.message", msgtype: "m.text", body: "https://tootsuite.net/Warp-Gate2.gif\ntanget: @ monster spawner", format: "org.matrix.custom.html", formatted_body: 'https://tootsuite.net/Warp-Gate2.gif
tanget: @ monster spawner', "m.mentions": {} }, { $type: "m.room.message", msgtype: "m.image", url: "mxc://cadence.moe/zAXdQriaJuLZohDDmacwWWDR", body: "Screenshot_20231001_034036.jpg", external_url: "https://cdn.discordapp.com/attachments/176333891320283136/1157854643037163610/Screenshot_20231001_034036.jpg?ex=651a1faa&is=6518ce2a&hm=eb5ca80a3fa7add8765bf404aea2028a28a2341e4a62435986bcdcf058da82f3&", filename: "Screenshot_20231001_034036.jpg", info: { h: 1170, w: 1080, size: 51981, mimetype: "image/jpeg" }, "m.mentions": {} }]) }) test("message2event embeds: blockquote in embed", async t => { const events = await messageToEvent(data.message_with_embeds.blockquote_in_embed, data.guild.general) t.deepEqual(events, [{ $type: "m.room.message", msgtype: "m.text", body: ":emoji: **4 |** #wonderland", format: "org.matrix.custom.html", formatted_body: `\":emoji:\" 4 | #wonderland`, "m.mentions": {} }, { $type: "m.room.message", msgtype: "m.notice", body: "> ## ⏺️ minimus https://matrix.to/#/!qzDBLKlildpzrrOnFZ:cadence.moe/$dVCLyj6kxb3DaAWDtjcv2kdSny8JMMHdDhCMz8mDxVo\n> \n> reply draft\n> > The following is a message composed via consensus of the Stinker Council.\n> > \n> > For those who are not currently aware of our existence, we represent the organization known as Wonderland. Our previous mission centered around the assortment and study of puzzling objects, entities and other assorted phenomena. This mission was the focus of our organization for more than 28 years.\n> > \n> > Due to circumstances outside of our control, this directive has now changed. Our new mission will be the extermination of the stinker race.\n> > \n> > There will be no further communication.\n> \n> [Go to Message](https://matrix.to/#/!qzDBLKlildpzrrOnFZ:cadence.moe/$dVCLyj6kxb3DaAWDtjcv2kdSny8JMMHdDhCMz8mDxVo)", format: "org.matrix.custom.html", formatted_body: "

⏺️ minimus

reply draft

The following is a message composed via consensus of the Stinker Council.

For those who are not currently aware of our existence, we represent the organization known as Wonderland. Our previous mission centered around the assortment and study of puzzling objects, entities and other assorted phenomena. This mission was the focus of our organization for more than 28 years.

Due to circumstances outside of our control, this directive has now changed. Our new mission will be the extermination of the stinker race.

There will be no further communication.

Go to Message

", "m.mentions": {} }]) }) test("message2event embeds: crazy html is all escaped", async t => { const events = await messageToEvent(data.message_with_embeds.escaping_crazy_html_tags, data.guild.general) t.deepEqual(events, [{ $type: "m.room.message", msgtype: "m.notice", body: "> ## ⏺️ [Hey