Refactor ShowBasedOnVoteLogics to accept injectable `now: Date` parameter across all methods, enabling deterministic testing of voting date logic without simulator clock manipulation. Test coverage (55 new tests across 3 files): - Pipeline 1: Streak calculation (7 tests) — consecutive, gaps, missing/placeholder exclusion - Pipeline 2: Duplicate prevention (5 tests) — add replaces, removeDuplicates keeps best - Pipeline 3: Fill missing dates (4 tests) — gap fill, idempotent, no overwrite - Pipeline 4: Delete flows (5 tests) — clearDB, deleteLast, deleteAllEntries - Pipeline 5: Update flows (5 tests) — mood, notes, photo set/clear - Pipeline 6: Batch import (4 tests) — bulk insert, replace, dedup in batch - Pipeline 7: Data listeners (3 tests) — fire on save, multiple listeners, refreshFromDisk - Pipeline 8: Boundary edge cases (5 tests) — midnight, 23:59, day boundary leak - Pipeline 9: Voting date logic (5 tests) — Today/Previous x before/after voting time - Pipeline 10: Side effects orchestration (7 tests) — logMood, updateMood, deleteMood - Pipeline 11: Full integration (5 tests) — streak grows/breaks/rebuilds, voting lifecycle Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
58 lines
2.4 KiB
Swift
58 lines
2.4 KiB
Swift
//
|
||
// Tests_iOS.swift
|
||
// Tests iOS
|
||
//
|
||
// Created by Trey Tartt on 1/10/22.
|
||
//
|
||
|
||
import XCTest
|
||
@testable import Feels
|
||
|
||
class Tests_iOS: XCTestCase {
|
||
override func setUpWithError() throws {
|
||
// Put setup code here. This method is called before the invocation of each test method in the class.
|
||
|
||
// In UI tests it is usually best to stop immediately when a failure occurs.
|
||
continueAfterFailure = false
|
||
|
||
// In UI tests it’s important to set the initial state - such as interface orientation - required for your tests before they run. The setUp method is a good place to do this.
|
||
}
|
||
|
||
override func tearDownWithError() throws {
|
||
// Put teardown code here. This method is called after the invocation of each test method in the class.
|
||
}
|
||
|
||
func testDatesBetween() {
|
||
let today = Calendar.current.date(bySettingHour: 0, minute: 0, second: 0, of: Date())!
|
||
let yesterday = Calendar.current.date(byAdding: .day, value: -1, to: today)!
|
||
let tenDaysAgo = Calendar.current.date(byAdding: .day, value: -10, to: today)!
|
||
|
||
let dates = Date.dates(from: Calendar.current.date(byAdding: .day, value: -10, to: Date())!, toDate: Date())
|
||
|
||
XCTAssertTrue(dates.last == yesterday)
|
||
XCTAssertTrue(dates.first == tenDaysAgo)
|
||
}
|
||
|
||
func testDatesIncluding() {
|
||
let today = Calendar.current.date(bySettingHour: 0, minute: 0, second: 0, of: Date())!
|
||
let yesterday = Calendar.current.date(bySettingHour: 0, minute: 0, second: 0, of: Date())!
|
||
let tenDaysAgo = Calendar.current.date(byAdding: .day, value: -10, to: today)!
|
||
|
||
let dates = Date.dates(from: Calendar.current.date(byAdding: .day, value: -10, to: Date())!, toDate: Date(), includingToDate: true)
|
||
|
||
XCTAssertTrue(dates.last == today)
|
||
XCTAssertTrue(dates.first == tenDaysAgo)
|
||
}
|
||
|
||
// func testLastVoteShouldExist() {
|
||
// let todayOneHourAhead = Calendar.current.date(byAdding: .day, value: 1, to: Date())!
|
||
// let fakeOnboarding = OnboardingData()
|
||
// fakeOnboarding.inputDay = DayOptions.Today
|
||
// fakeOnboarding.date = todayOneHourAhead
|
||
//
|
||
// let lastDay = ShowBasedOnVoteLogics.getLastDateVoteShouldExist(onboardingData: fakeOnboarding)
|
||
// let yesterday = Calendar.current.date(byAdding: .day, value: -1, to: Date())!
|
||
// XCTAssertTrue(lastDay == yesterday)
|
||
// }
|
||
}
|