Skip to content

Commit c271104

Browse files
authored
[#601] 푸시 알림 설정이 자동으로 upsert되는 현상을 해결한다 (#604)
* chore: 의존성 고정 * fix: PushNotificationSettings fetch 결과 반영 경로 분리
1 parent 36723b3 commit c271104

3 files changed

Lines changed: 30 additions & 26 deletions

File tree

Application/DevLogPresentation/Sources/Settings/PushNotificationSettingsFeature.swift

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ struct PushNotificationSettingsFeature {
4242
case binding(BindingAction<State>)
4343
case timePicker(PresentationAction<TimePicker>)
4444
case fetchSettings
45+
case applyFetchedSettings(PushNotificationSettings)
4546
case setAlert
4647
case tapCustomTime
4748
case selectPresetTime(Date)
@@ -86,6 +87,13 @@ struct PushNotificationSettingsFeature {
8687
break
8788
case .fetchSettings:
8889
return fetchPushNotificationSettingsEffect()
90+
case .applyFetchedSettings(let settings):
91+
state.pushNotificationEnable = settings.isEnabled
92+
if let hour = settings.scheduledTime.hour,
93+
let minute = settings.scheduledTime.minute,
94+
let date = Calendar.current.date(bySettingHour: hour, minute: minute, second: 0, of: Date()) {
95+
state.viewPushNotificationTime = date
96+
}
8997
case .setAlert:
9098
state.alert = Self.alertState()
9199
case .tapCustomTime:
@@ -154,12 +162,7 @@ private extension PushNotificationSettingsFeature {
154162
await send(.loading(.begin(target: .default, mode: .delayed)))
155163
do {
156164
let settings = try await fetchPushSettingsUseCase.execute()
157-
await send(.binding(.set(\.pushNotificationEnable, settings.isEnabled)))
158-
if let hour = settings.scheduledTime.hour,
159-
let minute = settings.scheduledTime.minute,
160-
let date = Calendar.current.date(bySettingHour: hour, minute: minute, second: 0, of: Date()) {
161-
await send(.binding(.set(\.viewPushNotificationTime, date)))
162-
}
165+
await send(.applyFetchedSettings(settings))
163166
await send(.loading(.end(target: .default, mode: .delayed)))
164167
} catch {
165168
await send(.loading(.end(target: .default, mode: .delayed)))

Application/DevLogPresentation/Tests/Settings/PushNotificationSettingsFeatureTests.swift

Lines changed: 17 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -19,31 +19,39 @@ struct PushNotificationSettingsFeatureTests {
1919
settings: makePushNotificationSettings(isEnabled: true, hour: 9, minute: 0)
2020
)
2121
let adapter = PushNotificationSettingsStoreTestAdapter(fetchUseCase: fetchSpy)
22-
2322
await adapter.fetchSettings()
24-
2523
#expect(adapter.pushNotificationEnable)
2624
#expect(adapter.pushNotificationHour == 9)
2725
#expect(adapter.pushNotificationMinute == 0)
2826
#expect(adapter.sheetPushNotificationTime == adapter.viewPushNotificationTime)
2927
}
3028

29+
@Test("fetchSettings는 서버 상태 반영 중 설정 업데이트를 다시 호출하지 않는다")
30+
func fetchSettings는_서버_상태_반영_중_설정_업데이트를_다시_호출하지_않는다() async {
31+
let fetchSpy = FetchPushSettingsUseCaseSpy(
32+
settings: makePushNotificationSettings(isEnabled: true, hour: 9, minute: 0)
33+
)
34+
let updateSpy = UpdatePushSettingsUseCaseSpy()
35+
let adapter = PushNotificationSettingsStoreTestAdapter(
36+
fetchUseCase: fetchSpy,
37+
updateUseCase: updateSpy
38+
)
39+
await adapter.fetchSettings()
40+
#expect(updateSpy.executeCallCount == 0)
41+
}
42+
3143
@Test("setPushNotificationEnable은 활성화 상태를 변경한다")
3244
func setPushNotificationEnable은_활성화_상태를_변경한다() async {
3345
let adapter = PushNotificationSettingsStoreTestAdapter()
34-
3546
await adapter.setPushNotificationEnable(true)
36-
3747
#expect(adapter.pushNotificationEnable)
3848
}
3949

4050
@Test("selectPresetTime은 화면과 시트 시간을 함께 변경한다")
4151
func selectPresetTime은_화면과_시트_시간을_함께_변경한다() async {
4252
let adapter = PushNotificationSettingsStoreTestAdapter()
4353
let date = makeDate(hour: 15, minute: 0)
44-
4554
await adapter.selectPresetTime(date)
46-
4755
#expect(adapter.viewPushNotificationTime == date)
4856
#expect(adapter.sheetPushNotificationTime == date)
4957
#expect(adapter.pushNotificationHour == 15)
@@ -54,10 +62,8 @@ struct PushNotificationSettingsFeatureTests {
5462
func setShowTimePicker는_현재_화면_시간으로_시트를_연다() async {
5563
let adapter = PushNotificationSettingsStoreTestAdapter()
5664
let date = makeDate(hour: 18, minute: 0)
57-
5865
await adapter.setPushNotificationTime(view: date)
5966
await adapter.setShowTimePicker(true)
60-
6167
#expect(adapter.showTimePicker)
6268
#expect(adapter.sheetPushNotificationTime == date)
6369
}
@@ -111,10 +117,8 @@ struct PushNotificationSettingsFeatureTests {
111117
@Test("setSheetHeight는 시트 높이 상태를 변경한다")
112118
func setSheetHeight는_시트_높이_상태를_변경한다() async {
113119
let adapter = PushNotificationSettingsStoreTestAdapter()
114-
115120
await adapter.setShowTimePicker(true)
116121
await adapter.setSheetHeight(240)
117-
118122
#expect(adapter.sheetHeight == 240)
119123
}
120124

@@ -345,8 +349,10 @@ private final class FetchPushSettingsUseCaseSpy: FetchPushSettingsUseCase {
345349

346350
private final class UpdatePushSettingsUseCaseSpy: UpdatePushSettingsUseCase {
347351
var error: Error?
352+
private(set) var executeCallCount = 0
348353

349354
func execute(_: PushNotificationSettings) async throws {
355+
executeCallCount += 1
350356
if let error {
351357
self.error = nil
352358
throw error
@@ -374,12 +380,7 @@ private func makeDate(
374380
minute: Int
375381
) -> Date {
376382
let baseDate = Date(timeIntervalSince1970: 0)
377-
return Calendar.current.date(
378-
bySettingHour: hour,
379-
minute: minute,
380-
second: 0,
381-
of: baseDate
382-
) ?? baseDate
383+
return Calendar.current.date(bySettingHour: hour, minute: minute, second: 0, of: baseDate) ?? baseDate
383384
}
384385

385386
private func expectedPushNotificationSettingsErrorAlert() -> AlertState<Never> {

Tuist/ProjectDescriptionHelpers/Project+Packages.swift

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,19 +3,19 @@ import ProjectDescription
33
public enum DevLogPackages {
44
public static let markdownUIPackage: Package = .package(
55
url: "https://github.com/gonzalezreal/swift-markdown-ui.git",
6-
.upToNextMajor(from: "2.4.1")
6+
.exact("2.4.1")
77
)
88
public static let swiftCollectionsPackage: Package = .package(
99
url: "https://github.com/apple/swift-collections.git",
10-
.upToNextMajor(from: "1.3.0")
10+
.exact("1.3.0")
1111
)
1212
public static let composableArchitecturePackage: Package = .package(
1313
url: "https://github.com/pointfreeco/swift-composable-architecture",
14-
.upToNextMinor(from: "1.25.5")
14+
.exact("1.25.5")
1515
)
1616
public static let firebasePackage: Package = .package(
1717
url: "https://github.com/firebase/firebase-ios-sdk",
18-
.upToNextMajor(from: "11.15.0")
18+
.exact("11.15.0")
1919
)
2020
public static let googleSignInPackage: Package = .package(
2121
url: "https://github.com/google/GoogleSignIn-iOS",

0 commit comments

Comments
 (0)