hermes-office/tests/unit/onboardingState.test.ts

64 lines
1.9 KiB
TypeScript

import { afterEach, describe, expect, it, vi } from "vitest";
import { act, renderHook } from "@testing-library/react";
import { useOnboardingState } from "@/features/onboarding/useOnboardingState";
describe("useOnboardingState", () => {
afterEach(() => {
// Clean up localStorage between tests
try {
window.localStorage.removeItem("claw3d:onboarding:completed");
} catch {
// noop
}
});
it("shows onboarding by default when localStorage is empty", () => {
const { result } = renderHook(() => useOnboardingState());
expect(result.current.showOnboarding).toBe(true);
});
it("hides onboarding after completeOnboarding is called", () => {
const { result } = renderHook(() => useOnboardingState());
expect(result.current.showOnboarding).toBe(true);
act(() => {
result.current.completeOnboarding();
});
expect(result.current.showOnboarding).toBe(false);
});
it("persists completion to localStorage", () => {
const { result } = renderHook(() => useOnboardingState());
act(() => {
result.current.completeOnboarding();
});
expect(window.localStorage.getItem("claw3d:onboarding:completed")).toBe(
"true",
);
});
it("reads completion state from localStorage on mount", () => {
window.localStorage.setItem("claw3d:onboarding:completed", "true");
const { result } = renderHook(() => useOnboardingState());
expect(result.current.showOnboarding).toBe(false);
});
it("resets onboarding when resetOnboarding is called", () => {
const { result } = renderHook(() => useOnboardingState());
act(() => {
result.current.completeOnboarding();
});
expect(result.current.showOnboarding).toBe(false);
act(() => {
result.current.resetOnboarding();
});
expect(result.current.showOnboarding).toBe(true);
expect(window.localStorage.getItem("claw3d:onboarding:completed")).toBeNull();
});
});