From dbb675c65898d3dc419caadc1dd8c365ffa9990d Mon Sep 17 00:00:00 2001 From: Rogee Date: Sun, 27 Sep 2026 13:34:57 +0800 Subject: [PATCH] =?UTF-8?q?feat(web):=20=E5=BC=BA=E5=88=B6=E5=90=8C?= =?UTF-8?q?=E6=AD=A5=E6=8C=89=E9=92=AE=EF=BC=88=E5=88=97=E8=A1=A8+?= =?UTF-8?q?=E8=AF=A6=E6=83=85=EF=BC=89=EF=BC=9Btest:=20=E5=BC=BA=E5=88=B6?= =?UTF-8?q?=E5=90=8C=E6=AD=A5=E8=AF=AD=E4=B9=89=E6=96=AD=E8=A8=80=EF=BC=88?= =?UTF-8?q?force=20=E7=AB=8B=E5=8D=B3=E6=89=A7=E8=A1=8C=E5=B9=B6=E5=88=B7?= =?UTF-8?q?=E6=96=B0=20next=5Fsync=5Fat=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/creator/integration_test.go | 16 ++++++++++++++++ .../accounts/MonitoringAccountList.tsx | 2 +- web/src/pages/accounts/monitoring/$id/index.tsx | 2 +- 3 files changed, 18 insertions(+), 2 deletions(-) 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() { 编辑标签