171023a411
- ReviewPromptServiceTests: la regla vigente pide 2 check-ins, no 3. - MonthlyCheckInViewTests: el día 1 cae en el periodo de gracia (20 días); usar el día 25 para etiquetar febrero. - SettingsViewModelTests: isPremium llega por receive(on: main); dar una vuelta de run loop antes de actuar. - DuoLayoutUITests: recorre tabs, split views e inspector con capturas (ejecutar en iPhone 17 Pro y iPad mini). ScreenshotMode oculta los tips de TipKit; identificador de accesibilidad en el botón de Quick Update. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01F1u4K16xy7eQVtgsYNZ9Vn
91 lines
2.8 KiB
Swift
91 lines
2.8 KiB
Swift
import XCTest
|
|
@testable import PortfolioJournal
|
|
|
|
final class ReviewPromptServiceTests: XCTestCase {
|
|
private var defaults: UserDefaults!
|
|
private var suiteName: String!
|
|
|
|
override func setUp() {
|
|
super.setUp()
|
|
suiteName = UUID().uuidString
|
|
defaults = UserDefaults(suiteName: suiteName)
|
|
}
|
|
|
|
override func tearDown() {
|
|
if let suiteName {
|
|
defaults.removePersistentDomain(forName: suiteName)
|
|
}
|
|
super.tearDown()
|
|
}
|
|
|
|
func testTriggersAfterMinimumCheckIns() {
|
|
var didRequest = false
|
|
let service = ReviewPromptService(
|
|
userDefaults: defaults,
|
|
dateProvider: { Date(timeIntervalSince1970: 1_000) },
|
|
reviewRequestHandler: { didRequest = true }
|
|
)
|
|
|
|
// Rating velocity rule (1.6.x): 2 check-ins are enough, not 3.
|
|
service.recordMonthlyCheckInCompleted()
|
|
XCTAssertFalse(didRequest)
|
|
|
|
service.recordMonthlyCheckInCompleted()
|
|
XCTAssertTrue(didRequest)
|
|
}
|
|
|
|
func testDoesNotTriggerIfPromptedRecently() {
|
|
var didRequest = false
|
|
let now = Date(timeIntervalSince1970: 10_000)
|
|
defaults.set(now, forKey: "reviewPromptLastDate")
|
|
|
|
let service = ReviewPromptService(
|
|
userDefaults: defaults,
|
|
dateProvider: { now.addingTimeInterval(60 * 60 * 24 * 10) },
|
|
reviewRequestHandler: { didRequest = true }
|
|
)
|
|
|
|
service.recordMonthlyCheckInCompleted()
|
|
service.recordMonthlyCheckInCompleted()
|
|
service.recordMonthlyCheckInCompleted()
|
|
|
|
XCTAssertFalse(didRequest)
|
|
}
|
|
|
|
func testAchievementPromptTriggersForNewUnlockWhenNotReviewed() {
|
|
let service = ReviewPromptService(
|
|
userDefaults: defaults,
|
|
dateProvider: Date.init,
|
|
reviewRequestHandler: {}
|
|
)
|
|
|
|
let shouldAsk = service.shouldAskForAchievementSatisfaction(newlyUnlockedAchievementKeys: ["streak_3"])
|
|
|
|
XCTAssertTrue(shouldAsk)
|
|
}
|
|
|
|
func testAchievementPromptDoesNotTriggerTwiceForSameAchievement() {
|
|
let service = ReviewPromptService(
|
|
userDefaults: defaults,
|
|
dateProvider: Date.init,
|
|
reviewRequestHandler: {}
|
|
)
|
|
|
|
XCTAssertTrue(service.shouldAskForAchievementSatisfaction(newlyUnlockedAchievementKeys: ["streak_3"]))
|
|
XCTAssertFalse(service.shouldAskForAchievementSatisfaction(newlyUnlockedAchievementKeys: ["streak_3"]))
|
|
}
|
|
|
|
func testAchievementPromptDoesNotTriggerAfterStoreReviewCompleted() {
|
|
let service = ReviewPromptService(
|
|
userDefaults: defaults,
|
|
dateProvider: Date.init,
|
|
reviewRequestHandler: {}
|
|
)
|
|
service.markStoreReviewCompleted()
|
|
|
|
let shouldAsk = service.shouldAskForAchievementSatisfaction(newlyUnlockedAchievementKeys: ["streak_6"])
|
|
|
|
XCTAssertFalse(shouldAsk)
|
|
}
|
|
}
|