import { render, screen } from '@testing-library/vue' import userEvent from '@testing-library/user-event' import { describe, expect, it, vi } from 'vitest' import { createI18n } from 'vue-i18n' import CustomizationDialog from './CustomizationDialog.vue' const DEFAULT_ICON = 'pi-bookmark-fill' const DEFAULT_COLOR = '#a1a1aa' vi.mock('@/stores/nodeBookmarkStore', () => ({ useNodeBookmarkStore: () => ({ defaultBookmarkIcon: DEFAULT_ICON, defaultBookmarkColor: DEFAULT_COLOR, bookmarksCustomization: {} }) })) vi.mock('primevue/dialog', () => ({ default: { name: 'Dialog', template: '
', props: ['visible'] } })) vi.mock('primevue/selectbutton', () => ({ default: { name: 'SelectButton', template: '
', props: ['modelValue', 'options'] } })) vi.mock('primevue/divider', () => ({ default: { name: 'Divider', template: '
' } })) vi.mock('@/components/common/ColorCustomizationSelector.vue', () => ({ default: { name: 'ColorCustomizationSelector', template: '
', props: ['modelValue', 'colorOptions'] } })) vi.mock('@/components/ui/button/Button.vue', () => ({ default: { name: 'Button', template: ``, emits: ['click'] } })) const i18n = createI18n({ legacy: false, locale: 'en', messages: { en: {} } }) function renderDialog(extraProps: Record = {}) { const onConfirm = vi.fn() render(CustomizationDialog, { global: { plugins: [i18n] }, props: { modelValue: true, onConfirm, ...extraProps } }) return { onConfirm } } describe('CustomizationDialog', () => { describe('confirmCustomization', () => { it('emits confirm with default icon and color when no initial values provided', async () => { const user = userEvent.setup() const { onConfirm } = renderDialog() await user.click(screen.getByText('g.confirm')) expect(onConfirm).toHaveBeenCalledWith(DEFAULT_ICON, DEFAULT_COLOR) }) it('emits confirm with matching initialIcon when provided', async () => { const user = userEvent.setup() const { onConfirm } = renderDialog({ initialIcon: 'pi-star' }) await user.click(screen.getByText('g.confirm')) expect(onConfirm).toHaveBeenCalledWith('pi-star', DEFAULT_COLOR) }) it('falls back to default icon when initialIcon does not match any option', async () => { const user = userEvent.setup() const { onConfirm } = renderDialog({ initialIcon: 'pi-nonexistent' }) await user.click(screen.getByText('g.confirm')) expect(onConfirm).toHaveBeenCalledWith(DEFAULT_ICON, DEFAULT_COLOR) }) it('emits confirm with initialColor when provided', async () => { const user = userEvent.setup() const { onConfirm } = renderDialog({ initialColor: '#007bff' }) await user.click(screen.getByText('g.confirm')) expect(onConfirm).toHaveBeenCalledWith(DEFAULT_ICON, '#007bff') }) }) })