Files
InvestmentTrackerApp/PortfolioJournalTests/Services/ReviewPromptServiceTests.swift
T
alexandrev-tibco 171023a411 Tests: corrige 3 tests desfasados y añade recorrido UI del layout adaptativo
- 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
2026-09-16 15:13:10 +02:00

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)
}
}