import { describe, it, expect, vi } from 'vitest' import { render, screen, fireEvent, act } from '@testing-library/react' import { NoteIcon } from './NoteIcon' describe('NoteIcon', () => { it('shows add button when no icon is set', () => { render( {}} onRemoveIcon={() => {}} />) expect(screen.getByTestId('note-icon-add')).toBeInTheDocument() expect(screen.queryByTestId('note-icon-display')).not.toBeInTheDocument() }) it('displays the emoji when icon is set', () => { render( {}} onRemoveIcon={() => {}} />) expect(screen.getByTestId('note-icon-display')).toHaveTextContent('🎯') expect(screen.queryByTestId('note-icon-add')).not.toBeInTheDocument() }) it('does not display Phosphor icon names as emoji', () => { render( {}} onRemoveIcon={() => {}} />) // Phosphor icon name is not an emoji → shows add button expect(screen.getByTestId('note-icon-add')).toBeInTheDocument() }) it('opens emoji picker when add button is clicked', () => { render( {}} onRemoveIcon={() => {}} />) fireEvent.click(screen.getByTestId('note-icon-add')) expect(screen.getByTestId('emoji-picker')).toBeInTheDocument() }) it('shows change/remove menu when existing icon is clicked', () => { render( {}} onRemoveIcon={() => {}} />) fireEvent.click(screen.getByTestId('note-icon-display')) expect(screen.getByTestId('note-icon-menu')).toBeInTheDocument() expect(screen.getByTestId('note-icon-change')).toBeInTheDocument() expect(screen.getByTestId('note-icon-remove')).toBeInTheDocument() }) it('calls onRemoveIcon when Remove is clicked', () => { const onRemove = vi.fn() render( {}} onRemoveIcon={onRemove} />) fireEvent.click(screen.getByTestId('note-icon-display')) fireEvent.click(screen.getByTestId('note-icon-remove')) expect(onRemove).toHaveBeenCalledOnce() }) it('opens picker when Change is clicked from menu', () => { render( {}} onRemoveIcon={() => {}} />) fireEvent.click(screen.getByTestId('note-icon-display')) fireEvent.click(screen.getByTestId('note-icon-change')) expect(screen.getByTestId('emoji-picker')).toBeInTheDocument() }) it('calls onSetIcon when emoji is selected from picker', () => { const onSet = vi.fn() render( {}} />) fireEvent.click(screen.getByTestId('note-icon-add')) const emojiButtons = screen.getAllByTestId('emoji-option') fireEvent.click(emojiButtons[0]) expect(onSet).toHaveBeenCalledOnce() }) it('hides add button when not editable', () => { render( {}} onRemoveIcon={() => {}} />) expect(screen.queryByTestId('note-icon-add')).not.toBeInTheDocument() }) it('disables icon click when not editable', () => { render( {}} onRemoveIcon={() => {}} />) const display = screen.getByTestId('note-icon-display') expect(display).toBeDisabled() }) it('opens picker on laputa:open-icon-picker event', () => { render( {}} onRemoveIcon={() => {}} />) act(() => { window.dispatchEvent(new CustomEvent('laputa:open-icon-picker')) }) expect(screen.getByTestId('emoji-picker')).toBeInTheDocument() }) })