import { fireEvent, render, screen, waitFor } from '@testing-library/react' import * as React from 'react' import { beforeEach, describe, expect, it, vi } from 'vitest' import Nav from '@/app/components/header/nav' import { AppModeEnum } from '@/types/app' const mockPush = vi.fn() const mockSetAppDetail = vi.fn() const mockOnCreate = vi.fn() const mockOnLoadMore = vi.fn() let mockSelectedSegment = 'app' let mockIsCurrentWorkspaceEditor = true vi.mock('@headlessui/react', () => { type MenuContextValue = { open: boolean setOpen: React.Dispatch> } const MenuContext = React.createContext(null) const Menu = ({ children, }: { children: React.ReactNode | ((props: { open: boolean }) => React.ReactNode) }) => { const [open, setOpen] = React.useState(false) const value = React.useMemo(() => ({ open, setOpen }), [open]) return ( {typeof children === 'function' ? children({ open }) : children} ) } const MenuButton = ({ children, onClick, ...props }: React.ButtonHTMLAttributes) => { const context = React.useContext(MenuContext) return ( ) } const MenuItems = ({ as: Component = 'div', children, ...props }: { as?: React.ElementType children: React.ReactNode } & Record) => { const context = React.useContext(MenuContext) if (!context?.open) return null return {children} } const MenuItem = ({ as: Component = 'div', children, ...props }: { as?: React.ElementType children: React.ReactNode } & Record) => {children} return { Menu, MenuButton, MenuItems, MenuItem, Transition: ({ children }: { children: React.ReactNode }) => <>{children}, } }) vi.mock('react-i18next', () => ({ useTranslation: () => ({ t: (key: string) => key, }), })) vi.mock('@/next/navigation', () => ({ useSelectedLayoutSegment: () => mockSelectedSegment, useRouter: () => ({ push: mockPush, }), })) vi.mock('@/next/link', () => ({ default: ({ href, children, }: { href: string children?: React.ReactNode }) => {children}, })) vi.mock('@/app/components/app/store', () => ({ useStore: () => mockSetAppDetail, })) vi.mock('@/context/app-context', () => ({ useAppContext: () => ({ isCurrentWorkspaceEditor: mockIsCurrentWorkspaceEditor, }), })) const navigationItems = [ { id: 'app-1', name: 'Alpha', link: '/app/app-1/configuration', icon_type: 'emoji' as const, icon: '🤖', icon_background: '#FFEAD5', icon_url: null, mode: AppModeEnum.CHAT, }, { id: 'app-2', name: 'Bravo', link: '/app/app-2/workflow', icon_type: 'emoji' as const, icon: '⚙️', icon_background: '#E0F2FE', icon_url: null, mode: AppModeEnum.WORKFLOW, }, ] const curNav = { id: 'app-1', name: 'Alpha', icon_type: 'emoji' as const, icon: '🤖', icon_background: '#FFEAD5', icon_url: null, mode: AppModeEnum.CHAT, } const renderNav = (nav = curNav) => { return render(