6 changed files with 200 additions and 61 deletions
@ -0,0 +1,52 @@ |
|||||
|
import { renderHook, act } from '@testing-library/react' |
||||
|
import useLocalStorage from './useLocalStorage' |
||||
|
import { beforeEach, describe, expect, it } from "vitest"; |
||||
|
|
||||
|
describe('useLocalStorage', () => { |
||||
|
const key = 'test-key' |
||||
|
|
||||
|
beforeEach(() => { |
||||
|
localStorage.clear() |
||||
|
}) |
||||
|
|
||||
|
it('should initialize with initial value if localStorage is empty', () => { |
||||
|
const { result } = renderHook(() => useLocalStorage(key, 'initial')) |
||||
|
const [value] = result.current |
||||
|
expect(value).toBe('initial') |
||||
|
}) |
||||
|
|
||||
|
it('should read existing value from localStorage', () => { |
||||
|
localStorage.setItem(key, JSON.stringify('stored')) |
||||
|
const { result } = renderHook(() => useLocalStorage(key, 'initial')) |
||||
|
const [value] = result.current |
||||
|
expect(value).toBe('stored') |
||||
|
}) |
||||
|
|
||||
|
it('should update localStorage when setValue is called', () => { |
||||
|
const { result } = renderHook(() => useLocalStorage(key, 'initial')) |
||||
|
const [, setValue] = result.current |
||||
|
|
||||
|
act(() => { |
||||
|
setValue('updated') |
||||
|
}) |
||||
|
|
||||
|
expect(localStorage.getItem(key)).toBe(JSON.stringify('updated')) |
||||
|
expect(result.current[0]).toBe('updated') |
||||
|
}) |
||||
|
|
||||
|
it('should remove value from localStorage when removeValue is called', () => { |
||||
|
const { result } = renderHook(() => useLocalStorage(key, 'initial')) |
||||
|
const [, setValue, removeValue] = result.current |
||||
|
|
||||
|
act(() => { |
||||
|
setValue('to-be-removed') |
||||
|
}) |
||||
|
|
||||
|
act(() => { |
||||
|
removeValue() |
||||
|
}) |
||||
|
|
||||
|
expect(localStorage.getItem(key)).toBeNull() |
||||
|
expect(result.current[0]).toBe('initial') |
||||
|
}) |
||||
|
}) |
||||
@ -0,0 +1,81 @@ |
|||||
|
import { renderHook, act } from '@testing-library/react' |
||||
|
import { useToast } from "@core/hooks/useToast.ts" |
||||
|
import { Button } from '@components/UI/Button.tsx' |
||||
|
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; |
||||
|
|
||||
|
describe('useToast', () => { |
||||
|
beforeEach(() => { |
||||
|
// Reset toast memory state before each test
|
||||
|
// our hook uses global memory to store toasts
|
||||
|
// @ts-expect-error - internal test reset
|
||||
|
globalThis.memoryState = { toasts: [] } |
||||
|
vi.useFakeTimers() |
||||
|
}) |
||||
|
|
||||
|
afterEach(() => { |
||||
|
vi.useRealTimers() |
||||
|
}) |
||||
|
|
||||
|
it('should create a toast with title, description, and action', () => { |
||||
|
const { result } = renderHook(() => useToast()) |
||||
|
|
||||
|
act(() => { |
||||
|
result.current.toast({ |
||||
|
title: 'Backup Reminder', |
||||
|
description: 'Don\'t forget to backup!', |
||||
|
action: <Button>Backup Now</Button> |
||||
|
}) |
||||
|
vi.runAllTimers() |
||||
|
}) |
||||
|
|
||||
|
const toast = result.current.toasts[0] |
||||
|
expect(result.current.toasts.length).toBe(1) |
||||
|
expect(toast.title).toBe('Backup Reminder') |
||||
|
expect(toast.description).toBe('Don\'t forget to backup!') |
||||
|
expect(toast.action).toBeTruthy() |
||||
|
expect(toast.open).toBe(true) |
||||
|
}) |
||||
|
it('should dismiss a toast using returned dismiss function', () => { |
||||
|
const { result } = renderHook(() => useToast()) |
||||
|
vi.useFakeTimers() |
||||
|
|
||||
|
let toastRef: { id: string, dismiss: () => void } |
||||
|
|
||||
|
act(() => { |
||||
|
toastRef = result.current.toast({ title: 'Dismiss Me' }) |
||||
|
vi.runAllTimers() // Flush ADD_TOAST
|
||||
|
}) |
||||
|
|
||||
|
act(() => { |
||||
|
toastRef.dismiss() |
||||
|
}) |
||||
|
|
||||
|
const toast = result.current.toasts.find(t => t.id === toastRef.id) |
||||
|
expect(toast?.open).toBe(false) |
||||
|
|
||||
|
vi.useRealTimers() |
||||
|
}) |
||||
|
|
||||
|
|
||||
|
it('should allow dismiss via hook dismiss function', () => { |
||||
|
const { result } = renderHook(() => useToast()) |
||||
|
vi.useFakeTimers() |
||||
|
|
||||
|
let toastRef: { id: string } |
||||
|
|
||||
|
act(() => { |
||||
|
toastRef = result.current.toast({ title: 'Manual Dismiss' }) |
||||
|
vi.runAllTimers() |
||||
|
}) |
||||
|
|
||||
|
act(() => { |
||||
|
result.current.dismiss(toastRef.id) |
||||
|
}) |
||||
|
|
||||
|
const toast = result.current.toasts.find(t => t.id === toastRef.id) |
||||
|
expect(toast?.open).toBe(false) |
||||
|
|
||||
|
vi.useRealTimers() |
||||
|
}) |
||||
|
|
||||
|
}) |
||||
Loading…
Reference in new issue