1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
@testable import Grain
import XCTest
final class NominatimResultTests: GrainTestCase {
/// Reverse-geocoding a spot in Kansas City returns a `county` field. It must not
/// leak into the stored `name` — we want "Kansas City, Missouri, United States",
/// not "Kansas City, Jackson County, Missouri, United States".
func testReverseGeocode_KansasCity_ExcludesCounty() {
let json: [String: Any] = [
"place_id": 12345,
"lat": "39.0997",
"lon": "-94.5786",
"display_name": "Kansas City, Jackson County, Missouri, 64108, United States",
"address": [
"city": "Kansas City",
"county": "Jackson County",
"state": "Missouri",
"country": "United States",
"country_code": "us",
"postcode": "64108",
],
]
let result = NominatimResult(from: json)
XCTAssertNotNil(result)
XCTAssertEqual(result?.name, "Kansas City, Missouri, United States")
XCTAssertFalse(result?.name.contains("County") ?? true,
"Name must not include county")
}
/// POI with a `name` from Nominatim should use that name as-is.
func testReverseGeocode_POI_UsesPlaceName() {
let json: [String: Any] = [
"place_id": 54321,
"lat": "37.7749",
"lon": "-122.4194",
"name": "Blue Bottle Coffee",
"display_name": "Blue Bottle Coffee, Mint Plaza, San Francisco, California, United States",
"address": [
"amenity": "Blue Bottle Coffee",
"city": "San Francisco",
"county": "San Francisco County",
"state": "California",
"country": "United States",
"country_code": "us",
],
]
let result = NominatimResult(from: json)
XCTAssertEqual(result?.name, "Blue Bottle Coffee")
}
/// Structured address dict must contain locality/region/country — never county.
func testReverseGeocode_AddressExcludesCounty() {
let json: [String: Any] = [
"place_id": 12345,
"lat": "39.0997",
"lon": "-94.5786",
"display_name": "anything",
"address": [
"city": "Kansas City",
"county": "Jackson County",
"state": "Missouri",
"country": "United States",
"country_code": "us",
],
]
let result = NominatimResult(from: json)
XCTAssertEqual(result?.address?["locality"]?.stringValue, "Kansas City")
XCTAssertEqual(result?.address?["region"]?.stringValue, "Missouri")
XCTAssertEqual(result?.address?["country"]?.stringValue, "US")
XCTAssertNil(result?.address?["county"])
}
}