import type { ComponentProps, ReactNode } from 'react'; import { cleanup, render, screen } from '@testing-library/react'; import { afterEach, describe, expect, it, vi } from 'vitest'; import { api } from '@spoon/backend/convex/_generated/api.js'; import { AvatarDropdown } from '../../src/components/layout/header/controls/AvatarDropdown'; // Stable sentinels: the real Convex `api` proxy hands back a fresh reference on // every access, so `===` comparisons in the mocks below would never match. vi.mock('@spoon/backend/convex/_generated/api.js', () => ({ api: { auth: { getUser: 'auth:getUser', }, files: { getImageUrl: 'files:getImageUrl', }, }, })); const { mockUseConvexAuth, mockUseQuery } = vi.hoisted(() => ({ mockUseConvexAuth: vi.fn(), mockUseQuery: vi.fn(), })); vi.mock('convex/react', () => ({ useConvexAuth: mockUseConvexAuth, useQuery: mockUseQuery, })); vi.mock('@convex-dev/auth/react', () => ({ useAuthActions: () => ({ signOut: vi.fn() }), })); vi.mock('next/navigation', () => ({ useRouter: () => ({ push: vi.fn(), replace: vi.fn() }), })); vi.mock('@/lib/avatar', () => ({ isRemoteImageUrl: () => false, })); // Render the dropdown primitives as pass-through wrappers so the menu content // is deterministically present under jsdom (Radix pointer behavior is flaky // here). We are exercising AvatarDropdown's logic, not Radix. vi.mock('@spoon/ui', () => ({ BasedAvatar: () =>
avatar
, Button: (props: ComponentProps<'button'>) =>