


























@@ -13,6 +13,37 @@ vi.mock("./mattermost/send.js", () => ({
13131414import { mattermostPlugin } from "./channel.js";
151516+type MattermostMessageAdapter = NonNullable<typeof mattermostPlugin.message>;
17+type MattermostMessageSender = NonNullable<MattermostMessageAdapter["send"]>;
18+19+function requireMattermostMessageAdapter(): MattermostMessageAdapter {
20+const adapter = mattermostPlugin.message;
21+if (!adapter) {
22+throw new Error("Expected mattermost plugin to expose a channel message adapter");
23+}
24+return adapter;
25+}
26+27+function requireTextSender(
28+adapter: MattermostMessageAdapter,
29+): NonNullable<MattermostMessageSender["text"]> {
30+const text = adapter.send?.text;
31+if (!text) {
32+throw new Error("Expected mattermost message adapter text sender");
33+}
34+return text;
35+}
36+37+function requireMediaSender(
38+adapter: MattermostMessageAdapter,
39+): NonNullable<MattermostMessageSender["media"]> {
40+const media = adapter.send?.media;
41+if (!media) {
42+throw new Error("Expected mattermost message adapter media sender");
43+}
44+return media;
45+}
46+1647describe("mattermost channel message adapter", () => {
1748beforeEach(() => {
1849sendMessageMattermostMock.mockReset();
@@ -23,14 +54,13 @@ describe("mattermost channel message adapter", () => {
2354});
24552556it("backs declared durable-final capabilities with outbound send proofs", async () => {
26-const adapter = mattermostPlugin.message;
27-if (!adapter) {
28-throw new Error("Expected mattermost plugin to expose a channel message adapter");
29-}
57+const adapter = requireMattermostMessageAdapter();
58+const sendText = requireTextSender(adapter);
59+const sendMedia = requireMediaSender(adapter);
30603161const proveText = async () => {
3262sendMessageMattermostMock.mockClear();
33-const result = await adapter.send!.text!({
63+const result = await sendText({
3464cfg: {},
3565to: "channel:team-1",
3666text: "hello",
@@ -47,7 +77,7 @@ describe("mattermost channel message adapter", () => {
47774878const proveMedia = async () => {
4979sendMessageMattermostMock.mockClear();
50-const result = await adapter.send!.media!({
80+const result = await sendMedia({
5181cfg: {},
5282to: "channel:team-1",
5383text: "caption",
@@ -67,7 +97,7 @@ describe("mattermost channel message adapter", () => {
67976898const proveReplyThread = async () => {
6999sendMessageMattermostMock.mockClear();
70-const result = await adapter.send!.text!({
100+const result = await sendText({
71101cfg: {},
72102to: "channel:parent-1",
73103text: "threaded",
@@ -84,7 +114,7 @@ describe("mattermost channel message adapter", () => {
8411485115const proveExplicitReply = async () => {
86116sendMessageMattermostMock.mockClear();
87-const result = await adapter.send!.text!({
117+const result = await sendText({
88118cfg: {},
89119to: "channel:parent-1",
90120text: "reply",
@@ -109,43 +139,44 @@ describe("mattermost channel message adapter", () => {
109139replyTo: proveExplicitReply,
110140thread: proveReplyThread,
111141messageSendingHooks: () => {
112-expect(adapter.send!.text).toBeTypeOf("function");
142+expect(sendText).toBeTypeOf("function");
113143},
114144},
115145});
116146});
117147118148it("backs declared live preview finalizer capabilities with adapter proofs", async () => {
119-const adapter = mattermostPlugin.message;
149+const adapter = requireMattermostMessageAdapter();
150+const sendText = requireTextSender(adapter);
120151121152await verifyChannelMessageLiveCapabilityAdapterProofs({
122153adapterName: "mattermostMessageAdapter",
123-adapter: adapter!,
154+ adapter,
124155proofs: {
125156draftPreview: () => {
126-expect(adapter!.live?.finalizer?.capabilities?.discardPending).toBe(true);
157+expect(adapter.live?.finalizer?.capabilities?.discardPending).toBe(true);
127158},
128159previewFinalization: () => {
129-expect(adapter!.live?.finalizer?.capabilities?.finalEdit).toBe(true);
160+expect(adapter.live?.finalizer?.capabilities?.finalEdit).toBe(true);
130161},
131162progressUpdates: () => {
132-expect(adapter!.live?.capabilities?.draftPreview).toBe(true);
163+expect(adapter.live?.capabilities?.draftPreview).toBe(true);
133164},
134165},
135166});
136167137168await verifyChannelMessageLiveFinalizerProofs({
138169adapterName: "mattermostMessageAdapter",
139-adapter: adapter!,
170+ adapter,
140171proofs: {
141172finalEdit: () => {
142-expect(adapter!.live?.capabilities?.previewFinalization).toBe(true);
173+expect(adapter.live?.capabilities?.previewFinalization).toBe(true);
143174},
144175normalFallback: () => {
145-expect(adapter!.send!.text).toBeTypeOf("function");
176+expect(sendText).toBeTypeOf("function");
146177},
147178discardPending: () => {
148-expect(adapter!.live?.capabilities?.draftPreview).toBe(true);
179+expect(adapter.live?.capabilities?.draftPreview).toBe(true);
149180},
150181},
151182});
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。