From 060ea4f477f8b2d6fe0a0423e4aaefdf8b622959 Mon Sep 17 00:00:00 2001 From: seonghobae <8172694+seonghobae@users.noreply.github.com> Date: Fri, 10 Jul 2026 22:07:16 +0000 Subject: [PATCH 1/3] =?UTF-8?q?=F0=9F=8E=A8=20Palette:=20DateRangePicker?= =?UTF-8?q?=20=EC=A0=91=EA=B7=BC=EC=84=B1=20=ED=96=A5=EC=83=81=20(aria-pre?= =?UTF-8?q?ssed=20=EB=B0=8F=20focus-visible=20=EC=B6=94=EA=B0=80)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/web/package.json | 8 +- .../dashboard/date-range-picker.test.tsx | 68 +++ .../dashboard/date-range-picker.tsx | 2 + packages/web/vitest.config.ts | 10 +- packages/web/vitest.setup.ts | 4 + pnpm-lock.yaml | 468 +++++++++++++++++- 6 files changed, 542 insertions(+), 18 deletions(-) create mode 100644 packages/web/src/components/dashboard/date-range-picker.test.tsx create mode 100644 packages/web/vitest.setup.ts diff --git a/packages/web/package.json b/packages/web/package.json index ae2cdb43..39a595c8 100644 --- a/packages/web/package.json +++ b/packages/web/package.json @@ -42,17 +42,21 @@ }, "devDependencies": { "@tailwindcss/postcss": "^4.2.2", + "@testing-library/dom": "^10.4.1", + "@testing-library/jest-dom": "^6.9.1", + "@testing-library/react": "^16.3.2", "@types/bcryptjs": "^2", "@types/node": "^20", "@types/react": "^19", "@types/react-dom": "^19", + "@vitest/coverage-v8": "3.2.6", "dotenv": "^17.4.2", "eslint-config-next": "^16.2.3", + "jsdom": "^29.1.1", "prisma": "^6", "shadcn": "^4.10.0", "tailwindcss": "^4", "typescript": "^5", - "vitest": "^3.2.6", - "@vitest/coverage-v8": "3.2.6" + "vitest": "^3.2.6" } } diff --git a/packages/web/src/components/dashboard/date-range-picker.test.tsx b/packages/web/src/components/dashboard/date-range-picker.test.tsx new file mode 100644 index 00000000..eb330a33 --- /dev/null +++ b/packages/web/src/components/dashboard/date-range-picker.test.tsx @@ -0,0 +1,68 @@ +import React from 'react' +import { render, screen, fireEvent } from '@testing-library/react' +import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest' +import { useRouter, useSearchParams } from 'next/navigation' +import { DateRangePicker } from './date-range-picker' +import { cleanup } from '@testing-library/react' + +// Mock next/navigation +vi.mock('next/navigation', () => { + return { + useRouter: vi.fn(), + useSearchParams: vi.fn(), + } +}) + +describe('DateRangePicker', () => { + let mockPush: ReturnType + + beforeEach(() => { + mockPush = vi.fn() + vi.mocked(useRouter).mockReturnValue({ + push: mockPush, + replace: vi.fn(), + prefetch: vi.fn(), + back: vi.fn(), + forward: vi.fn(), + refresh: vi.fn() + } as unknown as ReturnType) + + // Default search params + const mockSearchParams = new URLSearchParams() + vi.mocked(useSearchParams).mockReturnValue(mockSearchParams as unknown as ReturnType) + }) + + afterEach(() => { + cleanup() + }) + + it('renders presets', () => { + render() + + expect(screen.getByRole('button', { name: '7d' })).toBeDefined() + expect(screen.getByRole('button', { name: '30d' })).toBeDefined() + expect(screen.getByRole('button', { name: '90d' })).toBeDefined() + expect(screen.getByRole('button', { name: 'ALL' })).toBeDefined() + }) + + it('updates URL when a preset is clicked', () => { + render() + + const button30d = screen.getByRole('button', { name: '30d' }) + fireEvent.click(button30d) + + expect(mockPush).toHaveBeenCalledTimes(1) + + // Check if the URL contains from and to parameters + const calledUrl = mockPush.mock.calls[0][0] + expect(calledUrl).toContain('from=') + expect(calledUrl).toContain('to=') + }) + + it('has aria-pressed set correctly based on active state', () => { + render() + + const button7d = screen.getByRole('button', { name: '7d' }) + expect(button7d.hasAttribute('aria-pressed')).toBe(true) + }) +}) diff --git a/packages/web/src/components/dashboard/date-range-picker.tsx b/packages/web/src/components/dashboard/date-range-picker.tsx index aef2f7be..6da1a8d3 100644 --- a/packages/web/src/components/dashboard/date-range-picker.tsx +++ b/packages/web/src/components/dashboard/date-range-picker.tsx @@ -62,9 +62,11 @@ function DateRangePickerContent() {