import Foundation import Testing import ShotdeckCore @Test func syncRootsFindsOneDriveDirsMMDFirstIgnoresNonDirsAndOtherProviders() throws { let home = try makeFakeHome() defer { try? FileManager.default.removeItem(at: home) } let cloudStorage = home.appendingPathComponent("Library/CloudStorage", isDirectory: true) try FileManager.default.createDirectory(at: cloudStorage, withIntermediateDirectories: true) try FileManager.default.createDirectory( at: cloudStorage.appendingPathComponent("OneDrive-Flowmaster", isDirectory: true), withIntermediateDirectories: true ) try FileManager.default.createDirectory( at: cloudStorage.appendingPathComponent("OneDrive-MMDGROUP", isDirectory: true), withIntermediateDirectories: true ) try FileManager.default.createDirectory( at: cloudStorage.appendingPathComponent("GoogleDrive-x", isDirectory: true), withIntermediateDirectories: true ) // A plain FILE (not a directory) named like a OneDrive root must be ignored. FileManager.default.createFile( atPath: cloudStorage.appendingPathComponent("OneDrive-notadir").path, contents: Data("not a directory".utf8) ) let roots = OneDriveLocator.syncRoots(home: home, fileManager: .default) #expect(roots.map(\.lastPathComponent) == ["OneDrive-MMDGROUP", "OneDrive-Flowmaster"]) } @Test func syncRootsEmptyAndDefaultFolderNilWithNoCloudStorageDirectory() throws { let home = try makeFakeHome() defer { try? FileManager.default.removeItem(at: home) } // No Library/CloudStorage created at all. let roots = OneDriveLocator.syncRoots(home: home, fileManager: .default) #expect(roots.isEmpty) let defaultFolder = OneDriveLocator.defaultRedlineFolder(home: home, fileManager: .default) #expect(defaultFolder == nil) } @Test func defaultRedlineFolderIsFirstSyncRootPlusRedline() throws { let home = try makeFakeHome() defer { try? FileManager.default.removeItem(at: home) } let cloudStorage = home.appendingPathComponent("Library/CloudStorage", isDirectory: true) try FileManager.default.createDirectory( at: cloudStorage.appendingPathComponent("OneDrive-MMDGROUP", isDirectory: true), withIntermediateDirectories: true ) try FileManager.default.createDirectory( at: cloudStorage.appendingPathComponent("OneDrive-Flowmaster", isDirectory: true), withIntermediateDirectories: true ) let defaultFolder = try #require( OneDriveLocator.defaultRedlineFolder(home: home, fileManager: .default) ) // Derive "expected" from syncRoots() itself (already covered by its own dedicated // test) rather than hand-building the path string — FileManager's directory // enumeration can canonicalize /var -> /private/var and the two constructions // otherwise disagree on that even for a URL that already exists. let expectedRoot = try #require(OneDriveLocator.syncRoots(home: home, fileManager: .default).first) let expected = expectedRoot.appendingPathComponent("Redline", isDirectory: true) #expect(defaultFolder.path == expected.path) } @Test func resolveOneDriveFolderPrefersAnExistingStoredOverride() throws { let home = try makeFakeHome() defer { try? FileManager.default.removeItem(at: home) } let cloudStorage = home.appendingPathComponent("Library/CloudStorage", isDirectory: true) try FileManager.default.createDirectory( at: cloudStorage.appendingPathComponent("OneDrive-MMDGROUP", isDirectory: true), withIntermediateDirectories: true ) let suite = try makeTransportDefaultsSuite() defer { tearDownTransportSuite(suite) } let override = try makeTransportTemporaryDirectory(prefix: "shotdeck-onedrive-override") defer { try? FileManager.default.removeItem(at: override) } TransportSettings.setOneDriveFolder(override, defaults: suite.defaults) let resolved = OneDriveLocator.resolveOneDriveFolder( defaults: suite.defaults, home: home, fileManager: .default ) #expect(resolved?.path == override.path) } @Test func resolveOneDriveFolderIgnoresAStoredPathThatNoLongerExists() throws { let home = try makeFakeHome() defer { try? FileManager.default.removeItem(at: home) } let cloudStorage = home.appendingPathComponent("Library/CloudStorage", isDirectory: true) try FileManager.default.createDirectory( at: cloudStorage.appendingPathComponent("OneDrive-MMDGROUP", isDirectory: true), withIntermediateDirectories: true ) let suite = try makeTransportDefaultsSuite() defer { tearDownTransportSuite(suite) } let goneOverride = try makeTransportTemporaryDirectory(prefix: "shotdeck-onedrive-gone") TransportSettings.setOneDriveFolder(goneOverride, defaults: suite.defaults) try FileManager.default.removeItem(at: goneOverride) let resolved = OneDriveLocator.resolveOneDriveFolder( defaults: suite.defaults, home: home, fileManager: .default ) let expectedRoot = try #require(OneDriveLocator.syncRoots(home: home, fileManager: .default).first) let expected = expectedRoot.appendingPathComponent("Redline", isDirectory: true) #expect(resolved?.path == expected.path) } private func makeFakeHome() throws -> URL { let home = FileManager.default.temporaryDirectory .appendingPathComponent("shotdeck-fake-home-\(UUID().uuidString)", isDirectory: true) try FileManager.default.createDirectory(at: home, withIntermediateDirectories: true) return home }