diff --git a/Sources/Library/Extensions/URL+Extensions.swift b/Sources/Library/Extensions/URL+Extensions.swift new file mode 100644 index 0000000..04b5999 --- /dev/null +++ b/Sources/Library/Extensions/URL+Extensions.swift @@ -0,0 +1,35 @@ +import Foundation + +extension URL { + + // MARK: Initialisers + + init(at filePath: String) { + if #available(macOS 13.0, *) { + self = URL(filePath: filePath) + } else { + self = URL(fileURLWithPath: filePath) + } + } + + // MARK: Computed + + var pathString: String { + if #available(macOS 13.0, *) { + path() + } else { + path + } + } + + // MARK: Functions + + func appendingPath(_ path: String) -> URL { + if #available(macOS 13.0, *) { + appending(path: path) + } else { + appendingPathComponent(path) + } + } + +} diff --git a/Sources/Library/Extensions/URL+Inits.swift b/Sources/Library/Extensions/URL+Inits.swift deleted file mode 100644 index 7c31114..0000000 --- a/Sources/Library/Extensions/URL+Inits.swift +++ /dev/null @@ -1,15 +0,0 @@ -import Foundation - -extension URL { - - // MARK: Initialisers - - init(at filePath: String) { - if #available(macOS 13.0, *) { - self = URL(filePath: filePath) - } else { - self = URL(fileURLWithPath: filePath) - } - } - -} diff --git a/Sources/Library/Services/FileService.swift b/Sources/Library/Services/FileService.swift index 3e91ad2..1ccc4e6 100644 --- a/Sources/Library/Services/FileService.swift +++ b/Sources/Library/Services/FileService.swift @@ -54,25 +54,9 @@ public struct FileService: FileServicing { throw FileServiceError.urlNotFileURL } - let filePath = getPath(for: url) + let filePath = url.pathString return fileManager.fileExists(atPath: filePath) } } - -// MARK: - Helpers - -private extension FileService { - - // MARK: Functions - - func getPath(for url: URL) -> String { - if #available(macOS 13.0, *) { - return url.path() - } else { - return url.path - } - } - -} diff --git a/Sources/Library/Tasks/CreateRootFolderTask.swift b/Sources/Library/Tasks/CreateRootFolderTask.swift index fdee7e0..6345aee 100644 --- a/Sources/Library/Tasks/CreateRootFolderTask.swift +++ b/Sources/Library/Tasks/CreateRootFolderTask.swift @@ -27,12 +27,8 @@ public struct CreateRootFolderTask { } else { await fileService.currentFolder } - - let newFolder = if #available(macOS 13.0, *) { - rootFolder.appending(path: name) - } else { - rootFolder.appendingPathComponent(name) - } + + let newFolder = rootFolder.appendingPath(name) try await fileService.createFolder(at: newFolder) diff --git a/Tests/Library/Cases/Extensions/URL+ExtensionsTests.swift b/Tests/Library/Cases/Extensions/URL+ExtensionsTests.swift new file mode 100644 index 0000000..b5525ea --- /dev/null +++ b/Tests/Library/Cases/Extensions/URL+ExtensionsTests.swift @@ -0,0 +1,76 @@ +import Foundation +import Testing + +@testable import ColibriLibrary + +struct URL_ExtensionsTests { + + // MARK: Initialisers tests + + @Test(arguments: zip([String.someFilePath, .dotPath, .tildePath], + [URL.someFile, .dotFile, .tildeFile])) + func initAt( + with filePath: String, + expects url: URL + ) async throws { + // GIVEN + // WHEN + let result = URL(at: filePath) + + // THEN + #expect(result == url) + #expect(result.isFileURL == true) + } + + // MARK: Computed tests + + @Test(arguments: zip([URL.someFile, .dotFile, .tildeFile, .someURL], + [String.someFilePath, .dotPath, .tildePath, .empty])) + func pathString( + with url: URL, + expects path: String + ) async throws { + // GIVEN + // WHEN + let result = url.pathString + + // THEN + #expect(result == path) + } + + // MARK: Functions tests + + @Test(arguments: zip([URL.dotFile, .tildeFile, .someFile], + [".\(String.someFilePath)", "~\(String.someFilePath)", "\(String.someFilePath)\(String.someFilePath)"])) + func appendingPath( + with url: URL, + expects path: String + ) async throws { + // GIVEN + // WHEN + let result = url.appendingPath(.someFilePath) + + // THEN + #expect(result.pathString == path) + #expect(result.isFileURL == true) + } + +} + +// MARK: - String+Constants + +private extension String { + static let dotPath = "." + static let empty = "" + static let tildePath = "~" + static let someFilePath = "/some/file/path" +} + +// MARK: - URL+Constants + +private extension URL { + static let dotFile = URL(at: .dotPath) + static let someFile = URL(at: .someFilePath) + static let someURL = URL(string: "https://some.url.path")! + static let tildeFile = URL(at: .tildePath) +}