Skip to content
Open
Show file tree
Hide file tree
Changes from all 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
62 changes: 50 additions & 12 deletions .github/PULL_REQUEST_TEMPLATE.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,55 +4,93 @@

### 필수

- [ ] 반복 유형 선택
- [x] 반복 유형 선택
- 일정 생성 또는 수정 시 반복 유형을 선택할 수 있다.
- 반복 유형은 다음과 같다: 매일, 매주, 매월, 매년
- 31일에 매월을 선택한다면 -> 매월 마지막이 아닌, 31일에만 생성하세요.
- 윤년 29일에 매년을 선택한다면 -> 29일에만 생성하세요!
- [ ] 반복 일정 표시
- [x] 반복 일정 표시
- 캘린더 뷰에서 반복 일정을 시각적으로 구분하여 표시한다.
- 아이콘을 넣든 태그를 넣든 자유롭게 해보세요!
- [ ] 반복 종료
- [x] 반복 종료
- 반복 종료 조건을 지정할 수 있다.
- 옵션: 특정 날짜까지, 특정 횟수만큼, 또는 종료 없음 (예제 특성상, 2025-06-30까지)
- [ ] 반복 일정 단일 수정
- [x] 반복 일정 단일 수정
- 반복일정을 수정하면 단일 일정으로 변경됩니다.
- 반복일정 아이콘도 사라집니다.
- [ ] 반복 일정 단일 삭제
- [x] 반복 일정 단일 삭제
- 반복일정을 삭제하면 해당 일정만 삭제합니다.

### 선택

- [ ] 반복 간격 설정
- [x] 반복 간격 설정
- 각 반복 유형에 대해 간격을 설정할 수 있다.
- 예: 2일마다, 3주마다, 2개월마다 등
- [ ] 예외 날짜 처리:
- [x] 예외 날짜 처리:
- 반복 일정 중 특정 날짜를 제외할 수 있다.
- 반복 일정 중 특정 날짜의 일정을 수정할 수 있다.
- [ ] 요일 지정 (주간 반복의 경우):
- 주간 반복 시 특정 요일을 선택할 수 있다.
- [ ] 월간 반복 옵션:
- 매월 특정 날짜에 반복되도록 설정할 수 있다.
- 매월 특정 순서의 요일에 반복되도록 설정할 수 있다.
- [ ] 반복 일정 전체 수정 및 삭제
- [x] 반복 일정 전체 수정 및 삭제
- 반복 일정의 모든 일정을 수정할 수 있다.
- 반복 일정의 모든 일정을 삭제할 수 있다.

## 심화 과제

- [ ] 이 앱에 적합한 테스트 전략을 만들었나요?
- [x] 이 앱에 적합한 테스트 전략을 만들었나요?

### 각 팀원들의 테스트 전략은?

(작성 필요)
**Given-When-Then BDD 전략** 사용

- **Given**: 테스트의 전제 조건과 초기 상태를 명확히 정의합니다.
- **When**: 테스트하고자 하는 구체적인 동작이나 이벤트를 기술합니다
- **Then**: 예상되는 결과나 상태 변화를 명시합니다.

### 합의된 테스트 전략과 그 이유는 무엇인가요?

(작성 필요)
**BDD(Given-When-Then) 전략을 선택한 이유:**

1. TEO 코치님으로 부터 배운 테스트 방식이기도 하고,
2. **이해하기 쉬워서** 팀원들이 테스트 의도를 명확하게 파악 가능하고,
3. **비즈니스 요구사항과 직접적으로 연결**되 명세를 파악하기 쉽고,
4. **TDD Red-Green-Refactor 사이클**과 유사한 방식으로 진행할 수 있어서 선택하였습니다!

### 추가로 작성된 테스트 코드는 어떤 것들이 있나요?

(작성 필요)
**반복 일정 기능 관련 TDD 테스트 (`src/__tests__/unit/repeatEvent.spec.ts`)**

1. **31일 기준 매월 반복 처리**

- 31일이 없는 달은 제외된다

2. **윤년 2월 29일 매년 반복 처리**

- 평년에는 해당 날짜가 생성되지 않는다

3. **반복 종료 조건 처리**

- 특정 날짜까지 종료 조건이 적용된다
- 특정 횟수만큼 종료 조건이 적용된다

4. **반복 간격 계산**

- 매일 반복에 2일 간격이 적용된다
- 주간 반복에 2주 간격이 적용된다

5. **반복 일정 전체 조작**

- 반복 일정 전체 수정 시 모든 관련 일정이 업데이트된다
- 반복 일정 전체 삭제 시 모든 관련 일정이 제거된다

6. **예외 날짜 처리**
- 반복 일정 중 특정 날짜가 제외된다
- 예외 날짜가 없으면 모든 반복 일정이 생성된다

**총 10개의 새로운 테스트 케이스** 추가하여 반복 일정의 핵심 비즈니스 로직 검증

---

