Skip to content
Merged
Show file tree
Hide file tree
Changes from 5 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 35 additions & 0 deletions frontend/src/utils/parseRecruitmentPeriod.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
import { parseRecruitmentPeriod } from './stringToDate';

describe('parseRecruitmentPeriod 함수 테스트', () => {
it('올바른 형식의 날짜를 파싱한다.', () => {
const input = '2024.03.20 14:00 ~ 2024.03.25 18:00';
const result = parseRecruitmentPeriod(input);

expect(result.recruitmentStart).toEqual(new Date('2024-03-20T14:00:00'));
expect(result.recruitmentEnd).toEqual(new Date('2024-03-25T18:00:00'));
});

it('날짜가 기간형식이 아닌 단일 날짜 형식인 경우 null을 반환한다.', () => {
const input = '2024.03.20 14:00';
const result = parseRecruitmentPeriod(input);

expect(result.recruitmentStart).toBeNull();
expect(result.recruitmentEnd).toBeNull();
});

it('빈 문자열이라면 null을 반환한다.', () => {
const input = '';
const result = parseRecruitmentPeriod(input);

expect(result.recruitmentStart).toBeNull();
expect(result.recruitmentEnd).toBeNull();
});

it('날짜 사이 ~가 없다면 null을 반환한다.', () => {
const input = '2024.03.20 14:00 - 2024.03.25 18:00';
const result = parseRecruitmentPeriod(input);

expect(result.recruitmentStart).toBeNull();
expect(result.recruitmentEnd).toBeNull();
});
});
29 changes: 29 additions & 0 deletions frontend/src/utils/stringToDate.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
import { stringToDate } from './stringToDate';

describe('stringToDate 함수 테스트', () => {
it('날짜와 시간이 포함된 문자열을 Date 객체로 정확히 바꾼다', () => {
const input = '2025.05.25 13:45';
const result = new Date('2025-05-25T13:45:00');
expect(stringToDate(input)).toEqual(result);
});

it('자정 시간 "YYYY.MM.DD 00:00" 형식을 올바르게 Date 객체로 변환한다', () => {
const input = '2025.05.25 00:00';
const result = new Date('2025-05-25T00:00:00');
expect(stringToDate(input)).toEqual(result);
});

it('공백이 없는 문자열이 주어지면 예외를 발생시킨다.', () => {
const input = '2025.05.2513:45';
expect(() => stringToDate(input)).toThrow(
'유효하지 않은 날짜 형식입니다. 형식은 "YYYY.MM.DD HH:mm" 이어야 합니다.',
);
});

it('시간 형식이 누락된 경우 예외가 발생한다', () => {
const input = '2025.05.25 ';
expect(() => stringToDate(input)).toThrow(
'유효하지 않은 날짜 형식입니다. 형식은 "YYYY.MM.DD HH:mm" 이어야 합니다.',
);
});
});
38 changes: 25 additions & 13 deletions frontend/src/utils/stringToDate.ts
Original file line number Diff line number Diff line change
@@ -1,20 +1,32 @@
export function parseRecruitmentPeriod(periodStr: string): {
recruitmentStart: Date | null;
recruitmentEnd: Date | null;
} {
export const stringToDate = (s: string): Date => {
const [datePart, timePart] = s.split(' ') as [string, string];
if (!datePart || !timePart) {
throw new Error(
'유효하지 않은 날짜 형식입니다. 형식은 "YYYY.MM.DD HH:mm" 이어야 합니다.',
);
}

const isoDate = datePart.replace(/\./g, '-');
const date = new Date(`${isoDate}T${timePart}:00`);

if (isNaN(date.getTime())) {
throw new Error(
'유효하지 않은 날짜 형식입니다. 형식은 "YYYY.MM.DD HH:mm" 이어야 합니다.',
);
}
return date;
};

export const parseRecruitmentPeriod = (
periodStr: string,
): { recruitmentStart: Date | null; recruitmentEnd: Date | null } => {
const parts = periodStr.split('~').map((s) => s.trim());
if (parts.length !== 2) {
return { recruitmentStart: null, recruitmentEnd: null };
}

const convertToDate = (s: string): Date => {
const [datePart, timePart] = s.split(' ');
const isoDate = datePart.replace(/\./g, '-');
return new Date(`${isoDate}T${timePart}:00`);
};

return {
recruitmentStart: convertToDate(parts[0]),
recruitmentEnd: convertToDate(parts[1]),
recruitmentStart: stringToDate(parts[0]),
recruitmentEnd: stringToDate(parts[1]),
};
}
};