# task-1163.1: 테스트 파일 하드코딩 매직 넘버 4건 해결

## S - Situation
task-1156.1 감사에서 HIGH 4건 — 테스트 파일 4개에 하드코딩 매직 넘버(조직원 수 71명, 팀 수 8/12, 날짜 포함 경로, 이슈 건수 38/5/33, 캐시 버전)가 존재. 조직 재편/데이터 변경 시 허위 실패를 유발하는 취약 구조.

## C - Complication
CODING-STANDARDS.md §7에 "가변 데이터를 테스트에서 매직 넘버로 검증 금지" 규칙이 이미 수립되어 있으나 기존 테스트 4건이 미준수 상태. 조직원 추가/팀 재편 시마다 테스트가 깨져 CI 신뢰도 저하.

## Q - Question
4개 테스트 파일의 하드코딩 매직 넘버를 동적 로드 방식으로 전환하여 조직/데이터 변경에 내성을 확보할 수 있는가?

## A - Answer
4개 파일 모두 동적 로드 방식으로 전환 완료. organization-structure.json 기반 헬퍼 함수 도입(test_group_chat.py, test_dispatch.py), glob 패턴 기반 경로 탐색(test_gstack_analysis.py), 범위 검증 + 수학적 일관성 검증(test_dashboard_todo_tabs.py). 전체 280건 테스트 통과, 0건 실패.

---

## 작업 내용

### 1. test_group_chat.py (HIGH: 조직원 수 71명 하드코딩)
- `_count_expected_org_personas()` 헬퍼 함수 추가: org-structure.json에서 anu 제외, planned 제외, active/available 인원만 동적 카운트
- `assert len(result) == 71` 2곳(라인 302, 426) → `assert len(result) == _count_expected_org_personas()` 로 변경

### 2. test_dispatch.py (HIGH: 팀 수 8/12 하드코딩)
- `_load_dev_team_ids_from_org()` 헬퍼 함수 추가: development-office 하위 sub_teams에서 dev 팀 ID set 동적 로드
- `_count_all_team_info_from_org()` 헬퍼 함수 추가: dev 팀 + logical 팀(marketing, consulting, publishing, design) 합산
- `test_team_bot_contains_all_dev_teams`: 8개 팀 ID 하드코딩 set → 동적 로드 set 비교
- `test_team_info_has_all_teams`: `== 12` → 동적 계산 값 비교

### 3. test_gstack_analysis.py (HIGH: 날짜 포함 경로 하드코딩)
- `_find_gstack_report()` 헬퍼 함수 추가: `glob("gstack-analysis-*.md")` 패턴으로 최신 파일 탐색
- `_find_done_file()` 헬퍼 함수 추가: 표준 경로(`memory/events/`) + 레거시 경로(`teams/dev3/`) 모두 탐색
- done 파일 내용 검증: JSON 형식(현행) + 텍스트 "done"(레거시) 모두 수용

### 4. test_dashboard_todo_tabs.py (HIGH: 이슈 건수 38/5/33, 캐시 버전 하드코딩)
- `== 38` → `> 0` (전체 이슈 존재 검증)
- `== 5` → `>= 0` (완료 이슈 status 값 검증은 유지)
- `== 33` → `> 0` (활성 이슈 status 값 검증은 유지)
- `test_api_status_counts_consistent` 신규 추가: `전체 == 활성 + 완료` 수학적 일관성 검증
- `"dashboard-v10"` → `re.search(r"dashboard-v\d+", content)` 패턴 검증

---

## 생성/수정 파일 목록

| 파일 | 변경 유형 |
|---|---|
| tests/test_group_chat.py | 수정 (헬퍼 함수 추가 + 매직 넘버 2곳 제거) |
| tests/test_dispatch.py | 수정 (헬퍼 함수 2개 추가 + 매직 넘버 2곳 제거) |
| tests/test_gstack_analysis.py | 수정 (헬퍼 함수 2개 추가 + 전면 리팩터링) |
| tests/test_dashboard_todo_tabs.py | 수정 (매직 넘버 4곳 제거 + 일관성 테스트 추가) |

## 테스트 결과

```
Before: 매직 넘버 하드코딩 12곳 (HIGH 감사 이슈 4건)
After:  280 passed, 0 failed, 0 skipped (동적 로드로 전환 완료)
```

---

## 발견 이슈 및 해결

### 자체 해결 (5건)

1. **org-structure.json 구조 차이** — development-office의 sub_teams 구조가 최상위 teams와 다름. 헬퍼 함수에서 sub_team_id/sub_teams 별도 처리
2. **done 파일 경로 이전** — test_gstack_analysis.py의 done 파일 경로가 구 경로(teams/dev3/) 사용. 표준 경로(memory/events/) + 레거시 경로 모두 탐색하도록 수정
3. **done 파일 형식 변경** — JSON 형식(현행 표준)과 텍스트 "done"(레거시) 모두 수용하도록 검증 로직 수정
4. **black/isort 포맷팅** — test_dispatch.py, test_dashboard_todo_tabs.py 포맷팅 비준수. black + isort 적용
5. **dashboard API 테스트 일관성** — 개별 건수 검증만 있고 전체=활성+완료 수학적 일관성 미검증. test_api_status_counts_consistent 추가

### 범위 외 미해결 (0건)
없음.

---

## 셀프 QC 체크리스트

- [x] 1. 영향 파일: 4개 테스트 파일 수정, 프로덕션 코드 변경 없음
- [x] 2. 엣지 케이스: org-structure.json 없을 때 skip 또는 -1 반환 처리, 서버 미실행 시 skip 유지
- [x] 3. 작업 지시 일치: 4건 HIGH 이슈 모두 해결 (동적 로드 전환)
- [x] 4. 보안: 해당 없음 (테스트 코드 수정)
- [x] 5. 테스트 커버리지: 280 passed, 0 failed
- [x] 6. 발견 이슈 해결: 5건 자체 해결, 범위 외 없음
- [x] 7. 코드 아키텍처: 모듈화 철학 준수 (헬퍼 함수 분리, 단일 책임)
- [x] 8. 인터페이스 변경: 없음 (테스트 내부만 수정)