Expand Down
133 changes: 133 additions & 0 deletions CLAUDE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,133 @@
# 캘린더 반복 일정 기능 TDD 가이드

## 테스트 레벨별 구조

### Unit Tests (src/**tests**/unit/repeatEvent.spec.ts)

순수 함수와 비즈니스 로직 테스트

#### 1. 반복 날짜 계산 로직

```
Given: 31일 기준 매월 반복 설정이 주어졌을 때
When: 다음 6개월의 반복 날짜를 계산할 때
Then: 31일이 없는 달(2월, 4월, 6월, 9월, 11월)은 제외되어야 한다
```

```
Given: 윤년 2024년 2월 29일 기준 매년 반복 설정이 주어졌을 때
When: 다음 3년의 반복 날짜를 계산할 때
Then: 평년(2025, 2026, 2027)에는 해당 날짜가 생성되지 않아야 한다
```

#### 2. 반복 종료 조건 처리

```
Given: 반복 일정과 "특정 날짜까지" 종료 조건이 주어졌을 때
When: 반복 일정을 생성할 때
Then: 지정한 종료 날짜를 넘지 않는 일정들만 반환되어야 한다
```

```
Given: 반복 일정과 "특정 횟수만큼" 종료 조건이 주어졌을 때
When: 반복 일정을 생성할 때
Then: 지정한 횟수만큼의 일정들만 반환되어야 한다
```

#### 3. 반복 간격 계산

```
Given: 매일 반복에 2일 간격 설정이 주어졌을 때
When: 10개의 반복 일정을 생성할 때
Then: 2일씩 간격을 두고 일정이 생성되어야 한다
```

### Integration Tests (src/**tests**/integration/repeatEventFlow.spec.ts)

전체 기능 플로우와 컴포넌트 간 상호작용 테스트

#### 1. 반복 일정 생성부터 표시까지 플로우

```
Given: 일정 생성 폼이 렌더링되어 있을 때
When: 반복 유형을 선택하고 일정을 생성할 때
Then: 캘린더에 반복 일정이 시각적으로 구분되어 표시되어야 한다
```

#### 2. 반복 일정 단일 수정 플로우

```
Given: 캘린더에 반복 일정이 표시되어 있을 때
When: 특정 날짜의 반복 일정을 수정할 때
Then: 해당 일정은 단일 일정으로 변경되고 반복 표시가 사라져야 한다
```

#### 3. 반복 일정 단일 삭제 플로우

```
Given: 캘린더에 반복 일정이 표시되어 있을 때
When: 특정 날짜의 반복 일정을 삭제할 때
Then: 해당 날짜 일정만 삭제되고 다른 반복 일정은 유지되어야 한다
```

#### 4. 반복 일정 전체 수정/삭제 플로우

```
Given: 반복 일정이 여러 개 생성되어 있을 때
When: 반복 일정 전체를 수정/삭제할 때
Then: 모든 관련 반복 일정이 함께 수정/삭제되어야 한다
```

### 선택 기능 Unit Tests

#### 4. 요일 지정 반복 계산

```
Given: 주간 반복에 특정 요일(월, 수, 금) 설정이 주어졌을 때
When: 4주간의 반복 일정을 계산할 때
Then: 지정된 요일에만 일정이 생성되어야 한다
```

#### 5. 월간 반복 옵션 계산

```
Given: "매월 둘째 주 화요일" 설정이 주어졌을 때
When: 6개월간의 반복 일정을 계산할 때
Then: 각 달의 둘째 주 화요일에만 일정이 생성되어야 한다
```

#### 6. 예외 날짜 처리

```
Given: 반복 일정과 예외 날짜 목록이 주어졌을 때
When: 반복 일정을 생성할 때
Then: 예외 날짜는 제외된 일정 목록이 반환되어야 한다
```

## 테스트 작성 가이드

1. **Given**: 테스트의 전제 조건과 초기 상태를 명확히 정의
2. **When**: 테스트하고자 하는 구체적인 동작이나 이벤트를 기술
3. **Then**: 예상되는 결과나 상태 변화를 명시

### 테스트 파일 구조

```
src/__tests__/
├── unit/
│ └── repeatEvent.spec.ts # 순수 함수 테스트 (날짜 계산, 검증 등)
├── integration/
│ └── repeatEventFlow.spec.ts # 컴포넌트 간 상호작용 테스트
└── hooks/
└── useRepeatEvent.spec.ts # 반복 일정 관련 커스텀 훅 테스트
```

### 테스트 작성 우선순위

1. **Unit Tests**: 핵심 비즈니스 로직부터 (31일 매월, 윤년 처리 등)
2. **Integration Tests**: 필수 기능 플로우 (생성→표시→수정→삭제)
3. **선택 기능**: 간격 설정, 요일 지정 등

### Mock 데이터 활용

반복 일정 관련 테스트 시 `src/__mocks__/` 디렉토리의 mock 데이터를 활용하여 일관된 테스트 환경 구성
Loading