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 { loadCredentials } from "./wechat-extend-config.ts";910function useCwd(t: TestContext, cwd: string): void {11const previous = process.cwd();12process.chdir(cwd);13t.after(() => {14process.chdir(previous);15});16}1718function useHome(t: TestContext, home: string): void {19const previous = process.env.HOME;20process.env.HOME = home;21t.after(() => {22if (previous === undefined) {23delete process.env.HOME;24return;25}26process.env.HOME = previous;27});28}2930function useWechatEnv(31t: TestContext,32values: Partial<Record<"WECHAT_APP_ID" | "WECHAT_APP_SECRET", string | undefined>>,33): void {34const previous = {35WECHAT_APP_ID: process.env.WECHAT_APP_ID,36WECHAT_APP_SECRET: process.env.WECHAT_APP_SECRET,37};3839if (values.WECHAT_APP_ID === undefined) {40delete process.env.WECHAT_APP_ID;41} else {42process.env.WECHAT_APP_ID = values.WECHAT_APP_ID;43}4445if (values.WECHAT_APP_SECRET === undefined) {46delete process.env.WECHAT_APP_SECRET;47} else {48process.env.WECHAT_APP_SECRET = values.WECHAT_APP_SECRET;49}5051t.after(() => {52if (previous.WECHAT_APP_ID === undefined) {53delete process.env.WECHAT_APP_ID;54} else {55process.env.WECHAT_APP_ID = previous.WECHAT_APP_ID;56}5758if (previous.WECHAT_APP_SECRET === undefined) {59delete process.env.WECHAT_APP_SECRET;60} else {61process.env.WECHAT_APP_SECRET = previous.WECHAT_APP_SECRET;62}63});64}6566async function makeTempDir(prefix: string): Promise<string> {67return fs.mkdtemp(path.join(os.tmpdir(), prefix));68}6970async function writeEnvFile(root: string, content: string): Promise<void> {71const envPath = path.join(root, ".baoyu-skills", ".env");72await fs.mkdir(path.dirname(envPath), { recursive: true });73await fs.writeFile(envPath, content);74}7576test("loadCredentials selects the first complete source without mixing values across sources", async (t) => {77const cwdRoot = await makeTempDir("wechat-creds-cwd-");78const homeRoot = await makeTempDir("wechat-creds-home-");7980useCwd(t, cwdRoot);81useHome(t, homeRoot);82useWechatEnv(t, {83WECHAT_APP_ID: undefined,84WECHAT_APP_SECRET: "stale-secret-from-process-env",85});8687await writeEnvFile(cwdRoot, "WECHAT_APP_ID=cwd-app-id\nWECHAT_APP_SECRET=cwd-app-secret\n");88await writeEnvFile(homeRoot, "WECHAT_APP_ID=home-app-id\nWECHAT_APP_SECRET=home-app-secret\n");8990const credentials = loadCredentials();9192assert.equal(credentials.appId, "cwd-app-id");93assert.equal(credentials.appSecret, "cwd-app-secret");94assert.equal(credentials.source, "<cwd>/.baoyu-skills/.env");95assert.deepEqual(credentials.skippedSources, [96"process.env missing WECHAT_APP_ID",97]);98});99100test("loadCredentials prefers a complete process.env pair over lower-priority files", async (t) => {101const cwdRoot = await makeTempDir("wechat-creds-cwd-");102const homeRoot = await makeTempDir("wechat-creds-home-");103104useCwd(t, cwdRoot);105useHome(t, homeRoot);106useWechatEnv(t, {107WECHAT_APP_ID: "env-app-id",108WECHAT_APP_SECRET: "env-app-secret",109});110111await writeEnvFile(cwdRoot, "WECHAT_APP_ID=cwd-app-id\nWECHAT_APP_SECRET=cwd-app-secret\n");112await writeEnvFile(homeRoot, "WECHAT_APP_ID=home-app-id\nWECHAT_APP_SECRET=home-app-secret\n");113114const credentials = loadCredentials();115116assert.equal(credentials.appId, "env-app-id");117assert.equal(credentials.appSecret, "env-app-secret");118assert.equal(credentials.source, "process.env");119assert.deepEqual(credentials.skippedSources, []);120});121122test("loadCredentials reports skipped incomplete sources when no complete pair exists", async (t) => {123const cwdRoot = await makeTempDir("wechat-creds-cwd-");124const homeRoot = await makeTempDir("wechat-creds-home-");125126useCwd(t, cwdRoot);127useHome(t, homeRoot);128useWechatEnv(t, {129WECHAT_APP_ID: "env-app-id",130WECHAT_APP_SECRET: undefined,131});132133await writeEnvFile(cwdRoot, "WECHAT_APP_SECRET=cwd-app-secret\n");134135assert.throws(136() => loadCredentials(),137/Incomplete credential sources skipped:\n- process\.env missing WECHAT_APP_SECRET\n- <cwd>\/\.baoyu-skills\/\.env missing WECHAT_APP_ID/,138);139});140