Loading source
Pulling the file list, source metadata, and syntax-aware rendering for this listing.
Source from repo
Post articles and image-text content to WeChat Official Account via API or Chrome CDP, with markdown-to-WeChat HTML conversion.
Files
Skill
Size
Entrypoint
Format
Open file
Syntax-highlighted preview of this file as included in the skill package.
scripts/wechat-extend-config.test.ts
1import assert from "node:assert/strict";2import fs from "node:fs/promises";3import os from "node:os";4import path from "node:path";5import process from "node:process";6import test, { type TestContext } from "node:test";78import {9loadCredentials,10loadWechatExtendConfig,11resolveAccount,12} from "./wechat-extend-config.ts";1314function useCwd(t: TestContext, cwd: string): void {15const previous = process.cwd();16process.chdir(cwd);17t.after(() => {18process.chdir(previous);19});20}2122function useHome(t: TestContext, home: string): void {23const previous = process.env.HOME;24process.env.HOME = home;25t.after(() => {26if (previous === undefined) {27delete process.env.HOME;28return;29}30process.env.HOME = previous;31});32}3334function useWechatEnv(35t: TestContext,36values: Partial<Record<"WECHAT_APP_ID" | "WECHAT_APP_SECRET", string | undefined>>,37): void {38const previous = {39WECHAT_APP_ID: process.env.WECHAT_APP_ID,40WECHAT_APP_SECRET: process.env.WECHAT_APP_SECRET,41};4243if (values.WECHAT_APP_ID === undefined) {44delete process.env.WECHAT_APP_ID;45} else {46process.env.WECHAT_APP_ID = values.WECHAT_APP_ID;47}4849if (values.WECHAT_APP_SECRET === undefined) {50delete process.env.WECHAT_APP_SECRET;51} else {52process.env.WECHAT_APP_SECRET = values.WECHAT_APP_SECRET;53}5455t.after(() => {56if (previous.WECHAT_APP_ID === undefined) {57delete process.env.WECHAT_APP_ID;58} else {59process.env.WECHAT_APP_ID = previous.WECHAT_APP_ID;60}6162if (previous.WECHAT_APP_SECRET === undefined) {63delete process.env.WECHAT_APP_SECRET;64} else {65process.env.WECHAT_APP_SECRET = previous.WECHAT_APP_SECRET;66}67});68}6970async function makeTempDir(prefix: string): Promise<string> {71return fs.mkdtemp(path.join(os.tmpdir(), prefix));72}7374async function writeEnvFile(root: string, content: string): Promise<void> {75const envPath = path.join(root, ".baoyu-skills", ".env");76await fs.mkdir(path.dirname(envPath), { recursive: true });77await fs.writeFile(envPath, content);78}7980async function writeExtendFile(root: string, content: string): Promise<void> {81const extendPath = path.join(root, ".baoyu-skills", "baoyu-post-to-wechat", "EXTEND.md");82await fs.mkdir(path.dirname(extendPath), { recursive: true });83await fs.writeFile(extendPath, content);84}8586function useXdgConfigHome(t: TestContext, value: string | undefined): void {87const previous = process.env.XDG_CONFIG_HOME;88if (value === undefined) {89delete process.env.XDG_CONFIG_HOME;90} else {91process.env.XDG_CONFIG_HOME = value;92}93t.after(() => {94if (previous === undefined) {95delete process.env.XDG_CONFIG_HOME;96return;97}98process.env.XDG_CONFIG_HOME = previous;99});100}101102test("loadCredentials selects the first complete source without mixing values across sources", async (t) => {103const cwdRoot = await makeTempDir("wechat-creds-cwd-");104const homeRoot = await makeTempDir("wechat-creds-home-");105106useCwd(t, cwdRoot);107useHome(t, homeRoot);108useWechatEnv(t, {109WECHAT_APP_ID: undefined,110WECHAT_APP_SECRET: "stale-secret-from-process-env",111});112113await writeEnvFile(cwdRoot, "WECHAT_APP_ID=cwd-app-id\nWECHAT_APP_SECRET=cwd-app-secret\n");114await writeEnvFile(homeRoot, "WECHAT_APP_ID=home-app-id\nWECHAT_APP_SECRET=home-app-secret\n");115116const credentials = loadCredentials();117118assert.equal(credentials.appId, "cwd-app-id");119assert.equal(credentials.appSecret, "cwd-app-secret");120assert.equal(credentials.source, "<cwd>/.baoyu-skills/.env");121assert.deepEqual(credentials.skippedSources, [122"process.env missing WECHAT_APP_ID",123]);124});125126test("loadCredentials prefers a complete process.env pair over lower-priority files", async (t) => {127const cwdRoot = await makeTempDir("wechat-creds-cwd-");128const homeRoot = await makeTempDir("wechat-creds-home-");129130useCwd(t, cwdRoot);131useHome(t, homeRoot);132useWechatEnv(t, {133WECHAT_APP_ID: "env-app-id",134WECHAT_APP_SECRET: "env-app-secret",135});136137await writeEnvFile(cwdRoot, "WECHAT_APP_ID=cwd-app-id\nWECHAT_APP_SECRET=cwd-app-secret\n");138await writeEnvFile(homeRoot, "WECHAT_APP_ID=home-app-id\nWECHAT_APP_SECRET=home-app-secret\n");139140const credentials = loadCredentials();141142assert.equal(credentials.appId, "env-app-id");143assert.equal(credentials.appSecret, "env-app-secret");144assert.equal(credentials.source, "process.env");145assert.deepEqual(credentials.skippedSources, []);146});147148test("resolveAccount returns global remote_publish_* values when no account is configured", async (t) => {149const cwdRoot = await makeTempDir("wechat-extend-cwd-");150const homeRoot = await makeTempDir("wechat-extend-home-");151152useCwd(t, cwdRoot);153useHome(t, homeRoot);154useXdgConfigHome(t, undefined);155156await writeExtendFile(157cwdRoot,158[159"default_publish_method: remote-api",160"remote_publish_host: bastion.example.com",161"remote_publish_user: deploy",162"remote_publish_port: 2222",163"remote_publish_identity_file: /home/me/.ssh/id_ed25519",164"remote_publish_known_hosts_file: /home/me/.ssh/known_hosts",165"remote_publish_strict_host_key_checking: accept-new",166"remote_publish_connect_timeout: 12",167"remote_publish_proxy_jump: jump.example.com",168].join("\n"),169);170171const config = loadWechatExtendConfig();172const resolved = resolveAccount(config);173174assert.equal(resolved.default_publish_method, "remote-api");175assert.equal(resolved.remote_publish_host, "bastion.example.com");176assert.equal(resolved.remote_publish_user, "deploy");177assert.equal(resolved.remote_publish_port, 2222);178assert.equal(resolved.remote_publish_identity_file, "/home/me/.ssh/id_ed25519");179assert.equal(resolved.remote_publish_known_hosts_file, "/home/me/.ssh/known_hosts");180assert.equal(resolved.remote_publish_strict_host_key_checking, "accept-new");181assert.equal(resolved.remote_publish_connect_timeout, 12);182assert.equal(resolved.remote_publish_proxy_jump, "jump.example.com");183});184185test("resolveAccount lets account-level remote_publish_* override globals", async (t) => {186const cwdRoot = await makeTempDir("wechat-extend-cwd-");187const homeRoot = await makeTempDir("wechat-extend-home-");188189useCwd(t, cwdRoot);190useHome(t, homeRoot);191useXdgConfigHome(t, undefined);192193await writeExtendFile(194cwdRoot,195[196"default_publish_method: browser",197"remote_publish_host: global.example.com",198"remote_publish_user: deploy",199"remote_publish_port: 22",200"accounts:",201" - name: Primary",202" alias: primary",203" default: true",204" remote_publish_host: primary.example.com",205" remote_publish_user: primary-user",206" remote_publish_port: 2200",207" remote_publish_identity_file: /p/id_primary",208" - name: Secondary",209" alias: secondary",210" remote_publish_proxy_jump: jump.example.com",211].join("\n"),212);213214const config = loadWechatExtendConfig();215const primary = resolveAccount(config, "primary");216assert.equal(primary.alias, "primary");217assert.equal(primary.remote_publish_host, "primary.example.com");218assert.equal(primary.remote_publish_user, "primary-user");219assert.equal(primary.remote_publish_port, 2200);220assert.equal(primary.remote_publish_identity_file, "/p/id_primary");221assert.equal(primary.remote_publish_proxy_jump, undefined);222223const secondary = resolveAccount(config, "secondary");224assert.equal(secondary.alias, "secondary");225assert.equal(secondary.remote_publish_host, "global.example.com");226assert.equal(secondary.remote_publish_user, "deploy");227assert.equal(secondary.remote_publish_port, 22);228assert.equal(secondary.remote_publish_proxy_jump, "jump.example.com");229});230231test("loadWechatExtendConfig throws on invalid remote_publish_port", async (t) => {232const cwdRoot = await makeTempDir("wechat-extend-cwd-");233const homeRoot = await makeTempDir("wechat-extend-home-");234235useCwd(t, cwdRoot);236useHome(t, homeRoot);237useXdgConfigHome(t, undefined);238239await writeExtendFile(240cwdRoot,241[242"remote_publish_host: example.com",243"remote_publish_port: 99999",244].join("\n"),245);246247assert.throws(() => loadWechatExtendConfig(), /Invalid remote_publish_port: 99999/);248});249250test("loadWechatExtendConfig throws on invalid remote_publish_connect_timeout", async (t) => {251const cwdRoot = await makeTempDir("wechat-extend-cwd-");252const homeRoot = await makeTempDir("wechat-extend-home-");253254useCwd(t, cwdRoot);255useHome(t, homeRoot);256useXdgConfigHome(t, undefined);257258await writeExtendFile(259cwdRoot,260[261"remote_publish_host: example.com",262"remote_publish_connect_timeout: 0",263].join("\n"),264);265266assert.throws(() => loadWechatExtendConfig(), /Invalid remote_publish_connect_timeout: 0/);267});268269test("loadWechatExtendConfig throws on invalid remote_publish_strict_host_key_checking", async (t) => {270const cwdRoot = await makeTempDir("wechat-extend-cwd-");271const homeRoot = await makeTempDir("wechat-extend-home-");272273useCwd(t, cwdRoot);274useHome(t, homeRoot);275useXdgConfigHome(t, undefined);276277await writeExtendFile(278cwdRoot,279[280"remote_publish_host: example.com",281"remote_publish_strict_host_key_checking: maybe",282].join("\n"),283);284285assert.throws(286() => loadWechatExtendConfig(),287/Invalid remote_publish_strict_host_key_checking: maybe/,288);289});290291test("loadCredentials reports skipped incomplete sources when no complete pair exists", async (t) => {292const cwdRoot = await makeTempDir("wechat-creds-cwd-");293const homeRoot = await makeTempDir("wechat-creds-home-");294295useCwd(t, cwdRoot);296useHome(t, homeRoot);297useWechatEnv(t, {298WECHAT_APP_ID: "env-app-id",299WECHAT_APP_SECRET: undefined,300});301302await writeEnvFile(cwdRoot, "WECHAT_APP_SECRET=cwd-app-secret\n");303304assert.throws(305() => loadCredentials(),306/Incomplete credential sources skipped:\n- process\.env missing WECHAT_APP_SECRET\n- <cwd>\/\.baoyu-skills\/\.env missing WECHAT_APP_ID/,307);308});309