





























@@ -19,20 +19,61 @@ beforeAll(async () => {
1919({ discordPlugin } = await import("./channel.js"));
2020});
212122+type DiscordMessageAdapter = NonNullable<typeof discordPlugin.message>;
23+type DiscordMessageSender = NonNullable<DiscordMessageAdapter["send"]>;
24+25+function requireDiscordMessageAdapter(): DiscordMessageAdapter {
26+const adapter = discordPlugin.message;
27+if (!adapter) {
28+throw new Error("Expected discord plugin to expose a channel message adapter");
29+}
30+return adapter;
31+}
32+33+function requireTextSender(
34+adapter: DiscordMessageAdapter,
35+): NonNullable<DiscordMessageSender["text"]> {
36+const text = adapter.send?.text;
37+if (!text) {
38+throw new Error("Expected discord message adapter text sender");
39+}
40+return text;
41+}
42+43+function requireMediaSender(
44+adapter: DiscordMessageAdapter,
45+): NonNullable<DiscordMessageSender["media"]> {
46+const media = adapter.send?.media;
47+if (!media) {
48+throw new Error("Expected discord message adapter media sender");
49+}
50+return media;
51+}
52+53+function requirePayloadSender(
54+adapter: DiscordMessageAdapter,
55+): NonNullable<DiscordMessageSender["payload"]> {
56+const payload = adapter.send?.payload;
57+if (!payload) {
58+throw new Error("Expected discord message adapter payload sender");
59+}
60+return payload;
61+}
62+2263describe("discord channel message adapter", () => {
2364beforeEach(() => {
2465resetDiscordOutboundMocks(hoisted);
2566});
26672768it("backs declared durable-final capabilities with outbound send proofs", async () => {
28-const adapter = discordPlugin.message;
29-if (!adapter) {
30- throw new Error("Expected discord plugin to expose a channel message adapter");
31-}
69+const adapter = requireDiscordMessageAdapter();
70+const sendText = requireTextSender(adapter);
71+const sendMedia = requireMediaSender(adapter);
72+const sendPayload = requirePayloadSender(adapter);
32733374const proveText = async () => {
3475resetDiscordOutboundMocks(hoisted);
35-const result = await adapter.send!.text!({
76+const result = await sendText({
3677cfg: {},
3778to: "channel:123456",
3879text: "hello",
@@ -49,7 +90,7 @@ describe("discord channel message adapter", () => {
49905091const proveMedia = async () => {
5192resetDiscordOutboundMocks(hoisted);
52-const result = await adapter.send!.media!({
93+const result = await sendMedia({
5394cfg: {},
5495to: "channel:123456",
5596text: "caption",
@@ -69,7 +110,7 @@ describe("discord channel message adapter", () => {
6911070111const provePayload = async () => {
71112resetDiscordOutboundMocks(hoisted);
72-const result = await adapter.send!.payload!({
113+const result = await sendPayload({
73114cfg: {},
74115to: "channel:123456",
75116text: "payload",
@@ -86,7 +127,7 @@ describe("discord channel message adapter", () => {
8612787128const proveReplyThreadSilent = async () => {
88129resetDiscordOutboundMocks(hoisted);
89-const result = await adapter.send!.text!({
130+const result = await sendText({
90131cfg: {},
91132to: "channel:parent-1",
92133text: "threaded",
@@ -119,43 +160,44 @@ describe("discord channel message adapter", () => {
119160replyTo: proveReplyThreadSilent,
120161thread: proveReplyThreadSilent,
121162messageSendingHooks: () => {
122-expect(adapter.send!.text).toBeTypeOf("function");
163+expect(sendText).toBeTypeOf("function");
123164},
124165},
125166});
126167});
127168128169it("backs declared live preview finalizer capabilities with adapter proofs", async () => {
129-const adapter = discordPlugin.message;
170+const adapter = requireDiscordMessageAdapter();
171+const sendText = requireTextSender(adapter);
130172131173await verifyChannelMessageLiveCapabilityAdapterProofs({
132174adapterName: "discordMessageAdapter",
133-adapter: adapter!,
175+ adapter,
134176proofs: {
135177draftPreview: () => {
136-expect(adapter!.live?.finalizer?.capabilities?.discardPending).toBe(true);
178+expect(adapter.live?.finalizer?.capabilities?.discardPending).toBe(true);
137179},
138180previewFinalization: () => {
139-expect(adapter!.live?.finalizer?.capabilities?.finalEdit).toBe(true);
181+expect(adapter.live?.finalizer?.capabilities?.finalEdit).toBe(true);
140182},
141183progressUpdates: () => {
142-expect(adapter!.live?.capabilities?.draftPreview).toBe(true);
184+expect(adapter.live?.capabilities?.draftPreview).toBe(true);
143185},
144186},
145187});
146188147189await verifyChannelMessageLiveFinalizerProofs({
148190adapterName: "discordMessageAdapter",
149-adapter: adapter!,
191+ adapter,
150192proofs: {
151193finalEdit: () => {
152-expect(adapter!.live?.capabilities?.previewFinalization).toBe(true);
194+expect(adapter.live?.capabilities?.previewFinalization).toBe(true);
153195},
154196normalFallback: () => {
155-expect(adapter!.send!.text).toBeTypeOf("function");
197+expect(sendText).toBeTypeOf("function");
156198},
157199discardPending: () => {
158-expect(adapter!.live?.capabilities?.draftPreview).toBe(true);
200+expect(adapter.live?.capabilities?.draftPreview).toBe(true);
159201},
160202},
161203});
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。