From ded5d70bf82beb72259a7d99644ffb59b89499a6 Mon Sep 17 00:00:00 2001 From: Rahul S Date: Mon, 16 Feb 2026 21:08:54 +0530 Subject: [PATCH] tests: prevent UserConfigTests from touching real user config directory --- Leader Key/UserConfig.swift | 7 +++++-- Leader KeyTests/UserConfigTests.swift | 28 +++++++++++++++++++-------- 2 files changed, 25 insertions(+), 10 deletions(-) diff --git a/Leader Key/UserConfig.swift b/Leader Key/UserConfig.swift index c339d028..5123de87 100644 --- a/Leader Key/UserConfig.swift +++ b/Leader Key/UserConfig.swift @@ -20,6 +20,7 @@ class UserConfig: ObservableObject { let fileName = "config.json" private let alertHandler: AlertHandler private let fileManager: FileManager + private let defaultDirectoryResolver: () -> String private var lastReadChecksum: String? private var isLoading = false private let configIOQueue = DispatchQueue(label: "ConfigIO", qos: .userInitiated) @@ -27,10 +28,12 @@ class UserConfig: ObservableObject { init( alertHandler: AlertHandler = DefaultAlertHandler(), - fileManager: FileManager = .default + fileManager: FileManager = .default, + defaultDirectoryResolver: @escaping () -> String = UserConfig.defaultDirectory ) { self.alertHandler = alertHandler self.fileManager = fileManager + self.defaultDirectoryResolver = defaultDirectoryResolver } // MARK: - Public Interface @@ -194,7 +197,7 @@ class UserConfig: ObservableObject { private func ensureValidConfigDirectory() { let dir = Defaults[.configDir] - let defaultDir = Self.defaultDirectory() + let defaultDir = defaultDirectoryResolver() if !fileManager.fileExists(atPath: dir) { alertHandler.showAlert( diff --git a/Leader KeyTests/UserConfigTests.swift b/Leader KeyTests/UserConfigTests.swift index 6a8fb64f..4e51d0cb 100644 --- a/Leader KeyTests/UserConfigTests.swift +++ b/Leader KeyTests/UserConfigTests.swift @@ -24,6 +24,7 @@ class TestAlertManager: AlertHandler { final class UserConfigTests: XCTestCase { var tempBaseDir: String! + var testDefaultDir: String! var testAlertManager: TestAlertManager! var subject: UserConfig! var originalSuite: UserDefaults! @@ -38,12 +39,21 @@ final class UserConfigTests: XCTestCase { // Create a unique temporary directory for each test tempBaseDir = NSTemporaryDirectory().appending("/LeaderKeyTests-\(UUID().uuidString)") try? FileManager.default.createDirectory(atPath: tempBaseDir, withIntermediateDirectories: true) + testDefaultDir = tempBaseDir.appending("/DefaultConfigDir") - testAlertManager = TestAlertManager() - subject = UserConfig(alertHandler: testAlertManager) - - // Set the config directory to our temp directory by default + // Point config dir at temp location before creating UserConfig. Defaults[.configDir] = tempBaseDir + + testAlertManager = TestAlertManager() + let isolatedDefaultDir = testDefaultDir! + subject = UserConfig( + alertHandler: testAlertManager, + defaultDirectoryResolver: { + try? FileManager.default.createDirectory( + atPath: isolatedDefaultDir, withIntermediateDirectories: true) + return isolatedDefaultDir + } + ) } override func tearDown() { @@ -67,7 +77,7 @@ final class UserConfigTests: XCTestCase { } func testCreatesDefaultConfigDirIfNotExists() throws { - let defaultDir = UserConfig.defaultDirectory() + let defaultDir = testDefaultDir! // Remove both directory and config file try? FileManager.default.removeItem(atPath: defaultDir) try? FileManager.default.removeItem( @@ -90,7 +100,7 @@ final class UserConfigTests: XCTestCase { subject.ensureAndLoad() waitForConfigLoad() - XCTAssertEqual(Defaults[.configDir], UserConfig.defaultDirectory()) + XCTAssertEqual(Defaults[.configDir], testDefaultDir) XCTAssertEqual(testAlertManager.shownAlerts.count, 1) XCTAssertEqual(testAlertManager.shownAlerts[0].style, .warning) XCTAssertTrue( @@ -99,8 +109,10 @@ final class UserConfigTests: XCTestCase { } func testShowsAlertWhenConfigFileFailsToParse() throws { - // First ensure we're in the default directory since custom dirs are no longer supported - Defaults[.configDir] = UserConfig.defaultDirectory() + // Ensure we're exercising the default directory path (isolated under tempBaseDir). + Defaults[.configDir] = testDefaultDir + try? FileManager.default.createDirectory( + atPath: testDefaultDir, withIntermediateDirectories: true) let invalidJSON = "{ invalid json }" try invalidJSON.write(to: subject.url, atomically: true, encoding: .utf8)