rearchitecting wip
This commit is contained in:
@@ -1,10 +1,11 @@
|
||||
import type { ExecutionContext } from "ava"
|
||||
import test from "ava"
|
||||
import type { Message } from "discord.js"
|
||||
import { Client, TextChannel } from "discord.js"
|
||||
import { nanoid } from "nanoid"
|
||||
import { createRoot, Embed } from "reacord"
|
||||
import { createRoot, Text } from "reacord"
|
||||
import { pick } from "reacord-helpers/pick.js"
|
||||
import { raise } from "reacord-helpers/raise.js"
|
||||
import React, { useState } from "react"
|
||||
import React from "react"
|
||||
import { testBotToken, testChannelId } from "./test-environment.js"
|
||||
|
||||
const client = new Client({
|
||||
@@ -32,88 +33,53 @@ test.after(() => {
|
||||
client.destroy()
|
||||
})
|
||||
|
||||
test.only("test", async (t) => {
|
||||
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(
|
||||
<>
|
||||
<Embed color="BLUE">
|
||||
<Embed color="DARKER_GREY" />
|
||||
</Embed>
|
||||
<Embed color="DARKER_GREY" />
|
||||
{"hi world"} {"hi moon"}
|
||||
</>,
|
||||
)
|
||||
t.pass()
|
||||
await assertMessages(t, [{ content: "hi world hi moon" }])
|
||||
|
||||
await root.render(<Text>hi world</Text>)
|
||||
await assertMessages(t, [{ content: "hi world" }])
|
||||
|
||||
await root.render(<Text></Text>)
|
||||
await assertMessages(t, [])
|
||||
|
||||
await root.render([])
|
||||
await assertMessages(t, [])
|
||||
})
|
||||
|
||||
test("kitchen sink", async (t) => {
|
||||
const root = createRoot(channel)
|
||||
type MessageData = ReturnType<typeof extractMessageData>
|
||||
function extractMessageData(message: Message) {
|
||||
return pick(message, "content", "embeds", "components")
|
||||
}
|
||||
|
||||
const content = nanoid()
|
||||
await root.render(content)
|
||||
|
||||
await assertSomeMessageHasContent(t, content)
|
||||
|
||||
const newContent = nanoid()
|
||||
await root.render(newContent)
|
||||
|
||||
await assertSomeMessageHasContent(t, newContent)
|
||||
|
||||
await root.render(false)
|
||||
|
||||
await assertNoMessageHasContent(t, newContent)
|
||||
})
|
||||
|
||||
test("kitchen sink, rapid updates", async (t) => {
|
||||
const root = createRoot(channel)
|
||||
|
||||
const content = nanoid()
|
||||
const newContent = nanoid()
|
||||
|
||||
void root.render(content)
|
||||
await root.render(newContent)
|
||||
|
||||
await assertSomeMessageHasContent(t, newContent)
|
||||
|
||||
void root.render(content)
|
||||
await root.render(false)
|
||||
|
||||
await assertNoMessageHasContent(t, newContent)
|
||||
})
|
||||
|
||||
test("state", async (t) => {
|
||||
let setMessage: (message: string) => void
|
||||
|
||||
const initialMessage = nanoid()
|
||||
const newMessage = nanoid()
|
||||
|
||||
function Counter() {
|
||||
const [message, setMessage_] = useState(initialMessage)
|
||||
setMessage = setMessage_
|
||||
return `state: ${message}` as any
|
||||
}
|
||||
|
||||
const root = createRoot(channel)
|
||||
await root.render(<Counter />)
|
||||
|
||||
await assertSomeMessageHasContent(t, initialMessage)
|
||||
|
||||
setMessage!(newMessage)
|
||||
await root.completion()
|
||||
|
||||
await assertSomeMessageHasContent(t, newMessage)
|
||||
|
||||
await root.destroy()
|
||||
})
|
||||
|
||||
async function assertSomeMessageHasContent(
|
||||
t: ExecutionContext,
|
||||
content: string,
|
||||
async function assertMessages(
|
||||
t: ExecutionContext<unknown>,
|
||||
expected: Array<Partial<MessageData>>,
|
||||
) {
|
||||
const messages = await channel.messages.fetch()
|
||||
t.true(messages.some((m) => m.content.includes(content)))
|
||||
}
|
||||
|
||||
async function assertNoMessageHasContent(t: ExecutionContext, content: string) {
|
||||
const messages = await channel.messages.fetch()
|
||||
t.true(messages.every((m) => !m.content.includes(content)))
|
||||
const messageDataFallback: MessageData = {
|
||||
content: "",
|
||||
embeds: [],
|
||||
components: [],
|
||||
}
|
||||
|
||||
t.deepEqual(
|
||||
messages.map((message) => extractMessageData(message)),
|
||||
expected.map((data) => ({ ...messageDataFallback, ...data })),
|
||||
)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user