import { act, renderHook } from '@testing-library/react'; import { beforeEach, describe, expect, it, vi } from 'vitest'; import { MantineBetterMenusStoreProvider, useMantineBetterMenus } from './Store'; // Mock dependencies vi.mock('@warkypublic/artemis-kit', () => ({ getUUID: () => 'test-uuid-123', })); const createWrapper = () => { return ({ children }: { children: React.ReactNode }) => ( {children} ); }; describe('MantineBetterMenus Store', () => { let wrapper: ReturnType; beforeEach(() => { wrapper = createWrapper(); }); it('initializes with empty menus array', () => { const { result } = renderHook(() => useMantineBetterMenus(), { wrapper }); expect(result.current.menus).toEqual([]); }); it('can show a menu', () => { const { result } = renderHook(() => useMantineBetterMenus(), { wrapper }); act(() => { result.current.show('test-menu', { items: [{ label: 'Test Item' }], x: 100, y: 200, }); }); expect(result.current.menus).toHaveLength(1); expect(result.current.menus[0]).toMatchObject({ id: 'test-menu', items: [{ label: 'Test Item' }], visible: true, x: 100, y: 200, }); }); it('can hide a menu', () => { const { result } = renderHook(() => useMantineBetterMenus(), { wrapper }); // First show a menu act(() => { result.current.show('test-menu', { x: 100, y: 200 }); }); expect(result.current.menus[0].visible).toBe(true); // Then hide it act(() => { result.current.hide('test-menu'); }); expect(result.current.menus[0].visible).toBe(false); }); it('can update instance state', () => { const { result } = renderHook(() => useMantineBetterMenus(), { wrapper }); // Show a menu act(() => { result.current.show('test-menu', { x: 100, y: 200 }); }); // Update its position act(() => { result.current.setInstanceState('test-menu', 'x', 300); }); expect(result.current.menus[0].x).toBe(300); expect(result.current.menus[0].y).toBe(200); // Should remain unchanged }); it('handles multiple menus', () => { const { result } = renderHook(() => useMantineBetterMenus(), { wrapper }); act(() => { result.current.show('menu-1', { x: 100, y: 200 }); result.current.show('menu-2', { x: 300, y: 400 }); }); expect(result.current.menus).toHaveLength(2); expect(result.current.menus.find((m) => m.id === 'menu-1')).toBeDefined(); expect(result.current.menus.find((m) => m.id === 'menu-2')).toBeDefined(); }); });