reset: prep for new test suite
This commit is contained in:
@@ -1,34 +0,0 @@
|
||||
//
|
||||
// CameraAccessServiceTests.swift
|
||||
// GazeTests
|
||||
//
|
||||
// Created by Mike Freno on 1/13/26.
|
||||
//
|
||||
|
||||
import XCTest
|
||||
@testable import Gaze
|
||||
|
||||
@MainActor
|
||||
final class CameraAccessServiceTests: XCTestCase {
|
||||
var cameraService: CameraAccessService!
|
||||
|
||||
override func setUp() async throws {
|
||||
cameraService = CameraAccessService.shared
|
||||
}
|
||||
|
||||
func testCameraServiceInitialization() {
|
||||
XCTAssertNotNil(cameraService)
|
||||
}
|
||||
|
||||
func testCheckCameraAuthorizationStatus() {
|
||||
cameraService.checkCameraAuthorizationStatus()
|
||||
|
||||
XCTAssertFalse(cameraService.isCameraAuthorized || cameraService.cameraError != nil)
|
||||
}
|
||||
|
||||
func testIsFaceDetectionAvailable() {
|
||||
let isAvailable = cameraService.isFaceDetectionAvailable()
|
||||
|
||||
XCTAssertEqual(isAvailable, cameraService.isCameraAuthorized)
|
||||
}
|
||||
}
|
||||
@@ -1,59 +0,0 @@
|
||||
//
|
||||
// EnforceModeServiceTests.swift
|
||||
// GazeTests
|
||||
//
|
||||
// Created by Mike Freno on 1/13/26.
|
||||
//
|
||||
|
||||
import XCTest
|
||||
@testable import Gaze
|
||||
|
||||
@MainActor
|
||||
final class EnforceModeServiceTests: XCTestCase {
|
||||
var enforceModeService: EnforceModeService!
|
||||
var settingsManager: SettingsManager!
|
||||
|
||||
override func setUp() async throws {
|
||||
settingsManager = SettingsManager.shared
|
||||
enforceModeService = EnforceModeService.shared
|
||||
}
|
||||
|
||||
override func tearDown() async throws {
|
||||
enforceModeService.disableEnforceMode()
|
||||
settingsManager.settings.enforcementMode = false
|
||||
}
|
||||
|
||||
func testEnforceModeServiceInitialization() {
|
||||
XCTAssertNotNil(enforceModeService)
|
||||
XCTAssertFalse(enforceModeService.isEnforceModeEnabled)
|
||||
XCTAssertFalse(enforceModeService.isCameraActive)
|
||||
XCTAssertFalse(enforceModeService.userCompliedWithBreak)
|
||||
}
|
||||
|
||||
func testDisableEnforceModeResetsState() {
|
||||
enforceModeService.disableEnforceMode()
|
||||
|
||||
XCTAssertFalse(enforceModeService.isEnforceModeEnabled)
|
||||
XCTAssertFalse(enforceModeService.isCameraActive)
|
||||
XCTAssertFalse(enforceModeService.userCompliedWithBreak)
|
||||
}
|
||||
|
||||
func testShouldEnforceBreakOnlyForLookAwayTimer() {
|
||||
settingsManager.settings.enforcementMode = true
|
||||
|
||||
let shouldEnforceLookAway = enforceModeService.shouldEnforceBreak(for: .builtIn(.lookAway))
|
||||
XCTAssertFalse(shouldEnforceLookAway)
|
||||
|
||||
let shouldEnforceBlink = enforceModeService.shouldEnforceBreak(for: .builtIn(.blink))
|
||||
XCTAssertFalse(shouldEnforceBlink)
|
||||
|
||||
let shouldEnforcePosture = enforceModeService.shouldEnforceBreak(for: .builtIn(.posture))
|
||||
XCTAssertFalse(shouldEnforcePosture)
|
||||
}
|
||||
|
||||
func testCheckUserComplianceWhenNotActive() {
|
||||
enforceModeService.checkUserCompliance()
|
||||
|
||||
XCTAssertFalse(enforceModeService.userCompliedWithBreak)
|
||||
}
|
||||
}
|
||||
@@ -1,39 +0,0 @@
|
||||
//
|
||||
// EyeTrackingServiceTests.swift
|
||||
// GazeTests
|
||||
//
|
||||
// Created by Mike Freno on 1/13/26.
|
||||
//
|
||||
|
||||
import XCTest
|
||||
@testable import Gaze
|
||||
|
||||
@MainActor
|
||||
final class EyeTrackingServiceTests: XCTestCase {
|
||||
var eyeTrackingService: EyeTrackingService!
|
||||
|
||||
override func setUp() async throws {
|
||||
eyeTrackingService = EyeTrackingService.shared
|
||||
}
|
||||
|
||||
override func tearDown() async throws {
|
||||
eyeTrackingService.stopEyeTracking()
|
||||
}
|
||||
|
||||
func testEyeTrackingServiceInitialization() {
|
||||
XCTAssertNotNil(eyeTrackingService)
|
||||
XCTAssertFalse(eyeTrackingService.isEyeTrackingActive)
|
||||
XCTAssertFalse(eyeTrackingService.isEyesClosed)
|
||||
XCTAssertTrue(eyeTrackingService.userLookingAtScreen)
|
||||
XCTAssertFalse(eyeTrackingService.faceDetected)
|
||||
}
|
||||
|
||||
func testStopEyeTrackingResetsState() {
|
||||
eyeTrackingService.stopEyeTracking()
|
||||
|
||||
XCTAssertFalse(eyeTrackingService.isEyeTrackingActive)
|
||||
XCTAssertFalse(eyeTrackingService.isEyesClosed)
|
||||
XCTAssertTrue(eyeTrackingService.userLookingAtScreen)
|
||||
XCTAssertFalse(eyeTrackingService.faceDetected)
|
||||
}
|
||||
}
|
||||
@@ -1,71 +0,0 @@
|
||||
//
|
||||
// LaunchAtLoginManagerTests.swift
|
||||
// GazeTests
|
||||
//
|
||||
// Created by Mike Freno on 1/8/26.
|
||||
//
|
||||
|
||||
import XCTest
|
||||
@testable import Gaze
|
||||
|
||||
final class LaunchAtLoginManagerTests: XCTestCase {
|
||||
|
||||
func testIsEnabledReturnsBool() {
|
||||
let isEnabled = LaunchAtLoginManager.isEnabled
|
||||
XCTAssertNotNil(isEnabled)
|
||||
}
|
||||
|
||||
func testIsEnabledOnMacOS13AndLater() {
|
||||
if #available(macOS 13.0, *) {
|
||||
let isEnabled = LaunchAtLoginManager.isEnabled
|
||||
XCTAssert(isEnabled == true || isEnabled == false)
|
||||
}
|
||||
}
|
||||
|
||||
func testIsEnabledOnOlderMacOS() {
|
||||
if #unavailable(macOS 13.0) {
|
||||
let isEnabled = LaunchAtLoginManager.isEnabled
|
||||
XCTAssertFalse(isEnabled)
|
||||
}
|
||||
}
|
||||
|
||||
func testEnableThrowsOnUnsupportedOS() {
|
||||
if #unavailable(macOS 13.0) {
|
||||
XCTAssertThrowsError(try LaunchAtLoginManager.enable()) { error in
|
||||
XCTAssertTrue(error is LaunchAtLoginError)
|
||||
if let launchError = error as? LaunchAtLoginError {
|
||||
XCTAssertEqual(launchError, .unsupportedOS)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func testDisableThrowsOnUnsupportedOS() {
|
||||
if #unavailable(macOS 13.0) {
|
||||
XCTAssertThrowsError(try LaunchAtLoginManager.disable()) { error in
|
||||
XCTAssertTrue(error is LaunchAtLoginError)
|
||||
if let launchError = error as? LaunchAtLoginError {
|
||||
XCTAssertEqual(launchError, .unsupportedOS)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func testToggleDoesNotCrash() {
|
||||
LaunchAtLoginManager.toggle()
|
||||
}
|
||||
|
||||
func testLaunchAtLoginErrorCases() {
|
||||
let unsupportedError = LaunchAtLoginError.unsupportedOS
|
||||
let registrationError = LaunchAtLoginError.registrationFailed
|
||||
|
||||
XCTAssertNotEqual(unsupportedError, registrationError)
|
||||
}
|
||||
|
||||
func testLaunchAtLoginErrorEquality() {
|
||||
let error1 = LaunchAtLoginError.unsupportedOS
|
||||
let error2 = LaunchAtLoginError.unsupportedOS
|
||||
|
||||
XCTAssertEqual(error1, error2)
|
||||
}
|
||||
}
|
||||
@@ -1,137 +0,0 @@
|
||||
//
|
||||
// MigrationManagerTests.swift
|
||||
// GazeTests
|
||||
//
|
||||
// Created by Mike Freno on 1/8/26.
|
||||
//
|
||||
|
||||
import XCTest
|
||||
@testable import Gaze
|
||||
|
||||
final class MigrationManagerTests: XCTestCase {
|
||||
|
||||
var migrationManager: MigrationManager!
|
||||
|
||||
override func setUp() {
|
||||
super.setUp()
|
||||
migrationManager = MigrationManager()
|
||||
UserDefaults.standard.removeObject(forKey: "app_version")
|
||||
UserDefaults.standard.removeObject(forKey: "gazeAppSettings")
|
||||
UserDefaults.standard.removeObject(forKey: "gazeAppSettings_backup")
|
||||
}
|
||||
|
||||
override func tearDown() {
|
||||
UserDefaults.standard.removeObject(forKey: "app_version")
|
||||
UserDefaults.standard.removeObject(forKey: "gazeAppSettings")
|
||||
UserDefaults.standard.removeObject(forKey: "gazeAppSettings_backup")
|
||||
super.tearDown()
|
||||
}
|
||||
|
||||
func testGetCurrentVersionDefaultsToZero() {
|
||||
let version = migrationManager.getCurrentVersion()
|
||||
XCTAssertEqual(version, "0.0.0")
|
||||
}
|
||||
|
||||
func testSetCurrentVersion() {
|
||||
migrationManager.setCurrentVersion("1.2.3")
|
||||
let version = migrationManager.getCurrentVersion()
|
||||
XCTAssertEqual(version, "1.2.3")
|
||||
}
|
||||
|
||||
func testMigrateSettingsReturnsNilWhenNoSettings() throws {
|
||||
let result = try migrationManager.migrateSettingsIfNeeded()
|
||||
XCTAssertNil(result)
|
||||
}
|
||||
|
||||
func testMigrateSettingsReturnsExistingDataWhenUpToDate() throws {
|
||||
let testData: [String: Any] = ["test": "value"]
|
||||
let jsonData = try JSONSerialization.data(withJSONObject: testData)
|
||||
UserDefaults.standard.set(jsonData, forKey: "gazeAppSettings")
|
||||
|
||||
if let bundleVersion = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") as? String {
|
||||
migrationManager.setCurrentVersion(bundleVersion)
|
||||
}
|
||||
|
||||
let result = try migrationManager.migrateSettingsIfNeeded()
|
||||
XCTAssertNotNil(result)
|
||||
XCTAssertEqual(result?["test"] as? String, "value")
|
||||
}
|
||||
|
||||
func testMigrationErrorTypes() {
|
||||
let migrationFailed = MigrationError.migrationFailed("test")
|
||||
let invalidData = MigrationError.invalidDataStructure
|
||||
let versionMismatch = MigrationError.versionMismatch
|
||||
let noBackup = MigrationError.noBackupAvailable
|
||||
|
||||
switch migrationFailed {
|
||||
case .migrationFailed(let message):
|
||||
XCTAssertEqual(message, "test")
|
||||
default:
|
||||
XCTFail("Expected migrationFailed error")
|
||||
}
|
||||
|
||||
XCTAssertNotNil(invalidData.errorDescription)
|
||||
XCTAssertNotNil(versionMismatch.errorDescription)
|
||||
XCTAssertNotNil(noBackup.errorDescription)
|
||||
}
|
||||
|
||||
func testMigrationErrorDescriptions() {
|
||||
let errors: [MigrationError] = [
|
||||
.migrationFailed("test message"),
|
||||
.invalidDataStructure,
|
||||
.versionMismatch,
|
||||
.noBackupAvailable
|
||||
]
|
||||
|
||||
for error in errors {
|
||||
XCTAssertNotNil(error.errorDescription)
|
||||
XCTAssertFalse(error.errorDescription!.isEmpty)
|
||||
}
|
||||
}
|
||||
|
||||
func testVersion101MigrationTargetVersion() {
|
||||
let migration = Version101Migration()
|
||||
XCTAssertEqual(migration.targetVersion, "1.0.1")
|
||||
}
|
||||
|
||||
func testVersion101MigrationPreservesData() throws {
|
||||
let migration = Version101Migration()
|
||||
let testData: [String: Any] = ["key1": "value1", "key2": 42]
|
||||
|
||||
let result = try migration.migrate(testData)
|
||||
|
||||
XCTAssertEqual(result["key1"] as? String, "value1")
|
||||
XCTAssertEqual(result["key2"] as? Int, 42)
|
||||
}
|
||||
|
||||
func testMigrationThrowsOnInvalidData() {
|
||||
UserDefaults.standard.set(Data("invalid json".utf8), forKey: "gazeAppSettings")
|
||||
migrationManager.setCurrentVersion("0.0.0")
|
||||
|
||||
XCTAssertThrowsError(try migrationManager.migrateSettingsIfNeeded()) { error in
|
||||
XCTAssertTrue(error is MigrationError)
|
||||
}
|
||||
}
|
||||
|
||||
func testVersionComparison() throws {
|
||||
migrationManager.setCurrentVersion("1.0.0")
|
||||
let current = migrationManager.getCurrentVersion()
|
||||
XCTAssertEqual(current, "1.0.0")
|
||||
|
||||
migrationManager.setCurrentVersion("1.2.3")
|
||||
let updated = migrationManager.getCurrentVersion()
|
||||
XCTAssertEqual(updated, "1.2.3")
|
||||
}
|
||||
|
||||
func testBackupIsCreatedDuringMigration() throws {
|
||||
let testData: [String: Any] = ["test": "backup"]
|
||||
let jsonData = try JSONSerialization.data(withJSONObject: testData)
|
||||
UserDefaults.standard.set(jsonData, forKey: "gazeAppSettings")
|
||||
migrationManager.setCurrentVersion("0.0.0")
|
||||
|
||||
_ = try? migrationManager.migrateSettingsIfNeeded()
|
||||
|
||||
let backupData = UserDefaults.standard.data(forKey: "gazeAppSettings_backup")
|
||||
XCTAssertNotNil(backupData)
|
||||
}
|
||||
}
|
||||
@@ -1,148 +0,0 @@
|
||||
//
|
||||
// UpdateManagerTests.swift
|
||||
// GazeTests
|
||||
//
|
||||
// Created by Mike Freno on 1/11/26.
|
||||
//
|
||||
|
||||
import XCTest
|
||||
import Combine
|
||||
@testable import Gaze
|
||||
|
||||
@MainActor
|
||||
final class UpdateManagerTests: XCTestCase {
|
||||
|
||||
var sut: UpdateManager!
|
||||
var cancellables: Set<AnyCancellable>!
|
||||
|
||||
override func setUp() async throws {
|
||||
try await super.setUp()
|
||||
sut = UpdateManager.shared
|
||||
cancellables = []
|
||||
}
|
||||
|
||||
override func tearDown() async throws {
|
||||
cancellables = nil
|
||||
sut = nil
|
||||
try await super.tearDown()
|
||||
}
|
||||
|
||||
// MARK: - Singleton Tests
|
||||
|
||||
func testSingletonInstance() {
|
||||
// Arrange & Act
|
||||
let instance1 = UpdateManager.shared
|
||||
let instance2 = UpdateManager.shared
|
||||
|
||||
// Assert
|
||||
XCTAssertTrue(instance1 === instance2, "UpdateManager should be a singleton")
|
||||
}
|
||||
|
||||
// MARK: - Initialization Tests
|
||||
|
||||
func testInitialization() {
|
||||
// Assert
|
||||
XCTAssertNotNil(sut, "UpdateManager should initialize")
|
||||
}
|
||||
|
||||
func testInitialObservableProperties() {
|
||||
// Assert - Check that properties are initialized (values may vary)
|
||||
// automaticallyChecksForUpdates could be true or false based on Info.plist
|
||||
// Just verify it's a valid boolean
|
||||
XCTAssertTrue(
|
||||
sut.automaticallyChecksForUpdates == true || sut.automaticallyChecksForUpdates == false,
|
||||
"automaticallyChecksForUpdates should be a valid boolean"
|
||||
)
|
||||
}
|
||||
|
||||
// MARK: - Observable Property Tests
|
||||
|
||||
func testAutomaticallyChecksForUpdatesIsPublished() async throws {
|
||||
// Arrange
|
||||
let expectation = expectation(description: "automaticallyChecksForUpdates property change observed")
|
||||
var observedValue: Bool?
|
||||
|
||||
// Act - Subscribe to published property
|
||||
sut.$automaticallyChecksForUpdates
|
||||
.dropFirst() // Skip initial value
|
||||
.sink { newValue in
|
||||
observedValue = newValue
|
||||
expectation.fulfill()
|
||||
}
|
||||
.store(in: &cancellables)
|
||||
|
||||
// Toggle the value (toggle to ensure change regardless of initial value)
|
||||
let originalValue = sut.automaticallyChecksForUpdates
|
||||
sut.automaticallyChecksForUpdates = !originalValue
|
||||
|
||||
// Assert
|
||||
await fulfillment(of: [expectation], timeout: 2.0)
|
||||
XCTAssertNotNil(observedValue, "Should observe a value change")
|
||||
XCTAssertEqual(observedValue, !originalValue, "Observed value should match the new value")
|
||||
}
|
||||
|
||||
func testLastUpdateCheckDateIsPublished() async throws {
|
||||
// Arrange
|
||||
let expectation = expectation(description: "lastUpdateCheckDate property change observed")
|
||||
var observedValue: Date?
|
||||
var changeDetected = false
|
||||
|
||||
// Act - Subscribe to published property
|
||||
sut.$lastUpdateCheckDate
|
||||
.dropFirst() // Skip initial value
|
||||
.sink { newValue in
|
||||
observedValue = newValue
|
||||
changeDetected = true
|
||||
expectation.fulfill()
|
||||
}
|
||||
.store(in: &cancellables)
|
||||
|
||||
// Set a new date
|
||||
let testDate = Date(timeIntervalSince1970: 1000000)
|
||||
sut.lastUpdateCheckDate = testDate
|
||||
|
||||
// Assert
|
||||
await fulfillment(of: [expectation], timeout: 2.0)
|
||||
XCTAssertTrue(changeDetected, "Should detect property change")
|
||||
XCTAssertEqual(observedValue, testDate, "Observed date should match the set date")
|
||||
}
|
||||
|
||||
// MARK: - Update Check Tests
|
||||
|
||||
func testCheckForUpdatesDoesNotCrash() {
|
||||
// Arrange - method should be callable without crash
|
||||
|
||||
// Act & Assert
|
||||
XCTAssertNoThrow(
|
||||
sut.checkForUpdates(),
|
||||
"checkForUpdates should not throw or crash"
|
||||
)
|
||||
}
|
||||
|
||||
func testCheckForUpdatesIsCallable() {
|
||||
// Arrange
|
||||
var didComplete = false
|
||||
|
||||
// Act
|
||||
sut.checkForUpdates()
|
||||
didComplete = true
|
||||
|
||||
// Assert
|
||||
XCTAssertTrue(didComplete, "checkForUpdates should complete synchronously")
|
||||
}
|
||||
|
||||
// MARK: - Integration Tests
|
||||
|
||||
func testCheckForUpdatesIsAvailableAfterInitialization() {
|
||||
// Arrange & Act
|
||||
// checkForUpdates should be available immediately after initialization
|
||||
var didExecute = false
|
||||
|
||||
// Act - Call the method
|
||||
sut.checkForUpdates()
|
||||
didExecute = true
|
||||
|
||||
// Assert
|
||||
XCTAssertTrue(didExecute, "checkForUpdates should be callable after initialization")
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user