diff --git a/__tests__/board-title-form.test.tsx b/__tests__/board-title-form.test.tsx index 1f40c18..6fa7bf2 100644 --- a/__tests__/board-title-form.test.tsx +++ b/__tests__/board-title-form.test.tsx @@ -14,21 +14,21 @@ jest.mock('@/hooks/use-action', () => ({ })), })); -describe('BoardTitleForm', () => { - const mockBoard: Board = { - id: '1', - title: 'Test Board', - imageId: 'image1', - imageThumbUrl: 'thumb-url', - imageFullUrl: 'full-url', - imageUserName: 'user1', - imageLinkHTML: 'link-html', - imageDownloadUrl: 'download-url', - createdAt: new Date(), - updatedAt: new Date(), - orgId: 'org1', - }; +const mockBoard: Board = { + id: '1', + title: 'Test Board', + imageId: 'image1', + imageThumbUrl: 'thumb-url', + imageFullUrl: 'full-url', + imageUserName: 'user1', + imageLinkHTML: 'link-html', + imageDownloadUrl: 'download-url', + createdAt: new Date(), + updatedAt: new Date(), + orgId: 'org1', +}; +describe('BoardTitleForm', () => { it('should render correctly in browser environment', () => { render(); diff --git a/__tests__/card-form.test.tsx b/__tests__/card-form.test.tsx new file mode 100644 index 0000000..f91c148 --- /dev/null +++ b/__tests__/card-form.test.tsx @@ -0,0 +1,86 @@ +import { fireEvent, render, screen, waitFor } from '@testing-library/react'; +import { CardForm } from '@/app/(platform)/(dashboard)/board/[boardId]/_components/card-form'; +import { toast } from 'sonner'; + +jest.mock('@/hooks/use-action', () => ({ + useAction: jest.fn().mockImplementation(() => ({ + execute: jest.fn().mockImplementation(({ title }) => { + toast.success(`Card "${title}" created`); + }), + })), +})); + +jest.mock('next/navigation', () => ({ + useParams: jest.fn(() => ({ + boardId: 'test-board-id', + })), +})); + +let isEditing; + +const mockEnableEditing = jest.fn(() => { + isEditing = true; +}); + +const mockDisableEditing = jest.fn(() => { + isEditing = false; +}); +const mockListId = 'test-list-id'; + +describe('CardForm', () => { + it('should render correctly in browser environment', () => { + render( + + ); + expect( + screen.getByPlaceholderText(/Enter a title for this card\.\.\./i) + ).toBeInTheDocument(); + }); + + it('should create a new card when form is submitted using button', async () => { + render( + + ); + + const input = await screen.getByPlaceholderText( + 'Enter a title for this card...' + ); + fireEvent.change(input, { target: { value: 'New Card' } }); + fireEvent.click(screen.getByText(/Add Card/i)); + + await waitFor(() => { + expect(toast.success).toHaveBeenCalledWith('Card "New Card" created'); + }); + }); + + it('should create a new card when form is submitted using the enter key', async () => { + render( + + ); + + const input = await screen.getByPlaceholderText( + 'Enter a title for this card...' + ); + fireEvent.change(input, { target: { value: 'New Card' } }); + fireEvent.keyDown(input, { key: 'Enter', code: 'Enter' }); + + await waitFor(() => { + expect(toast.success).toHaveBeenCalledWith('Card "New Card" created'); + }); + }); +}); diff --git a/__tests__/list-header.test.tsx b/__tests__/list-header.test.tsx index 3ecb92e..f4c87fe 100644 --- a/__tests__/list-header.test.tsx +++ b/__tests__/list-header.test.tsx @@ -1,11 +1,5 @@ import '@testing-library/jest-dom'; -import { - render, - screen, - fireEvent, - act, - waitFor, -} from '@testing-library/react'; +import { render, screen, fireEvent, waitFor } from '@testing-library/react'; import { toast } from 'sonner'; import { ListHeader } from '@/app/(platform)/(dashboard)/board/[boardId]/_components/list-header'; diff --git a/app/(platform)/(dashboard)/board/[boardId]/_components/card-form.tsx b/app/(platform)/(dashboard)/board/[boardId]/_components/card-form.tsx index f8b5ef6..0fbb1da 100644 --- a/app/(platform)/(dashboard)/board/[boardId]/_components/card-form.tsx +++ b/app/(platform)/(dashboard)/board/[boardId]/_components/card-form.tsx @@ -1,7 +1,7 @@ 'use client'; import { Plus, X } from 'lucide-react'; -import { forwardRef, useRef, KeyboardEventHandler } from 'react'; +import { forwardRef, useRef, KeyboardEventHandler, useEffect } from 'react'; import { useOnClickOutside, useEventListener } from 'usehooks-ts'; import { useParams } from 'next/navigation'; import { toast } from 'sonner'; @@ -22,7 +22,10 @@ interface CardFormProps { export const CardForm = forwardRef( ({ listId, isEditing, enableEditing, disableEditing }, ref) => { const params = useParams(); - const formRef = useRef(document.createElement('form')); + const formRef = useRef(null); + useEffect(() => { + formRef.current = document.createElement('form'); + }, []); const { execute, fieldErrors } = useAction(createCard, { onSuccess: (data) => { @@ -40,7 +43,7 @@ export const CardForm = forwardRef( } }; - useOnClickOutside(formRef, disableEditing); + useOnClickOutside(formRef as React.RefObject, disableEditing); useEventListener('keydown', onKeyDown); const onTextareaKeyDown: KeyboardEventHandler = ( @@ -74,7 +77,7 @@ export const CardForm = forwardRef( placeholder='Enter a title for this card...' errors={fieldErrors} /> - + Add card diff --git a/jest.setup.ts b/jest.setup.ts index b926457..8f0d89b 100644 --- a/jest.setup.ts +++ b/jest.setup.ts @@ -1,5 +1,4 @@ import '@testing-library/jest-dom'; -import { toast } from 'sonner'; jest.mock('sonner', () => ({ toast: { @@ -23,3 +22,7 @@ jest.mock('@/actions/copy-list', () => ({ jest.mock('@/actions/update-board', () => ({ updateBoard: jest.fn(), })); + +jest.mock('@/actions/create-card', () => ({ + createCard: jest.fn(), +}));