import XCTest @testable import RSSuper /// Unit tests for SyncScheduler final class SyncSchedulerTests: XCTestCase { private var scheduler: SyncScheduler! override func setUp() { super.setUp() scheduler = SyncScheduler() } override func tearDown() { scheduler = nil super.tearDown() } func testDefaultSyncInterval() { XCTAssertEqual(scheduler.preferredSyncInterval, SyncScheduler.defaultSyncInterval) } func testSyncIntervalClamping() { // Test minimum clamping scheduler.preferredSyncInterval = 60 // 1 minute XCTAssertEqual(scheduler.preferredSyncInterval, SyncScheduler.minimumSyncInterval) // Test maximum clamping scheduler.preferredSyncInterval = 48 * 3600 // 48 hours XCTAssertEqual(scheduler.preferredSyncInterval, SyncScheduler.maximumSyncInterval) } func testIsSyncDue() { // Fresh scheduler should have sync due XCTAssertTrue(scheduler.isSyncDue) // Set last sync date to recent past scheduler.lastSyncDate = Date().addingTimeInterval(-1 * 3600) // 1 hour ago XCTAssertFalse(scheduler.isSyncDue) // Set last sync date to far past scheduler.lastSyncDate = Date().addingTimeInterval(-12 * 3600) // 12 hours ago XCTAssertTrue(scheduler.isSyncDue) } func testTimeSinceLastSync() { scheduler.lastSyncDate = Date().addingTimeInterval(-3600) // 1 hour ago let timeSince = scheduler.timeSinceLastSync XCTAssertGreaterThan(timeSince, 3500) XCTAssertLessThan(timeSince, 3700) } func testResetSyncSchedule() { scheduler.preferredSyncInterval = 12 * 3600 scheduler.lastSyncDate = Date().addingTimeInterval(-100) scheduler.resetSyncSchedule() XCTAssertEqual(scheduler.preferredSyncInterval, SyncScheduler.defaultSyncInterval) XCTAssertNil(scheduler.lastSyncDate) } func testUserActivityLevelCalculation() { // High activity XCTAssertEqual(UserActivityLevel.calculate(from: 5, lastOpenedAgo: 3600), .high) XCTAssertEqual(UserActivityLevel.calculate(from: 1, lastOpenedAgo: 60), .high) // Medium activity XCTAssertEqual(UserActivityLevel.calculate(from: 2, lastOpenedAgo: 3600), .medium) XCTAssertEqual(UserActivityLevel.calculate(from: 0, lastOpenedAgo: 43200), .medium) // Low activity XCTAssertEqual(UserActivityLevel.calculate(from: 0, lastOpenedAgo: 172800), .low) } }