import Foundation import Testing @testable import phbar // MARK: - Config directory cascade // // `PHPaths` resolves the config root in priority order: // 1. $XDG_CONFIG_HOME/phbar (only for an absolute XDG path) // 2. ~/.config/phbar // 3. ~/.phbar @Test func pathsCandidatesIncludeAbsoluteXdgFirst() { let home = FileManager.default.homeDirectoryForCurrentUser let candidates = PHPaths.configDirectoryCandidates(environment: ["XDG_CONFIG_HOME": "/custom/xdg"]) #expect(candidates.count == 3) #expect(candidates[0].path == "/custom/xdg/phbar") #expect(candidates[1].path == home.appending(path: ".config/phbar").path) #expect(candidates[2].path == home.appending(path: ".phbar").path) } @Test func pathsCandidatesOmitRelativeXdg() { let home = FileManager.default.homeDirectoryForCurrentUser let candidates = PHPaths.configDirectoryCandidates(environment: ["XDG_CONFIG_HOME": "relative/path"]) #expect(candidates.count == 2) #expect(candidates[0].path == home.appending(path: ".config/phbar").path) #expect(candidates[1].path == home.appending(path: ".phbar").path) } @Test func pathsCandidatesOmitEmptyXdg() { let candidates = PHPaths.configDirectoryCandidates(environment: ["XDG_CONFIG_HOME": ""]) #expect(candidates.count == 2) } @Test func pathsCandidatesOmitXdgWhenUnset() { let candidates = PHPaths.configDirectoryCandidates(environment: [:]) #expect(candidates.count == 2) } @Test func pathsResolvePicksFirstExistingCandidate() throws { // An existing XDG-rooted dir takes priority over ~/.config/phbar because // it sorts first in the candidate list. let xdgRoot = FileManager.default.temporaryDirectory.appending(path: "phbar_xdg_\(UUID().uuidString)") let xdgConfig = xdgRoot.appending(path: "phbar") try FileManager.default.createDirectory(at: xdgConfig, withIntermediateDirectories: true) defer { try? FileManager.default.removeItem(at: xdgRoot) } let resolved = PHPaths.resolveConfigDirectory(environment: ["XDG_CONFIG_HOME": xdgRoot.path]) #expect(resolved == xdgConfig) } @Test func pathsConfigDirectoryMatchesResolve() { // The cached static agrees with a fresh resolve against the live process env. #expect(PHPaths.configDirectory == PHPaths.resolveConfigDirectory()) }