Unit tests und nudging screen
This commit is contained in:
@@ -0,0 +1,84 @@
|
||||
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)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user