Files
zellyy-finance/src/hooks/transactions/__tests__/dateUtils.test.ts
hansoo 4d9effce41 fix: ESLint 오류 수정 - 사용하지 않는 변수들에 underscore prefix 추가
- AddTransactionButton.tsx: useEffect import 제거
- BudgetProgressCard.tsx: localBudgetData를 _localBudgetData로 변경
- Header.tsx: isMobile을 _isMobile로 변경
- RecentTransactionsSection.tsx: isDeleting을 _isDeleting로 변경
- TransactionCard.tsx: cn import 제거
- ExpenseForm.tsx: useState import 제거
- cacheStrategies.ts: QueryClient, Transaction import 제거
- Analytics.tsx: Separator import 제거, 미사용 변수들에 underscore prefix 추가
- Index.tsx: useMemo import 제거
- Login.tsx: setLoginError를 _setLoginError로 변경
- Register.tsx: useEffect dependency 수정 및 useCallback 추가
- Settings.tsx: toast, handleClick에 underscore prefix 추가
- authStore.ts: setError, setAppwriteInitialized에 underscore prefix 추가
- budgetStore.ts: ranges를 _ranges로 변경
- BudgetProgressCard.test.tsx: waitFor import 제거

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-07-12 20:49:36 +09:00

198 lines
6.5 KiB
TypeScript

