Skip to content

Commit a47a0e8

Browse files
authored
fix api host being overwritten by default value (#80)
* fix apiHost being overwritten by default value * add unit tests * address comment
1 parent 7d6da0f commit a47a0e8

File tree

2 files changed

+49
-4
lines changed

2 files changed

+49
-4
lines changed

core/src/main/java/com/segment/analytics/kotlin/core/platform/plugins/SegmentDestination.kt

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ import kotlinx.serialization.json.jsonPrimitive
1818
@Serializable
1919
data class SegmentSettings(
2020
var apiKey: String,
21-
var apiHost: String = DEFAULT_API_HOST,
21+
var apiHost: String? = null
2222
)
2323

2424
/**
@@ -95,8 +95,9 @@ class SegmentDestination : DestinationPlugin(), VersionedPlugin {
9595
override fun update(settings: Settings, type: Plugin.UpdateType) {
9696
super.update(settings, type)
9797
if (settings.hasIntegrationSettings(this)) {
98-
settings.destinationSettings<SegmentSettings>(key)?.let {
99-
pipeline.apiHost = it.apiHost
98+
// only populate the apiHost value if it exists
99+
settings.destinationSettings<SegmentSettings>(key)?.apiHost?.let {
100+
pipeline.apiHost = it
100101
}
101102
}
102103
}

core/src/test/kotlin/com/segment/analytics/kotlin/core/AnalyticsTests.kt

Lines changed: 45 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ import org.junit.jupiter.api.Test
1818
import org.junit.jupiter.api.TestInstance
1919
import org.junit.jupiter.api.*
2020
import org.junit.jupiter.api.Assertions.*
21+
import java.io.ByteArrayInputStream
22+
import java.net.HttpURLConnection
2123
import java.time.Instant
2224
import java.util.Date
2325
import java.util.UUID
@@ -43,12 +45,12 @@ class AnalyticsTests {
4345
every { Instant.now() } returns Date(0).toInstant()
4446
mockkStatic(UUID::class)
4547
every { UUID.randomUUID().toString() } returns "qwerty-qwerty-123"
46-
mockHTTPClient()
4748
}
4849

4950
@BeforeEach
5051
fun setup() {
5152
clearPersistentStorage()
53+
mockHTTPClient()
5254
val config = Configuration(
5355
writeKey = "123",
5456
application = "Test"
@@ -84,6 +86,48 @@ class AnalyticsTests {
8486

8587
assertEquals(exception.message?.contains("Android"), true)
8688
}
89+
90+
@Test
91+
fun `analytics should respect remote apiHost`() {
92+
// need the following block in `init` to inject mock before analytics gets instantiate
93+
val settingsStream = ByteArrayInputStream(
94+
"""
95+
{"integrations":{"Segment.io":{"apiKey":"1vNgUqwJeCHmqgI9S1sOm9UHCyfYqbaQ","apiHost":"remote"}},"plan":{},"edgeFunction":{}}
96+
""".trimIndent().toByteArray()
97+
)
98+
val httpConnection: HttpURLConnection = mockk()
99+
val connection = object : Connection(httpConnection, settingsStream, null) {}
100+
every { anyConstructed<HTTPClient>().settings("cdn-settings.segment.com/v1") } returns connection
101+
102+
val config = Configuration(
103+
writeKey = "123",
104+
application = "Test",
105+
apiHost = "local"
106+
)
107+
analytics = testAnalytics(config, testScope, testDispatcher)
108+
analytics.track("test")
109+
analytics.flush()
110+
111+
val apiHost = slot<String>()
112+
verify { anyConstructed<HTTPClient>().upload(capture(apiHost)) }
113+
assertEquals("remote", apiHost.captured)
114+
}
115+
116+
@Test
117+
fun `analytics should respect local modified apiHost if remote not presented`() {
118+
val config = Configuration(
119+
writeKey = "123",
120+
application = "Test",
121+
apiHost = "local"
122+
)
123+
analytics = testAnalytics(config, testScope, testDispatcher)
124+
analytics.track("test")
125+
analytics.flush()
126+
127+
val apiHost = slot<String>()
128+
verify { anyConstructed<HTTPClient>().upload(capture(apiHost)) }
129+
assertEquals("local", apiHost.captured)
130+
}
87131
}
88132

89133
@Nested

0 commit comments

Comments
 (0)