import Testing import Foundation @testable import Mobile_Music_Assistant // MARK: - MAStoreManager Nudge Logic @Suite("MAStoreManager – Nudge Logic") struct MAStoreManagerNudgeTests { // Use isolated UserDefaults to avoid polluting real app state private func makeStore(firstLaunch: Date, lastKeyDate: Date?) -> MAStoreManager { let store = MAStoreManager() let defaults = UserDefaults.standard defaults.set(firstLaunch, forKey: "ma_firstLaunchDate") if let last = lastKeyDate { defaults.set(last, forKey: "ma_lastNudgeOrPurchaseDate") } else { defaults.removeObject(forKey: "ma_lastNudgeOrPurchaseDate") } return store } // MARK: - Initial trigger @Test("Does not nudge before 3 days have passed") func noNudgeBeforeThreeDays() { let store = makeStore(firstLaunch: Date(), lastKeyDate: nil) #expect(store.shouldShowNudge == false) } @Test("Does not nudge at exactly 2 days 23 hours") func noNudgeJustBeforeThreshold() { let almostThreeDays = Date().addingTimeInterval(-(3 * 24 * 3600 - 60)) let store = makeStore(firstLaunch: almostThreeDays, lastKeyDate: nil) #expect(store.shouldShowNudge == false) } @Test("Nudges after 3 days with no prior interaction") func nudgeAfterThreeDays() { let threeDaysAgo = Date().addingTimeInterval(-(3 * 24 * 3600 + 1)) let store = makeStore(firstLaunch: threeDaysAgo, lastKeyDate: nil) #expect(store.shouldShowNudge == true) } // MARK: - 6-month repeat @Test("Does not nudge again within 6 months of last interaction") func noNudgeWithinSixMonths() { let fourMonthsAgo = Date().addingTimeInterval(-(4 * 30 * 24 * 3600)) let fiveMonthsAgo = Date().addingTimeInterval(-(5 * 30 * 24 * 3600)) let store = makeStore(firstLaunch: fiveMonthsAgo, lastKeyDate: fourMonthsAgo) #expect(store.shouldShowNudge == false) } @Test("Nudges again after 6 months since last interaction") func nudgeAfterSixMonths() { let sevenMonthsAgo = Date().addingTimeInterval(-(7 * 30 * 24 * 3600)) let sixMonthsAgo = Date().addingTimeInterval(-(6 * 30 * 24 * 3600 + 60)) let store = makeStore(firstLaunch: sevenMonthsAgo, lastKeyDate: sixMonthsAgo) #expect(store.shouldShowNudge == true) } // MARK: - recordNudgeShown @Test("recordNudgeShown suppresses future nudge within 6 months") func recordNudgeShownSuppressesNudge() { let fourDaysAgo = Date().addingTimeInterval(-(4 * 24 * 3600)) let store = makeStore(firstLaunch: fourDaysAgo, lastKeyDate: nil) #expect(store.shouldShowNudge == true) store.recordNudgeShown() #expect(store.shouldShowNudge == false) } // MARK: - firstLaunchDate persistence @Test("firstLaunchDate is written once and not overwritten") func firstLaunchDateNotOverwritten() { let expectedDate = Date().addingTimeInterval(-100) UserDefaults.standard.set(expectedDate, forKey: "ma_firstLaunchDate") let store = MAStoreManager() let delta = abs(store.firstLaunchDate.timeIntervalSince(expectedDate)) #expect(delta < 1.0) } }