diff --git a/src/renderer/src/components/__tests__/IndicatorLight.test.tsx b/src/renderer/src/components/__tests__/IndicatorLight.test.tsx new file mode 100644 index 0000000000..d85dba92d6 --- /dev/null +++ b/src/renderer/src/components/__tests__/IndicatorLight.test.tsx @@ -0,0 +1,50 @@ +import { render } from '@testing-library/react' +import { describe, expect, it } from 'vitest' + +import IndicatorLight from '../IndicatorLight' + +describe('IndicatorLight', () => { + it('should render with default props', () => { + const { container } = render() + const light = container.firstChild as HTMLElement + + expect(light).toHaveStyle({ + width: '8px', + height: '8px', + animation: 'pulse 2s infinite' + }) + }) + + it('should apply custom size', () => { + const { container } = render() + const light = container.firstChild as HTMLElement + + expect(light).toHaveStyle({ + width: '16px', + height: '16px' + }) + }) + + it('should convert green color to hex value', () => { + const { container } = render() + const light = container.firstChild as HTMLElement + expect(light).toHaveStyle({ backgroundColor: '#22c55e' }) + }) + + it('should disable shadow when specified', () => { + const { container } = render() + const light = container.firstChild as HTMLElement + expect(light).toHaveStyle({ boxShadow: 'none' }) + }) + + it('should disable animation when specified', () => { + const { container } = render() + const light = container.firstChild as HTMLElement + expect(light).toHaveStyle({ animation: 'none' }) + }) + + it('should match snapshot', () => { + const { container } = render() + expect(container.firstChild).toMatchSnapshot() + }) +}) diff --git a/src/renderer/src/components/__tests__/Spinner.test.tsx b/src/renderer/src/components/__tests__/Spinner.test.tsx new file mode 100644 index 0000000000..9c88b1c885 --- /dev/null +++ b/src/renderer/src/components/__tests__/Spinner.test.tsx @@ -0,0 +1,39 @@ +import { render, screen } from '@testing-library/react' +import { describe, expect, it, vi } from 'vitest' + +import Spinner from '../Spinner' + +// Mock motion/react to prevent animation issues in tests +vi.mock('motion/react', () => ({ + motion: { + create: (Component: any) => { + const MockedComponent = (props: any) => + return MockedComponent + } + } +})) + +describe('Spinner', () => { + it('should render with text', () => { + render() + expect(screen.getByText('Searching...')).toBeInTheDocument() + }) + + it('should render search icon', () => { + const { container } = render() + const icon = container.querySelector('svg') + expect(icon).toBeInTheDocument() + }) + + it('should render with empty text', () => { + const { container } = render() + const spanElement = container.querySelector('span') + expect(spanElement).toBeInTheDocument() + expect(spanElement).toHaveTextContent('') + }) + + it('should match snapshot', () => { + const { container } = render() + expect(container.firstChild).toMatchSnapshot() + }) +}) diff --git a/src/renderer/src/components/__tests__/__snapshots__/IndicatorLight.test.tsx.snap b/src/renderer/src/components/__tests__/__snapshots__/IndicatorLight.test.tsx.snap new file mode 100644 index 0000000000..c385373714 --- /dev/null +++ b/src/renderer/src/components/__tests__/__snapshots__/IndicatorLight.test.tsx.snap @@ -0,0 +1,18 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`IndicatorLight > should match snapshot 1`] = ` +.c0 { + width: 8px; + height: 8px; + border-radius: 50%; + background-color: #22c55e; + box-shadow: 0 0 6px #22c55e; + animation: pulse 2s infinite; +} + +
+`; diff --git a/src/renderer/src/components/__tests__/__snapshots__/Spinner.test.tsx.snap b/src/renderer/src/components/__tests__/__snapshots__/Spinner.test.tsx.snap new file mode 100644 index 0000000000..06175d3e64 --- /dev/null +++ b/src/renderer/src/components/__tests__/__snapshots__/Spinner.test.tsx.snap @@ -0,0 +1,45 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`Spinner > should match snapshot 1`] = ` +.c0 { + display: flex; + align-items: center; + gap: 4px; + font-size: 14px; + padding: 10px; + padding-left: 0; +} + +
+ + + + + + Loading files... + +
+`;