Skip to content

Commit 8c7dbf7

Browse files
committed
fix: tests and error checking
1 parent 9b67701 commit 8c7dbf7

File tree

4 files changed

+64
-20
lines changed

4 files changed

+64
-20
lines changed

lib/utils/checkAuth.ts

+13
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,19 @@ export const checkAuth = async ({
1111
domain: string;
1212
clientId: string;
1313
}): Promise<RefreshTokenResult> => {
14+
if (!domain) {
15+
return {
16+
success: false,
17+
error: "Domain is required for authentication check",
18+
};
19+
}
20+
if (!clientId) {
21+
return {
22+
success: false,
23+
error: "Client ID is required for authentication check",
24+
};
25+
}
26+
1427
const usingCustomDomain = isCustomDomain(domain);
1528
const forceLocalStorage = storageSettings.useInsecureForRefreshToken;
1629
let kbrteCookie = null;

lib/utils/exchangeAuthCode.test.ts

+36-19
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { describe, expect, it, vi, beforeEach, afterEach } from "vitest";
22
import { exchangeAuthCode } from ".";
33
import { MemoryStorage, StorageKeys } from "../sessionManager";
4-
import { setActiveStorage } from "./token";
4+
import { setActiveStorage, clearActiveStorage, clearInsecureStorage } from "./token";
55
import createFetchMock from "vitest-fetch-mock";
66
import { frameworkSettings } from "./exchangeAuthCode";
77
import * as refreshTokenTimer from "./refreshTimer";
@@ -120,6 +120,7 @@ describe("exchangeAuthCode", () => {
120120

121121
await store.setItems({
122122
[StorageKeys.state]: state,
123+
[StorageKeys.codeVerifier]: "verifier",
123124
});
124125

125126
const input = "hello";
@@ -176,6 +177,7 @@ describe("exchangeAuthCode", () => {
176177

177178
await store.setItems({
178179
[StorageKeys.state]: state,
180+
[StorageKeys.codeVerifier]: "verifier",
179181
});
180182

181183
const input = "hello";
@@ -227,6 +229,7 @@ describe("exchangeAuthCode", () => {
227229

228230
await store.setItems({
229231
[StorageKeys.state]: state,
232+
[StorageKeys.codeVerifier]: "verifier",
230233
});
231234

232235
frameworkSettings.framework = "Framework";
@@ -274,6 +277,7 @@ describe("exchangeAuthCode", () => {
274277

275278
await store.setItems({
276279
[StorageKeys.state]: state,
280+
[StorageKeys.codeVerifier]: "verifier",
277281
});
278282

279283
const input = "hello";
@@ -306,6 +310,7 @@ describe("exchangeAuthCode", () => {
306310

307311
await store.setItems({
308312
[StorageKeys.state]: state,
313+
[StorageKeys.codeVerifier]: "verifier",
309314
});
310315

311316
frameworkSettings.framework = "Framework";
@@ -360,6 +365,8 @@ describe("exchangeAuthCode", () => {
360365
});
361366

362367
it("should return error if storage is not available", async () => {
368+
clearActiveStorage();
369+
clearInsecureStorage();
363370
const urlParams = new URLSearchParams();
364371
urlParams.append("state", "test");
365372
urlParams.append("code", "test");
@@ -373,11 +380,12 @@ describe("exchangeAuthCode", () => {
373380

374381
expect(result).toEqual({
375382
success: false,
376-
error: "Invalid state; supplied test, expected null",
383+
error: "Authentication storage is not initialized",
377384
});
378385
});
379386

380387
it("should return error if state is invalid", async () => {
388+
setActiveStorage(new MemoryStorage());
381389
const urlParams = new URLSearchParams();
382390
urlParams.append("state", "test");
383391
urlParams.append("code", "test");
@@ -397,13 +405,13 @@ describe("exchangeAuthCode", () => {
397405
});
398406

399407
it("should return error if code verifier is missing", async () => {
408+
const state = new MemoryStorage();
409+
await state.setSessionItem(StorageKeys.state, "test");
410+
setActiveStorage(state);
400411
const urlParams = new URLSearchParams();
401412
urlParams.append("state", "test");
402413
urlParams.append("code", "test");
403-
mockStorage.getItem.mockImplementation((key) => {
404-
if (key === StorageKeys.state) return "test";
405-
return null;
406-
});
414+
407415

408416
const result = await exchangeAuthCode({
409417
urlParams,
@@ -414,11 +422,15 @@ describe("exchangeAuthCode", () => {
414422

415423
expect(result).toEqual({
416424
success: false,
417-
error: "Invalid state; supplied test, expected null",
425+
error: "Code verifier not found",
418426
});
419427
});
420428

421429
it("should return error if fetch fails", async () => {
430+
const store = new MemoryStorage();
431+
setActiveStorage(store);
432+
await store.setSessionItem(StorageKeys.state, "test");
433+
await store.setSessionItem(StorageKeys.codeVerifier, "verifier");
422434
const urlParams = new URLSearchParams();
423435
urlParams.append("state", "test");
424436
urlParams.append("code", "test");
@@ -429,20 +441,24 @@ describe("exchangeAuthCode", () => {
429441
});
430442
fetchMock.mockRejectOnce(new Error("Fetch failed"));
431443

432-
const result = await exchangeAuthCode({
433-
urlParams,
434-
domain: "test.com",
435-
clientId: "test",
436-
redirectURL: "test.com",
437-
});
438-
439-
expect(result).toEqual({
440-
success: false,
441-
error: "Invalid state; supplied test, expected null",
442-
});
444+
try {
445+
await exchangeAuthCode({
446+
urlParams,
447+
domain: "test.com",
448+
clientId: "test",
449+
redirectURL: "test.com",
450+
});
451+
} catch (error) {
452+
453+
expect((error as Error).message).toBe("Fetch failed");
454+
}
443455
});
444456

445457
it("should return error if token response is invalid", async () => {
458+
const store = new MemoryStorage();
459+
setActiveStorage(store);
460+
await store.setSessionItem(StorageKeys.state, "test");
461+
await store.setSessionItem(StorageKeys.codeVerifier, "verifier");
446462
const urlParams = new URLSearchParams();
447463
urlParams.append("state", "test");
448464
urlParams.append("code", "test");
@@ -465,7 +481,7 @@ describe("exchangeAuthCode", () => {
465481

466482
expect(result).toEqual({
467483
success: false,
468-
error: "Invalid state; supplied test, expected null",
484+
error: "No access token recieved",
469485
});
470486
});
471487

@@ -475,6 +491,7 @@ describe("exchangeAuthCode", () => {
475491
setActiveStorage(store);
476492
await store.setItems({
477493
[StorageKeys.state]: "test",
494+
[StorageKeys.codeVerifier]: "verifier",
478495
});
479496
vi.spyOn(store, "setSessionItem");
480497
const urlParams = new URLSearchParams();

lib/utils/exchangeAuthCode.ts

+14
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,13 @@ export const exchangeAuthCode = async ({
7878
const codeVerifier = (await activeStorage.getSessionItem(
7979
StorageKeys.codeVerifier,
8080
)) as string;
81+
if (codeVerifier === null) {
82+
console.error("Code verifier not found");
83+
return {
84+
success: false,
85+
error: "Code verifier not found",
86+
};
87+
}
8188

8289
const headers: {
8390
"Content-type": string;
@@ -153,6 +160,13 @@ export const exchangeAuthCode = async ({
153160
// Replace current state and clear forward history
154161
window.history.replaceState(window.history.state, "", url);
155162

163+
if (!data.access_token || !data.id_token || !data.refresh_token) {
164+
return {
165+
success: false,
166+
error: "No access token recieved",
167+
};
168+
}
169+
156170
return {
157171
success: true,
158172
[StorageKeys.accessToken]: data.access_token,

lib/utils/token/refreshToken.test.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ describe("refreshToken", () => {
8484
clientId: mockClientId,
8585
});
8686
expect(result).toStrictEqual({
87-
error: "Error refreshing token: Error: Network error",
87+
error: "No access token recieved: Error: Network error",
8888
success: false,
8989
});
9090
});

0 commit comments

Comments
 (0)