Skip to content

Commit

Permalink
Add test to store
Browse files Browse the repository at this point in the history
  • Loading branch information
poulch committed Nov 26, 2024
1 parent ba3e9c3 commit acb6854
Show file tree
Hide file tree
Showing 4 changed files with 115 additions and 38 deletions.
33 changes: 0 additions & 33 deletions src/newHome/homeOnboarding/onboardingContext/OnboardingStorage.ts

This file was deleted.

2 changes: 1 addition & 1 deletion src/newHome/homeOnboarding/onboardingContext/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ export type OnboardingState = {

export interface StorageService {
getOnboardingState(): OnboardingState | undefined;
saveOnboardingState(onboardingState: OnboardingState): void;
saveOnboardingState(onboardingState: OnboardingState): Promise<void>;
}

export interface OnboardingContextType {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,112 @@
import { useUser } from "@dashboard/auth";
import { useUpdateMetadataMutation } from "@dashboard/graphql";
import { act } from "@testing-library/react";
import { renderHook } from "@testing-library/react-hooks";

import { useOnboardingStorage } from "./useOnboardingStorage";

jest.mock("@dashboard/auth", () => ({
__esModule: true,
useUser: jest.fn(),
}));

jest.mock("@dashboard/graphql");

jest.useFakeTimers();

jest.mock("lodash/debounce", () => jest.fn(fn => fn));

describe("useOnboardingStorage", () => {
describe("getOnboardingState", () => {
it("should return undefined when there is no onboarding in user metadata", () => {
// Arrange
(useUser as jest.Mock).mockImplementation(() => ({
user: { metadata: [{ key1: "value1" }, { key2: "value2" }] },
}));
(useUpdateMetadataMutation as jest.Mock).mockReturnValue([jest.fn(), {}]);

const { getOnboardingState } = renderHook(() => useOnboardingStorage()).result.current;

// Act
const result = getOnboardingState();

// Assert
expect(result).toBeUndefined();
});

it("should return onboarding state from user metadata", () => {
// Arrange
(useUser as jest.Mock).mockImplementation(() => ({
user: {
metadata: [
{
key: "onboarding",
value: JSON.stringify({ steps: [], onboardingExpanded: true }),
},
],
},
}));
(useUpdateMetadataMutation as jest.Mock).mockReturnValue([jest.fn(), {}]);

const { getOnboardingState } = renderHook(() => useOnboardingStorage()).result.current;

// Act
const result = getOnboardingState();

// Assert
expect(result).toEqual({ steps: [], onboardingExpanded: true });
});
});

describe("saveOnboardingState", () => {
it("should not save onboarding state when there is no user", async () => {
// Arrange
(useUser as jest.Mock).mockImplementation(() => ({ user: null }));

const updateMetadataMock = jest.fn();

(useUpdateMetadataMutation as jest.Mock).mockReturnValue([updateMetadataMock, {}]);

const { result } = renderHook(() => useOnboardingStorage());

// Act
const returnValue = await act(async () => {
return await result.current.saveOnboardingState({ steps: [], onboardingExpanded: true });
});

// Assert
expect(returnValue).toBeUndefined();
expect(updateMetadataMock).not.toHaveBeenCalled();
});

it("should save onboarding state to user metadata and be called only once", async () => {
// Arrange
(useUser as jest.Mock).mockImplementation(() => ({ user: { id: "1", metadata: [] } }));

const updateMetadataMock = jest.fn();

(useUpdateMetadataMutation as jest.Mock).mockReturnValue([updateMetadataMock, {}]);

const { result } = renderHook(() => useOnboardingStorage());

// Act
await act(async () => {
await result.current.saveOnboardingState({ steps: [], onboardingExpanded: true });
});

jest.runAllTimers();

// Assert
expect(updateMetadataMock).toHaveBeenCalledTimes(1);
expect(updateMetadataMock).toHaveBeenCalledWith({
variables: {
id: "1",
input: [
{ key: "onboarding", value: JSON.stringify({ steps: [], onboardingExpanded: true }) },
],
keysToDelete: [],
},
});
});
});
});
Original file line number Diff line number Diff line change
Expand Up @@ -21,9 +21,7 @@ export const useOnboardingStorage = (): StorageService => {
return undefined;
}

const parsed = JSON.parse(metadata.value);

return parsed;
return JSON.parse(metadata.value);
} catch (error) {
// eslint-disable-next-line no-console
console.warn("Could not get onboarding state from metadata", { error });
Expand Down Expand Up @@ -67,7 +65,7 @@ export const useOnboardingStorage = (): StorageService => {
const debouncedSaveOnboardingState = useMemo(
() => debounce(saveOnboardingState, 1000),
[saveOnboardingState],
);
) as StorageService["saveOnboardingState"];

return {
getOnboardingState,
Expand Down

0 comments on commit acb6854

Please sign in to comment.