Files
PolyWeather/frontend/components/account/__tests__/trialValueReplay.test.ts
2026-06-09 19:00:31 +08:00

97 lines
3.3 KiB
TypeScript

import fs from "node:fs";
import path from "node:path";
import { buildTrialValueReplaySummary } from "@/lib/trial-value-replay";
function assert(condition: unknown, message: string) {
if (!condition) throw new Error(message);
}
export function runTests() {
const projectRoot = process.cwd();
const replayPath = path.join(projectRoot, "lib", "trial-value-replay.ts");
const accountCenter = fs.readFileSync(
path.join(projectRoot, "components", "account", "AccountCenter.tsx"),
"utf8",
);
const dashboardSource = fs.readFileSync(
path.join(projectRoot, "components", "dashboard", "ScanTerminalDashboard.tsx"),
"utf8",
);
assert(fs.existsSync(replayPath), "trial value replay helper must exist");
const replaySource = fs.readFileSync(replayPath, "utf8");
const accountReplaySurface = `${accountCenter}\n${replaySource}`;
assert(
replaySource.includes("TRIAL_VALUE_REPLAY_STORAGE_KEY") &&
replaySource.includes("recordTrialValueReplay") &&
replaySource.includes("readTrialValueReplay") &&
replaySource.includes("buildTrialValueReplaySummary"),
"trial value replay must persist and summarize local trial usage evidence",
);
assert(
dashboardSource.includes("recordTrialValueReplay") &&
dashboardSource.includes("isTrialTerminalAccess") &&
dashboardSource.includes("selectedRow"),
"terminal trial users must record real terminal usage for later value replay",
);
assert(
accountCenter.includes("buildTrialValueReplaySummary") &&
accountCenter.includes("trialValueReplay") &&
accountReplaySurface.includes("你本次试用已经") &&
accountReplaySurface.includes("保持访问") &&
accountReplaySurface.includes("Keep access"),
"account trial upgrade trigger must replay the user's own trial value before opening checkout",
);
assert(
accountCenter.includes('trackAppEvent("paywall_feature_clicked"') &&
accountCenter.includes('feature: "trial_value_replay_upgrade"'),
"trial value replay upgrade CTA must be tracked before checkout opens",
);
const zhSummary = buildTrialValueReplaySummary(
{
firstActiveAt: "2026-06-09T00:00:00.000Z",
lastActiveAt: "2026-06-09T00:20:00.000Z",
lastCityName: "Taipei",
lastSignalLabel: "Hot",
lastUserId: "user-1",
terminalVisits: 2,
rowsAvailableMax: 50,
signalsViewed: 2,
citiesViewed: ["Taipei", "New York"],
},
{ isEn: false },
);
assert(
zhSummary.headline === "你本次试用已经查看 2 个天气信号。" &&
zhSummary.bullets.includes("已记录 2 次终端使用。") &&
zhSummary.bullets.includes("Pro 终端本次提供了 50 个城市机会。") &&
zhSummary.primaryCta === "保持访问",
"trial value replay summary must turn usage evidence into concrete upgrade copy",
);
const expirySummary = buildTrialValueReplaySummary(
{
firstActiveAt: null,
lastActiveAt: null,
lastCityName: null,
lastSignalLabel: null,
lastUserId: null,
terminalVisits: 0,
rowsAvailableMax: 0,
signalsViewed: 0,
citiesViewed: [],
},
{ isEn: false, trialExpiresAt: "2099-01-01T00:00:00.000Z" },
);
assert(
expirySummary.bullets.some((bullet) => bullet.includes("试用剩余")),
"trial value replay summary must include trial time remaining when expiry is known",
);
}