diff --git a/internal/creator/integration_test.go b/internal/creator/integration_test.go index 2ae0764..4bf1434 100644 --- a/internal/creator/integration_test.go +++ b/internal/creator/integration_test.go @@ -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) diff --git a/web/src/components/accounts/MonitoringAccountList.tsx b/web/src/components/accounts/MonitoringAccountList.tsx index 429907c..fb41e7c 100644 --- a/web/src/components/accounts/MonitoringAccountList.tsx +++ b/web/src/components/accounts/MonitoringAccountList.tsx @@ -198,7 +198,7 @@ export default function MonitoringAccountList() { 编辑标签