|
1 | 1 | import { beforeEach, describe, expect, it, vi } from "vitest" |
2 | 2 |
|
| 3 | +const { getCurrentRendererManifestMock } = vi.hoisted(() => ({ |
| 4 | + getCurrentRendererManifestMock: vi.fn<() => null | { runtimeVersion: string; version: string }>( |
| 5 | + () => null, |
| 6 | + ), |
| 7 | +})) |
| 8 | + |
3 | 9 | vi.mock("@follow/shared/env.desktop", () => ({ |
4 | 10 | env: { |
5 | 11 | VITE_OTA_URL: "https://ota.folo.is", |
@@ -27,12 +33,30 @@ vi.mock("../env", () => ({ |
27 | 33 | })) |
28 | 34 |
|
29 | 35 | vi.mock("~/updater/hot-updater", () => ({ |
30 | | - getCurrentRendererManifest: () => null, |
| 36 | + getCurrentRendererManifest: getCurrentRendererManifestMock, |
| 37 | + isRendererManifestUsable: ( |
| 38 | + manifest: { runtimeVersion?: string; version?: string } | null, |
| 39 | + input: { appVersion: string; runtimeVersion: string }, |
| 40 | + ) => { |
| 41 | + if (!manifest?.runtimeVersion || manifest.runtimeVersion !== input.runtimeVersion) { |
| 42 | + return false |
| 43 | + } |
| 44 | + |
| 45 | + const manifestVersion = manifest.version?.split("-")[0] |
| 46 | + const appVersion = input.appVersion?.split("-")[0] |
| 47 | + |
| 48 | + if (!manifestVersion || !appVersion) { |
| 49 | + return false |
| 50 | + } |
| 51 | + |
| 52 | + return manifestVersion >= appVersion |
| 53 | + }, |
31 | 54 | })) |
32 | 55 |
|
33 | 56 | describe("desktop updater api", () => { |
34 | 57 | beforeEach(() => { |
35 | 58 | vi.stubGlobal("fetch", vi.fn()) |
| 59 | + getCurrentRendererManifestMock.mockReturnValue(null) |
36 | 60 | }) |
37 | 61 |
|
38 | 62 | it("returns null when desktop manifest responds 204", async () => { |
@@ -90,6 +114,27 @@ describe("desktop updater api", () => { |
90 | 114 | expect(result?.app).toBeNull() |
91 | 115 | }) |
92 | 116 |
|
| 117 | + it("falls back to the app version when the cached renderer manifest is stale", async () => { |
| 118 | + getCurrentRendererManifestMock.mockReturnValue({ |
| 119 | + runtimeVersion: "1.6.0", |
| 120 | + version: "0.6.4", |
| 121 | + }) |
| 122 | + |
| 123 | + vi.mocked(fetch).mockResolvedValue(new Response(null, { status: 204 })) |
| 124 | + |
| 125 | + const { fetchDesktopManifest } = await import("./api") |
| 126 | + await fetchDesktopManifest() |
| 127 | + |
| 128 | + expect(fetch).toHaveBeenCalledWith( |
| 129 | + new URL("/manifest", "https://ota.folo.is"), |
| 130 | + expect.objectContaining({ |
| 131 | + headers: expect.objectContaining({ |
| 132 | + "X-App-Renderer-Version": "1.5.0", |
| 133 | + }), |
| 134 | + }), |
| 135 | + ) |
| 136 | + }) |
| 137 | + |
93 | 138 | it("parses desktop policy responses", async () => { |
94 | 139 | vi.mocked(fetch).mockResolvedValue( |
95 | 140 | new Response( |
|
0 commit comments