mirror of
https://github.com/openclaw/openclaw.git
synced 2026-05-28 01:32:57 +00:00
138 lines
3.5 KiB
TypeScript
138 lines
3.5 KiB
TypeScript
import {
|
|
installChannelActionsContractSuite,
|
|
installChannelSetupContractSuite,
|
|
installChannelStatusContractSuite,
|
|
} from "openclaw/plugin-sdk/channel-test-helpers";
|
|
import type { OpenClawConfig } from "openclaw/plugin-sdk/config-contracts";
|
|
import { describe, expect } from "vitest";
|
|
import { slackPlugin } from "../api.js";
|
|
import { slackSetupPlugin } from "../setup-plugin-api.js";
|
|
|
|
const slackDefaultActions = [
|
|
"send",
|
|
"react",
|
|
"reactions",
|
|
"read",
|
|
"edit",
|
|
"delete",
|
|
"download-file",
|
|
"upload-file",
|
|
"pin",
|
|
"unpin",
|
|
"list-pins",
|
|
"member-info",
|
|
"emoji-list",
|
|
] as const;
|
|
|
|
describe("slack actions contract", () => {
|
|
installChannelActionsContractSuite({
|
|
plugin: slackPlugin,
|
|
unsupportedAction: "poll",
|
|
cases: [
|
|
{
|
|
name: "configured account exposes default Slack actions",
|
|
cfg: {
|
|
channels: {
|
|
slack: {
|
|
botToken: "xoxb-test",
|
|
appToken: "xapp-test",
|
|
},
|
|
},
|
|
} as OpenClawConfig,
|
|
expectedActions: slackDefaultActions,
|
|
expectedCapabilities: ["presentation"],
|
|
},
|
|
{
|
|
name: "interactive replies keep the shared presentation capability",
|
|
cfg: {
|
|
channels: {
|
|
slack: {
|
|
botToken: "xoxb-test",
|
|
appToken: "xapp-test",
|
|
capabilities: {
|
|
interactiveReplies: true,
|
|
},
|
|
},
|
|
},
|
|
} as OpenClawConfig,
|
|
expectedActions: slackDefaultActions,
|
|
expectedCapabilities: ["presentation"],
|
|
},
|
|
{
|
|
name: "missing tokens disables the actions surface",
|
|
cfg: {
|
|
channels: {
|
|
slack: {
|
|
enabled: true,
|
|
},
|
|
},
|
|
} as OpenClawConfig,
|
|
expectedActions: [],
|
|
expectedCapabilities: [],
|
|
},
|
|
],
|
|
});
|
|
});
|
|
|
|
describe("slack setup contract", () => {
|
|
installChannelSetupContractSuite({
|
|
plugin: slackSetupPlugin,
|
|
cases: [
|
|
{
|
|
name: "default account stores tokens and enables the channel",
|
|
cfg: {} as OpenClawConfig,
|
|
input: {
|
|
botToken: "xoxb-test",
|
|
appToken: "xapp-test",
|
|
},
|
|
expectedAccountId: "default",
|
|
assertPatchedConfig: (cfg) => {
|
|
expect(cfg.channels?.slack?.enabled).toBe(true);
|
|
expect(cfg.channels?.slack?.botToken).toBe("xoxb-test");
|
|
expect(cfg.channels?.slack?.appToken).toBe("xapp-test");
|
|
},
|
|
},
|
|
{
|
|
name: "non-default env setup is rejected",
|
|
cfg: {} as OpenClawConfig,
|
|
accountId: "ops",
|
|
input: {
|
|
useEnv: true,
|
|
},
|
|
expectedAccountId: "ops",
|
|
expectedValidation: "Slack env tokens can only be used for the default account.",
|
|
},
|
|
],
|
|
});
|
|
});
|
|
|
|
describe("slack status contract", () => {
|
|
installChannelStatusContractSuite({
|
|
plugin: slackPlugin,
|
|
cases: [
|
|
{
|
|
name: "configured account produces a configured status snapshot",
|
|
cfg: {
|
|
channels: {
|
|
slack: {
|
|
botToken: "xoxb-test",
|
|
appToken: "xapp-test",
|
|
},
|
|
},
|
|
} as OpenClawConfig,
|
|
runtime: {
|
|
accountId: "default",
|
|
connected: true,
|
|
running: true,
|
|
},
|
|
probe: { ok: true },
|
|
assertSnapshot: (snapshot) => {
|
|
expect(snapshot.accountId).toBe("default");
|
|
expect(snapshot.enabled).toBe(true);
|
|
expect(snapshot.configured).toBe(true);
|
|
},
|
|
},
|
|
],
|
|
});
|
|
});
|