Skip to content

Commit d80d60d

Browse files
committed
Align v3 data class field names with param names, add ALLOWED_PARAMS tests
Rename query→q, language→lang in V3AutocompleteRequest and V3ReverseRequest so field names match URL parameters exactly. Add reflection-based tests verifying ALLOWED_PARAMS matches data class fields for all v3 request types.
1 parent abe6ecb commit d80d60d

9 files changed

Lines changed: 56 additions & 30 deletions

File tree

proxy/src/main/kotlin/no/entur/geocoder/proxy/photon/PhotonAutocompleteRequest.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@ data class PhotonAutocompleteRequest(
132132
if (req.sources.any { it.contains("kartverket") || it.contains("matrikkelen") }) {
133133
null
134134
} else {
135-
req.query.takeIf { !it.contains("(\\s\\d|\\d\\s)".toRegex()) }?.let { Category.OSM_ADDRESS }
135+
req.q.takeIf { !it.contains("(\\s\\d|\\d\\s)".toRegex()) }?.let { Category.OSM_ADDRESS }
136136
}
137137
val excludes =
138138
listOfNotNull(
@@ -141,17 +141,17 @@ data class PhotonAutocompleteRequest(
141141
)
142142

143143
return PhotonAutocompleteRequest(
144-
query = req.query,
144+
query = req.q,
145145
limit = req.limit,
146-
language = handleLang(req.language),
146+
language = handleLang(req.lang),
147147
includes = includes,
148148
excludes = excludes,
149149
lat = req.lat,
150150
lon = req.lon,
151151
zoom = req.photonZoom(),
152152
locationBiasScale = req.photonLocationBiasScale(),
153153
includeHousenumbers =
154-
req.sources.any { it.contains("kartverket") || it.contains("matrikkelen") } && !req.query.contains("\\s\\d".toRegex()),
154+
req.sources.any { it.contains("kartverket") || it.contains("matrikkelen") } && !req.q.contains("\\s\\d".toRegex()),
155155
debug = false,
156156
)
157157
}

proxy/src/main/kotlin/no/entur/geocoder/proxy/photon/PhotonReverseRequest.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ data class PhotonReverseRequest(
5353
return PhotonReverseRequest(
5454
latitude = req.lat,
5555
longitude = req.lon,
56-
language = handleLang(req.language),
56+
language = handleLang(req.lang),
5757
limit = req.limit,
5858
radius = req.radius,
5959
includes = includes,

proxy/src/main/kotlin/no/entur/geocoder/proxy/v3/V3AutocompleteRequest.kt

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,9 @@ import kotlin.math.ln
55
import kotlin.math.roundToInt
66

77
data class V3AutocompleteRequest(
8-
val query: String = "",
8+
val q: String = "",
99
val limit: Int = 10,
10-
val language: String = "no",
10+
val lang: String = "no",
1111
val lat: Double? = null,
1212
val lon: Double? = null,
1313
val radius: Double? = null,
@@ -40,7 +40,7 @@ data class V3AutocompleteRequest(
4040
private const val DEFAULT_WEIGHT = 0.8
4141
private val LN2 = ln(2.0)
4242

43-
private val ALLOWED_PARAMS =
43+
internal val ALLOWED_PARAMS =
4444
setOf(
4545
"q", "limit", "lang", "lat", "lon",
4646
"radius", "weight", "layers", "sources", "countries", "countyIds",
@@ -54,9 +54,9 @@ data class V3AutocompleteRequest(
5454
val lat = req["lat"]?.toDoubleOrNull()
5555
val lon = req["lon"]?.toDoubleOrNull()
5656
return V3AutocompleteRequest(
57-
query = req["q"] ?: "",
57+
q = req["q"] ?: "",
5858
limit = req["limit"]?.toIntOrNull() ?: 10,
59-
language = req["lang"] ?: "no",
59+
lang = req["lang"] ?: "no",
6060
lat = lat,
6161
lon = lon,
6262
radius = req["radius"]?.toDoubleOrNull(),

proxy/src/main/kotlin/no/entur/geocoder/proxy/v3/V3PlaceRequest.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ data class V3PlaceRequest(val ids: List<String>) {
88
}
99

1010
companion object {
11-
private val ALLOWED_PARAMS = setOf("ids")
11+
internal val ALLOWED_PARAMS = setOf("ids")
1212

1313
fun from(req: Parameters): V3PlaceRequest {
1414
val unknown = req.names().filterNot { it in ALLOWED_PARAMS }

proxy/src/main/kotlin/no/entur/geocoder/proxy/v3/V3ResultTransformer.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,9 +49,9 @@ object V3ResultTransformer {
4949
Metadata(
5050
query =
5151
QueryInfo(
52-
text = req.query,
52+
text = req.q,
5353
limit = req.limit,
54-
language = req.language,
54+
language = req.lang,
5555
filters = filters,
5656
),
5757
resultCount = features.size,
@@ -76,7 +76,7 @@ object V3ResultTransformer {
7676
latitude = req.lat,
7777
longitude = req.lon,
7878
limit = req.limit,
79-
language = req.language,
79+
language = req.lang,
8080
),
8181
resultCount = features.size,
8282
timestamp = System.currentTimeMillis(),

proxy/src/main/kotlin/no/entur/geocoder/proxy/v3/V3ReverseRequest.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ data class V3ReverseRequest(
77
val lon: Double,
88
val radius: Double? = null,
99
val limit: Int = 10,
10-
val language: String = "no",
10+
val lang: String = "no",
1111
val layers: List<String> = emptyList(),
1212
val sources: List<String> = emptyList(),
1313
val multimodal: String = "parent",
@@ -18,7 +18,7 @@ data class V3ReverseRequest(
1818
}
1919

2020
companion object {
21-
private val ALLOWED_PARAMS =
21+
internal val ALLOWED_PARAMS =
2222
setOf(
2323
"lat", "lon", "radius", "limit", "lang",
2424
"layers", "sources", "multimodal",
@@ -35,7 +35,7 @@ data class V3ReverseRequest(
3535
?: throw IllegalArgumentException("Parameter 'lon' is required"),
3636
radius = req["radius"]?.toDoubleOrNull(),
3737
limit = req["limit"]?.toIntOrNull() ?: 10,
38-
language = req["lang"] ?: "no",
38+
lang = req["lang"] ?: "no",
3939
layers = req["layers"]?.split(",")?.filter { it.isNotBlank() } ?: emptyList(),
4040
sources = req["sources"]?.split(",")?.filter { it.isNotBlank() } ?: emptyList(),
4141
multimodal = req["multimodal"] ?: "parent",
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package no.entur.geocoder.proxy.v3
2+
3+
import kotlin.reflect.KClass
4+
import kotlin.reflect.full.primaryConstructor
5+
import kotlin.test.Test
6+
import kotlin.test.assertEquals
7+
8+
class V3AllowedParamsTest {
9+
private fun expectedParams(klass: KClass<*>): Set<String> =
10+
klass.primaryConstructor?.parameters?.mapNotNull { it.name }?.toSet().orEmpty()
11+
12+
@Test
13+
fun `autocomplete ALLOWED_PARAMS matches data class fields`() {
14+
assertEquals(expectedParams(V3AutocompleteRequest::class), V3AutocompleteRequest.ALLOWED_PARAMS)
15+
}
16+
17+
@Test
18+
fun `reverse ALLOWED_PARAMS matches data class fields`() {
19+
assertEquals(expectedParams(V3ReverseRequest::class), V3ReverseRequest.ALLOWED_PARAMS)
20+
}
21+
22+
@Test
23+
fun `place ALLOWED_PARAMS matches data class fields`() {
24+
assertEquals(expectedParams(V3PlaceRequest::class), V3PlaceRequest.ALLOWED_PARAMS)
25+
}
26+
}

proxy/src/test/kotlin/no/entur/geocoder/proxy/v3/V3AutocompleteRequestTest.kt

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -7,66 +7,66 @@ import kotlin.test.assertNull
77
class V3AutocompleteRequestTest {
88
@Test
99
fun `photonZoom returns null when no focus point`() {
10-
val req = V3AutocompleteRequest(query = "oslo")
10+
val req = V3AutocompleteRequest(q = "oslo")
1111
assertNull(req.photonZoom())
1212
assertNull(req.photonLocationBiasScale())
1313
}
1414

1515
@Test
1616
fun `photonZoom uses default radius of 50km`() {
17-
val req = V3AutocompleteRequest(query = "oslo", lat = 59.9, lon = 10.7)
17+
val req = V3AutocompleteRequest(q = "oslo", lat = 59.9, lon = 10.7)
1818
// 50km -> zoom = 18 - log2(50/0.25) = 18 - log2(200) ≈ 18 - 7.64 = 10
1919
assertEquals(10, req.photonZoom())
2020
}
2121

2222
@Test
2323
fun `photonZoom with explicit radius`() {
2424
// 4km -> zoom = 18 - log2(4/0.25) = 18 - 4 = 14
25-
val req = V3AutocompleteRequest(query = "oslo", lat = 59.9, lon = 10.7, radius = 4.0)
25+
val req = V3AutocompleteRequest(q = "oslo", lat = 59.9, lon = 10.7, radius = 4.0)
2626
assertEquals(14, req.photonZoom())
2727
}
2828

2929
@Test
3030
fun `photonZoom with small radius`() {
3131
// 0.25km -> zoom = 18 - log2(1) = 18
32-
val req = V3AutocompleteRequest(query = "oslo", lat = 59.9, lon = 10.7, radius = 0.25)
32+
val req = V3AutocompleteRequest(q = "oslo", lat = 59.9, lon = 10.7, radius = 0.25)
3333
assertEquals(18, req.photonZoom())
3434
}
3535

3636
@Test
3737
fun `photonZoom clamps to valid range`() {
38-
val large = V3AutocompleteRequest(query = "oslo", lat = 59.9, lon = 10.7, radius = 100000.0)
38+
val large = V3AutocompleteRequest(q = "oslo", lat = 59.9, lon = 10.7, radius = 100000.0)
3939
assertEquals(0, large.photonZoom())
4040

41-
val tiny = V3AutocompleteRequest(query = "oslo", lat = 59.9, lon = 10.7, radius = 0.001)
41+
val tiny = V3AutocompleteRequest(q = "oslo", lat = 59.9, lon = 10.7, radius = 0.001)
4242
assertEquals(18, tiny.photonZoom())
4343
}
4444

4545
@Test
4646
fun `photonLocationBiasScale uses default weight of 0_8`() {
47-
val req = V3AutocompleteRequest(query = "oslo", lat = 59.9, lon = 10.7)
47+
val req = V3AutocompleteRequest(q = "oslo", lat = 59.9, lon = 10.7)
4848
// weight 0.8 -> location_bias_scale = 1 - 0.8 = 0.2
4949
assertEquals(0.2, req.photonLocationBiasScale()!!, 0.001)
5050
}
5151

5252
@Test
5353
fun `photonLocationBiasScale with explicit weight`() {
54-
val noFocus = V3AutocompleteRequest(query = "oslo", lat = 59.9, lon = 10.7, weight = 0.0)
54+
val noFocus = V3AutocompleteRequest(q = "oslo", lat = 59.9, lon = 10.7, weight = 0.0)
5555
assertEquals(1.0, noFocus.photonLocationBiasScale())
5656

57-
val maxFocus = V3AutocompleteRequest(query = "oslo", lat = 59.9, lon = 10.7, weight = 1.0)
57+
val maxFocus = V3AutocompleteRequest(q = "oslo", lat = 59.9, lon = 10.7, weight = 1.0)
5858
assertEquals(0.0, maxFocus.photonLocationBiasScale())
5959

60-
val half = V3AutocompleteRequest(query = "oslo", lat = 59.9, lon = 10.7, weight = 0.5)
60+
val half = V3AutocompleteRequest(q = "oslo", lat = 59.9, lon = 10.7, weight = 0.5)
6161
assertEquals(0.5, half.photonLocationBiasScale())
6262
}
6363

6464
@Test
6565
fun `photonLocationBiasScale clamps weight`() {
66-
val over = V3AutocompleteRequest(query = "oslo", lat = 59.9, lon = 10.7, weight = 2.0)
66+
val over = V3AutocompleteRequest(q = "oslo", lat = 59.9, lon = 10.7, weight = 2.0)
6767
assertEquals(0.0, over.photonLocationBiasScale())
6868

69-
val under = V3AutocompleteRequest(query = "oslo", lat = 59.9, lon = 10.7, weight = -1.0)
69+
val under = V3AutocompleteRequest(q = "oslo", lat = 59.9, lon = 10.7, weight = -1.0)
7070
assertEquals(1.0, under.photonLocationBiasScale())
7171
}
7272
}

proxy/src/test/kotlin/no/entur/geocoder/proxy/v3/V3ResultTransformerTest.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ class V3ResultTransformerTest {
114114
),
115115
),
116116
)
117-
val req = V3AutocompleteRequest(query = "test")
117+
val req = V3AutocompleteRequest(q = "test")
118118
return V3ResultTransformer
119119
.parseAndTransform(photonResult, req)
120120
.features

0 commit comments

Comments
 (0)