Skip to content

Commit

Permalink
fix: tests and error checking
Browse files Browse the repository at this point in the history
  • Loading branch information
DanielRivers committed Jan 16, 2025
1 parent 9b67701 commit 8c7dbf7
Show file tree
Hide file tree
Showing 4 changed files with 64 additions and 20 deletions.
13 changes: 13 additions & 0 deletions lib/utils/checkAuth.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,19 @@ export const checkAuth = async ({
domain: string;
clientId: string;
}): Promise<RefreshTokenResult> => {
if (!domain) {
return {
success: false,
error: "Domain is required for authentication check",
};
}
if (!clientId) {
return {
success: false,
error: "Client ID is required for authentication check",
};
}

const usingCustomDomain = isCustomDomain(domain);
const forceLocalStorage = storageSettings.useInsecureForRefreshToken;
let kbrteCookie = null;
Expand Down
55 changes: 36 additions & 19 deletions lib/utils/exchangeAuthCode.test.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { describe, expect, it, vi, beforeEach, afterEach } from "vitest";
import { exchangeAuthCode } from ".";
import { MemoryStorage, StorageKeys } from "../sessionManager";
import { setActiveStorage } from "./token";
import { setActiveStorage, clearActiveStorage, clearInsecureStorage } from "./token";
import createFetchMock from "vitest-fetch-mock";
import { frameworkSettings } from "./exchangeAuthCode";
import * as refreshTokenTimer from "./refreshTimer";
Expand Down Expand Up @@ -120,6 +120,7 @@ describe("exchangeAuthCode", () => {

await store.setItems({
[StorageKeys.state]: state,
[StorageKeys.codeVerifier]: "verifier",
});

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

await store.setItems({
[StorageKeys.state]: state,
[StorageKeys.codeVerifier]: "verifier",
});

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

await store.setItems({
[StorageKeys.state]: state,
[StorageKeys.codeVerifier]: "verifier",
});

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

await store.setItems({
[StorageKeys.state]: state,
[StorageKeys.codeVerifier]: "verifier",
});

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

await store.setItems({
[StorageKeys.state]: state,
[StorageKeys.codeVerifier]: "verifier",
});

frameworkSettings.framework = "Framework";
Expand Down Expand Up @@ -360,6 +365,8 @@ describe("exchangeAuthCode", () => {
});

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

expect(result).toEqual({
success: false,
error: "Invalid state; supplied test, expected null",
error: "Authentication storage is not initialized",
});
});

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

it("should return error if code verifier is missing", async () => {
const state = new MemoryStorage();
await state.setSessionItem(StorageKeys.state, "test");
setActiveStorage(state);
const urlParams = new URLSearchParams();
urlParams.append("state", "test");
urlParams.append("code", "test");
mockStorage.getItem.mockImplementation((key) => {
if (key === StorageKeys.state) return "test";
return null;
});


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

expect(result).toEqual({
success: false,
error: "Invalid state; supplied test, expected null",
error: "Code verifier not found",
});
});

it("should return error if fetch fails", async () => {
const store = new MemoryStorage();
setActiveStorage(store);
await store.setSessionItem(StorageKeys.state, "test");
await store.setSessionItem(StorageKeys.codeVerifier, "verifier");
const urlParams = new URLSearchParams();
urlParams.append("state", "test");
urlParams.append("code", "test");
Expand All @@ -429,20 +441,24 @@ describe("exchangeAuthCode", () => {
});
fetchMock.mockRejectOnce(new Error("Fetch failed"));

const result = await exchangeAuthCode({
urlParams,
domain: "test.com",
clientId: "test",
redirectURL: "test.com",
});

expect(result).toEqual({
success: false,
error: "Invalid state; supplied test, expected null",
});
try {
await exchangeAuthCode({
urlParams,
domain: "test.com",
clientId: "test",
redirectURL: "test.com",
});
} catch (error) {

expect((error as Error).message).toBe("Fetch failed");
}
});

it("should return error if token response is invalid", async () => {
const store = new MemoryStorage();
setActiveStorage(store);
await store.setSessionItem(StorageKeys.state, "test");
await store.setSessionItem(StorageKeys.codeVerifier, "verifier");
const urlParams = new URLSearchParams();
urlParams.append("state", "test");
urlParams.append("code", "test");
Expand All @@ -465,7 +481,7 @@ describe("exchangeAuthCode", () => {

expect(result).toEqual({
success: false,
error: "Invalid state; supplied test, expected null",
error: "No access token recieved",
});
});

Expand All @@ -475,6 +491,7 @@ describe("exchangeAuthCode", () => {
setActiveStorage(store);
await store.setItems({
[StorageKeys.state]: "test",
[StorageKeys.codeVerifier]: "verifier",
});
vi.spyOn(store, "setSessionItem");
const urlParams = new URLSearchParams();
Expand Down
14 changes: 14 additions & 0 deletions lib/utils/exchangeAuthCode.ts
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,13 @@ export const exchangeAuthCode = async ({
const codeVerifier = (await activeStorage.getSessionItem(
StorageKeys.codeVerifier,
)) as string;
if (codeVerifier === null) {
console.error("Code verifier not found");
return {
success: false,
error: "Code verifier not found",
};
}

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

if (!data.access_token || !data.id_token || !data.refresh_token) {
return {
success: false,
error: "No access token recieved",
};
}

return {
success: true,
[StorageKeys.accessToken]: data.access_token,
Expand Down
2 changes: 1 addition & 1 deletion lib/utils/token/refreshToken.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,7 @@ describe("refreshToken", () => {
clientId: mockClientId,
});
expect(result).toStrictEqual({
error: "Error refreshing token: Error: Network error",
error: "No access token recieved: Error: Network error",
success: false,
});
});
Expand Down

0 comments on commit 8c7dbf7

Please sign in to comment.