Pulse Log의 기능을 안전하게 유지하고 확장하기 위한 테스트 가능한 경계를 정의한다. 현재 Android 앱은 배포 중이므로 Android 하네스는 기존 동작 보호에 집중하고, iOS 하네스는 Android 소스와 독립된 신규 구현의 품질 기준으로 둔다.
Android 앱에는 다음 경계가 이미 있다.
ClockProviderHealthRepositoryNotificationSchedulerValidationPolicyCalendarPolicyGraphPolicyExportPolicyNotificationSchedulePolicyNotificationReminderPolicy현재 Android 체크는 repository root에서 실행한다.
.\scripts\check.ps1
또는:
bash ./scripts/check.sh
Android 하네스의 우선순위는 배포 중인 앱의 회귀 방지다. iOS 구현을 위해 Android 구조를 재편하지 않는다.
app/src/test 단위 테스트를 동반한다.app/src/androidTest 테스트를 동반한다.Modifier.testTag()를 추가하거나 유지한다.NotificationScheduler 경계를 통과해야 한다.app/schemas에 보존한다.iOS 앱은 Android와 같은 shared Kotlin Multiplatform 경계를 사용한다.
shared
commonMain
model
domain
repository
usecase
presentation
commonTest
ios
PulseLog
App
Features
Entry
Calendar
Graph
Settings
Export
SharedBridge
Data
LocalHealthRepository
Notifications
NotificationScheduling
LocalNotificationScheduler
DesignSystem
PulseLogTests
PulseLogUITests
공통 경계는 가능한 한 shared/commonMain에 둔다. iOS 프로젝트에는 SwiftUI 상태 wrapper, 저장소 구현, 알림 구현, 공유 시트 구현만 남긴다.
목적:
권장 shared API:
protocol ClockProviding {
fun today(): LocalDate
fun nowEpochMs(): Long
fun zoneId(): TimeZoneId
}
목적:
필수 동작:
목적:
UNUserNotificationCenter 직접 호출을 앱 로직에서 분리한다.필수 동작:
다음 정책은 플랫폼 API 없이 테스트 가능해야 한다.
상세 shared 모듈 구조는 Android/iOS 공통 코드 설계를 따른다.
위치:
ios/PulseLogTests
우선 테스트:
49, 50, 200, 2010, 100, 100.001, -108:00, 23:59, 24:00, 12:60검증:
위치:
ios/PulseLogUITests
권장 accessibility identifier:
main.tab.entry
main.tab.calendar
main.tab.graph
main.header.settings
main.header.export
entry.morning.systolic
entry.morning.diastolic
entry.morning.save
entry.morning.delete
entry.evening.systolic
entry.evening.diastolic
entry.evening.save
entry.weight.value
entry.weight.save
calendar.month.previous
calendar.month.next
calendar.day.<yyyy-mm-dd>
graph.range.7
graph.range.30
settings.morning.enabled
settings.morning.time
settings.evening.enabled
settings.evening.time
settings.save
export.csv.30
export.csv.all
첫 TestFlight 전:
App Store 제출 전:
Android 유지:
iOS 신규: