Skip to content

Commit 458f5fb

Browse files
committed
test: move channel flow proof under telegram
1 parent 84a53ff commit 458f5fb

4 files changed

Lines changed: 47 additions & 30 deletions

File tree

.agents/skills/channel-message-flows/SKILL.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,14 +20,14 @@ pnpm openclaw qa suite --scenario channel-message-flows
2020
Run the focused e2e test directly in a Codex worktree:
2121

2222
```bash
23-
node scripts/run-vitest.mjs test/e2e/qa-lab/channels/channel-message-flows.e2e.test.ts
23+
node scripts/run-vitest.mjs extensions/telegram/src/channel-message-flows.qa.e2e.test.ts
2424
```
2525

2626
## References
2727

2828
- `qa/scenarios/channels/channel-message-flows.yaml`
29-
- `test/e2e/qa-lab/channels/channel-message-flows.e2e.test.ts`
30-
- `test/e2e/qa-lab/channels/channel-message-flows-runtime.ts`
29+
- `extensions/telegram/src/channel-message-flows.qa.e2e.test.ts`
30+
- `extensions/telegram/src/test-support/channel-message-flows.ts`
3131

3232
The scenario covers `channels.streaming` as primary evidence and records
3333
secondary coverage for thread preservation, delivery ordering, and reasoning

test/e2e/qa-lab/channels/channel-message-flows.e2e.test.ts renamed to extensions/telegram/src/channel-message-flows.qa.e2e.test.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
// Channel Message Flows tests cover QA Lab channel delivery evidence.
2+
import type { OpenClawConfig } from "openclaw/plugin-sdk/config-contracts";
23
import { describe, expect, it, vi } from "vitest";
3-
import type { OpenClawConfig } from "../../../../src/config/types.openclaw.js";
44
import {
55
resolveTelegramFlowThreadSpec,
66
runTelegramThinkingFinalFlow,
77
runTelegramWorkingFinalFlow,
8-
} from "./channel-message-flows-runtime.js";
8+
} from "./test-support/channel-message-flows.js";
99

1010
describe("channel message flows QA e2e", () => {
1111
function createTestDraftStream(params?: {
@@ -15,6 +15,7 @@ describe("channel message flows QA e2e", () => {
1515
}) {
1616
return {
1717
update: vi.fn(params?.update ?? (() => {})),
18+
updatePreview: vi.fn(),
1819
flush: vi.fn(params?.flush ?? (async () => {})),
1920
clear: vi.fn(params?.clear ?? (async () => {})),
2021
stop: vi.fn(async () => {}),
@@ -35,6 +36,7 @@ describe("channel message flows QA e2e", () => {
3536
clear: vi.fn(async () => {
3637
events.push("clear");
3738
}),
39+
updatePreview: vi.fn(),
3840
stop: vi.fn(async () => {}),
3941
messageId: vi.fn(() => 17),
4042
forceNewMessage: vi.fn(),
@@ -82,6 +84,7 @@ describe("channel message flows QA e2e", () => {
8284
throw new Error("flush failed");
8385
}),
8486
clear: vi.fn(async () => {}),
87+
updatePreview: vi.fn(),
8588
stop: vi.fn(async () => {}),
8689
messageId: vi.fn(() => 17),
8790
forceNewMessage: vi.fn(),
@@ -113,6 +116,7 @@ describe("channel message flows QA e2e", () => {
113116
update: vi.fn(() => {}),
114117
flush: vi.fn(async () => {}),
115118
clear: vi.fn(async () => {}),
119+
updatePreview: vi.fn(),
116120
stop: vi.fn(async () => {}),
117121
messageId: vi.fn(() => 17),
118122
forceNewMessage: vi.fn(),

test/e2e/qa-lab/channels/channel-message-flows-runtime.ts renamed to extensions/telegram/src/test-support/channel-message-flows.ts

Lines changed: 35 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -2,23 +2,23 @@
22
import { setTimeout as sleep } from "node:timers/promises";
33
import type { Bot } from "grammy";
44
import type { Message } from "grammy/types";
5-
import {
6-
deleteMessageTelegram,
7-
editMessageTelegram,
8-
sendMessageTelegram,
9-
} from "../../../../extensions/telegram/runtime-api.js";
10-
import type { TelegramThreadSpec } from "../../../../extensions/telegram/src/bot/helpers.js";
11-
import {
12-
createTelegramDraftStream,
13-
type TelegramDraftStream,
14-
} from "../../../../extensions/telegram/src/draft-stream.js";
5+
import { formatReasoningMessage } from "openclaw/plugin-sdk/agent-runtime";
6+
import { formatChannelProgressDraftText } from "openclaw/plugin-sdk/channel-outbound";
7+
import type { OpenClawConfig } from "openclaw/plugin-sdk/config-contracts";
8+
import type { TelegramThreadSpec } from "../bot/helpers.js";
9+
import { createTelegramDraftStream, type TelegramDraftStream } from "../draft-stream.js";
1510
import {
1611
buildTelegramRichMarkdown,
12+
type TelegramEditRichMessageTextParams,
1713
type TelegramInputRichMessage,
18-
} from "../../../../extensions/telegram/src/rich-message.js";
19-
import { formatReasoningMessage } from "../../../../src/agents/embedded-agent-utils.js";
20-
import type { OpenClawConfig } from "../../../../src/config/types.openclaw.js";
21-
import { formatChannelProgressDraftText } from "../../../../src/plugin-sdk/channel-outbound.js";
14+
type TelegramSendRichMessageParams,
15+
} from "../rich-message.js";
16+
import { deleteMessageTelegram, editMessageTelegram, sendMessageTelegram } from "../send.js";
17+
18+
type TelegramApi = Bot["api"];
19+
type TelegramSendMessageParams = Parameters<TelegramApi["sendMessage"]>;
20+
type TelegramEditMessageTextParams = Parameters<TelegramApi["editMessageText"]>;
21+
type TelegramDeleteMessageParams = Parameters<TelegramApi["deleteMessage"]>;
2222

2323
type SupportedFlow = "thinking-final" | "working-final";
2424

@@ -130,15 +130,15 @@ function richMessageText(richMessage: TelegramInputRichMessage): {
130130
text: string;
131131
textMode: "markdown" | "html";
132132
} {
133-
return "html" in richMessage
133+
return richMessage.html !== undefined
134134
? { text: richMessage.html, textMode: "html" }
135135
: { text: richMessage.markdown, textMode: "markdown" };
136136
}
137137

138138
function createTelegramFlowApi(params: { accountId?: string; cfg: OpenClawConfig }): Bot["api"] {
139-
return {
139+
const api = {
140140
raw: {
141-
sendRichMessage: async (sendParams) => {
141+
sendRichMessage: async (sendParams: TelegramSendRichMessageParams) => {
142142
const richText = richMessageText(sendParams.rich_message);
143143
const result = await sendMessageTelegram(String(sendParams.chat_id), richText.text, {
144144
accountId: params.accountId,
@@ -148,7 +148,7 @@ function createTelegramFlowApi(params: { accountId?: string; cfg: OpenClawConfig
148148
});
149149
return { message_id: Number(result.messageId) } as Message;
150150
},
151-
editMessageText: async (editParams) => {
151+
editMessageText: async (editParams: TelegramEditRichMessageTextParams) => {
152152
if (typeof editParams.message_id !== "number") {
153153
throw new Error("Telegram flow rich edit requires message_id.");
154154
}
@@ -166,7 +166,11 @@ function createTelegramFlowApi(params: { accountId?: string; cfg: OpenClawConfig
166166
return true;
167167
},
168168
},
169-
sendMessage: async (chatId, text, sendParams) => {
169+
sendMessage: async (
170+
chatId: TelegramSendMessageParams[0],
171+
text: TelegramSendMessageParams[1],
172+
sendParams: TelegramSendMessageParams[2],
173+
) => {
170174
const result = await sendMessageTelegram(String(chatId), text, {
171175
accountId: params.accountId,
172176
cfg: params.cfg,
@@ -175,22 +179,31 @@ function createTelegramFlowApi(params: { accountId?: string; cfg: OpenClawConfig
175179
});
176180
return { message_id: Number(result.messageId) };
177181
},
178-
editMessageText: async (chatId, messageId, text, editParams) => {
182+
editMessageText: async (
183+
chatId: TelegramEditMessageTextParams[0],
184+
messageId: TelegramEditMessageTextParams[1],
185+
text: TelegramEditMessageTextParams[2],
186+
editParams: TelegramEditMessageTextParams[3],
187+
) => {
179188
await editMessageTelegram(String(chatId), messageId, text, {
180189
accountId: params.accountId,
181190
cfg: params.cfg,
182191
textMode: editParams?.parse_mode === "HTML" ? "html" : "markdown",
183192
});
184193
return true;
185194
},
186-
deleteMessage: async (chatId, messageId) => {
195+
deleteMessage: async (
196+
chatId: TelegramDeleteMessageParams[0],
197+
messageId: TelegramDeleteMessageParams[1],
198+
) => {
187199
await deleteMessageTelegram(String(chatId), messageId, {
188200
accountId: params.accountId,
189201
cfg: params.cfg,
190202
});
191203
return true;
192204
},
193-
} as Bot["api"];
205+
};
206+
return api as unknown as Bot["api"];
194207
}
195208

196209
export function resolveTelegramFlowThreadSpec(threadId?: number): TelegramThreadSpec | undefined {

qa/scenarios/channels/channel-message-flows.yaml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,9 @@ scenario:
1919
- docs/channels/telegram.md
2020
- docs/concepts/qa-e2e-automation.md
2121
codeRefs:
22-
- test/e2e/qa-lab/channels/channel-message-flows.e2e.test.ts
23-
- test/e2e/qa-lab/channels/channel-message-flows-runtime.ts
22+
- extensions/telegram/src/channel-message-flows.qa.e2e.test.ts
23+
- extensions/telegram/src/test-support/channel-message-flows.ts
2424
execution:
2525
kind: vitest
26-
path: test/e2e/qa-lab/channels/channel-message-flows.e2e.test.ts
26+
path: extensions/telegram/src/channel-message-flows.qa.e2e.test.ts
2727
summary: Vitest coverage for channel message flow sequencing.

0 commit comments

Comments
 (0)