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
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");
|
|
});
|
|
});
|