From 08a56d1f2e39d41b48591704910bee4060bbb4d6 Mon Sep 17 00:00:00 2001 From: Aarya1402 Date: Mon, 18 May 2026 10:33:13 +0530 Subject: [PATCH 01/11] test(ui): add test coverage for ui components d4f81b746 --- package.json | 5 +++++ src/components/ui/Button.test.tsx | 16 ++++++++++++++++ src/test/setup.ts | 1 + vite.config.ts | 7 ++++++- 4 files changed, 28 insertions(+), 1 deletion(-) create mode 100644 src/components/ui/Button.test.tsx create mode 100644 src/test/setup.ts diff --git a/package.json b/package.json index 89d9182..68ee688 100644 --- a/package.json +++ b/package.json @@ -33,6 +33,10 @@ }, "devDependencies": { "@eslint/js": "^10.0.1", + "@testing-library/jest-dom": "^6.9.1", + "@testing-library/react": "^16.3.2", + "@testing-library/user-event": "^14.6.1", + "@types/jsdom": "^28.0.3", "@types/react": "^19.2.14", "@types/react-dom": "^19.2.3", "eslint": "^10.2.1", @@ -40,6 +44,7 @@ "eslint-plugin-react-refresh": "^0.5.2", "globals": "^17.5.0", "husky": "^9.1.7", + "jsdom": "^29.1.1", "lint-staged": "^16.4.0", "prettier": "^3.8.3", "typescript-eslint": "^8.58.2", diff --git a/src/components/ui/Button.test.tsx b/src/components/ui/Button.test.tsx new file mode 100644 index 0000000..f536318 --- /dev/null +++ b/src/components/ui/Button.test.tsx @@ -0,0 +1,16 @@ +import { render, screen } from '@testing-library/react'; +import { Button } from './Button'; +import { describe, it, expect } from 'vitest'; + +describe('Button component', () => { + it('renders children correctly', () => { + render(); + expect(screen.getByText('Click Me')).toBeInTheDocument(); + }); + + it('shows loading state when loading prop is true', () => { + render(); + expect(screen.getByText('⏳')).toBeInTheDocument(); + expect(screen.getByRole('button')).toBeDisabled(); + }); +}); diff --git a/src/test/setup.ts b/src/test/setup.ts new file mode 100644 index 0000000..7b0828b --- /dev/null +++ b/src/test/setup.ts @@ -0,0 +1 @@ +import '@testing-library/jest-dom'; diff --git a/vite.config.ts b/vite.config.ts index 0e77097..80a6bac 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -1,4 +1,4 @@ -import { defineConfig } from 'vite'; +import { defineConfig } from 'vitest/config'; import react from '@vitejs/plugin-react'; import tailwindcss from '@tailwindcss/vite'; import path from 'path'; @@ -14,4 +14,9 @@ export default defineConfig({ port: 5173, open: true, }, + test: { + environment: 'jsdom', + setupFiles: ['./src/test/setup.ts'], + globals: true, + }, }); From 5846beb9022aadeeacecf08b95c6f3a84fa4026e Mon Sep 17 00:00:00 2001 From: Aarya1402 Date: Mon, 18 May 2026 10:40:13 +0530 Subject: [PATCH 02/11] test(ui): add test coverage for Input component d4f81b746 --- src/components/ui/Input.test.tsx | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 src/components/ui/Input.test.tsx diff --git a/src/components/ui/Input.test.tsx b/src/components/ui/Input.test.tsx new file mode 100644 index 0000000..9447760 --- /dev/null +++ b/src/components/ui/Input.test.tsx @@ -0,0 +1,23 @@ +import { render, screen } from '@testing-library/react'; +import { Input } from './Input'; +import { describe, it, expect } from 'vitest'; +import React from 'react'; + +describe('Input component', () => { + it('renders correctly', () => { + render(); + expect(screen.getByPlaceholderText('Enter text')).toBeInTheDocument(); + }); + + it('passes ref correctly', () => { + const ref = React.createRef(); + render(); + expect(ref.current).toBeInstanceOf(HTMLInputElement); + }); + + it('applies error styles when hasError is true', () => { + render(); + const input = screen.getByTestId('error-input'); + expect(input.style.border).toContain('var(--status-error)'); + }); +}); From 551ca41befe453be82caa692f01c0777449fa135 Mon Sep 17 00:00:00 2001 From: Aarya1402 Date: Mon, 18 May 2026 10:41:10 +0530 Subject: [PATCH 03/11] test(ui): add test coverage for Panel component d4f81b746 --- src/components/ui/Panel.test.tsx | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 src/components/ui/Panel.test.tsx diff --git a/src/components/ui/Panel.test.tsx b/src/components/ui/Panel.test.tsx new file mode 100644 index 0000000..9ac0af9 --- /dev/null +++ b/src/components/ui/Panel.test.tsx @@ -0,0 +1,25 @@ +import { render, screen } from '@testing-library/react'; +import { Panel } from './Panel'; +import { describe, it, expect } from 'vitest'; +import React from 'react'; + +describe('Panel component', () => { + it('renders children correctly', () => { + render(Panel Content); + expect(screen.getByText('Panel Content')).toBeInTheDocument(); + }); + + it('renders title when provided', () => { + render(Content); + expect(screen.getByText('[ Test Title ]')).toBeInTheDocument(); + }); + + it('renders headerRight when provided', () => { + render( + Action}> + Content + , + ); + expect(screen.getByRole('button', { name: 'Action' })).toBeInTheDocument(); + }); +}); From 0c59bd4d0dcb66c18177d3ea4d69eaf6490783bb Mon Sep 17 00:00:00 2001 From: Aarya1402 Date: Mon, 18 May 2026 10:44:17 +0530 Subject: [PATCH 04/11] test(ui): add test coverage for ProgressBar component d4f81b746 --- src/components/ui/ProgressBar.test.tsx | 35 ++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 src/components/ui/ProgressBar.test.tsx diff --git a/src/components/ui/ProgressBar.test.tsx b/src/components/ui/ProgressBar.test.tsx new file mode 100644 index 0000000..824f1be --- /dev/null +++ b/src/components/ui/ProgressBar.test.tsx @@ -0,0 +1,35 @@ +import { render, screen } from '@testing-library/react'; +import { ProgressBar } from './ProgressBar'; +import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest'; +import React from 'react'; + +describe('ProgressBar component', () => { + beforeEach(() => { + vi.useFakeTimers(); + }); + + afterEach(() => { + vi.useRealTimers(); + }); + + it('renders correctly with current and total', () => { + render(); + expect(screen.getByText(/5\/10 \(50%\)/)).toBeInTheDocument(); + }); + + it('renders label when provided', () => { + render(); + expect(screen.getByText('Processing')).toBeInTheDocument(); + }); + + it('hides count when showCount is false', () => { + render(); + expect(screen.queryByText(/5\/10 \(50%\)/)).not.toBeInTheDocument(); + }); + + it('shows ETA when startTime is provided', () => { + const startTime = Date.now(); + render(); + expect(screen.getByText(/ETA:/)).toBeInTheDocument(); + }); +}); From 770be7f3f4e2511d6ec1322912c7e7a6833f2502 Mon Sep 17 00:00:00 2001 From: Aarya1402 Date: Mon, 18 May 2026 10:44:45 +0530 Subject: [PATCH 05/11] test(ui): add test coverage for ScrollArea component d4f81b746 --- src/components/ui/ScrollArea.test.tsx | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 src/components/ui/ScrollArea.test.tsx diff --git a/src/components/ui/ScrollArea.test.tsx b/src/components/ui/ScrollArea.test.tsx new file mode 100644 index 0000000..9c66da8 --- /dev/null +++ b/src/components/ui/ScrollArea.test.tsx @@ -0,0 +1,27 @@ +import { render, screen } from '@testing-library/react'; +import { ScrollArea } from './ScrollArea'; +import { describe, it, expect } from 'vitest'; +import React from 'react'; + +describe('ScrollArea component', () => { + it('renders children correctly', () => { + render(Scrollable Content); + expect(screen.getByText('Scrollable Content')).toBeInTheDocument(); + }); + + it('applies maxHeight when provided', () => { + render( + + Content + , + ); + const element = screen.getByTestId('scroll-area'); + expect(element.style.maxHeight).toBe('200px'); + }); + + it('passes innerRef correctly', () => { + const ref = React.createRef(); + render(Content); + expect(ref.current).toBeInstanceOf(HTMLDivElement); + }); +}); From 07ddfe5002151b4c211e4babfc49cf067afdc1a7 Mon Sep 17 00:00:00 2001 From: Aarya1402 Date: Mon, 18 May 2026 10:45:06 +0530 Subject: [PATCH 06/11] test(ui): add test coverage for MarkdownRenderer component d4f81b746 --- src/components/ui/MarkdownRenderer.test.tsx | 25 +++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 src/components/ui/MarkdownRenderer.test.tsx diff --git a/src/components/ui/MarkdownRenderer.test.tsx b/src/components/ui/MarkdownRenderer.test.tsx new file mode 100644 index 0000000..dc2469e --- /dev/null +++ b/src/components/ui/MarkdownRenderer.test.tsx @@ -0,0 +1,25 @@ +import { render, screen } from '@testing-library/react'; +import { MarkdownRenderer } from './MarkdownRenderer'; +import { describe, it, expect } from 'vitest'; +import React from 'react'; + +describe('MarkdownRenderer component', () => { + it('renders markdown content correctly', () => { + render(); + // Testing specific output depends on react-markdown, we just test if the component renders the text + expect(screen.getByText('Hello World')).toBeInTheDocument(); + }); + + it('renders code blocks correctly', () => { + render(); + expect(screen.getByText('inline code')).toBeInTheDocument(); + expect(screen.getByText('inline code').tagName).toBe('CODE'); + }); + + it('renders links correctly', () => { + render(); + const link = screen.getByRole('link', { name: 'GitHub' }); + expect(link).toBeInTheDocument(); + expect(link).toHaveAttribute('href', 'https://github.com'); + }); +}); From fdfd964e5f4571f571f21bfd0fe806471d74e14e Mon Sep 17 00:00:00 2001 From: Aarya1402 Date: Mon, 18 May 2026 10:46:06 +0530 Subject: [PATCH 07/11] fix(ui): fix failing ScrollArea test d4f81b746 --- src/components/ui/ScrollArea.test.tsx | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/src/components/ui/ScrollArea.test.tsx b/src/components/ui/ScrollArea.test.tsx index 9c66da8..8079ef4 100644 --- a/src/components/ui/ScrollArea.test.tsx +++ b/src/components/ui/ScrollArea.test.tsx @@ -10,12 +10,8 @@ describe('ScrollArea component', () => { }); it('applies maxHeight when provided', () => { - render( - - Content - , - ); - const element = screen.getByTestId('scroll-area'); + render(Scroll Area Content); + const element = screen.getByText('Scroll Area Content'); expect(element.style.maxHeight).toBe('200px'); }); From bbe3244108ce9b68ce7a50f98df8ba9b7d6dbf8e Mon Sep 17 00:00:00 2001 From: Aarya1402 Date: Mon, 18 May 2026 10:47:26 +0530 Subject: [PATCH 08/11] test(terminal): add test coverage for TerminalInput component d4f81b746 --- .../terminal/TerminalInput.test.tsx | 40 +++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/src/components/terminal/TerminalInput.test.tsx b/src/components/terminal/TerminalInput.test.tsx index e69de29..7fa17b1 100644 --- a/src/components/terminal/TerminalInput.test.tsx +++ b/src/components/terminal/TerminalInput.test.tsx @@ -0,0 +1,40 @@ +import { render, screen, fireEvent } from '@testing-library/react'; +import { TerminalInput } from './TerminalInput'; +import { describe, it, expect, vi } from 'vitest'; +import React from 'react'; + +describe('TerminalInput component', () => { + it('renders correctly', () => { + const onChange = vi.fn(); + const onSubmit = vi.fn(); + render(); + expect(screen.getByPlaceholderText('Type here...')).toBeInTheDocument(); + }); + + it('calls onChange when typing', () => { + const onChange = vi.fn(); + const onSubmit = vi.fn(); + render(); + const input = screen.getByPlaceholderText('Type here...'); + fireEvent.change(input, { target: { value: 'hello' } }); + expect(onChange).toHaveBeenCalledWith('hello'); + }); + + it('calls onSubmit when Enter is pressed', () => { + const onChange = vi.fn(); + const onSubmit = vi.fn(); + render(); + const input = screen.getByPlaceholderText('Type here...'); + fireEvent.keyDown(input, { key: 'Enter', code: 'Enter' }); + expect(onSubmit).toHaveBeenCalled(); + }); + + it('clears input when Escape is pressed', () => { + const onChange = vi.fn(); + const onSubmit = vi.fn(); + render(); + const input = screen.getByPlaceholderText('Type here...'); + fireEvent.keyDown(input, { key: 'Escape', code: 'Escape' }); + expect(onChange).toHaveBeenCalledWith(''); + }); +}); From 08d57fdc51f087d1f1c13553dd113f542d85edfb Mon Sep 17 00:00:00 2001 From: Aarya1402 Date: Mon, 18 May 2026 10:55:24 +0530 Subject: [PATCH 09/11] fix(types): add jest-dom type reference d4f81b746 --- vite-env.d.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/vite-env.d.ts b/vite-env.d.ts index e92b4bd..6560e54 100644 --- a/vite-env.d.ts +++ b/vite-env.d.ts @@ -1,4 +1,5 @@ /// +/// interface ImportMetaEnv { readonly VITE_GITHUB_TOKEN: string; From ac8b7d8d4db52e1dacfa92598d0bb0d4cf0cba8c Mon Sep 17 00:00:00 2001 From: Aarya1402 <124037849+Aarya1402@users.noreply.github.com> Date: Mon, 18 May 2026 17:24:38 +0530 Subject: [PATCH 10/11] Update package.json Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 68ee688..9cce57e 100644 --- a/package.json +++ b/package.json @@ -36,7 +36,7 @@ "@testing-library/jest-dom": "^6.9.1", "@testing-library/react": "^16.3.2", "@testing-library/user-event": "^14.6.1", - "@types/jsdom": "^28.0.3", + "@types/jsdom": "^21.1.7", "@types/react": "^19.2.14", "@types/react-dom": "^19.2.3", "eslint": "^10.2.1", From 83f0e9cbfd27762dcf057c5ec908c004c57b28ab Mon Sep 17 00:00:00 2001 From: Aarya1402 <124037849+Aarya1402@users.noreply.github.com> Date: Mon, 18 May 2026 17:24:50 +0530 Subject: [PATCH 11/11] Update package.json Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 9cce57e..cdb2d1f 100644 --- a/package.json +++ b/package.json @@ -44,7 +44,7 @@ "eslint-plugin-react-refresh": "^0.5.2", "globals": "^17.5.0", "husky": "^9.1.7", - "jsdom": "^29.1.1", + "jsdom": "^26.0.0", "lint-staged": "^16.4.0", "prettier": "^3.8.3", "typescript-eslint": "^8.58.2",