diff --git a/src/currency.ts b/src/currency.ts index 1e9fae1d..f084546a 100644 --- a/src/currency.ts +++ b/src/currency.ts @@ -114,6 +114,11 @@ async function getExchangeRate(code: string): Promise { const cached = await loadCachedRate(code) if (cached) return cached + // Test-only escape hatch, set for the whole suite in + // tests/setup/env-isolation.ts: skip the live Frankfurter fetch so a real FX + // move can't shift assertions. Same fallback an unreachable network gets. + if (process.env['CODEBURN_FX_NO_FETCH']) return 1 + let rate: number try { rate = await fetchRate(code) diff --git a/tests/setup/env-isolation.ts b/tests/setup/env-isolation.ts index 42f2aeba..6a3326ec 100644 --- a/tests/setup/env-isolation.ts +++ b/tests/setup/env-isolation.ts @@ -110,6 +110,9 @@ function applyIsolation(): void { // fetches the live upstream table, so a mid-week reprice by a provider turns // pricing assertions red with no local change. process.env['CODEBURN_PRICING_SNAPSHOT_ONLY'] = '1' + // Same for FX: skip the live Frankfurter fetch and fall back to the + // USD-equivalent rate unless a test seeds its own exchange-rate.json cache. + process.env['CODEBURN_FX_NO_FETCH'] = '1' // Pin the timezone so date grouping is deterministic regardless of the dev's // shell TZ. Clearing it is not enough (Node falls back to the OS zone); a // non-UTC TZ would otherwise shift day buckets versus a clean CI runner. A