Skip to content

Commit 6eb47d8

Browse files
authored
Null input stream unit test (#215)
* null stream unit test * removing unnecessary configs
1 parent 868b853 commit 6eb47d8

File tree

2 files changed

+46
-1
lines changed

2 files changed

+46
-1
lines changed

sdk/analytics/src/test/java/com/klaviyo/analytics/networking/KlaviyoApiClientTest.kt

+45-1
Original file line numberDiff line numberDiff line change
@@ -20,14 +20,17 @@ import com.klaviyo.core.networking.NetworkMonitor
2020
import com.klaviyo.core.networking.NetworkObserver
2121
import com.klaviyo.fixtures.BaseTest
2222
import io.mockk.every
23+
import io.mockk.just
2324
import io.mockk.mockk
2425
import io.mockk.mockkConstructor
2526
import io.mockk.mockkObject
27+
import io.mockk.runs
2628
import io.mockk.slot
2729
import io.mockk.spyk
2830
import io.mockk.unmockkConstructor
2931
import io.mockk.unmockkObject
3032
import io.mockk.verify
33+
import java.net.HttpURLConnection
3134
import java.net.URL
3235
import kotlinx.coroutines.Dispatchers
3336
import kotlinx.coroutines.launch
@@ -39,6 +42,7 @@ import org.junit.Assert.assertEquals
3942
import org.junit.Assert.assertNotEquals
4043
import org.junit.Assert.assertNotNull
4144
import org.junit.Assert.assertNull
45+
import org.junit.Assert.fail
4246
import org.junit.Before
4347
import org.junit.Test
4448

@@ -564,7 +568,8 @@ internal class KlaviyoApiClientTest : BaseTest() {
564568

565569
@Test
566570
fun `Rate limited requests are retried with backoff until max attempts in absence of Retry-After header`() {
567-
val defaultInterval = Registry.config.networkFlushIntervals[NetworkMonitor.NetworkType.Wifi.position]
571+
val defaultInterval =
572+
Registry.config.networkFlushIntervals[NetworkMonitor.NetworkType.Wifi.position]
568573

569574
// First unsent request, which we will retry till max attempts
570575
val request1 = mockRequest("uuid-retry", KlaviyoApiRequest.Status.Unsent).also {
@@ -712,4 +717,43 @@ internal class KlaviyoApiClientTest : BaseTest() {
712717
assertEquals("[\"mock_uuid2\"]", actualQueue) // Expect queue to reflect the dropped item
713718
assertNull(spyDataStore.fetch("mock_uuid1")) // Expect the item to be cleared from store
714719
}
720+
721+
@Test
722+
fun `response body handles null stream correctly`() {
723+
// Create a KlaviyoApiRequest with required arguments
724+
val request = KlaviyoApiRequest("mockPath", RequestMethod.GET)
725+
726+
// Spy on that specific instance
727+
val spiedRequest = spyk(request)
728+
729+
// Mock network connection and config
730+
every { Registry.networkMonitor.isNetworkConnected() } returns true
731+
// Mock URL and URLConnection
732+
val urlMock = mockk<URL>()
733+
val connectionMock = mockk<HttpURLConnection>()
734+
735+
// Set up mocks for URL and connection
736+
every { urlMock.openConnection() } returns connectionMock
737+
every { urlMock.protocol } returns "http"
738+
every { connectionMock.inputStream } returns null
739+
every { connectionMock.errorStream } returns null
740+
every { connectionMock.responseCode } returns HttpURLConnection.HTTP_INTERNAL_ERROR
741+
every { connectionMock.headerFields } returns emptyMap()
742+
every { connectionMock.setRequestProperty(any(), any()) } returns Unit
743+
every { connectionMock.requestMethod = any() } returns Unit
744+
every { connectionMock.readTimeout = any() } returns Unit
745+
every { connectionMock.connectTimeout = any() } returns Unit
746+
every { connectionMock.disconnect() } just runs
747+
every { connectionMock.connect() } just runs
748+
749+
// Mock the URL used by the request to our mocked URL
750+
every { spiedRequest.url } returns urlMock
751+
752+
try {
753+
// Attempt to send without an exception occurring
754+
spiedRequest.send()
755+
} catch (e: NullPointerException) {
756+
fail("NullPointerException was thrown: ${e.message}")
757+
}
758+
}
715759
}

sdk/fixtures/src/main/java/com/klaviyo/fixtures/BaseTest.kt

+1
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ abstract class BaseTest {
7474
every { applicationContext } returns mockContext
7575
every { debounceInterval } returns debounceTime
7676
every { networkMaxAttempts } returns 50
77+
every { networkTimeout } returns 1000
7778
every { networkMaxRetryInterval } returns 180_000L
7879
every { networkFlushIntervals } returns longArrayOf(10_000, 30_000, 60_000)
7980
every { networkJitterRange } returns 0..0

0 commit comments

Comments
 (0)