2025-06-07 22:04:57 -07:00
/ * *
* @license
* Copyright 2025 Google LLC
* SPDX - License - Identifier : Apache - 2.0
* /
import { describe , it , expect } from 'vitest' ;
import { parseAndFormatApiError } from './errorParsing.js' ;
2025-06-23 17:30:13 -04:00
import { StructuredError } from '@gemini-cli/core' ;
2025-06-07 22:04:57 -07:00
describe ( 'parseAndFormatApiError' , ( ) = > {
2025-06-23 17:30:13 -04:00
const rateLimitMessage =
'Please wait and try again later. To increase your limits, upgrade to a plan with higher limits, or use /auth to switch to using a paid API key from AI Studio at https://aistudio.google.com/apikey' ;
2025-06-07 22:04:57 -07:00
it ( 'should format a valid API error JSON' , ( ) = > {
const errorMessage =
'got status: 400 Bad Request. {"error":{"code":400,"message":"API key not valid. Please pass a valid API key.","status":"INVALID_ARGUMENT"}}' ;
const expected =
2025-06-23 17:30:13 -04:00
'[API Error: API key not valid. Please pass a valid API key. (Status: INVALID_ARGUMENT)]' ;
expect ( parseAndFormatApiError ( errorMessage ) ) . toBe ( expected ) ;
} ) ;
it ( 'should format a 429 API error JSON with the custom message' , ( ) = > {
const errorMessage =
'got status: 429 Too Many Requests. {"error":{"code":429,"message":"Rate limit exceeded","status":"RESOURCE_EXHAUSTED"}}' ;
const expected = ` [API Error: Rate limit exceeded (Status: RESOURCE_EXHAUSTED)] \ n ${ rateLimitMessage } ` ;
2025-06-07 22:04:57 -07:00
expect ( parseAndFormatApiError ( errorMessage ) ) . toBe ( expected ) ;
} ) ;
it ( 'should return the original message if it is not a JSON error' , ( ) = > {
const errorMessage = 'This is a plain old error message' ;
2025-06-23 17:30:13 -04:00
expect ( parseAndFormatApiError ( errorMessage ) ) . toBe (
` [API Error: ${ errorMessage } ] ` ,
) ;
2025-06-07 22:04:57 -07:00
} ) ;
it ( 'should return the original message for malformed JSON' , ( ) = > {
const errorMessage = '[Stream Error: {"error": "malformed}' ;
2025-06-23 17:30:13 -04:00
expect ( parseAndFormatApiError ( errorMessage ) ) . toBe (
` [API Error: ${ errorMessage } ] ` ,
) ;
2025-06-07 22:04:57 -07:00
} ) ;
it ( 'should handle JSON that does not match the ApiError structure' , ( ) = > {
const errorMessage = '[Stream Error: {"not_an_error": "some other json"}]' ;
2025-06-23 17:30:13 -04:00
expect ( parseAndFormatApiError ( errorMessage ) ) . toBe (
` [API Error: ${ errorMessage } ] ` ,
) ;
2025-06-07 22:04:57 -07:00
} ) ;
it ( 'should format a nested API error' , ( ) = > {
const nestedErrorMessage = JSON . stringify ( {
error : {
code : 429 ,
message :
"Gemini 2.5 Pro Preview doesn't have a free quota tier. For more information on this error, head to: https://ai.google.dev/gemini-api/docs/rate-limits." ,
status : 'RESOURCE_EXHAUSTED' ,
} ,
} ) ;
const errorMessage = JSON . stringify ( {
error : {
code : 429 ,
message : nestedErrorMessage ,
status : 'Too Many Requests' ,
} ,
} ) ;
2025-06-23 17:30:13 -04:00
const expected = ` [API Error: Gemini 2.5 Pro Preview doesn't have a free quota tier. For more information on this error, head to: https://ai.google.dev/gemini-api/docs/rate-limits. (Status: Too Many Requests)] \ n ${ rateLimitMessage } ` ;
expect ( parseAndFormatApiError ( errorMessage ) ) . toBe ( expected ) ;
} ) ;
it ( 'should format a StructuredError' , ( ) = > {
const error : StructuredError = {
message : 'A structured error occurred' ,
status : 500 ,
} ;
const expected = '[API Error: A structured error occurred]' ;
expect ( parseAndFormatApiError ( error ) ) . toBe ( expected ) ;
} ) ;
it ( 'should format a 429 StructuredError with the custom message' , ( ) = > {
const error : StructuredError = {
message : 'Rate limit exceeded' ,
status : 429 ,
} ;
const expected = ` [API Error: Rate limit exceeded] \ n ${ rateLimitMessage } ` ;
expect ( parseAndFormatApiError ( error ) ) . toBe ( expected ) ;
} ) ;
it ( 'should handle an unknown error type' , ( ) = > {
const error = 12345 ;
const expected = '[API Error: An unknown error occurred.]' ;
expect ( parseAndFormatApiError ( error ) ) . toBe ( expected ) ;
2025-06-07 22:04:57 -07:00
} ) ;
} ) ;