From 84fd910529ad541e3f8d36e724ff2fbafc1f2c28 Mon Sep 17 00:00:00 2001 From: ykisana Date: Wed, 14 Oct 2026 18:08:16 -0600 Subject: [PATCH] fix/reorder-block-order --- Normal/Services/TimedUnblockService.swift | 10 ++-- .../Services/TimedUnblockServiceTests.swift | 48 +++++++++++++++++++ 2 files changed, 54 insertions(+), 4 deletions(-) diff --git a/Normal/Services/TimedUnblockService.swift b/Normal/Services/TimedUnblockService.swift index ddc9377..e1a2f1a 100644 --- a/Normal/Services/TimedUnblockService.swift +++ b/Normal/Services/TimedUnblockService.swift @@ -59,12 +59,9 @@ final class TimedUnblockService { ) throws { let activityName = SharedConstants.mainTimedUnblockActivityName cancelMonitoring(activityName: activityName) - cancelAllGroupUnblocks() let start = Date.now let endDate = start.addingTimeInterval(duration.timeInterval) - screenTimeService.removeShieldOnAll(blockAllPreventsAppDelete: blockAllPreventsAppDelete) - sharedStore.setScheduleOverrideActive(false) try scheduleActivity(name: activityName, start: start, endDate: endDate) try persist( @@ -77,6 +74,10 @@ final class TimedUnblockService { isGroupUnblock: false, blockAllPreventsAppDelete: blockAllPreventsAppDelete ) + + cancelAllGroupUnblocks() + screenTimeService.removeShieldOnAll(blockAllPreventsAppDelete: blockAllPreventsAppDelete) + sharedStore.setScheduleOverrideActive(false) } func startGroup( @@ -92,7 +93,6 @@ final class TimedUnblockService { let start = Date.now let endDate = start.addingTimeInterval(duration.timeInterval) - screenTimeService.removeFromShields(selection: selection, customDomains: customDomains) try scheduleActivity(name: activityName, start: start, endDate: endDate) try persist( @@ -104,6 +104,8 @@ final class TimedUnblockService { activityName: activityName, isGroupUnblock: true ) + + screenTimeService.removeFromShields(selection: selection, customDomains: customDomains) } func cancelMain( diff --git a/NormalTests/Services/TimedUnblockServiceTests.swift b/NormalTests/Services/TimedUnblockServiceTests.swift index c7f0010..fb78836 100644 --- a/NormalTests/Services/TimedUnblockServiceTests.swift +++ b/NormalTests/Services/TimedUnblockServiceTests.swift @@ -61,6 +61,54 @@ struct TimedUnblockServiceTests { #expect(service.isGroupUnblockActive(groupId: groupId)) } + private struct RegistrationFailed: Error {} + + @Test func startMainRegistrationFailureLeavesShieldsAndGroupUnblocks() throws { + let (service, activity, store) = makeService() + let screenTime = FakeScreenTimeService() + let groupId = UUID() + try service.startGroup( + duration: .fifteenMinutes, + groupId: groupId, + selection: FamilyActivitySelection(), + screenTimeService: screenTime + ) + activity.startError = RegistrationFailed() + + #expect(throws: RegistrationFailed.self) { + try service.startMain( + duration: .fifteenMinutes, + selection: FamilyActivitySelection(), + screenTimeService: screenTime + ) + } + + #expect(!screenTime.removeShieldOnAllCalled) + #expect(!service.isMainUnblockActive) + #expect(service.isGroupUnblockActive(groupId: groupId)) + #expect(store.timedUnblocks.map(\.id) == [groupId.uuidString]) + } + + @Test func startGroupRegistrationFailureLeavesShields() { + let (service, activity, store) = makeService() + let screenTime = FakeScreenTimeService() + let groupId = UUID() + activity.startError = RegistrationFailed() + + #expect(throws: RegistrationFailed.self) { + try service.startGroup( + duration: .fifteenMinutes, + groupId: groupId, + selection: FamilyActivitySelection(), + screenTimeService: screenTime + ) + } + + #expect(!screenTime.removeFromShieldsCalled) + #expect(!service.isGroupUnblockActive(groupId: groupId)) + #expect(store.timedUnblocks.isEmpty) + } + @Test func customDurationSetsEndDateAndPersistsStartDate() throws { let (service, _, store) = makeService() let custom = try #require(TimedUnblockDuration(validating: 5700))