diff --git a/Sources/TelemetryDeck/Signals/SignalManager.swift b/Sources/TelemetryDeck/Signals/SignalManager.swift index 5736212..489bdb5 100644 --- a/Sources/TelemetryDeck/Signals/SignalManager.swift +++ b/Sources/TelemetryDeck/Signals/SignalManager.swift @@ -294,17 +294,20 @@ extension SignalManager { } static func getServiceUrl(baseURL: URL, namespace: String? = nil) -> URL? { - let path = - if let namespace = namespace, !namespace.isEmpty { - "/v2/namespace/\(namespace)/" - } else { - "/v2/" - } + var base = baseURL.absoluteString + if !base.hasSuffix("/") { + base += "/" + } - guard let serviceURL = URL(string: path, relativeTo: baseURL)?.standardized else { - return nil + let suffix: String + if let namespace, !namespace.isEmpty { + suffix = "v2/namespace/\(namespace)/" + } else { + suffix = "v2/" } + let serviceURL = URL(string: base + suffix) + assert(serviceURL != nil, "Failed to construct service URL from base: \(baseURL)") return serviceURL } } diff --git a/Sources/TelemetryDeck/TelemetryClient.swift b/Sources/TelemetryDeck/TelemetryClient.swift index b5c5637..35e02c5 100644 --- a/Sources/TelemetryDeck/TelemetryClient.swift +++ b/Sources/TelemetryDeck/TelemetryClient.swift @@ -10,7 +10,7 @@ import Foundation import TVUIKit #endif -let sdkVersion = "2.11.0" +let sdkVersion = "2.12.0" /// Configuration for TelemetryManager /// diff --git a/Tests/TelemetryDeckTests/TelemetryClientTests.swift b/Tests/TelemetryDeckTests/TelemetryClientTests.swift index 43c2c86..cb7437e 100644 --- a/Tests/TelemetryDeckTests/TelemetryClientTests.swift +++ b/Tests/TelemetryDeckTests/TelemetryClientTests.swift @@ -31,4 +31,40 @@ struct TelemetryClientTests { #expect(result != nil) #expect(result?.absoluteString == "https://nom.telemetrydeck.com/v2/namespace/deltaquadrant/") } + + @Test + func `SignalManager preserves base URL path components`() { + let baseURL = URL(string: "https://example.com/array/sensors")! + let result = SignalManager.getServiceUrl(baseURL: baseURL) + + #expect(result != nil) + #expect(result?.absoluteString == "https://example.com/array/sensors/v2/") + } + + @Test + func `SignalManager preserves base URL path components with trailing slash`() { + let baseURL = URL(string: "https://example.com/array/sensors/")! + let result = SignalManager.getServiceUrl(baseURL: baseURL) + + #expect(result != nil) + #expect(result?.absoluteString == "https://example.com/array/sensors/v2/") + } + + @Test + func `SignalManager preserves base URL path components with namespace`() { + let baseURL = URL(string: "https://example.com/array/sensors")! + let result = SignalManager.getServiceUrl(baseURL: baseURL, namespace: "deltaquadrant") + + #expect(result != nil) + #expect(result?.absoluteString == "https://example.com/array/sensors/v2/namespace/deltaquadrant/") + } + + @Test + func `SignalManager preserves base URL path components with trailing slash and namespace`() { + let baseURL = URL(string: "https://example.com/array/sensors/")! + let result = SignalManager.getServiceUrl(baseURL: baseURL, namespace: "deltaquadrant") + + #expect(result != nil) + #expect(result?.absoluteString == "https://example.com/array/sensors/v2/namespace/deltaquadrant/") + } }