From 3c2e848a8e0e6f2749b79d46cdab021ef49ce23f Mon Sep 17 00:00:00 2001 From: Randy Torres Date: Thu, 8 Jan 2026 04:44:32 +0000 Subject: [PATCH] Docker: fix WhatsApp config typing in onboarding + add tests --- src/commands/onboard-providers.test.ts | 57 ++++++++++++++++++++++++++ src/commands/onboard-providers.ts | 41 +++++++++--------- 2 files changed, 76 insertions(+), 22 deletions(-) create mode 100644 src/commands/onboard-providers.test.ts diff --git a/src/commands/onboard-providers.test.ts b/src/commands/onboard-providers.test.ts new file mode 100644 index 000000000..f231fbb16 --- /dev/null +++ b/src/commands/onboard-providers.test.ts @@ -0,0 +1,57 @@ +import { describe, expect, it } from "vitest"; + +import type { ClawdbotConfig } from "../config/config.js"; +import { + setWhatsAppAllowFrom, + setWhatsAppDmPolicy, + setWhatsAppSelfChatMode, +} from "./onboard-providers.js"; + +describe("onboard-providers WhatsApp setters", () => { + it("preserves existing WhatsApp fields when updating allowFrom", () => { + const cfg: ClawdbotConfig = { + whatsapp: { + selfChatMode: true, + dmPolicy: "pairing", + allowFrom: ["*"], + accounts: { + default: { enabled: false }, + }, + }, + }; + + const next = setWhatsAppAllowFrom(cfg, ["+15555550123"]); + + expect(next.whatsapp?.selfChatMode).toBe(true); + expect(next.whatsapp?.dmPolicy).toBe("pairing"); + expect(next.whatsapp?.allowFrom).toEqual(["+15555550123"]); + expect(next.whatsapp?.accounts?.default?.enabled).toBe(false); + }); + + it("updates dmPolicy without dropping selfChatMode", () => { + const cfg: ClawdbotConfig = { + whatsapp: { + selfChatMode: true, + dmPolicy: "pairing", + }, + }; + + const next = setWhatsAppDmPolicy(cfg, "open"); + + expect(next.whatsapp?.dmPolicy).toBe("open"); + expect(next.whatsapp?.selfChatMode).toBe(true); + }); + + it("updates selfChatMode without dropping allowFrom", () => { + const cfg: ClawdbotConfig = { + whatsapp: { + allowFrom: ["+15555550123"], + }, + }; + + const next = setWhatsAppSelfChatMode(cfg, true); + + expect(next.whatsapp?.selfChatMode).toBe(true); + expect(next.whatsapp?.allowFrom).toEqual(["+15555550123"]); + }); +}); diff --git a/src/commands/onboard-providers.ts b/src/commands/onboard-providers.ts index dd7f02c0d..4ce154f0c 100644 --- a/src/commands/onboard-providers.ts +++ b/src/commands/onboard-providers.ts @@ -1,7 +1,7 @@ import fs from "node:fs/promises"; import path from "node:path"; import type { ClawdbotConfig } from "../config/config.js"; -import type { DmPolicy } from "../config/types.js"; +import type { DmPolicy, WhatsAppConfig } from "../config/types.js"; import { listDiscordAccountIds, resolveDefaultDiscordAccountId, @@ -249,30 +249,33 @@ async function noteSlackTokenHelp( ); } -function setWhatsAppDmPolicy( +export function mergeWhatsAppConfig( cfg: ClawdbotConfig, - dmPolicy?: DmPolicy, + patch: Partial, ): ClawdbotConfig { + const base = cfg.whatsapp ?? {}; return { ...cfg, whatsapp: { - ...cfg.whatsapp, - dmPolicy, + selfChatMode: base.selfChatMode, + ...base, + ...patch, }, }; } -function setWhatsAppAllowFrom( +export function setWhatsAppDmPolicy( + cfg: ClawdbotConfig, + dmPolicy: DmPolicy, +): ClawdbotConfig { + return mergeWhatsAppConfig(cfg, { dmPolicy }); +} + +export function setWhatsAppAllowFrom( cfg: ClawdbotConfig, allowFrom?: string[], ): ClawdbotConfig { - return { - ...cfg, - whatsapp: { - ...cfg.whatsapp, - allowFrom, - }, - }; + return mergeWhatsAppConfig(cfg, { allowFrom }); } function setMessagesResponsePrefix( @@ -288,17 +291,11 @@ function setMessagesResponsePrefix( }; } -function setWhatsAppSelfChatMode( +export function setWhatsAppSelfChatMode( cfg: ClawdbotConfig, - selfChatMode?: boolean, + selfChatMode: boolean, ): ClawdbotConfig { - return { - ...cfg, - whatsapp: { - ...cfg.whatsapp, - selfChatMode, - }, - }; + return mergeWhatsAppConfig(cfg, { selfChatMode }); } function setTelegramDmPolicy(cfg: ClawdbotConfig, dmPolicy: DmPolicy) {