/** * @license * Copyright 2025 Google LLC * SPDX-License-Identifier: Apache-2.0 */ /** * Testing utilities for simulating 429 errors in unit tests */ let requestCounter = 0; let simulate429Enabled = false; let simulate429AfterRequests = 0; let simulate429ForAuthType: string | undefined; let fallbackOccurred = false; /** * Check if we should simulate a 429 error for the current request */ export function shouldSimulate429(authType?: string): boolean { if (!simulate429Enabled || fallbackOccurred) { return false; } // If auth type filter is set, only simulate for that auth type if (simulate429ForAuthType && authType !== simulate429ForAuthType) { return false; } requestCounter++; // If afterRequests is set, only simulate after that many requests if (simulate429AfterRequests > 0) { return requestCounter > simulate429AfterRequests; } // Otherwise, simulate for every request return true; } /** * Reset the request counter (useful for tests) */ export function resetRequestCounter(): void { requestCounter = 0; } /** * Disable 429 simulation after successful fallback */ export function disableSimulationAfterFallback(): void { fallbackOccurred = true; } /** * Create a simulated 429 error response */ export function createSimulated429Error(): Error { const error = new Error('Rate limit exceeded (simulated)') as Error & { status: number; }; error.status = 429; return error; } /** * Reset simulation state when switching auth methods */ export function resetSimulationState(): void { fallbackOccurred = false; resetRequestCounter(); } /** * Enable/disable 429 simulation programmatically (for tests) */ export function setSimulate429( enabled: boolean, afterRequests = 0, forAuthType?: string, ): void { simulate429Enabled = enabled; simulate429AfterRequests = afterRequests; simulate429ForAuthType = forAuthType; fallbackOccurred = false; // Reset fallback state when simulation is re-enabled resetRequestCounter(); }