@matdata/yasqe 5.5.0 → 5.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,342 @@
1
+ import { describe, it } from "mocha";
2
+ import { expect } from "chai";
3
+ describe("Authentication", () => {
4
+ describe("Basic Authentication", () => {
5
+ describe("Base64 Encoding", () => {
6
+ it("should encode credentials correctly", () => {
7
+ const username = "testuser";
8
+ const password = "testpass";
9
+ const credentials = `${username}:${password}`;
10
+ const encoded = btoa(credentials);
11
+ const expected = "dGVzdHVzZXI6dGVzdHBhc3M=";
12
+ expect(encoded).to.equal(expected);
13
+ });
14
+ it("should handle special characters", () => {
15
+ const username = "user@example.com";
16
+ const password = "p@ss:word!";
17
+ const credentials = `${username}:${password}`;
18
+ const encoded = btoa(credentials);
19
+ const decoded = atob(encoded);
20
+ expect(decoded).to.equal(credentials);
21
+ });
22
+ });
23
+ describe("Authorization Header Format", () => {
24
+ it("should create proper Basic auth header", () => {
25
+ const username = "admin";
26
+ const password = "secret";
27
+ const credentials = `${username}:${password}`;
28
+ const encoded = btoa(credentials);
29
+ const header = `Basic ${encoded}`;
30
+ expect(header).to.equal("Basic YWRtaW46c2VjcmV0");
31
+ expect(header).to.match(/^Basic [A-Za-z0-9+/=]+$/);
32
+ });
33
+ });
34
+ describe("Empty Credentials", () => {
35
+ it("should handle empty username", () => {
36
+ const username = "";
37
+ const password = "password";
38
+ const credentials = `${username}:${password}`;
39
+ const encoded = btoa(credentials);
40
+ expect(encoded).to.be.a("string");
41
+ expect(encoded.length).to.be.greaterThan(0);
42
+ });
43
+ it("should handle empty password", () => {
44
+ const username = "user";
45
+ const password = "";
46
+ const credentials = `${username}:${password}`;
47
+ const encoded = btoa(credentials);
48
+ expect(encoded).to.be.a("string");
49
+ expect(encoded.length).to.be.greaterThan(0);
50
+ });
51
+ });
52
+ });
53
+ describe("Bearer Token Authentication", () => {
54
+ describe("Authorization Header Format", () => {
55
+ it("should create proper Bearer auth header", () => {
56
+ const token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9";
57
+ const header = `Bearer ${token}`;
58
+ expect(header).to.equal(`Bearer ${token}`);
59
+ expect(header).to.match(/^Bearer .+$/);
60
+ });
61
+ it("should handle various token formats", () => {
62
+ const tokens = [
63
+ "simple-token-123",
64
+ "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIn0",
65
+ "ghp_1234567890abcdefghijklmnopqrstuv",
66
+ "Bearer_prefix_should_not_be_duplicated",
67
+ ];
68
+ tokens.forEach((token) => {
69
+ const header = `Bearer ${token}`;
70
+ expect(header).to.match(/^Bearer .+$/);
71
+ expect(header).to.equal(`Bearer ${token}`);
72
+ });
73
+ });
74
+ });
75
+ describe("Token Validation", () => {
76
+ it("should accept non-empty tokens", () => {
77
+ const validTokens = [
78
+ "abc123",
79
+ "very-long-token-with-many-characters-1234567890",
80
+ "token.with.dots",
81
+ "token_with_underscores",
82
+ ];
83
+ validTokens.forEach((token) => {
84
+ expect(token).to.be.a("string");
85
+ expect(token.length).to.be.greaterThan(0);
86
+ });
87
+ });
88
+ });
89
+ });
90
+ describe("API Key Authentication", () => {
91
+ describe("Custom Header Format", () => {
92
+ it("should create proper X-API-Key header", () => {
93
+ const headerName = "X-API-Key";
94
+ const apiKey = "abcdef123456";
95
+ expect(headerName).to.be.a("string");
96
+ expect(apiKey).to.be.a("string");
97
+ expect(headerName.length).to.be.greaterThan(0);
98
+ expect(apiKey.length).to.be.greaterThan(0);
99
+ });
100
+ it("should support various header names", () => {
101
+ const headers = [
102
+ { name: "X-API-Key", value: "key123" },
103
+ { name: "X-Auth-Token", value: "token456" },
104
+ { name: "API-Key", value: "apikey789" },
105
+ { name: "Authorization", value: "ApiKey xyz" },
106
+ { name: "X-Custom-Auth", value: "custom-value" },
107
+ ];
108
+ headers.forEach((header) => {
109
+ expect(header.name).to.be.a("string");
110
+ expect(header.value).to.be.a("string");
111
+ expect(header.name.length).to.be.greaterThan(0);
112
+ expect(header.value.length).to.be.greaterThan(0);
113
+ });
114
+ });
115
+ });
116
+ describe("API Key Validation", () => {
117
+ it("should accept alphanumeric keys", () => {
118
+ const validKeys = ["abc123", "API-KEY-12345", "key_with_underscores", "key.with.dots", "UPPERCASE_KEY"];
119
+ validKeys.forEach((key) => {
120
+ expect(key).to.be.a("string");
121
+ expect(key.length).to.be.greaterThan(0);
122
+ });
123
+ });
124
+ });
125
+ });
126
+ describe("Authentication Priority", () => {
127
+ it("should prioritize Bearer token over Basic auth", () => {
128
+ const basicAuthHeader = "Basic dGVzdDp0ZXN0";
129
+ const bearerAuthHeader = "Bearer token123";
130
+ expect(bearerAuthHeader).to.not.equal(basicAuthHeader);
131
+ expect(bearerAuthHeader).to.match(/^Bearer .+$/);
132
+ });
133
+ it("should allow API Key to coexist with Authorization header", () => {
134
+ const authHeader = "Authorization";
135
+ const apiKeyHeader = "X-API-Key";
136
+ expect(authHeader).to.not.equal(apiKeyHeader);
137
+ });
138
+ });
139
+ describe("Authentication Implementation Tests", () => {
140
+ describe("Bearer Token Authentication", () => {
141
+ it("should create correct header format with token", () => {
142
+ const token = "test-token-123";
143
+ const header = `Bearer ${token}`;
144
+ expect(header).to.equal("Bearer test-token-123");
145
+ expect(header).to.match(/^Bearer .+$/);
146
+ });
147
+ it("should handle whitespace trimming in token", () => {
148
+ const token = " test-token-456 ";
149
+ const trimmedToken = token.trim();
150
+ const header = `Bearer ${trimmedToken}`;
151
+ expect(header).to.equal("Bearer test-token-456");
152
+ expect(header).to.not.include(" ");
153
+ expect(trimmedToken).to.equal("test-token-456");
154
+ });
155
+ it("should validate empty token", () => {
156
+ const token = "";
157
+ const trimmedToken = token.trim();
158
+ const isValid = trimmedToken.length > 0;
159
+ expect(isValid).to.be.false;
160
+ });
161
+ it("should validate whitespace-only token", () => {
162
+ const token = " ";
163
+ const trimmedToken = token.trim();
164
+ const isValid = trimmedToken.length > 0;
165
+ expect(isValid).to.be.false;
166
+ });
167
+ it("should validate non-empty token", () => {
168
+ const token = "valid-token";
169
+ const trimmedToken = token.trim();
170
+ const isValid = trimmedToken.length > 0;
171
+ expect(isValid).to.be.true;
172
+ });
173
+ });
174
+ describe("API Key Authentication", () => {
175
+ it("should create correct custom header with API key", () => {
176
+ const headerName = "X-API-Key";
177
+ const apiKey = "my-api-key-123";
178
+ const headers = {};
179
+ headers[headerName] = apiKey;
180
+ expect(headers["X-API-Key"]).to.equal("my-api-key-123");
181
+ });
182
+ it("should handle whitespace trimming in header name and API key", () => {
183
+ const headerName = " X-Custom-Key ";
184
+ const apiKey = " key-value ";
185
+ const trimmedHeaderName = headerName.trim();
186
+ const trimmedApiKey = apiKey.trim();
187
+ const headers = {};
188
+ headers[trimmedHeaderName] = trimmedApiKey;
189
+ expect(headers["X-Custom-Key"]).to.equal("key-value");
190
+ expect(trimmedHeaderName).to.equal("X-Custom-Key");
191
+ expect(trimmedApiKey).to.equal("key-value");
192
+ });
193
+ it("should validate empty API key", () => {
194
+ const apiKey = "";
195
+ const trimmedApiKey = apiKey.trim();
196
+ const isValid = trimmedApiKey.length > 0;
197
+ expect(isValid).to.be.false;
198
+ });
199
+ it("should validate empty header name", () => {
200
+ const headerName = "";
201
+ const trimmedHeaderName = headerName.trim();
202
+ const isValid = trimmedHeaderName.length > 0;
203
+ expect(isValid).to.be.false;
204
+ });
205
+ it("should validate whitespace-only header name and key", () => {
206
+ const headerName = " ";
207
+ const apiKey = " ";
208
+ const isHeaderNameValid = headerName.trim().length > 0;
209
+ const isApiKeyValid = apiKey.trim().length > 0;
210
+ expect(isHeaderNameValid).to.be.false;
211
+ expect(isApiKeyValid).to.be.false;
212
+ });
213
+ it("should support various header names", () => {
214
+ const headerNames = ["X-API-Key", "X-Auth-Token", "API-Key", "X-Custom-Auth"];
215
+ headerNames.forEach((headerName) => {
216
+ const headers = {};
217
+ headers[headerName] = "test-key";
218
+ expect(headers[headerName]).to.equal("test-key");
219
+ });
220
+ });
221
+ });
222
+ describe("Basic Authentication", () => {
223
+ it("should create correct Basic auth header format", () => {
224
+ const username = "testuser";
225
+ const password = "testpass";
226
+ const credentials = `${username}:${password}`;
227
+ const encoded = btoa(credentials);
228
+ const header = `Basic ${encoded}`;
229
+ expect(header).to.match(/^Basic [A-Za-z0-9+/=]+$/);
230
+ expect(header).to.equal("Basic dGVzdHVzZXI6dGVzdHBhc3M=");
231
+ });
232
+ it("should validate credentials are provided", () => {
233
+ const username = "user";
234
+ const password = "pass";
235
+ const hasCredentials = !!(username && password);
236
+ expect(hasCredentials).to.be.true;
237
+ });
238
+ it("should detect missing credentials", () => {
239
+ const username = "";
240
+ const password = "pass";
241
+ const hasCredentials = !!(username && password);
242
+ expect(hasCredentials).to.be.false;
243
+ });
244
+ });
245
+ describe("Authentication Priority and Collision Detection", () => {
246
+ it("should verify Bearer takes priority over Basic by checking Authorization header usage", () => {
247
+ const bearerToken = "bearer-token";
248
+ const bearerHeader = `Bearer ${bearerToken}`;
249
+ const basicHeader = "Basic " + btoa("user:pass");
250
+ expect(bearerHeader).to.not.equal(basicHeader);
251
+ expect(bearerHeader).to.include("Bearer");
252
+ expect(basicHeader).to.include("Basic");
253
+ });
254
+ it("should verify API Key can coexist with Bearer token using different headers", () => {
255
+ const authorizationHeader = "Authorization";
256
+ const apiKeyHeader = "X-API-Key";
257
+ expect(authorizationHeader).to.not.equal(apiKeyHeader);
258
+ });
259
+ it("should verify API Key can coexist with Basic auth using different headers", () => {
260
+ const authorizationHeader = "Authorization";
261
+ const apiKeyHeader = "X-API-Key";
262
+ expect(authorizationHeader).to.not.equal(apiKeyHeader);
263
+ });
264
+ it("should validate header collision detection logic", () => {
265
+ const headers = { Authorization: "existing-value" };
266
+ const headerExists = headers["Authorization"] !== undefined;
267
+ expect(headerExists).to.be.true;
268
+ if (headerExists) {
269
+ expect(headers["Authorization"]).to.equal("existing-value");
270
+ }
271
+ });
272
+ it("should validate custom header collision detection", () => {
273
+ const headers = { "X-API-Key": "existing-key" };
274
+ const headerExists = headers["X-API-Key"] !== undefined;
275
+ expect(headerExists).to.be.true;
276
+ if (headerExists) {
277
+ expect(headers["X-API-Key"]).to.equal("existing-key");
278
+ }
279
+ });
280
+ });
281
+ describe("Error Handling and Edge Cases", () => {
282
+ it("should validate undefined auth config handling", () => {
283
+ const bearerAuth = undefined;
284
+ const apiKeyAuth = undefined;
285
+ expect(bearerAuth).to.be.undefined;
286
+ expect(apiKeyAuth).to.be.undefined;
287
+ });
288
+ it("should validate null token handling", () => {
289
+ const token = null;
290
+ const isValid = !!(token && token.trim && token.trim().length > 0);
291
+ expect(isValid).to.be.false;
292
+ });
293
+ it("should validate function-based config pattern", () => {
294
+ const getBearerConfig = () => ({ token: "dynamic-token" });
295
+ const getApiKeyConfig = () => ({ headerName: "X-Key", apiKey: "dynamic-key" });
296
+ const bearerConfig = getBearerConfig();
297
+ const apiKeyConfig = getApiKeyConfig();
298
+ expect(bearerConfig.token).to.equal("dynamic-token");
299
+ expect(apiKeyConfig.headerName).to.equal("X-Key");
300
+ expect(apiKeyConfig.apiKey).to.equal("dynamic-key");
301
+ });
302
+ it("should validate error handling in function-based config", () => {
303
+ const getAuthConfigWithError = () => {
304
+ throw new Error("Config error");
305
+ };
306
+ try {
307
+ getAuthConfigWithError();
308
+ expect.fail("Should have thrown error");
309
+ }
310
+ catch (error) {
311
+ expect(error).to.be.instanceOf(Error);
312
+ }
313
+ });
314
+ });
315
+ describe("Trimming Behavior Verification", () => {
316
+ it("should verify trimmed values are used in headers not originals", () => {
317
+ const originalToken = " token-with-spaces ";
318
+ const trimmedToken = originalToken.trim();
319
+ const header = `Bearer ${trimmedToken}`;
320
+ expect(header).to.equal("Bearer token-with-spaces");
321
+ expect(header).to.not.include(" ");
322
+ });
323
+ it("should verify trimmed header name is used not original", () => {
324
+ const originalHeaderName = " X-API-Key ";
325
+ const trimmedHeaderName = originalHeaderName.trim();
326
+ const headers = {};
327
+ headers[trimmedHeaderName] = "value";
328
+ expect(headers["X-API-Key"]).to.equal("value");
329
+ expect(headers[" X-API-Key "]).to.be.undefined;
330
+ });
331
+ it("should verify trimmed API key is used not original", () => {
332
+ const originalKey = " key-value ";
333
+ const trimmedKey = originalKey.trim();
334
+ const headers = {};
335
+ headers["X-API-Key"] = trimmedKey;
336
+ expect(headers["X-API-Key"]).to.equal("key-value");
337
+ expect(headers["X-API-Key"]).to.not.include(" ");
338
+ });
339
+ });
340
+ });
341
+ });
342
+ //# sourceMappingURL=auth-test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-test.js","sourceRoot":"","sources":["../../../../../../packages/yasqe/src/__tests__/auth-test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,247 @@
1
+ import { describe, it } from "mocha";
2
+ import { expect } from "chai";
3
+ describe("OAuth 2.0 Authentication", () => {
4
+ describe("Token Expiration", () => {
5
+ it("should detect expired token", () => {
6
+ const pastTimestamp = Date.now() - 60 * 60 * 1000;
7
+ const isExpired = pastTimestamp <= Date.now();
8
+ expect(isExpired).to.be.true;
9
+ });
10
+ it("should detect valid token", () => {
11
+ const futureTimestamp = Date.now() + 60 * 60 * 1000;
12
+ const isExpired = futureTimestamp <= Date.now();
13
+ expect(isExpired).to.be.false;
14
+ });
15
+ it("should handle undefined expiry", () => {
16
+ const tokenExpiry = undefined;
17
+ const isExpired = !tokenExpiry || tokenExpiry <= Date.now();
18
+ expect(isExpired).to.be.true;
19
+ });
20
+ it("should add buffer time to expiration check", () => {
21
+ const soonToExpire = Date.now() + 30 * 1000;
22
+ const buffer = 60 * 1000;
23
+ const isExpiredWithBuffer = soonToExpire <= Date.now() + buffer;
24
+ expect(isExpiredWithBuffer).to.be.true;
25
+ });
26
+ });
27
+ describe("Authorization Header Format", () => {
28
+ it("should create proper OAuth 2.0 Bearer header", () => {
29
+ const accessToken = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c";
30
+ const header = `Bearer ${accessToken}`;
31
+ expect(header).to.equal(`Bearer ${accessToken}`);
32
+ expect(header).to.match(/^Bearer .+$/);
33
+ });
34
+ it("should handle various access token formats", () => {
35
+ const tokens = [
36
+ "short-token",
37
+ "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.payload.signature",
38
+ "opaque-token-12345678",
39
+ "token_with_underscores",
40
+ "token-with-dashes",
41
+ ];
42
+ tokens.forEach((token) => {
43
+ const header = `Bearer ${token}`;
44
+ expect(header).to.match(/^Bearer .+$/);
45
+ expect(header).to.equal(`Bearer ${token}`);
46
+ });
47
+ });
48
+ });
49
+ describe("Token Storage and Retrieval", () => {
50
+ it("should store access token", () => {
51
+ const tokenData = {
52
+ accessToken: "test-access-token",
53
+ refreshToken: "test-refresh-token",
54
+ tokenExpiry: Date.now() + 3600 * 1000,
55
+ };
56
+ expect(tokenData.accessToken).to.be.a("string");
57
+ expect(tokenData.refreshToken).to.be.a("string");
58
+ expect(tokenData.tokenExpiry).to.be.a("number");
59
+ });
60
+ it("should handle missing refresh token", () => {
61
+ const tokenData = {
62
+ accessToken: "test-access-token",
63
+ refreshToken: undefined,
64
+ tokenExpiry: Date.now() + 3600 * 1000,
65
+ };
66
+ expect(tokenData.accessToken).to.be.a("string");
67
+ expect(tokenData.refreshToken).to.be.undefined;
68
+ });
69
+ });
70
+ describe("Token Expiry Calculation", () => {
71
+ it("should calculate correct expiry timestamp", () => {
72
+ const expiresIn = 3600;
73
+ const now = Date.now();
74
+ const expectedExpiry = now + expiresIn * 1000;
75
+ const calculatedExpiry = now + expiresIn * 1000;
76
+ expect(calculatedExpiry).to.be.closeTo(expectedExpiry, 1000);
77
+ });
78
+ it("should handle undefined expires_in", () => {
79
+ const expiresIn = undefined;
80
+ const expiry = expiresIn ? Date.now() + expiresIn * 1000 : undefined;
81
+ expect(expiry).to.be.undefined;
82
+ });
83
+ it("should convert seconds to milliseconds", () => {
84
+ const expiresInSeconds = 3600;
85
+ const expiresInMs = expiresInSeconds * 1000;
86
+ expect(expiresInMs).to.equal(3600000);
87
+ });
88
+ });
89
+ describe("OAuth 2.0 Configuration Validation", () => {
90
+ it("should validate required OAuth 2.0 parameters", () => {
91
+ const config = {
92
+ clientId: "my-client-id",
93
+ authorizationEndpoint: "https://provider.com/oauth/authorize",
94
+ tokenEndpoint: "https://provider.com/oauth/token",
95
+ redirectUri: "https://myapp.com/callback",
96
+ };
97
+ expect(config.clientId).to.be.a("string").and.to.have.length.greaterThan(0);
98
+ expect(config.authorizationEndpoint).to.be.a("string").and.to.include("http");
99
+ expect(config.tokenEndpoint).to.be.a("string").and.to.include("http");
100
+ expect(config.redirectUri).to.be.a("string").and.to.include("http");
101
+ });
102
+ it("should handle optional scope parameter", () => {
103
+ const config = {
104
+ clientId: "my-client-id",
105
+ authorizationEndpoint: "https://provider.com/oauth/authorize",
106
+ tokenEndpoint: "https://provider.com/oauth/token",
107
+ redirectUri: "https://myapp.com/callback",
108
+ scope: "read write",
109
+ };
110
+ expect(config.scope).to.be.a("string");
111
+ });
112
+ it("should handle missing scope parameter", () => {
113
+ const config = {
114
+ clientId: "my-client-id",
115
+ authorizationEndpoint: "https://provider.com/oauth/authorize",
116
+ tokenEndpoint: "https://provider.com/oauth/token",
117
+ redirectUri: "https://myapp.com/callback",
118
+ scope: undefined,
119
+ };
120
+ expect(config.scope).to.be.undefined;
121
+ });
122
+ });
123
+ describe("PKCE Code Challenge Generation", () => {
124
+ it("should generate code verifier of correct length", () => {
125
+ const length = 128;
126
+ const possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~";
127
+ const codeVerifier = Array.from({ length }, () => possible[Math.floor(Math.random() * possible.length)]).join("");
128
+ expect(codeVerifier).to.have.length(length);
129
+ expect(codeVerifier).to.match(/^[A-Za-z0-9\-._~]+$/);
130
+ });
131
+ it("should validate PKCE characters", () => {
132
+ const validChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~";
133
+ const testString = "abc123-._~ABC";
134
+ const allValid = testString.split("").every((char) => validChars.includes(char));
135
+ expect(allValid).to.be.true;
136
+ });
137
+ });
138
+ describe("URL Parameter Encoding", () => {
139
+ it("should properly encode URL parameters", () => {
140
+ const params = {
141
+ client_id: "my-client-id",
142
+ response_type: "code",
143
+ redirect_uri: "https://myapp.com/callback",
144
+ state: "random-state-string",
145
+ code_challenge: "challenge-string",
146
+ code_challenge_method: "S256",
147
+ };
148
+ const searchParams = new URLSearchParams(params);
149
+ expect(searchParams.get("client_id")).to.equal("my-client-id");
150
+ expect(searchParams.get("response_type")).to.equal("code");
151
+ expect(searchParams.get("code_challenge_method")).to.equal("S256");
152
+ });
153
+ it("should handle optional scope in URL", () => {
154
+ const params = {
155
+ client_id: "my-client-id",
156
+ scope: "read write",
157
+ };
158
+ const searchParams = new URLSearchParams(params);
159
+ expect(searchParams.get("scope")).to.equal("read write");
160
+ });
161
+ });
162
+ describe("Token Response Parsing", () => {
163
+ it("should parse token response correctly", () => {
164
+ const tokenResponse = {
165
+ access_token: "new-access-token",
166
+ refresh_token: "new-refresh-token",
167
+ expires_in: 3600,
168
+ token_type: "Bearer",
169
+ };
170
+ expect(tokenResponse.access_token).to.be.a("string");
171
+ expect(tokenResponse.refresh_token).to.be.a("string");
172
+ expect(tokenResponse.expires_in).to.be.a("number");
173
+ expect(tokenResponse.token_type).to.equal("Bearer");
174
+ });
175
+ it("should handle response without refresh token", () => {
176
+ const tokenResponse = {
177
+ access_token: "new-access-token",
178
+ expires_in: 3600,
179
+ token_type: "Bearer",
180
+ };
181
+ expect(tokenResponse.access_token).to.be.a("string");
182
+ expect(tokenResponse).to.not.have.property("refresh_token");
183
+ });
184
+ });
185
+ describe("Authentication Priority with OAuth 2.0", () => {
186
+ it("should prioritize OAuth 2.0 over Basic auth", () => {
187
+ const oauth2Header = "Bearer oauth2-token";
188
+ const basicHeader = "Basic " + btoa("user:pass");
189
+ expect(oauth2Header).to.not.equal(basicHeader);
190
+ expect(oauth2Header).to.include("Bearer");
191
+ expect(basicHeader).to.include("Basic");
192
+ });
193
+ it("should allow API Key to coexist with OAuth 2.0", () => {
194
+ const authorizationHeader = "Authorization";
195
+ const apiKeyHeader = "X-API-Key";
196
+ expect(authorizationHeader).to.not.equal(apiKeyHeader);
197
+ });
198
+ });
199
+ describe("Error Handling", () => {
200
+ it("should handle undefined authentication config", () => {
201
+ const oauth2Auth = undefined;
202
+ expect(oauth2Auth).to.be.undefined;
203
+ });
204
+ it("should handle null access token", () => {
205
+ const accessToken = null;
206
+ const isValid = !!(accessToken && typeof accessToken === "string" && accessToken.trim().length > 0);
207
+ expect(isValid).to.be.false;
208
+ });
209
+ it("should validate empty access token", () => {
210
+ const accessToken = "";
211
+ const isValid = accessToken.trim().length > 0;
212
+ expect(isValid).to.be.false;
213
+ });
214
+ it("should validate whitespace-only access token", () => {
215
+ const accessToken = " ";
216
+ const isValid = accessToken.trim().length > 0;
217
+ expect(isValid).to.be.false;
218
+ });
219
+ it("should validate non-empty access token", () => {
220
+ const accessToken = "valid-token";
221
+ const isValid = accessToken.trim().length > 0;
222
+ expect(isValid).to.be.true;
223
+ });
224
+ });
225
+ describe("Trimming Behavior", () => {
226
+ it("should use trimmed access token in header", () => {
227
+ const originalToken = " token-with-spaces ";
228
+ const trimmedToken = originalToken.trim();
229
+ const header = `Bearer ${trimmedToken}`;
230
+ expect(header).to.equal("Bearer token-with-spaces");
231
+ expect(header).to.not.include(" ");
232
+ });
233
+ it("should verify trimmed values are used not originals", () => {
234
+ const originalConfig = {
235
+ clientId: " client-id ",
236
+ scope: " read write ",
237
+ };
238
+ const trimmedConfig = {
239
+ clientId: originalConfig.clientId.trim(),
240
+ scope: originalConfig.scope.trim(),
241
+ };
242
+ expect(trimmedConfig.clientId).to.equal("client-id");
243
+ expect(trimmedConfig.scope).to.equal("read write");
244
+ });
245
+ });
246
+ });
247
+ //# sourceMappingURL=oauth2-test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauth2-test.js","sourceRoot":"","sources":["../../../../../../packages/yasqe/src/__tests__/oauth2-test.ts"],"names":[],"mappings":"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"}