Files
koc-loop/tests/task-center-stage.test.mjs
ABAPPLO 87f4d4066d feat: KOC详情弹窗 + 任务中心单入口改版 + 资源池默认合作方/采集兜底
KOC 详情弹窗(合作方/数据回收/工作台三处入口):
- 新增 KocDetailModal:基本信息 / 绑定KOC账号画像 / 参与任务记录 / 履约漏斗
- 工作台最近分发、回收队列账号名、截图回收合作方名、合作方页名称、分发详情头部合作方均可点开
- 分发表行点击仍打开分发详情(stopPropagation 隔离)

任务中心单入口改版(对齐"单任务双阶段"模型):
- 任务卡发布/回收面板整块可点,全卡仅保留一个「查看明细」,回收面板重复按钮移除
- 详情页自述身份:动态 label(任务详情·分发与回收一体/仅分发)+ 阶段徽章(含回收·截止/未开通回收)
- 内容分发表新增阶段筛选 chips(全部/待发布/已发布待数据/待收截图,未开通回收不显示截图项),筛选落空给专用空态文案
- 数据回收页入口文案改为「选择一个任务进入回收队列」,全站不再区分发布/回收两种任务类型

资源池 KOC 默认加入合作方 + 采集兜底:
- partners 新增 released_account_id(mysql/0023):显式解绑/被顶替的账号不再被默认合作方同步回填
- 任务未设置采集计划时,默认按发布时间起连续采集 7 天,等待文案显示「等待D1 · 默认7天」
2026-10-12 11:11:31 +08:00

58 lines
3.0 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import { strict as assert } from "node:assert";
import { readFileSync } from "node:fs";
import test from "node:test";
const adminApp = readFileSync(new URL("../app/admin-app.tsx", import.meta.url), "utf8");
const adminCss = readFileSync(new URL("../app/globals.css", import.meta.url), "utf8");
test("任务卡单一入口:发布/回收面板整块可点,全卡只有一个「查看明细」", () => {
const start = adminApp.indexOf("function TaskRowCard");
const end = adminApp.indexOf("function TasksPage");
const body = adminApp.slice(start, end);
// 两块阶段面板都可整块点击进入任务明细
assert.match(body, /className="master-panel publish clickable"/);
assert.match(body, /className="master-panel recovery clickable"/);
// 回收面板不再有独立的「查看明细」按钮:全卡仅一处
assert.equal(body.match(/查看明细/g)?.length, 1);
// 未开通回收的面板保持不可点、保留开通入口
assert.match(body, /className="master-panel ghost"/);
assert.match(body, /开通回收 ›/);
});
test("详情页自述身份:动态 label 说明任务阶段构成", () => {
assert.match(adminApp, /任务详情 · 分发与回收一体/);
assert.match(adminApp, /任务详情 · 仅分发/);
// 头部阶段徽章:含回收(带截止日或同日说明)/ 未开通回收
assert.match(adminApp, /未开通回收"\s*: task\.recovery_due_at/);
assert.match(adminApp, /含回收 · 回收截止 \$\{formatDate\(task\.recovery_due_at\)\}/);
assert.match(adminApp, /含回收 · 与发布同日截止/);
});
test("单一列表按阶段筛选:不拆两套列表,用筛选 chips 过滤生命周期阶段", () => {
const start = adminApp.indexOf("function TaskDistributionDetail");
const end = adminApp.indexOf("\nfunction ", start + 20);
const body = adminApp.slice(start, end);
assert.match(body, /const \[stageFilter, setStageFilter\] = useState<StageFilterKey>\("all"\);/);
assert.match(body, /key: "pending_publish",\s*\n\s*label: "待发布"/);
assert.match(body, /label: "已发布待数据"/);
assert.match(body, /label: "待收截图"/);
// 待收截图仅在开通回收的任务出现
assert.match(body, /\.\.\.\(recoveryEnabled\s*\?\s*\[\{/);
// 表格使用过滤后的列表;筛选落空时给出专用空态文案
assert.match(body, /distributions=\{visibleDistributions\}/);
assert.match(body, /当前筛选下没有分发记录/);
assert.match(body, /stage-filter-tabs/);
});
test("阶段面板与筛选 chips 的样式", () => {
assert.match(adminCss, /^\.master-panel\.clickable \{/m);
assert.match(adminCss, /^\.master-panel\.clickable:hover \{/m);
assert.match(adminCss, /^\.stage-filter-tabs \{/m);
assert.match(adminCss, /^\.stage-filter-tabs button\.active \{/m);
});
test("数据回收页入口不再使用「数据回收任务」的说法", () => {
assert.match(adminApp, /选择一个任务进入回收队列/);
assert.doesNotMatch(adminApp, /选择一个数据回收任务/);
});