-
-
Notifications
You must be signed in to change notification settings - Fork 5
Expand file tree
/
Copy patherrors.test.ts
More file actions
151 lines (131 loc) 路 4.78 KB
/
Copy patherrors.test.ts
File metadata and controls
151 lines (131 loc) 路 4.78 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
// Copyright 2023-present Eser Ozvataf and other contributors. All rights reserved. Apache-2.0 license.
import { describe, it } from "@std/testing/bdd";
import { assertEquals, assertInstanceOf } from "@std/assert";
import * as errorsModule from "./errors.ts";
describe("AiError hierarchy", () => {
it("should create a base AiError", () => {
const err = new errorsModule.AiError("test error", {
provider: "openai",
statusCode: 500,
});
assertInstanceOf(err, Error);
assertInstanceOf(err, errorsModule.AiError);
assertEquals(err.message, "test error");
assertEquals(err.provider, "openai");
assertEquals(err.statusCode, 500);
});
it("should default provider and statusCode to null", () => {
const err = new errorsModule.AiError("test");
assertEquals(err.provider, null);
assertEquals(err.statusCode, null);
});
it("should create RateLimitedError", () => {
const err = new errorsModule.RateLimitedError("too many requests", {
provider: "anthropic",
});
assertInstanceOf(err, errorsModule.AiError);
assertInstanceOf(err, errorsModule.RateLimitedError);
assertEquals(err.statusCode, 429);
});
it("should create AuthFailedError", () => {
const err = new errorsModule.AuthFailedError("bad key");
assertInstanceOf(err, errorsModule.AuthFailedError);
assertEquals(err.statusCode, 401);
});
it("should create InsufficientCreditsError", () => {
const err = new errorsModule.InsufficientCreditsError("no credits");
assertEquals(err.statusCode, 402);
});
it("should create BadRequestError", () => {
const err = new errorsModule.BadRequestError("invalid params");
assertEquals(err.statusCode, 400);
});
it("should create ServiceUnavailableError", () => {
const err = new errorsModule.ServiceUnavailableError("server down");
assertEquals(err.statusCode, 503);
});
it("should preserve cause in error chain", () => {
const original = new Error("original error");
const err = new errorsModule.RateLimitedError("rate limited", {
cause: original,
});
assertEquals(err.cause, original);
});
});
describe("Registry errors", () => {
it("should create ModelNotFoundError", () => {
const err = new errorsModule.ModelNotFoundError("my-model");
assertInstanceOf(err, errorsModule.AiError);
assertEquals(err.message, 'Model "my-model" not found in registry');
});
it("should create ModelAlreadyExistsError", () => {
const err = new errorsModule.ModelAlreadyExistsError("default");
assertEquals(err.message, 'Model "default" already exists in registry');
});
it("should create UnsupportedProviderError", () => {
const err = new errorsModule.UnsupportedProviderError("unknown-provider");
assertEquals(
err.message,
'No factory registered for provider "unknown-provider"',
);
});
});
describe("classifyStatusCode", () => {
it("should classify 429 as RateLimitedError", () => {
assertEquals(
errorsModule.classifyStatusCode(429),
errorsModule.RateLimitedError,
);
});
it("should classify 401 as AuthFailedError", () => {
assertEquals(
errorsModule.classifyStatusCode(401),
errorsModule.AuthFailedError,
);
});
it("should classify 402 as InsufficientCreditsError", () => {
assertEquals(
errorsModule.classifyStatusCode(402),
errorsModule.InsufficientCreditsError,
);
});
it("should classify 400 as BadRequestError", () => {
assertEquals(
errorsModule.classifyStatusCode(400),
errorsModule.BadRequestError,
);
});
it("should classify 500/503/529 as ServiceUnavailableError", () => {
assertEquals(
errorsModule.classifyStatusCode(500),
errorsModule.ServiceUnavailableError,
);
assertEquals(
errorsModule.classifyStatusCode(503),
errorsModule.ServiceUnavailableError,
);
assertEquals(
errorsModule.classifyStatusCode(529),
errorsModule.ServiceUnavailableError,
);
});
it("should return null for unknown status codes", () => {
assertEquals(errorsModule.classifyStatusCode(404), null);
assertEquals(errorsModule.classifyStatusCode(502), null);
});
});
describe("classifyAndWrap", () => {
it("should wrap with classified error", () => {
const original = new Error("rate limited");
const wrapped = errorsModule.classifyAndWrap("anthropic", 429, original);
assertInstanceOf(wrapped, errorsModule.RateLimitedError);
assertEquals(wrapped.provider, "anthropic");
assertEquals(wrapped.cause, original);
});
it("should wrap unknown status as generic AiError", () => {
const original = new Error("not found");
const wrapped = errorsModule.classifyAndWrap("openai", 404, original);
assertInstanceOf(wrapped, errorsModule.AiError);
assertEquals(wrapped.statusCode, 404);
});
});