From 2090c9c230aa06d706a9feadf7093c03a6c99bc2 Mon Sep 17 00:00:00 2001 From: MapleLeaf <19603573+itsMapleLeaf@users.noreply.github.com> Date: Thu, 9 Dec 2021 19:20:45 -0600 Subject: [PATCH] add jsx/state test --- integration/text.test.ts | 81 ----------------------------- integration/text.test.tsx | 106 ++++++++++++++++++++++++++++++++++++++ package.json | 8 +-- src/render.ts | 1 + tsconfig.json | 3 ++ 5 files changed, 115 insertions(+), 84 deletions(-) delete mode 100644 integration/text.test.ts create mode 100644 integration/text.test.tsx diff --git a/integration/text.test.ts b/integration/text.test.ts deleted file mode 100644 index c09b723..0000000 --- a/integration/text.test.ts +++ /dev/null @@ -1,81 +0,0 @@ -import test from "ava" -import { Client, TextChannel } from "discord.js" -import { nanoid } from "nanoid" -import { raise } from "../src/helpers/raise.js" -import { createRoot } from "../src/render.js" -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("rendering text", async (t) => { - const root = createRoot(channel) - - const content = nanoid() - await root.render(content) - - { - const messages = await channel.messages.fetch() - t.true(messages.some((m) => m.content === content)) - } - - const newContent = nanoid() - await root.render(newContent) - - { - const messages = await channel.messages.fetch() - t.true(messages.some((m) => m.content === newContent)) - } - - await root.render(false) - - { - const messages = await channel.messages.fetch() - t.false(messages.some((m) => m.content === newContent)) - } -}) - -test("rapid updates", async (t) => { - const root = createRoot(channel) - - const content = nanoid() - const newContent = nanoid() - - void root.render(content) - await root.render(newContent) - - { - const messages = await channel.messages.fetch() - t.true(messages.some((m) => m.content === newContent)) - } - - void root.render(content) - await root.render(false) - - { - const messages = await channel.messages.fetch() - t.false(messages.some((m) => m.content === newContent)) - } -}) diff --git a/integration/text.test.tsx b/integration/text.test.tsx new file mode 100644 index 0000000..b5394e2 --- /dev/null +++ b/integration/text.test.tsx @@ -0,0 +1,106 @@ +import type { ExecutionContext } from "ava" +import test from "ava" +import { Client, TextChannel } from "discord.js" +import { nanoid } from "nanoid" +import React, { useState } from "react" +import { raise } from "../src/helpers/raise.js" +import { createRoot } from "../src/render.js" +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("rendering text", async (t) => { + const root = createRoot(channel) + + 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("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() + + await assertSomeMessageHasContent(t, initialMessage) + + setMessage!(newMessage) + await root.awaitActions() + + await assertSomeMessageHasContent(t, newMessage) + + await root.destroy() +}) + +async function assertSomeMessageHasContent( + t: ExecutionContext, + content: string, +) { + 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))) +} diff --git a/package.json b/package.json index 98f43d0..84a9f5a 100644 --- a/package.json +++ b/package.json @@ -78,7 +78,8 @@ }, "ava": { "extensions": { - "ts": "module" + "ts": "module", + "tsx": "module" }, "nodeArguments": [ "--loader=esbuild-node-loader", @@ -86,7 +87,8 @@ "--no-warnings" ], "files": [ - "{src,integration}/**/*.test.ts" - ] + "{src,integration}/**/*.test.{ts,tsx}" + ], + "serial": true } } diff --git a/src/render.ts b/src/render.ts index 7282f91..cfa6b7a 100644 --- a/src/render.ts +++ b/src/render.ts @@ -18,5 +18,6 @@ export function createRoot(target: ReacordRenderTarget) { reconciler.updateContainer(null, containerId) return container.awaitActions() }, + awaitActions: () => container.awaitActions(), } } diff --git a/tsconfig.json b/tsconfig.json index 5d606ef..4990763 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,4 +1,7 @@ { "extends": "@itsmapleleaf/configs/tsconfig.app", + "compilerOptions": { + "jsx": "react" + }, "exclude": ["dist", "node_modules"] }