import Foundation import Testing @testable import Clawdbot @Suite struct GatewayEnvironmentTests { @Test func semverParsesCommonForms() { #expect(Semver.parse("1.2.3") == Semver(major: 1, minor: 2, patch: 3)) #expect(Semver.parse(" v1.2.3 \n") == Semver(major: 1, minor: 2, patch: 3)) #expect(Semver.parse("v2.0.0") == Semver(major: 2, minor: 0, patch: 0)) #expect(Semver.parse("3.4.5-beta.1") == Semver(major: 3, minor: 4, patch: 5)) // prerelease suffix stripped #expect(Semver.parse("2026.1.11-4") == Semver(major: 2026, minor: 1, patch: 11)) // build suffix stripped #expect(Semver.parse("1.0.5+build.123") == Semver(major: 1, minor: 0, patch: 5)) // metadata suffix stripped #expect(Semver.parse("v1.2.3+build.9") == Semver(major: 1, minor: 2, patch: 3)) #expect(Semver.parse("1.2.3+build.123") == Semver(major: 1, minor: 2, patch: 3)) #expect(Semver.parse("1.2.3-rc.1+build.7") == Semver(major: 1, minor: 2, patch: 3)) #expect(Semver.parse("v1.2.3-rc.1") == Semver(major: 1, minor: 2, patch: 3)) #expect(Semver.parse("1.2.0") == Semver(major: 1, minor: 2, patch: 0)) #expect(Semver.parse(nil) == nil) #expect(Semver.parse("invalid") == nil) #expect(Semver.parse("1.2") == nil) #expect(Semver.parse("1.2.x") == nil) } @Test func semverCompatibilityRequiresSameMajorAndNotOlder() { let required = Semver(major: 2, minor: 1, patch: 0) #expect(Semver(major: 2, minor: 1, patch: 0).compatible(with: required)) #expect(Semver(major: 2, minor: 2, patch: 0).compatible(with: required)) #expect(Semver(major: 2, minor: 1, patch: 1).compatible(with: required)) #expect(Semver(major: 2, minor: 0, patch: 9).compatible(with: required) == false) #expect(Semver(major: 3, minor: 0, patch: 0).compatible(with: required) == false) #expect(Semver(major: 1, minor: 9, patch: 9).compatible(with: required) == false) } @Test func gatewayPortDefaultsAndRespectsOverride() async { let configPath = TestIsolation.tempConfigPath() await TestIsolation.withIsolatedState( env: ["CLAWDBOT_CONFIG_PATH": configPath], defaults: ["gatewayPort": nil]) { let defaultPort = GatewayEnvironment.gatewayPort() #expect(defaultPort == 18789) UserDefaults.standard.set(19999, forKey: "gatewayPort") defer { UserDefaults.standard.removeObject(forKey: "gatewayPort") } #expect(GatewayEnvironment.gatewayPort() == 19999) } } @Test func expectedGatewayVersionFromStringUsesParser() { #expect(GatewayEnvironment.expectedGatewayVersion(from: "v9.1.2") == Semver(major: 9, minor: 1, patch: 2)) #expect(GatewayEnvironment.expectedGatewayVersion(from: "2026.1.11-4") == Semver( major: 2026, minor: 1, patch: 11)) #expect(GatewayEnvironment.expectedGatewayVersion(from: nil) == nil) } }