import type { ExecutionContext } from "ava" import test from "ava" import type { Message } from "discord.js" import { Client, TextChannel } from "discord.js" import { createRoot, Text } from "reacord" import { pick } from "reacord-helpers/pick.js" import { raise } from "reacord-helpers/raise.js" import React from "react" import { testBotToken, testChannelId } from "./test-environment.js" const client = new Client({ intents: ["GUILDS"], }) let channel: TextChannel test.before(async () => { await client.login(testBotToken) const result = client.channels.cache.get(testChannelId) ?? (await client.channels.fetch(testChannelId)) ?? raise("Channel not found") if (!(result instanceof TextChannel)) { throw new TypeError("Channel must be a text channel") } channel = result }) test.after(() => { client.destroy() }) test.beforeEach(async () => { const messages = await channel.messages.fetch() await Promise.all(messages.map((message) => message.delete())) }) test("rendering", async (t) => { const root = createRoot(channel) await root.render("hi world") await assertMessages(t, [{ content: "hi world" }]) await root.render( <> {"hi world"} {"hi moon"} , ) await assertMessages(t, [{ content: "hi world hi moon" }]) await root.render(hi world) await assertMessages(t, [{ content: "hi world" }]) await root.render() await assertMessages(t, []) await root.render([]) await assertMessages(t, []) }) type MessageData = ReturnType function extractMessageData(message: Message) { return pick(message, "content", "embeds", "components") } async function assertMessages( t: ExecutionContext, expected: Array>, ) { const messages = await channel.messages.fetch() const messageDataFallback: MessageData = { content: "", embeds: [], components: [], } t.deepEqual( messages.map((message) => extractMessageData(message)), expected.map((data) => ({ ...messageDataFallback, ...data })), ) }