test(discord): split channel target resolver tests (#108857)

This commit is contained in:
Peter Steinberger
2026-07-16 02:48:15 -07:00
committed by GitHub
parent 06795a669b
commit b28070543a
2 changed files with 85 additions and 78 deletions
@@ -0,0 +1,85 @@
// Discord channel target-resolver tests cover normalized and directory-backed routing.
import { describe, expect, it, vi } from "vitest";
import { discordPlugin } from "./channel.js";
import * as directoryLive from "./directory-live.js";
import type { OpenClawConfig } from "./runtime-api.js";
function createCfg(): OpenClawConfig {
return {
channels: {
discord: {
enabled: true,
token: "test-token-placeholder",
},
},
} as OpenClawConfig;
}
function requireResolveTarget() {
const resolveTarget = discordPlugin.messaging?.targetResolver?.resolveTarget;
if (!resolveTarget) {
throw new Error("Expected discordPlugin.messaging.targetResolver.resolveTarget to be defined");
}
return resolveTarget;
}
describe("discordPlugin messaging target resolver", () => {
it("resolves Discord usernames through the messaging target resolver", async () => {
vi.spyOn(directoryLive, "listDiscordDirectoryPeersLive").mockResolvedValueOnce([
{ kind: "user", id: "user:999", name: "Jane" } as const,
]);
await expect(
requireResolveTarget()({
cfg: createCfg(),
accountId: "default",
input: "jane",
normalized: "channel:jane",
preferredKind: "user",
}),
).resolves.toEqual({
to: "user:999",
kind: "user",
display: "jane",
source: "directory",
});
});
it("rejects unresolved Discord names after the shared directory lookup misses", async () => {
vi.spyOn(directoryLive, "listDiscordDirectoryPeersLive").mockResolvedValue([]);
await expect(
requireResolveTarget()({
cfg: createCfg(),
accountId: "default",
input: "channel:missing",
normalized: "channel:missing",
preferredKind: "channel",
}),
).resolves.toBeNull();
await expect(
requireResolveTarget()({
cfg: createCfg(),
accountId: "default",
input: "user:missing",
normalized: "user:missing",
preferredKind: "user",
}),
).resolves.toBeNull();
});
it("does not reinterpret a bare channel name as a Discord username on fallback", async () => {
vi.spyOn(directoryLive, "listDiscordDirectoryPeersLive").mockResolvedValueOnce([
{ kind: "user", id: "user:999", name: "General" } as const,
]);
await expect(
requireResolveTarget()({
cfg: createCfg(),
accountId: "default",
input: "general",
normalized: "channel:general",
}),
).resolves.toBeNull();
});
});
-78
View File
@@ -6,7 +6,6 @@ import { createStartAccountContext } from "openclaw/plugin-sdk/channel-test-help
import type { PluginRuntime } from "openclaw/plugin-sdk/core";
import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest";
import type { ResolvedDiscordAccount } from "./accounts.js";
import * as directoryLive from "./directory-live.js";
import type { OpenClawConfig } from "./runtime-api.js";
import * as sendModule from "./send.js";
import { createDiscordSendReceipt } from "./send.receipt.js";
@@ -262,83 +261,6 @@ describe("discordPlugin outbound", () => {
expect(messaging.inferTargetChatType({ to: "1470130713209602050" })).toBe("channel");
});
it("resolves Discord usernames through the messaging target resolver", async () => {
vi.spyOn(directoryLive, "listDiscordDirectoryPeersLive").mockResolvedValueOnce([
{ kind: "user", id: "user:999", name: "Jane" } as const,
]);
const resolveTarget = discordPlugin.messaging?.targetResolver?.resolveTarget;
if (!resolveTarget) {
throw new Error(
"Expected discordPlugin.messaging.targetResolver.resolveTarget to be defined",
);
}
await expect(
resolveTarget({
cfg: createCfg(),
accountId: "default",
input: "jane",
normalized: "channel:jane",
preferredKind: "user",
}),
).resolves.toEqual({
to: "user:999",
kind: "user",
display: "jane",
source: "directory",
});
});
it("rejects unresolved Discord names after the shared directory lookup misses", async () => {
vi.spyOn(directoryLive, "listDiscordDirectoryPeersLive").mockResolvedValue([]);
const resolveTarget = discordPlugin.messaging?.targetResolver?.resolveTarget;
if (!resolveTarget) {
throw new Error(
"Expected discordPlugin.messaging.targetResolver.resolveTarget to be defined",
);
}
await expect(
resolveTarget({
cfg: createCfg(),
accountId: "default",
input: "channel:missing",
normalized: "channel:missing",
preferredKind: "channel",
}),
).resolves.toBeNull();
await expect(
resolveTarget({
cfg: createCfg(),
accountId: "default",
input: "user:missing",
normalized: "user:missing",
preferredKind: "user",
}),
).resolves.toBeNull();
});
it("does not reinterpret a bare channel name as a Discord username on fallback", async () => {
vi.spyOn(directoryLive, "listDiscordDirectoryPeersLive").mockResolvedValueOnce([
{ kind: "user", id: "user:999", name: "General" } as const,
]);
const resolveTarget = discordPlugin.messaging?.targetResolver?.resolveTarget;
if (!resolveTarget) {
throw new Error(
"Expected discordPlugin.messaging.targetResolver.resolveTarget to be defined",
);
}
await expect(
resolveTarget({
cfg: createCfg(),
accountId: "default",
input: "general",
normalized: "channel:general",
}),
).resolves.toBeNull();
});
it("preserves the normalized channel kind for bare current-channel ids", async () => {
const resolveTarget = discordPlugin.messaging?.targetResolver?.resolveTarget;
if (!resolveTarget) {