|
1 | 1 | // Release Beta Verifier tests cover release beta verifier script behavior. |
2 | | -import { describe, expect, it } from "vitest"; |
| 2 | +import { afterEach, describe, expect, it, vi } from "vitest"; |
3 | 3 | import { |
| 4 | +fetchStatusWithRetry, |
4 | 5 | parseNpmViewFields, |
5 | 6 | parseReleaseVerifyBetaArgs, |
6 | 7 | readBoundedJsonResponse, |
7 | 8 | runNpmViewWithRetry, |
8 | 9 | } from "../../scripts/lib/release-beta-verifier.ts"; |
9 | 10 | |
| 11 | +afterEach(() => { |
| 12 | +vi.unstubAllGlobals(); |
| 13 | +vi.useRealTimers(); |
| 14 | +}); |
| 15 | + |
10 | 16 | describe("parseReleaseVerifyBetaArgs", () => { |
11 | 17 | it("defaults beta verification to the matching tag and repo", () => { |
12 | 18 | expect(parseReleaseVerifyBetaArgs(["2026.5.10-beta.3"])).toEqual({ |
@@ -152,6 +158,46 @@ describe("runNpmViewWithRetry", () => {
|
152 | 158 | }); |
153 | 159 | }); |
154 | 160 | |
| 161 | +describe("fetchStatusWithRetry", () => { |
| 162 | +it("cancels retryable and returned GET response bodies", async () => { |
| 163 | +vi.useFakeTimers(); |
| 164 | +const canceled: string[] = []; |
| 165 | +const responses = [ |
| 166 | +new Response( |
| 167 | +new ReadableStream<Uint8Array>({ |
| 168 | +cancel() { |
| 169 | +canceled.push("retry"); |
| 170 | +}, |
| 171 | +}), |
| 172 | +{ status: 500 }, |
| 173 | +), |
| 174 | +new Response( |
| 175 | +new ReadableStream<Uint8Array>({ |
| 176 | +cancel() { |
| 177 | +canceled.push("final"); |
| 178 | +}, |
| 179 | +}), |
| 180 | +{ status: 200 }, |
| 181 | +), |
| 182 | +]; |
| 183 | +const fetchImpl = vi.fn(async () => { |
| 184 | +const response = responses.shift(); |
| 185 | +if (!response) { |
| 186 | +throw new Error("unexpected fetch call"); |
| 187 | +} |
| 188 | +return response; |
| 189 | +}); |
| 190 | +vi.stubGlobal("fetch", fetchImpl); |
| 191 | + |
| 192 | +const status = fetchStatusWithRetry("https://clawhub.test/api/v1/package", "GET"); |
| 193 | +await vi.advanceTimersByTimeAsync(1000); |
| 194 | + |
| 195 | +await expect(status).resolves.toBe(200); |
| 196 | +expect(canceled).toEqual(["retry", "final"]); |
| 197 | +expect(fetchImpl).toHaveBeenCalledTimes(2); |
| 198 | +}); |
| 199 | +}); |
| 200 | + |
155 | 201 | describe("readBoundedJsonResponse", () => { |
156 | 202 | it("parses JSON bodies within the release verifier limit", async () => { |
157 | 203 | await expect( |
|