import { describe, test, expect, beforeEach } from 'vitest' import { render, screen } from '@testing-library/react' import { Prefix } from './prefix' import { useWidgetStore } from '../../stores/widget-store' import type { FormulaWidgetState } from '../types' describe('Prefix', () => { beforeEach(() => { useWidgetStore.getState().clearWidgets() }) test('renders prefix from widget data at default index 0', () => { useWidgetStore.getState().setWidget('test-prefix', { type: 'formula', data: [{ value: 100, prefix: '$' }], }) render() expect(screen.getByText('$')).toBeTruthy() }) test('renders prefix at specified index', () => { useWidgetStore.getState().setWidget('test-prefix', { type: 'formula', data: [ { value: 100, prefix: 'First' }, { value: 200, prefix: 'Second' }, { value: 300, prefix: 'Third' }, ], }) render() expect(screen.getByText('Second')).toBeTruthy() }) test('renders prefix at index 0 when index not specified', () => { useWidgetStore.getState().setWidget('test-prefix', { type: 'formula', data: [ { value: 100, prefix: 'First' }, { value: 200, prefix: 'Second' }, ], }) render() expect(screen.getByText('First')).toBeTruthy() }) test('returns null when widget does not exist', () => { const { container } = render() expect(container.firstChild).toBeNull() }) test('returns null when widget data is undefined', () => { useWidgetStore.getState().setWidget('test-prefix', { type: 'formula', }) const { container } = render() expect(container.firstChild).toBeNull() }) test('returns null when prefix is undefined', () => { useWidgetStore.getState().setWidget('test-prefix', { type: 'formula', data: [{ value: 100 }], }) const { container } = render() expect(container.firstChild).toBeNull() }) test('returns null when index is out of bounds', () => { useWidgetStore.getState().setWidget('test-prefix', { type: 'formula', data: [{ value: 100, prefix: '$' }], }) const { container } = render() expect(container.firstChild).toBeNull() }) test('returns null for empty data array', () => { useWidgetStore.getState().setWidget('test-prefix', { type: 'formula', data: [], }) const { container } = render() expect(container.firstChild).toBeNull() }) test('returns null for empty string prefix', () => { useWidgetStore.getState().setWidget('test-prefix', { type: 'formula', data: [{ value: 100, prefix: '' }], }) const { container } = render() expect(container.firstChild).toBeNull() }) test('renders string prefix', () => { useWidgetStore.getState().setWidget('test-prefix', { type: 'formula', data: [{ value: 100, prefix: 'Total:' }], }) render() expect(screen.getByText('Total:')).toBeTruthy() }) test('renders single character prefix', () => { useWidgetStore.getState().setWidget('test-prefix', { type: 'formula', data: [{ value: 100, prefix: '$' }], }) render() expect(screen.getByText('$')).toBeTruthy() }) test('renders multi-word prefix', () => { useWidgetStore.getState().setWidget('test-prefix', { type: 'formula', data: [{ value: 100, prefix: 'Grand Total:' }], }) render() expect(screen.getByText('Grand Total:')).toBeTruthy() }) test('renders as Typography h5', () => { useWidgetStore.getState().setWidget('test-prefix', { type: 'formula', data: [{ value: 100, prefix: '$' }], }) render() const element = screen.getByText('$') expect(element.tagName).toBe('H5') }) test('passes disabled prop to Item', () => { useWidgetStore.getState().setWidget('test-prefix', { type: 'formula', data: [{ value: 100, prefix: '$' }], }) render() const element = screen.getByText('$') expect(element.getAttribute('data-disabled')).toBe('true') }) test('passes TypographyProps to Item', () => { useWidgetStore.getState().setWidget('test-prefix', { type: 'formula', data: [{ value: 100, prefix: '$' }], }) render( , ) const element = screen.getByText('$') expect(element.classList.contains('custom')).toBe(true) }) test('handles all data properties together', () => { useWidgetStore.getState().setWidget('test-prefix', { type: 'formula', data: [ { value: 100, color: '#FF0000', prefix: '$', suffix: 'USD', }, ], }) render() expect(screen.getByText('$')).toBeTruthy() }) test('updates when widget data changes', () => { useWidgetStore.getState().setWidget('test-prefix', { type: 'formula', data: [{ value: 100, prefix: '$' }], }) const { rerender } = render() expect(screen.getByText('$')).toBeTruthy() useWidgetStore.getState().setWidget('test-prefix', { data: [{ value: 200, prefix: '€' }], }) rerender() expect(screen.queryByText('$')).toBeNull() expect(screen.getByText('€')).toBeTruthy() }) test('updates when prefix is removed', () => { useWidgetStore.getState().setWidget('test-prefix', { type: 'formula', data: [{ value: 100, prefix: '$' }], }) const { container, rerender } = render() expect(screen.getByText('$')).toBeTruthy() useWidgetStore.getState().setWidget('test-prefix', { data: [{ value: 100 }], }) rerender() expect(container.firstChild).toBeNull() }) test('updates when index changes', () => { useWidgetStore.getState().setWidget('test-prefix', { type: 'formula', data: [ { value: 100, prefix: '$' }, { value: 200, prefix: '€' }, ], }) const { rerender } = render() expect(screen.getByText('$')).toBeTruthy() rerender() expect(screen.queryByText('$')).toBeNull() expect(screen.getByText('€')).toBeTruthy() }) test('handles widget removal gracefully', () => { useWidgetStore.getState().setWidget('test-prefix', { type: 'formula', data: [{ value: 100, prefix: '$' }], }) const { container, rerender } = render() expect(screen.getByText('$')).toBeTruthy() useWidgetStore.getState().removeWidget('test-prefix') rerender() expect(container.firstChild).toBeNull() }) test('handles prefix with special characters', () => { useWidgetStore.getState().setWidget('test-prefix', { type: 'formula', data: [{ value: 100, prefix: '¥' }], }) render() expect(screen.getByText('¥')).toBeTruthy() }) test('handles prefix with unicode characters', () => { useWidgetStore.getState().setWidget('test-prefix', { type: 'formula', data: [{ value: 100, prefix: '€ 💰' }], }) render() expect(screen.getByText(/€ 💰/)).toBeTruthy() }) test('handles prefix with numbers', () => { useWidgetStore.getState().setWidget('test-prefix', { type: 'formula', data: [{ value: 100, prefix: '#1:' }], }) render() expect(screen.getByText('#1:')).toBeTruthy() }) test('handles long prefix text', () => { const longPrefix = 'This is a very long prefix text: ' useWidgetStore.getState().setWidget('test-prefix', { type: 'formula', data: [{ value: 100, prefix: longPrefix }], }) render() expect(screen.getByText(longPrefix.trim())).toBeTruthy() }) test('renders different prefixes for different items', () => { useWidgetStore.getState().setWidget('test-prefix', { type: 'formula', data: [ { value: 100, prefix: '$' }, { value: 200, prefix: '€' }, { value: 300, prefix: '£' }, ], }) const { unmount } = render() expect(screen.getByText('$')).toBeTruthy() unmount() render() expect(screen.getByText('€')).toBeTruthy() }) test('handles negative index (invalid but should not crash)', () => { useWidgetStore.getState().setWidget('test-prefix', { type: 'formula', data: [{ value: 100, prefix: '$' }], }) const { container } = render() expect(container.firstChild).toBeNull() }) test('handles prefix with only whitespace', () => { useWidgetStore.getState().setWidget('test-prefix', { type: 'formula', data: [{ value: 100, prefix: ' ' }], }) const { container } = render() // Whitespace is normalized by text content, just verify component renders expect(container.querySelector('.MuiTypography-root')).toBeTruthy() }) test('prefix is sanitized to string only in store', () => { useWidgetStore.getState().setWidget('test-prefix', { type: 'formula', data: [{ value: 100, prefix: 'Valid String' }], }) render() expect(screen.getByText('Valid String')).toBeTruthy() }) })