feat(web): 强制同步按钮(列表+详情);test: 强制同步语义断言(force 立即执行并刷新 next_sync_at)
douyin-release-gate / verify (push) Failing after 3m1s
douyin-release-gate / verify (push) Failing after 3m1s
This commit is contained in:
@@ -304,6 +304,22 @@ func TestCreatorPostgresContentAndWorkflow(t *testing.T) {
|
||||
if due, err := store.ListDueCompetitors(ctx, dueNow); err != nil || len(due) != 0 {
|
||||
t.Fatalf("blocked competitor must not fire before retry time: due=%+v err=%v", due, err)
|
||||
}
|
||||
// 强制同步语义:next_sync_at 未到期时 force claim 仍立即执行;完成后 MarkCompetitorSync 刷新 next_sync_at。
|
||||
if _, claimed, err := store.ClaimCompetitorSync(ctx, competitor.ID, false, dueNow); err != nil || claimed {
|
||||
t.Fatalf("non-forced claim must wait for next_sync_at: claimed=%v err=%v", claimed, err)
|
||||
}
|
||||
forceToken, forceClaimed, err := store.ClaimCompetitorSync(ctx, competitor.ID, true, dueNow)
|
||||
if err != nil || !forceClaimed {
|
||||
t.Fatalf("forced claim must run before next_sync_at: err=%v claimed=%v", err, forceClaimed)
|
||||
}
|
||||
forceNext := dueNow.Add(30 * time.Minute)
|
||||
if err := store.MarkCompetitorSync(ctx, competitor.ID, forceToken, "idle", "", "", &forceNext); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
// Postgres timestamp 微秒精度会截断纳秒,比较用秒级容差。
|
||||
if refreshed, err := store.GetCompetitor(ctx, competitor.ID); err != nil || refreshed.NextSyncAt == nil || refreshed.NextSyncAt.Sub(forceNext).Abs() > time.Second {
|
||||
t.Fatalf("forced sync must refresh next_sync_at: next=%v err=%v", refreshed.NextSyncAt, err)
|
||||
}
|
||||
work, inserted, err = store.UpsertWork(ctx, WorkInput{Platform: PlatformDouyin, WorkKey: workKey, SourceType: SourceCompetitor, SourceID: competitor.ID, Title: "", Body: "", PublishedAt: nil, Likes: nil, CommentsCount: nil, Shares: nil}, now)
|
||||
if err != nil || inserted || len(work.Sources) != 2 {
|
||||
t.Fatalf("work source association was not retained: work=%+v inserted=%v err=%v", work, inserted, err)
|
||||
|
||||
@@ -198,7 +198,7 @@ export default function MonitoringAccountList() {
|
||||
编辑标签
|
||||
</Button>
|
||||
<Button size="small" disabled={actionBusy === row.id} onClick={() => syncCompetitor(row)}>
|
||||
同步
|
||||
强制同步
|
||||
</Button>
|
||||
<Button size="small" disabled={actionBusy === row.id} onClick={() => toggleCompetitor(row)}>
|
||||
{row.enabled ? '暂停' : '恢复'}
|
||||
|
||||
@@ -149,7 +149,7 @@ export default function Page() {
|
||||
}
|
||||
}}
|
||||
>
|
||||
立即同步
|
||||
强制同步
|
||||
</Button>
|
||||
<Button
|
||||
type="primary"
|
||||
|
||||
Reference in New Issue
Block a user