From b600b5fcef973273d23b273c3e96b771b0af287a Mon Sep 17 00:00:00 2001 From: Sheebazz Date: Wed, 2 Sep 2026 19:30:46 +0000 Subject: [PATCH] fix: remove duplicate score history and webhook triggers Closes #531 --- src/__tests__/scoreUpdateCron.test.ts | 13 ++++++++++++- src/lib/scoreUpdateCron.ts | 13 ------------- 2 files changed, 12 insertions(+), 14 deletions(-) diff --git a/src/__tests__/scoreUpdateCron.test.ts b/src/__tests__/scoreUpdateCron.test.ts index 1bdb80e..83ec442 100644 --- a/src/__tests__/scoreUpdateCron.test.ts +++ b/src/__tests__/scoreUpdateCron.test.ts @@ -74,6 +74,8 @@ jest.mock("../config", () => ({ }, })); +import { recordScoreHistory } from "../lib/history"; +import { triggerWebhooks } from "../lib/webhooks"; import { runHourlyScoreUpdate } from "../lib/scoreUpdateCron"; import { getTotalProjects, updateImpactScore, RpcDegradedError } from "../lib/registry"; import { getSolarData } from "../lib/iot"; @@ -168,4 +170,13 @@ describe("runHourlyScoreUpdate (cron job execution flow)", () => { expect(markFailed).not.toHaveBeenCalled(); expect(recordCronRun).toHaveBeenCalledWith("score-update", "success"); }); -}); + + it("invokes recordScoreHistory and triggerWebhooks exactly once per successful update (Issue #531)", async () => { + (getTotalProjects as jest.Mock).mockResolvedValue(1); + + await runHourlyScoreUpdate(); + + expect(recordScoreHistory).toHaveBeenCalledTimes(1); + expect(triggerWebhooks).toHaveBeenCalledTimes(1); + }); +}); \ No newline at end of file diff --git a/src/lib/scoreUpdateCron.ts b/src/lib/scoreUpdateCron.ts index cc71cb0..8c0c489 100644 --- a/src/lib/scoreUpdateCron.ts +++ b/src/lib/scoreUpdateCron.ts @@ -74,19 +74,6 @@ export async function runHourlyScoreUpdate(): Promise { }); } const timestamp = Date.now(); - recordScoreHistory( - projectId, - scoreResult.creditQuality, - scoreResult.greenImpact, - timestamp, - ); - triggerWebhooks({ - project_id: projectId, - credit_quality: scoreResult.creditQuality, - green_impact: scoreResult.greenImpact, - tx_hash: scoreResult.txHash, - timestamp, - }); broadcastScoreUpdate({ project_id: projectId, credit_quality: scoreResult.creditQuality,