@@ -214,3 +214,63 @@ func TestOpsErrorLoggerMiddleware_DoesNotBreakOuterMiddlewares(t *testing.T) {
214214 })
215215 require .Equal (t , http .StatusNoContent , rec .Code )
216216}
217+
218+ func TestIsKnownOpsErrorType (t * testing.T ) {
219+ known := []string {
220+ "invalid_request_error" ,
221+ "authentication_error" ,
222+ "rate_limit_error" ,
223+ "billing_error" ,
224+ "subscription_error" ,
225+ "upstream_error" ,
226+ "overloaded_error" ,
227+ "api_error" ,
228+ "not_found_error" ,
229+ "forbidden_error" ,
230+ }
231+ for _ , k := range known {
232+ require .True (t , isKnownOpsErrorType (k ), "expected known: %s" , k )
233+ }
234+
235+ unknown := []string {"<nil>" , "null" , "" , "random_error" , "some_new_type" , "<nil>\u003e " }
236+ for _ , u := range unknown {
237+ require .False (t , isKnownOpsErrorType (u ), "expected unknown: %q" , u )
238+ }
239+ }
240+
241+ func TestNormalizeOpsErrorType (t * testing.T ) {
242+ tests := []struct {
243+ name string
244+ errType string
245+ code string
246+ want string
247+ }{
248+ // Known types pass through.
249+ {"known invalid_request_error" , "invalid_request_error" , "" , "invalid_request_error" },
250+ {"known rate_limit_error" , "rate_limit_error" , "" , "rate_limit_error" },
251+ {"known upstream_error" , "upstream_error" , "" , "upstream_error" },
252+
253+ // Unknown/garbage types are rejected and fall through to code-based or default.
254+ {"nil literal from upstream" , "<nil>" , "" , "api_error" },
255+ {"null string" , "null" , "" , "api_error" },
256+ {"random string" , "something_weird" , "" , "api_error" },
257+
258+ // Unknown type but known code still maps correctly.
259+ {"nil with INSUFFICIENT_BALANCE code" , "<nil>" , "INSUFFICIENT_BALANCE" , "billing_error" },
260+ {"nil with USAGE_LIMIT_EXCEEDED code" , "<nil>" , "USAGE_LIMIT_EXCEEDED" , "subscription_error" },
261+
262+ // Empty type falls through to code-based mapping.
263+ {"empty type with balance code" , "" , "INSUFFICIENT_BALANCE" , "billing_error" },
264+ {"empty type with subscription code" , "" , "SUBSCRIPTION_NOT_FOUND" , "subscription_error" },
265+ {"empty type no code" , "" , "" , "api_error" },
266+
267+ // Known type overrides conflicting code-based mapping.
268+ {"known type overrides conflicting code" , "rate_limit_error" , "INSUFFICIENT_BALANCE" , "rate_limit_error" },
269+ }
270+ for _ , tt := range tests {
271+ t .Run (tt .name , func (t * testing.T ) {
272+ got := normalizeOpsErrorType (tt .errType , tt .code )
273+ require .Equal (t , tt .want , got )
274+ })
275+ }
276+ }
0 commit comments