You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

119 lines
4.2 KiB

import { readFileSync, existsSync } from "node:fs";
import { join } from "node:path";
import { describe, expect, it } from "vitest";
import {
DEFAULT_FLOCK_QUOTE_URL,
formatFlockRecordingChecklist,
} from "@/workers/rpa/flock/demo-input";
import {
formatFlockLoggedInRecordingChecklist,
parseFlockRecordArgs,
resolveFlockOutputBasename,
resolveFlockStoragePath,
} from "@/scripts/record-flock";
const SH_PATH = join(process.cwd(), "scripts", "record-flock.sh");
const TS_PATH = join(process.cwd(), "scripts", "record-flock.ts");
const VISUAL_PATH = join(process.cwd(), "scripts", "visual-flock-human-assist.ts");
const SOP_PATH = join(process.cwd(), "docs", "rpa-flock-logged-in-sop.md");
describe("record-flock scripts", () => {
it("record-flock.sh 存在且包含 codegen + logged-in", () => {
expect(existsSync(SH_PATH)).toBe(true);
const content = readFileSync(SH_PATH, "utf8");
expect(content).toContain("codegen");
expect(content).toContain("get-a-quote");
expect(content).toContain("--logged-in");
expect(content).toContain("flock-logged-in");
});
it("record-flock.ts 存在且包含 headed 与 canonical 路径", () => {
expect(existsSync(TS_PATH)).toBe(true);
const content = readFileSync(TS_PATH, "utf8");
expect(content).toContain("codegen");
expect(content).toContain("FLOCK_CANONICAL_PATHS");
expect(content).toContain("DEFAULT_FLOCK_QUOTE_URL");
expect(content).toContain("--logged-in");
expect(content).toContain("flock-logged-in-");
expect(content).toContain("flock-logged-in-storage.json");
});
it("登录后 SOP 存在", () => {
expect(existsSync(SOP_PATH)).toBe(true);
const content = readFileSync(SOP_PATH, "utf8");
expect(content).toContain("flock-logged-in-");
expect(content).toContain("Let's build a quote");
});
it("visual-flock-human-assist 含分步 pause", () => {
expect(existsSync(VISUAL_PATH)).toBe(true);
const content = readFileSync(VISUAL_PATH, "utf8");
expect(content).toContain("page.pause");
expect(content).toContain("flock-human-");
});
it("录制清单包含关键步骤", () => {
const text = formatFlockRecordingChecklist({
pickupDateDisplay: "07/14/2026",
pickupZip: "90001",
deliveryZip: "75201",
palletCount: 6,
totalWeightLb: 3500,
lengthIn: 48,
widthIn: 40,
heightIn: 48,
});
expect(text).toContain("Next");
expect(text).toContain("Create your free account");
expect(text).toContain("Complete your order");
});
it("登录后清单提示手动粘贴账密与 Generate my quote", () => {
const text = formatFlockLoggedInRecordingChecklist();
expect(text).toContain("FLOCK_LOGIN_EMAIL");
expect(text).toContain("Generate my quote");
expect(text).toContain("90001");
});
});
describe("parseFlockRecordArgs / storage 隔离", () => {
it("默认匿名;--logged-in / --login 切换模式", () => {
expect(parseFlockRecordArgs(["node", "record-flock.ts"]).mode).toBe(
"anonymous",
);
expect(
parseFlockRecordArgs(["node", "record-flock.ts", "--logged-in"]).mode,
).toBe("logged-in");
expect(
parseFlockRecordArgs(["node", "record-flock.ts", "--login"]).mode,
).toBe("logged-in");
});
it("解析起始 URL 与 help / list", () => {
const withUrl = parseFlockRecordArgs([
"node",
"x",
"--logged-in",
"https://app.flockfreight.com/login",
]);
expect(withUrl.mode).toBe("logged-in");
expect(withUrl.startUrl).toBe("https://app.flockfreight.com/login");
expect(parseFlockRecordArgs(["node", "x", "-h"]).help).toBe(true);
expect(parseFlockRecordArgs(["node", "x", "list"]).list).toBe(true);
});
it("登录态产物前缀与 storage 路径隔离", () => {
expect(resolveFlockOutputBasename("logged-in", "20260715-120000")).toBe(
"flock-logged-in-20260715-120000.js",
);
expect(resolveFlockOutputBasename("anonymous", "20260715-120000")).toBe(
"flock-manual-20260715-120000.js",
);
expect(resolveFlockStoragePath("logged-in")).toContain(
"flock-logged-in-storage.json",
);
expect(resolveFlockStoragePath("anonymous")).toContain("flock-storage.json");
expect(DEFAULT_FLOCK_QUOTE_URL).toContain("get-a-quote");
});
});