




















@@ -19,6 +19,66 @@ afterEach(() => {
1919resetFacadeRuntimeStateForTest();
2020});
212122+type IMessageOutbound = NonNullable<ReturnType<typeof createIMessageTestPlugin>["outbound"]>;
23+type IMessageMessageAdapter = NonNullable<typeof imessagePlugin.message>;
24+type IMessageMessageSender = NonNullable<IMessageMessageAdapter["send"]>;
25+26+function requireOutbound(): IMessageOutbound {
27+const outbound = createIMessageTestPlugin().outbound;
28+if (!outbound) {
29+throw new Error("Expected iMessage test plugin outbound adapter");
30+}
31+return outbound;
32+}
33+34+function requireOutboundSendText(
35+outbound: IMessageOutbound,
36+): NonNullable<IMessageOutbound["sendText"]> {
37+const sendText = outbound.sendText;
38+if (!sendText) {
39+throw new Error("Expected iMessage outbound sendText");
40+}
41+return sendText;
42+}
43+44+function requireOutboundSendMedia(
45+outbound: IMessageOutbound,
46+): NonNullable<IMessageOutbound["sendMedia"]> {
47+const sendMedia = outbound.sendMedia;
48+if (!sendMedia) {
49+throw new Error("Expected iMessage outbound sendMedia");
50+}
51+return sendMedia;
52+}
53+54+function requireMessageAdapter(): IMessageMessageAdapter {
55+const adapter = imessagePlugin.message;
56+if (!adapter) {
57+throw new Error("Expected iMessage message adapter");
58+}
59+return adapter;
60+}
61+62+function requireMessageSendText(
63+adapter: IMessageMessageAdapter,
64+): NonNullable<IMessageMessageSender["text"]> {
65+const text = adapter.send?.text;
66+if (!text) {
67+throw new Error("Expected iMessage message adapter text sender");
68+}
69+return text;
70+}
71+72+function requireMessageSendMedia(
73+adapter: IMessageMessageAdapter,
74+): NonNullable<IMessageMessageSender["media"]> {
75+const media = adapter.send?.media;
76+if (!media) {
77+throw new Error("Expected iMessage message adapter media sender");
78+}
79+return media;
80+}
81+2282describe("createIMessageTestPlugin", () => {
2383it("does not load the bundled iMessage facade by default", () => {
2484expect(listImportedBundledPluginFacadeIds()).toEqual([]);
@@ -55,7 +115,9 @@ describe("createIMessageTestPlugin", () => {
55115});
5611657117it("backs declared durable final capabilities with delivery proofs", async () => {
58-const outbound = createIMessageTestPlugin().outbound!;
118+const outbound = requireOutbound();
119+const sendText = requireOutboundSendText(outbound);
120+const sendMedia = requireOutboundSendMedia(outbound);
59121const sendIMessage = async () => ({ messageId: "imsg-1" });
6012261123await verifyDurableFinalCapabilityProofs({
@@ -64,7 +126,7 @@ describe("createIMessageTestPlugin", () => {
64126proofs: {
65127text: async () => {
66128await expect(
67-outbound.sendText?.({
129+sendText({
68130cfg: {} as never,
69131to: "+15551234567",
70132text: "hello",
@@ -74,7 +136,7 @@ describe("createIMessageTestPlugin", () => {
74136},
75137media: async () => {
76138await expect(
77-outbound.sendMedia?.({
139+sendMedia({
78140cfg: {} as never,
79141to: "+15551234567",
80142text: "caption",
@@ -86,7 +148,7 @@ describe("createIMessageTestPlugin", () => {
86148},
87149replyTo: async () => {
88150await expect(
89-outbound.sendText?.({
151+sendText({
90152cfg: {} as never,
91153to: "+15551234567",
92154text: "reply",
@@ -96,7 +158,7 @@ describe("createIMessageTestPlugin", () => {
96158).resolves.toEqual({ channel: "imessage", messageId: "imsg-1" });
97159},
98160messageSendingHooks: () => {
99-expect(outbound.sendText).toBeTypeOf("function");
161+expect(sendText).toBeTypeOf("function");
100162},
101163},
102164});
@@ -119,49 +181,52 @@ describe("createIMessageTestPlugin", () => {
119181}),
120182};
121183};
184+const adapter = requireMessageAdapter();
185+const sendText = requireMessageSendText(adapter);
186+const sendMedia = requireMessageSendMedia(adapter);
122187123188await verifyChannelMessageAdapterCapabilityProofs({
124189adapterName: "imessageMessage",
125-adapter: imessagePlugin.message!,
190+ adapter,
126191proofs: {
127192text: async () => {
128-const result = await imessagePlugin.message?.send?.text?.({
193+const result = await sendText({
129194cfg: {} as never,
130195to: "+15551234567",
131196text: "hello",
132197deps: { imessage: sendIMessage },
133-} as Parameters<NonNullable<typeof imessagePlugin.message.send.text>>[0] & {
198+} as Parameters<typeof sendText>[0] & {
134199deps: { imessage: typeof sendIMessage };
135200});
136-expect(result?.receipt.platformMessageIds).toEqual(["imsg-text-1"]);
201+expect(result.receipt.platformMessageIds).toEqual(["imsg-text-1"]);
137202},
138203media: async () => {
139-const result = await imessagePlugin.message?.send?.media?.({
204+const result = await sendMedia({
140205cfg: {} as never,
141206to: "+15551234567",
142207text: "caption",
143208mediaUrl: "/tmp/image.png",
144209mediaLocalRoots: ["/tmp"],
145210deps: { imessage: sendIMessage },
146-} as Parameters<NonNullable<typeof imessagePlugin.message.send.media>>[0] & {
211+} as Parameters<typeof sendMedia>[0] & {
147212deps: { imessage: typeof sendIMessage };
148213});
149-expect(result?.receipt.platformMessageIds).toEqual(["imsg-media-1"]);
214+expect(result.receipt.platformMessageIds).toEqual(["imsg-media-1"]);
150215},
151216replyTo: async () => {
152-const result = await imessagePlugin.message?.send?.text?.({
217+const result = await sendText({
153218cfg: {} as never,
154219to: "+15551234567",
155220text: "reply",
156221replyToId: "reply-1",
157222deps: { imessage: sendIMessage },
158-} as Parameters<NonNullable<typeof imessagePlugin.message.send.text>>[0] & {
223+} as Parameters<typeof sendText>[0] & {
159224deps: { imessage: typeof sendIMessage };
160225});
161-expect(result?.receipt.replyToId).toBe("reply-1");
226+expect(result.receipt.replyToId).toBe("reply-1");
162227},
163228messageSendingHooks: () => {
164-expect(imessagePlugin.message?.send?.text).toBeTypeOf("function");
229+expect(sendText).toBeTypeOf("function");
165230},
166231},
167232});
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。