Skip to content

Commit 70637df

Browse files
author
=
committed
retest
1 parent 8028431 commit 70637df

2 files changed

Lines changed: 6 additions & 18 deletions

File tree

src/services/queue-trends.ts

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -88,15 +88,16 @@ function buildWindow(windowDays: 7 | 14 | 30, totals: RepoGithubTotalsSnapshotRe
8888
const targetMs = latestMs - windowDays * 24 * 60 * 60 * 1000;
8989
const baseline = [...totals].reverse().find((snapshot) => Date.parse(snapshot.fetchedAt) <= targetMs);
9090
if (!baseline) return unavailableWindow(windowDays, `Need at least ${windowDays} days of totals history.`);
91-
const observedDays = Math.max(0, round((latestMs - Date.parse(baseline.fetchedAt)) / (24 * 60 * 60 * 1000)));
91+
// Baseline is the newest snapshot at or before (latest - windowDays), so observedDays is always >= windowDays.
92+
const observedDays = round((latestMs - Date.parse(baseline.fetchedAt)) / (24 * 60 * 60 * 1000));
9293
const mergedPullRequests = Math.max(0, latest.mergedPullRequestsTotal - baseline.mergedPullRequestsTotal);
9394
const closedUnmergedPullRequests = Math.max(0, latest.closedUnmergedPullRequestsTotal - baseline.closedUnmergedPullRequestsTotal);
9495
const latestQueue = latestQueuePoint(queuePoints);
9596
const baselineQueue = latestQueue ? baselineQueuePoint(queuePoints, latestQueue.generatedAt, windowDays) : null;
9697
const stalePullRequestRate = latestQueue ? staleRate(latestQueue) : null;
9798
const baselineStaleRate = baselineQueue ? staleRate(baselineQueue) : null;
9899
const duplicateTrend = latestQueue && baselineQueue ? latestQueue.collisionClusters - baselineQueue.collisionClusters : null;
99-
const reviewVelocityPerDay = computeReviewVelocityPerDay(mergedPullRequests, closedUnmergedPullRequests, observedDays);
100+
const reviewVelocityPerDay = round((mergedPullRequests + closedUnmergedPullRequests) / observedDays);
100101
const pullRequestGrowth = latest.openPullRequestsTotal - baseline.openPullRequestsTotal;
101102
return {
102103
windowDays,
@@ -112,16 +113,10 @@ function buildWindow(windowDays: 7 | 14 | 30, totals: RepoGithubTotalsSnapshotRe
112113
stalePullRequestRate,
113114
stalePullRequestRateDelta: stalePullRequestRate !== null && baselineStaleRate !== null ? round(stalePullRequestRate - baselineStaleRate) : null,
114115
duplicateTrend,
115-
summary: `${windowDays}d trend: PR queue ${signed(pullRequestGrowth)}, review velocity ${reviewVelocityPerDay === null ? "n/a" : `${reviewVelocityPerDay}/day`}.`,
116+
summary: `${windowDays}d trend: PR queue ${signed(pullRequestGrowth)}, review velocity ${reviewVelocityPerDay}/day.`,
116117
};
117118
}
118119

119-
/** Returns null when the observation window spans zero days (avoids divide-by-zero / fabricated velocity). */
120-
export function computeReviewVelocityPerDay(mergedPullRequests: number, closedUnmergedPullRequests: number, observedDays: number): number | null {
121-
if (observedDays === 0) return null;
122-
return round((mergedPullRequests + closedUnmergedPullRequests) / observedDays);
123-
}
124-
125120
function trendWarnings(windows: QueueTrendWindow[]): string[] {
126121
const warnings: string[] = [];
127122
for (const window of windows.filter((entry) => entry.status === "ready")) {

test/unit/queue-trends.test.ts

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { describe, expect, it } from "vitest";
22
import { getRepoQueueTrendSnapshot, persistRepoGithubTotalsSnapshot, persistSignalSnapshot, upsertPullRequestFromGitHub, upsertRepositoryFromGitHub } from "../../src/db/repositories";
33
import { generateSignalSnapshots } from "../../src/queue/processors";
4-
import { buildQueueTrendReport, buildUnavailableQueueTrendReport, computeReviewVelocityPerDay, type QueueTrendReport } from "../../src/services/queue-trends";
4+
import { buildQueueTrendReport, buildUnavailableQueueTrendReport, type QueueTrendReport } from "../../src/services/queue-trends";
55
import type { RepoGithubTotalsSnapshotRecord } from "../../src/types";
66
import { createTestEnv } from "../helpers/d1";
77

@@ -70,9 +70,7 @@ describe("queue trend windows", () => {
7070
for (const window of report.windows.filter((entry) => entry.status === "ready")) {
7171
expect(window.reviewVelocityPerDay).not.toBe(Infinity);
7272
expect(window.summary).not.toContain("Infinity");
73-
if (window.reviewVelocityPerDay !== null) {
74-
expect(Number.isFinite(window.reviewVelocityPerDay)).toBe(true);
75-
}
73+
expect(Number.isFinite(window.reviewVelocityPerDay)).toBe(true);
7674
}
7775
expect(report.windows[0]).toMatchObject({
7876
windowDays: 7,
@@ -83,11 +81,6 @@ describe("queue trend windows", () => {
8381
});
8482
});
8583

86-
it("returns null review velocity when observedDays is zero", () => {
87-
expect(computeReviewVelocityPerDay(7, 3, 0)).toBeNull();
88-
expect(computeReviewVelocityPerDay(7, 3, 7)).toBe(1.43);
89-
});
90-
9184
it("returns clear unavailable windows when history is missing", () => {
9285
const report = buildQueueTrendReport({ repoFullName: "owner/repo", totalsSnapshots: [totals(0, { openIssues: 1, openPrs: 1, merged: 0, closed: 0 })] });
9386
expect(report).toMatchObject({

0 commit comments

Comments
 (0)