import { describe, expect, it, vi, beforeAll, afterAll } from 'vitest';
import {
MONTHS_KR,
isValidMonth,
getCurrentMonth,
getPrevMonth,
getNextMonth,
formatMonthForDisplay
} from '../dateUtils';
// Mock logger to prevent console output during tests
vi.mock('@/utils/logger', () => ({
logger: {
warn: vi.fn(),
error: vi.fn(),
},
}));
describe('dateUtils', () => {
// Mock current date for consistent testing
const mockDate = new Date('2024-06-15T12:00:00.000Z');
beforeAll(() => {
vi.useFakeTimers();
vi.setSystemTime(mockDate);
});
afterAll(() => {
vi.useRealTimers();
});
describe('MONTHS_KR', () => {
it('contains all 12 months in Korean', () => {
expect(MONTHS_KR).toHaveLength(12);
expect(MONTHS_KR[0]).toBe('1월');
expect(MONTHS_KR[11]).toBe('12월');
});
it('has correct month names', () => {
const expectedMonths = [
'1월', '2월', '3월', '4월', '5월', '6월',
'7월', '8월', '9월', '10월', '11월', '12월'
];
expect(MONTHS_KR).toEqual(expectedMonths);
});
});
describe('isValidMonth', () => {
it('validates correct YYYY-MM format', () => {
expect(isValidMonth('2024-01')).toBe(true);
expect(isValidMonth('2024-12')).toBe(true);
expect(isValidMonth('2023-06')).toBe(true);
expect(isValidMonth('2025-09')).toBe(true);
});
it('rejects invalid month numbers', () => {
expect(isValidMonth('2024-00')).toBe(false);
expect(isValidMonth('2024-13')).toBe(false);
expect(isValidMonth('2024-99')).toBe(false);
});
it('rejects invalid formats', () => {
expect(isValidMonth('24-01')).toBe(false);
expect(isValidMonth('2024-1')).toBe(false);
expect(isValidMonth('2024/01')).toBe(false);
expect(isValidMonth('2024.01')).toBe(false);
expect(isValidMonth('2024-01-01')).toBe(false);
expect(isValidMonth('')).toBe(false);
expect(isValidMonth('invalid')).toBe(false);
});
it('handles edge cases', () => {
expect(isValidMonth('0000-01')).toBe(true); // 기술적으로 valid
expect(isValidMonth('9999-12')).toBe(true);
});
});
describe('getCurrentMonth', () => {
it('returns current month in YYYY-MM format', () => {
expect(getCurrentMonth()).toBe('2024-06');
});
});
describe('getPrevMonth', () => {
it('calculates previous month correctly', () => {
expect(getPrevMonth('2024-06')).toBe('2024-05');
expect(getPrevMonth('2024-03')).toBe('2024-02');
expect(getPrevMonth('2024-12')).toBe('2024-11');
});
it('handles year boundary correctly', () => {
expect(getPrevMonth('2024-01')).toBe('2023-12');
expect(getPrevMonth('2025-01')).toBe('2024-12');
});
it('handles invalid input gracefully', () => {
expect(getPrevMonth('invalid')).toBe('2024-06'); // current month fallback
expect(getPrevMonth('')).toBe('2024-06');
expect(getPrevMonth('2024-13')).toBe('2024-06');
expect(getPrevMonth('24-01')).toBe('2024-06');
});
it('handles edge cases', () => {
expect(getPrevMonth('0001-01')).toBe('0001-12'); // date-fns handles year 0 differently
expect(getPrevMonth('2024-00')).toBe('2024-06'); // invalid, returns current
});
});
describe('getNextMonth', () => {
it('calculates next month correctly', () => {
expect(getNextMonth('2024-06')).toBe('2024-07');
expect(getNextMonth('2024-03')).toBe('2024-04');
expect(getNextMonth('2024-11')).toBe('2024-12');
});
it('handles year boundary correctly', () => {
expect(getNextMonth('2024-12')).toBe('2025-01');
expect(getNextMonth('2023-12')).toBe('2024-01');
});
it('handles invalid input gracefully', () => {
expect(getNextMonth('invalid')).toBe('2024-06'); // current month fallback
expect(getNextMonth('')).toBe('2024-06');
expect(getNextMonth('2024-13')).toBe('2024-06');
expect(getNextMonth('24-01')).toBe('2024-06');
});
it('handles edge cases', () => {
expect(getNextMonth('9999-12')).toBe('10000-01'); // theoretically valid
expect(getNextMonth('2024-00')).toBe('2024-06'); // invalid, returns current
});
});
describe('formatMonthForDisplay', () => {
it('formats valid months correctly', () => {
expect(formatMonthForDisplay('2024-01')).toBe('2024년 01월');
expect(formatMonthForDisplay('2024-06')).toBe('2024년 06월');
expect(formatMonthForDisplay('2024-12')).toBe('2024년 12월');
});
it('handles different years', () => {
expect(formatMonthForDisplay('2023-03')).toBe('2023년 03월');
expect(formatMonthForDisplay('2025-09')).toBe('2025년 09월');
});
it('handles invalid input gracefully', () => {
// Should return current date formatted when invalid input
expect(formatMonthForDisplay('invalid')).toBe('2024년 06월');
expect(formatMonthForDisplay('')).toBe('2024년 06월');
expect(formatMonthForDisplay('2024-13')).toBe('2024년 06월');
});
it('preserves original format on error', () => {
// For some edge cases, it might return the original string
const result = formatMonthForDisplay('completely-invalid-format');
// Could be either the fallback format or the original string
expect(typeof result).toBe('string');
expect(result.length).toBeGreaterThan(0);
});
it('handles edge case years', () => {
expect(formatMonthForDisplay('0001-01')).toBe('0001년 01월');
expect(formatMonthForDisplay('9999-12')).toBe('9999년 12월');
});
});
describe('month navigation sequences', () => {
it('maintains consistency in forward/backward navigation', () => {
const startMonth = '2024-06';
// Forward then backward should return to original
const nextMonth = getNextMonth(startMonth);
const backToPrev = getPrevMonth(nextMonth);
expect(backToPrev).toBe(startMonth);
// Backward then forward should return to original
const prevMonth = getPrevMonth(startMonth);
const backToNext = getNextMonth(prevMonth);
expect(backToNext).toBe(startMonth);
});
it('handles multiple month navigation', () => {
let month = '2024-01';
// Navigate forward 12 months
for (let i = 0; i < 12; i++) {
month = getNextMonth(month);
}
expect(month).toBe('2025-01');
// Navigate backward 12 months
for (let i = 0; i < 12; i++) {
month = getPrevMonth(month);
}
expect(month).toBe('2024-01');
});
});
});