2025-12-10 01:19:46 +00:00
|
|
|
import Foundation
|
|
|
|
|
import Testing
|
2026-01-30 03:15:10 +01:00
|
|
|
@testable import OpenClaw
|
2025-12-10 01:19:46 +00:00
|
|
|
|
2026-01-07 20:13:24 +00:00
|
|
|
@Suite struct GatewayEnvironmentTests {
|
2025-12-10 01:19:46 +00:00
|
|
|
@Test func semverParsesCommonForms() {
|
|
|
|
|
#expect(Semver.parse("1.2.3") == Semver(major: 1, minor: 2, patch: 3))
|
2026-01-17 17:54:41 +00:00
|
|
|
#expect(Semver.parse(" v1.2.3 \n") == Semver(major: 1, minor: 2, patch: 3))
|
2025-12-10 01:19:46 +00:00
|
|
|
#expect(Semver.parse("v2.0.0") == Semver(major: 2, minor: 0, patch: 0))
|
2026-01-18 00:31:20 +08:00
|
|
|
#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
|
2026-01-17 16:50:05 +00:00
|
|
|
#expect(Semver.parse("1.0.5+build.123") == Semver(major: 1, minor: 0, patch: 5)) // metadata suffix stripped
|
2026-01-17 17:54:41 +00:00
|
|
|
#expect(Semver.parse("v1.2.3+build.9") == Semver(major: 1, minor: 2, patch: 3))
|
2026-01-17 17:15:08 +00:00
|
|
|
#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))
|
2025-12-10 01:19:46 +00:00
|
|
|
#expect(Semver.parse(nil) == nil)
|
|
|
|
|
#expect(Semver.parse("invalid") == nil)
|
2026-01-17 17:15:08 +00:00
|
|
|
#expect(Semver.parse("1.2") == nil)
|
|
|
|
|
#expect(Semver.parse("1.2.x") == nil)
|
2025-12-10 01:19:46 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@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))
|
2026-01-17 17:54:41 +00:00
|
|
|
#expect(Semver(major: 2, minor: 1, patch: 1).compatible(with: required))
|
|
|
|
|
#expect(Semver(major: 2, minor: 0, patch: 9).compatible(with: required) == false)
|
2025-12-10 01:19:46 +00:00
|
|
|
#expect(Semver(major: 3, minor: 0, patch: 0).compatible(with: required) == false)
|
|
|
|
|
#expect(Semver(major: 1, minor: 9, patch: 9).compatible(with: required) == false)
|
|
|
|
|
}
|
|
|
|
|
|
2026-01-07 20:13:24 +00:00
|
|
|
@Test func gatewayPortDefaultsAndRespectsOverride() async {
|
|
|
|
|
let configPath = TestIsolation.tempConfigPath()
|
|
|
|
|
await TestIsolation.withIsolatedState(
|
2026-01-30 03:15:10 +01:00
|
|
|
env: ["OPENCLAW_CONFIG_PATH": configPath],
|
2026-01-07 20:13:24 +00:00
|
|
|
defaults: ["gatewayPort": nil])
|
|
|
|
|
{
|
|
|
|
|
let defaultPort = GatewayEnvironment.gatewayPort()
|
|
|
|
|
#expect(defaultPort == 18789)
|
2026-01-07 19:30:01 +00:00
|
|
|
|
2026-01-07 20:13:24 +00:00
|
|
|
UserDefaults.standard.set(19999, forKey: "gatewayPort")
|
|
|
|
|
defer { UserDefaults.standard.removeObject(forKey: "gatewayPort") }
|
|
|
|
|
#expect(GatewayEnvironment.gatewayPort() == 19999)
|
|
|
|
|
}
|
2025-12-10 01:19:46 +00:00
|
|
|
}
|
2025-12-10 01:26:54 +00:00
|
|
|
|
|
|
|
|
@Test func expectedGatewayVersionFromStringUsesParser() {
|
|
|
|
|
#expect(GatewayEnvironment.expectedGatewayVersion(from: "v9.1.2") == Semver(major: 9, minor: 1, patch: 2))
|
2026-01-22 00:59:36 +00:00
|
|
|
#expect(GatewayEnvironment.expectedGatewayVersion(from: "2026.1.11-4") == Semver(
|
|
|
|
|
major: 2026,
|
|
|
|
|
minor: 1,
|
|
|
|
|
patch: 11))
|
2025-12-10 01:26:54 +00:00
|
|
|
#expect(GatewayEnvironment.expectedGatewayVersion(from: nil) == nil)
|
|
|
|
|
}
|
2025-12-10 01:19:46 +00:00
|
|
|
}
|