119 lines
3.7 KiB
TypeScript
119 lines
3.7 KiB
TypeScript
import { DateFormat } from '@/types/import';
|
|
import { describe, expect, it } from 'vitest';
|
|
import { autoDetectDateFormat, getLocaleDateFormat } from './file-parser';
|
|
|
|
describe('getLocaleDateFormat', () => {
|
|
it('returns null for undefined locale', () => {
|
|
expect(getLocaleDateFormat(undefined)).toBeNull();
|
|
});
|
|
|
|
it('returns MM-DD-YYYY for en-US', () => {
|
|
expect(getLocaleDateFormat('en-US')).toBe(DateFormat.MonthDayYear);
|
|
});
|
|
|
|
it('returns DD-MM-YYYY for en-GB', () => {
|
|
expect(getLocaleDateFormat('en-GB')).toBe(DateFormat.DayMonthYear);
|
|
});
|
|
|
|
it('returns DD-MM-YYYY for es', () => {
|
|
expect(getLocaleDateFormat('es')).toBe(DateFormat.DayMonthYear);
|
|
});
|
|
|
|
it('returns DD-MM-YYYY for de', () => {
|
|
expect(getLocaleDateFormat('de')).toBe(DateFormat.DayMonthYear);
|
|
});
|
|
|
|
it('returns DD-MM-YYYY for fr', () => {
|
|
expect(getLocaleDateFormat('fr')).toBe(DateFormat.DayMonthYear);
|
|
});
|
|
|
|
it('handles underscored locales like en_US', () => {
|
|
expect(getLocaleDateFormat('en_US')).toBe(DateFormat.MonthDayYear);
|
|
});
|
|
});
|
|
|
|
describe('autoDetectDateFormat', () => {
|
|
it('returns null for empty data', () => {
|
|
expect(autoDetectDateFormat([], 'date')).toBeNull();
|
|
});
|
|
|
|
it('detects YYYY-MM-DD unambiguously', () => {
|
|
const data = [
|
|
{ date: '2024-01-15' },
|
|
{ date: '2024-02-20' },
|
|
{ date: '2024-03-25' },
|
|
];
|
|
expect(autoDetectDateFormat(data, 'date')).toBe(
|
|
DateFormat.YearMonthDay,
|
|
);
|
|
});
|
|
|
|
it('detects DD-MM-YYYY when day > 12 disambiguates', () => {
|
|
const data = [
|
|
{ date: '15/01/2024' },
|
|
{ date: '20/02/2024' },
|
|
{ date: '25/03/2024' },
|
|
];
|
|
expect(autoDetectDateFormat(data, 'date')).toBe(
|
|
DateFormat.DayMonthYear,
|
|
);
|
|
});
|
|
|
|
it('detects MM-DD-YYYY when day > 12 disambiguates', () => {
|
|
const data = [
|
|
{ date: '01/15/2024' },
|
|
{ date: '02/20/2024' },
|
|
{ date: '03/25/2024' },
|
|
];
|
|
expect(autoDetectDateFormat(data, 'date')).toBe(
|
|
DateFormat.MonthDayYear,
|
|
);
|
|
});
|
|
|
|
it('uses locale to break tie for ambiguous dates (en-GB prefers DD-MM-YYYY)', () => {
|
|
// All dates have day <= 12, so DD-MM-YYYY and MM-DD-YYYY both parse
|
|
const data = [
|
|
{ date: '05/03/2024' },
|
|
{ date: '06/04/2024' },
|
|
{ date: '07/05/2024' },
|
|
];
|
|
expect(autoDetectDateFormat(data, 'date', 'en-GB')).toBe(
|
|
DateFormat.DayMonthYear,
|
|
);
|
|
});
|
|
|
|
it('uses locale to break tie for ambiguous dates (en-US prefers MM-DD-YYYY)', () => {
|
|
const data = [
|
|
{ date: '05/03/2024' },
|
|
{ date: '06/04/2024' },
|
|
{ date: '07/05/2024' },
|
|
];
|
|
expect(autoDetectDateFormat(data, 'date', 'en-US')).toBe(
|
|
DateFormat.MonthDayYear,
|
|
);
|
|
});
|
|
|
|
it('uses locale to break tie for ambiguous dates (es prefers DD-MM-YYYY)', () => {
|
|
const data = [
|
|
{ date: '05/03/2024' },
|
|
{ date: '06/04/2024' },
|
|
{ date: '07/05/2024' },
|
|
];
|
|
expect(autoDetectDateFormat(data, 'date', 'es')).toBe(
|
|
DateFormat.DayMonthYear,
|
|
);
|
|
});
|
|
|
|
it('prefers unambiguous detection over locale', () => {
|
|
// Day > 12, so only DD-MM-YYYY parses correctly, even with en-US locale
|
|
const data = [
|
|
{ date: '15/01/2024' },
|
|
{ date: '20/02/2024' },
|
|
{ date: '25/03/2024' },
|
|
];
|
|
expect(autoDetectDateFormat(data, 'date', 'en-US')).toBe(
|
|
DateFormat.DayMonthYear,
|
|
);
|
|
});
|
|
});
|