diff --git a/Sources/Conf/Environment.swift b/Sources/Conf/Environment.swift index 78ae280..92603c7 100644 --- a/Sources/Conf/Environment.swift +++ b/Sources/Conf/Environment.swift @@ -1,5 +1,6 @@ import Foundation +/// Manages environment variables @dynamicMemberLookup public struct Environment { public init(info: ProcessInfo = .processInfo) { diff --git a/Tests/ConfTests/EnvironmentTests.swift b/Tests/ConfTests/EnvironmentTests.swift index 255ba37..8ce7274 100644 --- a/Tests/ConfTests/EnvironmentTests.swift +++ b/Tests/ConfTests/EnvironmentTests.swift @@ -3,9 +3,18 @@ import XCTest final class EnvironmentTests: XCTestCase { + static let sampleValues: [String: String] = [ + "first": "string", + "integer": "1", + "float": "2.33", + "booleanTrue": "true", + "booleanFalse": "false", + "YES": "YES" + ] + func testDump() throws { - let values = MockProcessInfo.sampleEnv - let info = MockProcessInfo(values) + let values = Self.sampleValues + let info = ProcessInfo.make(with: values) let env = Environment(info: info) let dumped = env.dump() @@ -14,8 +23,7 @@ final class EnvironmentTests: XCTestCase { } func testRead() throws { - let values = MockProcessInfo.sampleEnv - let info = MockProcessInfo(values) + let info = ProcessInfo.make(with: Self.sampleValues) let env = Environment(info: info) XCTAssertNil(env.blabla) @@ -59,7 +67,7 @@ final class EnvironmentTests: XCTestCase { } func testAdd() { - let env = Environment(info: ProcessInfo()) + let env = Environment(info: ProcessInfo.instance) XCTAssertNil(env.key1) env.key1 = "value1" @@ -71,7 +79,7 @@ final class EnvironmentTests: XCTestCase { } func testRemove() { - let env = Environment(info: ProcessInfo()) + let env = Environment(info: ProcessInfo.instance) env.key1 = "value1" XCTAssertEqual(env.key1, "value1") @@ -85,7 +93,7 @@ final class EnvironmentTests: XCTestCase { } func testUpdate() { - let env = Environment(info: ProcessInfo()) + let env = Environment(info: ProcessInfo.instance) env.key1 = "value" XCTAssertEqual(env.key1, "value") @@ -94,7 +102,7 @@ final class EnvironmentTests: XCTestCase { } func testWrite() { - let env = Environment(info: ProcessInfo()) + let env = Environment(info: ProcessInfo.instance) let int = Int.random(in: Int.min...Int.max) env.int = int @@ -109,21 +117,5 @@ final class EnvironmentTests: XCTestCase { env.failure = false XCTAssertEqual(env.failure, false) - } } - -class MockProcessInfo: ProcessInfo { - init(_ env: [String: String]) { self.env = env } - var env: [String: String] - override var environment: [String: String] { env } - - static let sampleEnv: [String: String] = [ - "first": "string", - "integer": "1", - "float": "2.33", - "booleanTrue": "true", - "booleanFalse": "false", - "YES": "YES" - ] -} diff --git a/Tests/ConfTests/MockProcessInfo.swift b/Tests/ConfTests/MockProcessInfo.swift new file mode 100644 index 0000000..d4cbbb1 --- /dev/null +++ b/Tests/ConfTests/MockProcessInfo.swift @@ -0,0 +1,42 @@ +import Foundation + +#if os(macOS) +class MockProcessInfo: ProcessInfo { + init(_ env: [String: String]) { self.env = env } + var env: [String: String] + override var environment: [String: String] { env } +} +#endif + +extension ProcessInfo { + static var instance: ProcessInfo { + #if os(macOS) + return ProcessInfo() + #else + return ProcessInfo.processInfo + #endif + } + + static func make(with env: [String: String]) -> ProcessInfo { + #if os(macOS) + return MockProcessInfo(env) + #else + let info = ProcessInfo.instance + info.clearEnv() + info.set(env: env) + return info + #endif + } + + func clearEnv() { + environment.forEach {key, _ in + unsetenv(key) + } + } + + func set(env: [String: String]) { + env.forEach { key, value in + setenv(key, value, 1) + } + } +}