Set map tiler URL from well known if available (#5633)

This commit is contained in:
Mauro
2026-05-28 15:24:58 +02:00
committed by GitHub
parent 594d041128
commit 7093d966b4
25 changed files with 291 additions and 88 deletions
@@ -19,10 +19,10 @@ struct MapTilerURLBuilderTests {
var builder: MapTilerURLBuilderProtocol
init() {
builder = MapTilerConfiguration(baseURL: Self.baseURL,
apiKey: Self.apiKey,
lightStyleID: Self.lightStyleID,
darkStyleID: Self.darkStyleID)
builder = MapTilerSettings.configuration(.init(baseURL: Self.baseURL,
apiKey: Self.apiKey,
lightStyleID: Self.lightStyleID,
darkStyleID: Self.darkStyleID))
}
@Test
@@ -58,10 +58,10 @@ struct MapTilerURLBuilderTests {
@Test
mutating func nilAPIKey() {
let configuration = MapTilerConfiguration(baseURL: Self.baseURL,
apiKey: nil,
lightStyleID: Self.lightStyleID,
darkStyleID: Self.darkStyleID)
let configuration = MapTilerSettings.configuration(.init(baseURL: Self.baseURL,
apiKey: nil,
lightStyleID: Self.lightStyleID,
darkStyleID: Self.darkStyleID))
#expect(!configuration.isEnabled)
builder = configuration
@@ -76,4 +76,66 @@ struct MapTilerURLBuilderTests {
let dynamicMapURL = builder.interactiveMapURL(for: .light)
#expect(dynamicMapURL == nil)
}
// MARK: - Override URL
@Test
mutating func overrideInteractiveMap() {
let overrideURL: URL = "https://maps.example.com/maps/streets-v2/style.json?key=server_key"
let configuration = MapTilerSettings.url(overrideURL)
#expect(configuration.isEnabled)
builder = configuration
// The override is returned as-is for the interactive map, ignoring light/dark.
#expect(builder.interactiveMapURL(for: .light) == overrideURL)
#expect(builder.interactiveMapURL(for: .dark) == overrideURL)
}
@Test
mutating func overrideStaticMapPreservesQueryItems() {
// The override includes an embedded API key as a query item — it must be preserved
// when deriving the static map URL.
let overrideURL: URL = "https://maps.example.com/maps/streets-v2/style.json?key=server_key"
builder = MapTilerSettings.url(overrideURL)
let url = builder.staticMapTileImageURL(for: .light,
coordinates: .init(latitude: 1, longitude: 2),
zoomLevel: 5,
size: .init(width: 300, height: 200),
attribution: .topLeft)
let expectedURL: URL = "https://maps.example.com/maps/streets-v2/static/2.000000,1.000000,5.000000/300x200@2x.png?key=server_key&attribution=topleft"
#expect(url == expectedURL)
}
@Test
mutating func overrideStaticMapWithoutQueryItems() {
// An override without a key (e.g. self-hosted server proxying the key) still works.
let overrideURL: URL = "https://maps.example.com/maps/streets-v2/style.json"
builder = MapTilerSettings.url(overrideURL)
let url = builder.staticMapTileImageURL(for: .dark,
coordinates: .init(latitude: 1, longitude: 2),
zoomLevel: 5,
size: .init(width: 300, height: 200),
attribution: .hidden)
let expectedURL: URL = "https://maps.example.com/maps/streets-v2/static/2.000000,1.000000,5.000000/300x200@2x.png?attribution=false"
#expect(url == expectedURL)
}
@Test
mutating func overrideMissingStyleJSONFails() {
// If the override URL doesn't end in /style.json we can't derive a static URL.
let overrideURL: URL = "https://maps.example.com/maps/streets-v2/"
builder = MapTilerSettings.url(overrideURL)
let url = builder.staticMapTileImageURL(for: .light,
coordinates: .init(latitude: 1, longitude: 2),
zoomLevel: 5,
size: .init(width: 300, height: 200),
attribution: .topLeft)
#expect(url == nil)
}
}