diff --git a/README.md b/README.md index 9210a24a..50647c51 100755 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ Full API documentation is available on [Github Pages](https://constructor-io.git ## 1. Install -Please follow the directions at [Jitpack.io](https://jitpack.io/#Constructor-io/constructorio-client-android/v2.36.0) to add the client to your project. +Please follow the directions at [Jitpack.io](https://jitpack.io/#Constructor-io/constructorio-client-android/v2.38.0-cdx-358-2) to add the client to your project. ## 2. Retrieve an API key diff --git a/library/build.gradle b/library/build.gradle index 99283036..51bcb869 100755 --- a/library/build.gradle +++ b/library/build.gradle @@ -25,7 +25,7 @@ android { multiDexEnabled true testInstrumentationRunner "${applicationId}.runner.RxAndroidJUnitRunner" versionCode 1 - versionName '2.36.0' + versionName '2.38.0-cdx-358-2' buildConfigField("String", "CLIENT_VERSION", "\"cioand-${versionName}\"") buildConfigField("String", "DEFAULT_ITEM_SECTION", "\"Products\"") buildConfigField("String", "SERVICE_URL", "\"ac.cnstrc.com\"") diff --git a/library/src/main/java/io/constructor/core/ConstructorIo.kt b/library/src/main/java/io/constructor/core/ConstructorIo.kt index fe19e68e..61af0069 100755 --- a/library/src/main/java/io/constructor/core/ConstructorIo.kt +++ b/library/src/main/java/io/constructor/core/ConstructorIo.kt @@ -33,7 +33,9 @@ import io.constructor.util.urlEncode import io.reactivex.Completable import io.reactivex.Observable import io.reactivex.disposables.CompositeDisposable +import io.reactivex.plugins.RxJavaPlugins import io.reactivex.schedulers.Schedulers +import java.io.IOException import java.util.* typealias ConstructorError = ((Throwable) -> Unit)? @@ -98,6 +100,33 @@ object ConstructorIo { trackSessionStart() } + /** + * Sets up a global RxJava error handler to prevent crashes from undeliverable exceptions. + * This handles network errors (like SocketTimeoutException) that occur on OkHttp's + * background threads after the RxJava subscription can no longer receive them. + */ + private fun setupRxErrorHandler() { + RxJavaPlugins.setErrorHandler(createRxErrorHandler()) + } + + /** + * Creates the RxJava error handler function. + * Internal for testing purposes. + */ + internal fun createRxErrorHandler(): (Throwable) -> Unit = { throwable -> + // Unwrap the exception to get the actual cause + val error = throwable.cause ?: throwable + + if (error is IOException || error is InterruptedException) { + // Network errors and interruptions are expected in normal operation + // Log as warning so crash reporting tools can track frequency + e("Non-fatal network error: ${error.message}") + } else { + // For unexpected errors, log as error level + e("Undeliverable exception: ${error.message}") + } + } + /** * Initializes the client * @@ -110,11 +139,17 @@ object ConstructorIo { } this.context = context.applicationContext + // Setup RxJava error handler to prevent crashes from undeliverable network exceptions + if (constructorIoConfig.suppressNetworkExceptions) { + setupRxErrorHandler() + } + configMemoryHolder = component.configMemoryHolder() configMemoryHolder.autocompleteResultCount = constructorIoConfig.autocompleteResultCount configMemoryHolder.testCellParams = constructorIoConfig.testCells configMemoryHolder.segments = constructorIoConfig.segments configMemoryHolder.defaultAnalyticsTags = constructorIoConfig.defaultAnalyticsTags + configMemoryHolder.suppressNetworkExceptions = constructorIoConfig.suppressNetworkExceptions preferenceHelper = component.preferenceHelper() preferenceHelper.apiKey = constructorIoConfig.apiKey diff --git a/library/src/main/java/io/constructor/core/ConstructorIoConfig.kt b/library/src/main/java/io/constructor/core/ConstructorIoConfig.kt index f9467541..8b7148b0 100644 --- a/library/src/main/java/io/constructor/core/ConstructorIoConfig.kt +++ b/library/src/main/java/io/constructor/core/ConstructorIoConfig.kt @@ -13,6 +13,7 @@ import io.constructor.BuildConfig * @property servicePort The port to use (for testing purposes only, defaults to 443) * @property serviceScheme The scheme to use (for testing purposes only, defaults to HTTPS) * @property defaultAnalyticsTags Additional analytics tags to pass. Will be merged with analytics tags passed on the request level + * @property suppressNetworkExceptions When true, catches network exceptions (e.g., SocketTimeoutException, IOException) that would otherwise crash the app and handles them gracefully. For tracking/analytics endpoints, failures are silently ignored. For other endpoints, a synthetic error response is returned. Defaults to false. */ data class ConstructorIoConfig( val apiKey: String, @@ -24,5 +25,6 @@ data class ConstructorIoConfig( val defaultItemSection: String = BuildConfig.DEFAULT_ITEM_SECTION, val servicePort: Int = BuildConfig.SERVICE_PORT, val serviceScheme: String = BuildConfig.SERVICE_SCHEME, - val defaultAnalyticsTags: Map = emptyMap() -) \ No newline at end of file + val defaultAnalyticsTags: Map = emptyMap(), + val suppressNetworkExceptions: Boolean = false +) diff --git a/library/src/main/java/io/constructor/data/interceptor/RequestInterceptor.kt b/library/src/main/java/io/constructor/data/interceptor/RequestInterceptor.kt index de04bdb2..4c336683 100755 --- a/library/src/main/java/io/constructor/data/interceptor/RequestInterceptor.kt +++ b/library/src/main/java/io/constructor/data/interceptor/RequestInterceptor.kt @@ -5,9 +5,18 @@ import io.constructor.core.Constants import io.constructor.data.local.PreferencesHelper import io.constructor.data.memory.ConfigMemoryHolder import io.constructor.data.remote.ApiPaths +import io.constructor.util.e import okhttp3.HttpUrl import okhttp3.Interceptor +import okhttp3.Protocol import okhttp3.Response +import okhttp3.ResponseBody.Companion.toResponseBody +import java.io.IOException +import java.io.InterruptedIOException +import java.net.SocketException +import java.net.SocketTimeoutException +import java.net.UnknownHostException +import javax.net.ssl.SSLException /** * @suppress @@ -96,6 +105,38 @@ class RequestInterceptor( } val newRequest = newRequestBuilder.url(builder.build()).build(); - return chain.proceed(newRequest) + + // If suppressNetworkExceptions is disabled, use default behavior (let exceptions propagate) + if (!configMemoryHolder.suppressNetworkExceptions) { + return chain.proceed(newRequest) + } + + return try { + chain.proceed(newRequest) + } catch (e: Exception) { + // Handle network exceptions that would otherwise crash the app when they occur + // on OkHttp's background threads. These exceptions can bypass RxJava's error + // handling since they may occur in OkHttp's thread pool context. + when (e) { + is SocketTimeoutException, + is InterruptedIOException, + is SocketException, + is UnknownHostException, + is SSLException, + is IOException -> { + e("Network error intercepted: ${e.javaClass.simpleName} - ${e.message}") + // Return a synthetic error response to prevent crashes while + // preserving error semantics for the app's error handling + Response.Builder() + .request(newRequest) + .protocol(Protocol.HTTP_1_1) + .code(599) // Network connect timeout error + .message("Network Error: ${e.message ?: "Unknown"}") + .body("".toResponseBody(null)) + .build() + } + else -> throw e // Re-throw unexpected non-network exceptions + } + } } } \ No newline at end of file diff --git a/library/src/main/java/io/constructor/data/memory/ConfigMemoryHolder.kt b/library/src/main/java/io/constructor/data/memory/ConfigMemoryHolder.kt index 59752e4e..335b001f 100644 --- a/library/src/main/java/io/constructor/data/memory/ConfigMemoryHolder.kt +++ b/library/src/main/java/io/constructor/data/memory/ConfigMemoryHolder.kt @@ -42,4 +42,6 @@ class ConfigMemoryHolder @Inject constructor() { var userId: String? = null var defaultAnalyticsTags: Map? = null + + var suppressNetworkExceptions: Boolean = false } \ No newline at end of file diff --git a/library/src/test/java/io/constructor/core/ConstructorIoAutocompleteTest.kt b/library/src/test/java/io/constructor/core/ConstructorIoAutocompleteTest.kt index 70f6c547..128a748b 100644 --- a/library/src/test/java/io/constructor/core/ConstructorIoAutocompleteTest.kt +++ b/library/src/test/java/io/constructor/core/ConstructorIoAutocompleteTest.kt @@ -49,6 +49,7 @@ class ConstructorIoAutocompleteTest { every { configMemoryHolder.userId } returns "player-one" every { configMemoryHolder.testCellParams } returns emptyList() every { configMemoryHolder.segments } returns emptyList() + every { configMemoryHolder.suppressNetworkExceptions } returns false val config = ConstructorIoConfig("dummyKey") val dataManager = createTestDataManager(preferencesHelper, configMemoryHolder) @@ -68,7 +69,7 @@ class ConstructorIoAutocompleteTest { } val request = mockServer.takeRequest() val path = - "/autocomplete/titanic?key=golden-key&i=guido-the-guid&ui=player-one&s=79&c=cioand-2.36.0&_dt=" + "/autocomplete/titanic?key=golden-key&i=guido-the-guid&ui=player-one&s=79&c=cioand-2.38.0-cdx-358-2&_dt=" assert(request.path!!.startsWith(path)) } @@ -87,7 +88,7 @@ class ConstructorIoAutocompleteTest { } val request = mockServer.takeRequest() val path = - "/autocomplete/titanic?filters%5BstoreLocation%5D=CA&key=golden-key&i=guido-the-guid&ui=player-one&s=79&c=cioand-2.36.0&_dt=" + "/autocomplete/titanic?filters%5BstoreLocation%5D=CA&key=golden-key&i=guido-the-guid&ui=player-one&s=79&c=cioand-2.38.0-cdx-358-2&_dt=" assert(request.path!!.startsWith(path)) } @@ -110,7 +111,7 @@ class ConstructorIoAutocompleteTest { } val request = mockServer.takeRequest() val path = - "/autocomplete/titanic?filters%5BstoreLocation%5D=CA&filters%5BSearch%20Suggestions%5D%5BstoreLocation%5D=US&filters%5BProducts%5D%5Bbrand%5D=Top%20Brand&key=golden-key&i=guido-the-guid&ui=player-one&s=79&c=cioand-2.36.0&_dt=" + "/autocomplete/titanic?filters%5BstoreLocation%5D=CA&filters%5BSearch%20Suggestions%5D%5BstoreLocation%5D=US&filters%5BProducts%5D%5Bbrand%5D=Top%20Brand&key=golden-key&i=guido-the-guid&ui=player-one&s=79&c=cioand-2.38.0-cdx-358-2&_dt=" assert(request.path!!.startsWith(path)) } @@ -126,7 +127,7 @@ class ConstructorIoAutocompleteTest { } val request = mockServer.takeRequest() val path = - "/autocomplete/titanic?filters%5Bgroup_id%5D=101&key=golden-key&i=guido-the-guid&ui=player-one&s=79&c=cioand-2.36.0&_dt=" + "/autocomplete/titanic?filters%5Bgroup_id%5D=101&key=golden-key&i=guido-the-guid&ui=player-one&s=79&c=cioand-2.38.0-cdx-358-2&_dt=" assert(request.path!!.startsWith(path)) } @@ -140,7 +141,7 @@ class ConstructorIoAutocompleteTest { } val request = mockServer.takeRequest() val path = - "/autocomplete/titanic?key=golden-key&i=guido-the-guid&ui=player-one&s=79&c=cioand-2.36.0&_dt=" + "/autocomplete/titanic?key=golden-key&i=guido-the-guid&ui=player-one&s=79&c=cioand-2.38.0-cdx-358-2&_dt=" assert(request.path!!.startsWith(path)) } @@ -156,7 +157,7 @@ class ConstructorIoAutocompleteTest { } val request = mockServer.takeRequest() val path = - "/autocomplete/titanic?key=golden-key&i=guido-the-guid&ui=player-one&s=79&c=cioand-2.36.0&_dt=" + "/autocomplete/titanic?key=golden-key&i=guido-the-guid&ui=player-one&s=79&c=cioand-2.38.0-cdx-358-2&_dt=" assert(request.path!!.startsWith(path)) } @@ -172,7 +173,7 @@ class ConstructorIoAutocompleteTest { } val request = mockServer.takeRequest() val path = - "/autocomplete/titanic?key=golden-key&i=guido-the-guid&ui=player-one&s=79&c=cioand-2.36.0&_dt=" + "/autocomplete/titanic?key=golden-key&i=guido-the-guid&ui=player-one&s=79&c=cioand-2.38.0-cdx-358-2&_dt=" assert(request.path!!.startsWith(path)) } @@ -189,7 +190,7 @@ class ConstructorIoAutocompleteTest { ).test() val request = mockServer.takeRequest() val path = - "/autocomplete/bbq?fmt_options%5Bhidden_fields%5D=hiddenField1&fmt_options%5Bhidden_fields%5D=hiddenField2&key=golden-key&i=guido-the-guid&ui=player-one&s=79&c=cioand-2.36.0&_dt=" + "/autocomplete/bbq?fmt_options%5Bhidden_fields%5D=hiddenField1&fmt_options%5Bhidden_fields%5D=hiddenField2&key=golden-key&i=guido-the-guid&ui=player-one&s=79&c=cioand-2.38.0-cdx-358-2&_dt=" assert(request.path!!.startsWith(path)) } @@ -201,7 +202,7 @@ class ConstructorIoAutocompleteTest { val observer = constructorIo.getAutocompleteResults("2% cheese").test() val request = mockServer.takeRequest() val path = - "/autocomplete/2%25%20cheese?key=golden-key&i=guido-the-guid&ui=player-one&s=79&c=cioand-2.36.0&_dt=" + "/autocomplete/2%25%20cheese?key=golden-key&i=guido-the-guid&ui=player-one&s=79&c=cioand-2.38.0-cdx-358-2&_dt=" assert(request.path!!.startsWith(path)) } @@ -224,7 +225,7 @@ class ConstructorIoAutocompleteTest { } val request = mockServer.takeRequest() val path = - "/autocomplete/titanic?filters%5BstoreLocation%5D=CA&filters%5Bgroup_id%5D=101&key=golden-key&i=guido-the-guid&ui=player-one&s=79&c=cioand-2.36.0&_dt=" + "/autocomplete/titanic?filters%5BstoreLocation%5D=CA&filters%5Bgroup_id%5D=101&key=golden-key&i=guido-the-guid&ui=player-one&s=79&c=cioand-2.38.0-cdx-358-2&_dt=" assert(request.path!!.startsWith(path)) } @@ -247,7 +248,7 @@ class ConstructorIoAutocompleteTest { } val request = mockServer.takeRequest() val path = - "/autocomplete/titanic?num_results_Products=5&num_results_Search%20Suggestions=10&key=golden-key&i=guido-the-guid&ui=player-one&s=79&c=cioand-2.36.0&_dt=" + "/autocomplete/titanic?num_results_Products=5&num_results_Search%20Suggestions=10&key=golden-key&i=guido-the-guid&ui=player-one&s=79&c=cioand-2.38.0-cdx-358-2&_dt=" assert(request.path!!.startsWith(path)) } @@ -281,7 +282,7 @@ class ConstructorIoAutocompleteTest { "i" to "guido-the-guid", "ui" to "player-one", "s" to "79", - "c" to "cioand-2.36.0", + "c" to "cioand-2.38.0-cdx-358-2", "_dt" to "1" ) assertThat(queryParameterNames).containsExactlyInAnyOrderElementsOf(queryParams.keys) diff --git a/library/src/test/java/io/constructor/core/ConstructorIoIntegrationQuizTest.kt b/library/src/test/java/io/constructor/core/ConstructorIoIntegrationQuizTest.kt index 1c05a968..a36dcf47 100644 --- a/library/src/test/java/io/constructor/core/ConstructorIoIntegrationQuizTest.kt +++ b/library/src/test/java/io/constructor/core/ConstructorIoIntegrationQuizTest.kt @@ -46,6 +46,7 @@ class ConstructorIoIntegrationQuizTest { every { configMemoryHolder.defaultAnalyticsTags } returns mapOf("appVersion" to "123", "appPlatform" to "Android") every { configMemoryHolder.testCellParams } returns emptyList() every { configMemoryHolder.segments } returns emptyList() + every { configMemoryHolder.suppressNetworkExceptions } returns false val config = ConstructorIoConfig("ZqXaOfXuBWD4s3XzCI1q") val dataManager = createTestDataManager(preferencesHelper, configMemoryHolder) diff --git a/library/src/test/java/io/constructor/core/ConstructorIoIntegrationTest.kt b/library/src/test/java/io/constructor/core/ConstructorIoIntegrationTest.kt index 8e864163..ee973a3a 100644 --- a/library/src/test/java/io/constructor/core/ConstructorIoIntegrationTest.kt +++ b/library/src/test/java/io/constructor/core/ConstructorIoIntegrationTest.kt @@ -50,6 +50,7 @@ class ConstructorIoIntegrationTest { every { configMemoryHolder.userId } returns "player-three" every { configMemoryHolder.testCellParams } returns emptyList() every { configMemoryHolder.segments } returns emptyList() + every { configMemoryHolder.suppressNetworkExceptions } returns false val config = ConstructorIoConfig("ZqXaOfXuBWD4s3XzCI1q") val dataManager = createTestDataManager(preferencesHelper, configMemoryHolder) diff --git a/library/src/test/java/io/constructor/core/ConstructorIoNetworkExceptionSuppressionTest.kt b/library/src/test/java/io/constructor/core/ConstructorIoNetworkExceptionSuppressionTest.kt new file mode 100644 index 00000000..4f864be5 --- /dev/null +++ b/library/src/test/java/io/constructor/core/ConstructorIoNetworkExceptionSuppressionTest.kt @@ -0,0 +1,173 @@ +package io.constructor.core + +import io.constructor.data.interceptor.RequestInterceptor +import io.constructor.data.local.PreferencesHelper +import io.constructor.data.memory.ConfigMemoryHolder +import io.mockk.every +import io.mockk.mockk +import okhttp3.Interceptor +import okhttp3.Protocol +import okhttp3.Request +import okhttp3.Response +import okhttp3.ResponseBody.Companion.toResponseBody +import org.junit.Before +import org.junit.Test +import java.io.IOException +import java.net.SocketTimeoutException +import kotlin.test.assertEquals +import kotlin.test.assertFailsWith + +/** + * Tests for the suppressNetworkExceptions feature that prevents crashes from + * network exceptions (e.g., SocketTimeoutException) on OkHttp's background threads. + */ +class ConstructorIoNetworkExceptionSuppressionTest { + + private val preferencesHelper = mockk() + private val configMemoryHolder = mockk() + private lateinit var interceptor: RequestInterceptor + + @Before + fun setup() { + every { preferencesHelper.apiKey } returns "copper-key" + every { preferencesHelper.id } returns "wacko-the-guid" + every { preferencesHelper.port } returns 443 + every { preferencesHelper.getSessionId() } returns 67 + + every { configMemoryHolder.userId } returns "player-three" + every { configMemoryHolder.testCellParams } returns emptyList() + every { configMemoryHolder.segments } returns emptyList() + + interceptor = RequestInterceptor(preferencesHelper, configMemoryHolder) + } + + private fun createMockChain(url: String, throwException: Exception? = null): Interceptor.Chain { + val request = Request.Builder().url(url).build() + return mockk { + every { request() } returns request + every { proceed(any()) } answers { + if (throwException != null) { + throw throwException + } + Response.Builder() + .request(request) + .protocol(Protocol.HTTP_1_1) + .code(200) + .message("OK") + .body("".toResponseBody(null)) + .build() + } + } + } + + @Test + fun `when suppression disabled, SocketTimeoutException should propagate`() { + every { configMemoryHolder.suppressNetworkExceptions } returns false + + val chain = createMockChain( + "http://test.com/v2/behavioral_action/conversion", + SocketTimeoutException("timeout") + ) + + assertFailsWith { + interceptor.intercept(chain) + } + } + + @Test + fun `when suppression enabled, behavioral v2 endpoint SocketTimeoutException should return 599`() { + every { configMemoryHolder.suppressNetworkExceptions } returns true + + val chain = createMockChain( + "http://test.com/v2/behavioral_action", + SocketTimeoutException("timeout") + ) + + val response = interceptor.intercept(chain) + + assertEquals(599, response.code) + assert(response.message.contains("Network Error")) + } + + @Test + fun `when suppression enabled, behavioral v1 endpoint IOException should return 599`() { + every { configMemoryHolder.suppressNetworkExceptions } returns true + + val chain = createMockChain( + "http://test.com/behavior", + IOException("Connection reset") + ) + + val response = interceptor.intercept(chain) + + assertEquals(599, response.code) + } + + @Test + fun `when suppression enabled, autocomplete search endpoint should return 599`() { + every { configMemoryHolder.suppressNetworkExceptions } returns true + + val chain = createMockChain( + "http://test.com/autocomplete/test/search", + SocketTimeoutException("timeout") + ) + + val response = interceptor.intercept(chain) + + assertEquals(599, response.code) + } + + @Test + fun `when suppression enabled, non-behavioral endpoint should return 599`() { + every { configMemoryHolder.suppressNetworkExceptions } returns true + + val chain = createMockChain( + "http://test.com/search/products", + SocketTimeoutException("timeout") + ) + + val response = interceptor.intercept(chain) + + assertEquals(599, response.code) + assert(response.message.contains("Network Error")) + } + + @Test + fun `when suppression enabled, autocomplete endpoint should return 599`() { + every { configMemoryHolder.suppressNetworkExceptions } returns true + + val chain = createMockChain( + "http://test.com/autocomplete/test", + IOException("Connection refused") + ) + + val response = interceptor.intercept(chain) + + assertEquals(599, response.code) + } + + @Test + fun `when suppression enabled, non-network exception should still propagate`() { + every { configMemoryHolder.suppressNetworkExceptions } returns true + + val chain = createMockChain( + "http://test.com/v2/behavioral_action/conversion", + IllegalStateException("unexpected error") + ) + + assertFailsWith { + interceptor.intercept(chain) + } + } + + @Test + fun `successful request should return normally regardless of suppression setting`() { + every { configMemoryHolder.suppressNetworkExceptions } returns true + + val chain = createMockChain("http://test.com/v2/behavioral_action/conversion") + + val response = interceptor.intercept(chain) + + assertEquals(200, response.code) + } +} diff --git a/library/src/test/java/io/constructor/core/ConstructorIoRecommendationsTest.kt b/library/src/test/java/io/constructor/core/ConstructorIoRecommendationsTest.kt index f554a6bc..43d255ec 100644 --- a/library/src/test/java/io/constructor/core/ConstructorIoRecommendationsTest.kt +++ b/library/src/test/java/io/constructor/core/ConstructorIoRecommendationsTest.kt @@ -51,6 +51,7 @@ class ConstructorIoRecommendationsTest { every { configMemoryHolder.userId } returns "player-one" every { configMemoryHolder.testCellParams } returns emptyList() every { configMemoryHolder.segments } returns emptyList() + every { configMemoryHolder.suppressNetworkExceptions } returns false val config = ConstructorIoConfig("dummyKey") val dataManager = createTestDataManager(preferencesHelper, configMemoryHolder) @@ -76,7 +77,7 @@ class ConstructorIoRecommendationsTest { assertEquals(recommendationResponse?.response?.resultCount, 225) val request = mockServer.takeRequest() - val path = "/recommendations/v1/pods/titanic?key=golden-key&i=guido-the-guid&ui=player-one&s=79&c=cioand-2.36.0&_dt=" + val path = "/recommendations/v1/pods/titanic?key=golden-key&i=guido-the-guid&ui=player-one&s=79&c=cioand-2.38.0-cdx-358-2&_dt=" assert(request.path!!.startsWith(path)) } @@ -89,7 +90,7 @@ class ConstructorIoRecommendationsTest { it.networkError } val request = mockServer.takeRequest() - val path = "/recommendations/v1/pods/titanic?key=golden-key&i=guido-the-guid&ui=player-one&s=79&c=cioand-2.36.0&_dt=" + val path = "/recommendations/v1/pods/titanic?key=golden-key&i=guido-the-guid&ui=player-one&s=79&c=cioand-2.38.0-cdx-358-2&_dt=" assert(request.path!!.startsWith(path)) } @@ -103,7 +104,7 @@ class ConstructorIoRecommendationsTest { it.isError } val request = mockServer.takeRequest() - val path = "/recommendations/v1/pods/titanic?key=golden-key&i=guido-the-guid&ui=player-one&s=79&c=cioand-2.36.0&_dt=" + val path = "/recommendations/v1/pods/titanic?key=golden-key&i=guido-the-guid&ui=player-one&s=79&c=cioand-2.38.0-cdx-358-2&_dt=" assert(request.path!!.startsWith(path)) } @@ -120,7 +121,7 @@ class ConstructorIoRecommendationsTest { assertEquals(recommendationResponse?.response?.resultCount, 0) val request = mockServer.takeRequest() - val path = "/recommendations/v1/pods/titanic?key=golden-key&i=guido-the-guid&ui=player-one&s=79&c=cioand-2.36.0&_dt=" + val path = "/recommendations/v1/pods/titanic?key=golden-key&i=guido-the-guid&ui=player-one&s=79&c=cioand-2.38.0-cdx-358-2&_dt=" assert(request.path!!.startsWith(path)) } @@ -142,7 +143,7 @@ class ConstructorIoRecommendationsTest { assertEquals(recommendationResponse?.response?.resultCount, 225) val request = mockServer.takeRequest() - val path = "/recommendations/v1/pods/titanic?key=golden-key&i=guido-the-guid&ui=player-one&s=79&c=cioand-2.36.0&_dt=" + val path = "/recommendations/v1/pods/titanic?key=golden-key&i=guido-the-guid&ui=player-one&s=79&c=cioand-2.38.0-cdx-358-2&_dt=" assert(request.path!!.startsWith(path)) } @@ -166,7 +167,7 @@ class ConstructorIoRecommendationsTest { assertEquals(recommendationResponse?.response?.resultCount, 225) val request = mockServer.takeRequest() - val path = "/recommendations/v1/pods/titanic?item_id=item_id_1&item_id=item_id_2&key=golden-key&i=guido-the-guid&ui=player-one&s=79&c=cioand-2.36.0&_dt=" + val path = "/recommendations/v1/pods/titanic?item_id=item_id_1&item_id=item_id_2&key=golden-key&i=guido-the-guid&ui=player-one&s=79&c=cioand-2.38.0-cdx-358-2&_dt=" assert(request.path!!.startsWith(path)) } @@ -201,7 +202,7 @@ class ConstructorIoRecommendationsTest { "i" to "guido-the-guid", "ui" to "player-one", "s" to "79", - "c" to "cioand-2.36.0", + "c" to "cioand-2.38.0-cdx-358-2", "_dt" to "1" ) assertThat(queryParameterNames).containsExactlyInAnyOrderElementsOf(queryParams.keys) @@ -240,7 +241,7 @@ class ConstructorIoRecommendationsTest { "i" to "guido-the-guid", "ui" to "player-one", "s" to "79", - "c" to "cioand-2.36.0", + "c" to "cioand-2.38.0-cdx-358-2", "_dt" to "1" ) assertThat(queryParameterNames).containsExactlyInAnyOrderElementsOf(queryParams.keys) @@ -281,7 +282,7 @@ class ConstructorIoRecommendationsTest { "i" to "guido-the-guid", "ui" to "player-one", "s" to "79", - "c" to "cioand-2.36.0", + "c" to "cioand-2.38.0-cdx-358-2", "_dt" to "1" ) assertThat(queryParameterNames).containsExactlyInAnyOrderElementsOf(queryParams.keys) diff --git a/library/src/test/java/io/constructor/core/ConstructorIoRxErrorHandlerTest.kt b/library/src/test/java/io/constructor/core/ConstructorIoRxErrorHandlerTest.kt new file mode 100644 index 00000000..3eca80af --- /dev/null +++ b/library/src/test/java/io/constructor/core/ConstructorIoRxErrorHandlerTest.kt @@ -0,0 +1,85 @@ +package io.constructor.core + +import io.reactivex.plugins.RxJavaPlugins +import org.junit.After +import org.junit.Before +import org.junit.Test +import java.io.IOException +import java.net.SocketTimeoutException +import kotlin.test.assertEquals + +/** + * Tests for the RxJava global error handler that prevents crashes from + * undeliverable exceptions (e.g., SocketTimeoutException on OkHttp background threads) + */ +class ConstructorIoRxErrorHandlerTest { + + private var errorCount = 0 + + @Before + fun setup() { + // Reset state before each test + RxJavaPlugins.reset() + errorCount = 0 + + // Use the actual error handler from ConstructorIo + val internalHandler = ConstructorIo.createRxErrorHandler() + RxJavaPlugins.setErrorHandler { throwable -> + errorCount++ + internalHandler(throwable) + } + } + + @After + fun tearDown() { + RxJavaPlugins.reset() + } + + @Test + fun `SocketTimeoutException should be handled without crashing`() { + // Simulate what happens when OkHttp throws SocketTimeoutException on a background thread + val exception = SocketTimeoutException("timeout") + + // This would crash the app without the error handler + RxJavaPlugins.onError(exception) + + // Verify the error was handled - if we get here, we didn't crash + assertEquals(1, errorCount, "Error should have been handled") + } + + @Test + fun `IOException should be handled without crashing`() { + val exception = IOException("Connection reset") + + RxJavaPlugins.onError(exception) + + assertEquals(1, errorCount, "Error should have been handled") + } + + @Test + fun `InterruptedException should be handled without crashing`() { + val exception = InterruptedException("Thread interrupted") + + RxJavaPlugins.onError(exception) + + assertEquals(1, errorCount, "Error should have been handled") + } + + @Test + fun `other exceptions should be handled without crashing`() { + val exception = IllegalStateException("Some other error") + + RxJavaPlugins.onError(exception) + + assertEquals(1, errorCount, "Error should have been handled") + } + + @Test + fun `multiple errors should all be handled without crashing`() { + RxJavaPlugins.onError(SocketTimeoutException("timeout1")) + RxJavaPlugins.onError(IOException("connection reset")) + RxJavaPlugins.onError(SocketTimeoutException("timeout2")) + + assertEquals(3, errorCount, "All errors should be handled without crashing") + } +} diff --git a/library/src/test/java/io/constructor/core/ConstructorIoTrackingTest.kt b/library/src/test/java/io/constructor/core/ConstructorIoTrackingTest.kt index f2d732ef..bda6e92a 100755 --- a/library/src/test/java/io/constructor/core/ConstructorIoTrackingTest.kt +++ b/library/src/test/java/io/constructor/core/ConstructorIoTrackingTest.kt @@ -201,6 +201,7 @@ class ConstructorIoTrackingTest { every { configMemoryHolder.userId } returns "player-three" every { configMemoryHolder.testCellParams } returns emptyList() every { configMemoryHolder.segments } returns emptyList() + every { configMemoryHolder.suppressNetworkExceptions } returns false val config = ConstructorIoConfig("dummyKey") val dataManager = createTestDataManager(preferencesHelper, configMemoryHolder) @@ -215,7 +216,7 @@ class ConstructorIoTrackingTest { val observer = constructorIo.trackSessionStartInternal().test() observer.assertComplete() val request = mockServer.takeRequest() - val path = "/behavior?action=session_start&key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.36.0&_dt=" + val path = "/behavior?action=session_start&key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.38.0-cdx-358-2&_dt=" assert(request.path!!.startsWith(path)) } @@ -226,7 +227,7 @@ class ConstructorIoTrackingTest { val observer = ConstructorIo.trackSessionStartInternal().test() observer.assertError { true } val request = mockServer.takeRequest() - val path = "/behavior?action=session_start&key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.36.0&_dt=" + val path = "/behavior?action=session_start&key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.38.0-cdx-358-2&_dt=" assert(request.path!!.startsWith(path)) } @@ -238,7 +239,7 @@ class ConstructorIoTrackingTest { val observer = ConstructorIo.trackSessionStartInternal().test() observer.assertError(SocketTimeoutException::class.java) val request = mockServer.takeRequest() - val path = "/behavior?action=session_start&key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.36.0&_dt=" + val path = "/behavior?action=session_start&key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.38.0-cdx-358-2&_dt=" assert(request.path!!.startsWith(path)) } @@ -249,7 +250,7 @@ class ConstructorIoTrackingTest { val observer = ConstructorIo.trackInputFocusInternal("tita").test() observer.assertComplete() val request = mockServer.takeRequest() - val path = "/behavior?term=tita&action=focus&key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.36.0&_dt=" + val path = "/behavior?term=tita&action=focus&key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.38.0-cdx-358-2&_dt=" assert(request.path!!.startsWith(path)) } @@ -260,7 +261,7 @@ class ConstructorIoTrackingTest { val observer = ConstructorIo.trackInputFocusInternal("tita").test() observer.assertError { true } val request = mockServer.takeRequest() - val path = "/behavior?term=tita&action=focus&key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.36.0&_dt=" + val path = "/behavior?term=tita&action=focus&key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.38.0-cdx-358-2&_dt=" assert(request.path!!.startsWith(path)) } @@ -272,7 +273,7 @@ class ConstructorIoTrackingTest { val observer = ConstructorIo.trackInputFocusInternal("tita").test() observer.assertError(SocketTimeoutException::class.java) val request = mockServer.takeRequest() - val path = "/behavior?term=tita&action=focus&key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.36.0&_dt=" + val path = "/behavior?term=tita&action=focus&key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.38.0-cdx-358-2&_dt=" assert(request.path!!.startsWith(path)) } @@ -283,7 +284,7 @@ class ConstructorIoTrackingTest { val observer = ConstructorIo.trackAutocompleteSelectInternal("titanic", "tit", "Search Suggestions").test() observer.assertComplete() val request = mockServer.takeRequest() - val path = "/autocomplete/titanic/select?section=Search%20Suggestions&original_query=tit&tr=click&key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.36.0&_dt=" + val path = "/autocomplete/titanic/select?section=Search%20Suggestions&original_query=tit&tr=click&key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.38.0-cdx-358-2&_dt=" assert(request.path!!.startsWith(path)) } @@ -294,7 +295,7 @@ class ConstructorIoTrackingTest { val observer = ConstructorIo.trackAutocompleteSelectInternal("titanic", "tit", "Search Suggestions", ResultGroup("recommended", "123123"), "2346784").test() observer.assertComplete() val request = mockServer.takeRequest() - val path = "/autocomplete/titanic/select?section=Search%20Suggestions&original_query=tit&tr=click&result_id=2346784&group%5Bgroup_id%5D=123123&group%5Bdisplay_name%5D=recommended&key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.36.0&_dt=" + val path = "/autocomplete/titanic/select?section=Search%20Suggestions&original_query=tit&tr=click&result_id=2346784&group%5Bgroup_id%5D=123123&group%5Bdisplay_name%5D=recommended&key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.38.0-cdx-358-2&_dt=" assert(request.path!!.startsWith(path)) } @@ -305,7 +306,7 @@ class ConstructorIoTrackingTest { val observer = ConstructorIo.trackAutocompleteSelectInternal("titanic", "tit", "Search Suggestions").test() observer.assertError { true } val request = mockServer.takeRequest() - val path = "/autocomplete/titanic/select?section=Search%20Suggestions&original_query=tit&tr=click&key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.36.0&_dt=" + val path = "/autocomplete/titanic/select?section=Search%20Suggestions&original_query=tit&tr=click&key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.38.0-cdx-358-2&_dt=" assert(request.path!!.startsWith(path)) } @@ -317,7 +318,7 @@ class ConstructorIoTrackingTest { val observer = ConstructorIo.trackAutocompleteSelectInternal("titanic", "tit", "Search Suggestions").test() observer.assertError(SocketTimeoutException::class.java) val request = mockServer.takeRequest() - val path = "/autocomplete/titanic/select?section=Search%20Suggestions&original_query=tit&tr=click&key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.36.0&_dt=" + val path = "/autocomplete/titanic/select?section=Search%20Suggestions&original_query=tit&tr=click&key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.38.0-cdx-358-2&_dt=" assert(request.path!!.startsWith(path)) } @@ -328,7 +329,7 @@ class ConstructorIoTrackingTest { val observer = ConstructorIo.trackSearchSubmitInternal("titanic", "tit", null).test() observer.assertComplete() val request = mockServer.takeRequest() - val path = "/autocomplete/titanic/search?original_query=tit&tr=search&key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.36.0&_dt=" + val path = "/autocomplete/titanic/search?original_query=tit&tr=search&key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.38.0-cdx-358-2&_dt=" assert(request.path!!.startsWith(path)) } @@ -339,7 +340,7 @@ class ConstructorIoTrackingTest { val observer = ConstructorIo.trackSearchSubmitInternal("titanic", "tit", null).test() observer.assertError { true } val request = mockServer.takeRequest() - val path = "/autocomplete/titanic/search?original_query=tit&tr=search&key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.36.0&_dt=" + val path = "/autocomplete/titanic/search?original_query=tit&tr=search&key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.38.0-cdx-358-2&_dt=" assert(request.path!!.startsWith(path)) } @@ -351,7 +352,7 @@ class ConstructorIoTrackingTest { val observer = ConstructorIo.trackSearchSubmitInternal("titanic", "tit", null).test() observer.assertError(SocketTimeoutException::class.java) val request = mockServer.takeRequest() - val path = "/autocomplete/titanic/search?original_query=tit&tr=search&key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.36.0&_dt=" + val path = "/autocomplete/titanic/search?original_query=tit&tr=search&key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.38.0-cdx-358-2&_dt=" assert(request.path!!.startsWith(path)) } @@ -363,7 +364,7 @@ class ConstructorIoTrackingTest { observer.assertComplete() val request = mockServer.takeRequest() val requestBody = getRequestBody(request) - val path = "/v2/behavioral_action/search_result_load?key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.36.0&_dt=" + val path = "/v2/behavioral_action/search_result_load?key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.38.0-cdx-358-2&_dt=" assertEquals("titanic", requestBody["search_term"]) assertEquals("10", requestBody["result_count"]) assertEquals(null, requestBody["items"]) @@ -397,7 +398,7 @@ class ConstructorIoTrackingTest { observer.assertComplete() val request = mockServer.takeRequest() val requestBody = getRequestBody(request) - val path = "/v2/behavioral_action/search_result_load?key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.36.0&_dt=" + val path = "/v2/behavioral_action/search_result_load?key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.38.0-cdx-358-2&_dt=" assertEquals("titanic", requestBody["search_term"]) assertEquals("10", requestBody["result_count"]) assertEquals("[{item_id:123},{item_id:234}]", requestBody["items"]) @@ -413,7 +414,7 @@ class ConstructorIoTrackingTest { observer.assertComplete() val request = mockServer.takeRequest() val requestBody = getRequestBody(request) - val path = "/v2/behavioral_action/search_result_load?key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.36.0&_dt=" + val path = "/v2/behavioral_action/search_result_load?key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.38.0-cdx-358-2&_dt=" assertEquals("titanic", requestBody["search_term"]) assertEquals("10", requestBody["result_count"]) assertEquals(null, requestBody["items"]) @@ -429,7 +430,7 @@ class ConstructorIoTrackingTest { val observer = ConstructorIo.trackSearchResultsLoadedInternal("titanic", 10).test() observer.assertError { true } val request = mockServer.takeRequest() - val path = "/v2/behavioral_action/search_result_load?key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.36.0&_dt=" + val path = "/v2/behavioral_action/search_result_load?key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.38.0-cdx-358-2&_dt=" assert(request.path!!.startsWith(path)) } @@ -451,7 +452,7 @@ class ConstructorIoTrackingTest { val observer = ConstructorIo.trackSearchResultClickInternal("titanic replica", "TIT-REP-1997",null, "titanic").test() observer.assertComplete() val request = mockServer.takeRequest() - val path = "/autocomplete/titanic/click_through?name=titanic%20replica&customer_id=TIT-REP-1997§ion=Products&key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.36.0&_dt=" + val path = "/autocomplete/titanic/click_through?name=titanic%20replica&customer_id=TIT-REP-1997§ion=Products&key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.38.0-cdx-358-2&_dt=" assert(request.path!!.startsWith(path)) } @@ -482,7 +483,7 @@ class ConstructorIoTrackingTest { val observer = ConstructorIo.trackSearchResultClickInternal("titanic replica", "TIT-REP-1997","RED", "titanic").test() observer.assertComplete() val request = mockServer.takeRequest() - val path = "/autocomplete/titanic/click_through?name=titanic%20replica&customer_id=TIT-REP-1997&variation_id=RED§ion=Products&key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.36.0&_dt=" + val path = "/autocomplete/titanic/click_through?name=titanic%20replica&customer_id=TIT-REP-1997&variation_id=RED§ion=Products&key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.38.0-cdx-358-2&_dt=" assert(request.path!!.startsWith(path)) } @@ -493,7 +494,7 @@ class ConstructorIoTrackingTest { val observer = ConstructorIo.trackSearchResultClickInternal("titanic replica", "TIT-REP-1997", null,"titanic", "Products","3467632").test() observer.assertComplete() val request = mockServer.takeRequest() - val path = "/autocomplete/titanic/click_through?name=titanic%20replica&customer_id=TIT-REP-1997§ion=Products&result_id=3467632&key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.36.0&_dt=" + val path = "/autocomplete/titanic/click_through?name=titanic%20replica&customer_id=TIT-REP-1997§ion=Products&result_id=3467632&key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.38.0-cdx-358-2&_dt=" assert(request.path!!.startsWith(path)) } @@ -504,7 +505,7 @@ class ConstructorIoTrackingTest { val observer = ConstructorIo.trackSearchResultClickInternal("titanic replica", "TIT-REP-1997",null, "titanic").test() observer.assertError { true } val request = mockServer.takeRequest() - val path = "/autocomplete/titanic/click_through?name=titanic%20replica&customer_id=TIT-REP-1997§ion=Products&key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.36.0&_dt=" + val path = "/autocomplete/titanic/click_through?name=titanic%20replica&customer_id=TIT-REP-1997§ion=Products&key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.38.0-cdx-358-2&_dt=" assert(request.path!!.startsWith(path)) } @@ -516,7 +517,7 @@ class ConstructorIoTrackingTest { val observer = ConstructorIo.trackSearchResultClickInternal("titanic replica", "TIT-REP-1997",null, "titanic").test() observer.assertError(SocketTimeoutException::class.java) val request = mockServer.takeRequest() - val path = "/autocomplete/titanic/click_through?name=titanic%20replica&customer_id=TIT-REP-1997§ion=Products&key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.36.0&_dt=" + val path = "/autocomplete/titanic/click_through?name=titanic%20replica&customer_id=TIT-REP-1997§ion=Products&key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.38.0-cdx-358-2&_dt=" assert(request.path!!.startsWith(path)) } @@ -527,7 +528,7 @@ class ConstructorIoTrackingTest { val observer = ConstructorIo.trackConversionInternal("titanic replica", "TIT-REP-1997",null,89.00).test() observer.assertComplete() val request = mockServer.takeRequest() - val path = "/v2/behavioral_action/conversion?key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.36.0&_dt=" + val path = "/v2/behavioral_action/conversion?key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.38.0-cdx-358-2&_dt=" val requestBody = getRequestBody(request) assertEquals("TIT-REP-1997", requestBody["item_id"]) assertEquals("titanic replica", requestBody["item_name"]) @@ -544,7 +545,7 @@ class ConstructorIoTrackingTest { val observer = ConstructorIo.trackConversionInternal("titanic replica", "TIT-REP-1997","RED",89.00).test() observer.assertComplete() val request = mockServer.takeRequest() - val path = "/v2/behavioral_action/conversion?key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.36.0&_dt=" + val path = "/v2/behavioral_action/conversion?key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.38.0-cdx-358-2&_dt=" val requestBody = getRequestBody(request) assertEquals("TIT-REP-1997", requestBody["item_id"]) assertEquals("titanic replica", requestBody["item_name"]) @@ -563,7 +564,7 @@ class ConstructorIoTrackingTest { observer.assertComplete() val request = mockServer.takeRequest() val requestBody = getRequestBody(request) - val path = "/v2/behavioral_action/conversion?key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.36.0&_dt=" + val path = "/v2/behavioral_action/conversion?key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.38.0-cdx-358-2&_dt=" assertEquals("TIT-REP-1997", requestBody["item_id"]) assertEquals("titanic replica", requestBody["item_name"]) assertEquals("Like", requestBody["type"]) @@ -582,7 +583,7 @@ class ConstructorIoTrackingTest { observer.assertComplete() val request = mockServer.takeRequest() val requestBody = getRequestBody(request) - val path = "/v2/behavioral_action/conversion?key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.36.0&_dt=" + val path = "/v2/behavioral_action/conversion?key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.38.0-cdx-358-2&_dt=" assertEquals("TIT-REP-1997", requestBody["item_id"]) assertEquals("titanic replica", requestBody["item_name"]) assertEquals("add_to_loves", requestBody["type"]) @@ -603,7 +604,7 @@ class ConstructorIoTrackingTest { observer.assertError { true } val request = mockServer.takeRequest() val requestBody = getRequestBody(request) - val path = "/v2/behavioral_action/conversion?key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.36.0&_dt=" + val path = "/v2/behavioral_action/conversion?key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.38.0-cdx-358-2&_dt=" assertEquals("TIT-REP-1997", requestBody["item_id"]) assertEquals("titanic replica", requestBody["item_name"]) assertEquals("add_to_loves", requestBody["type"]) @@ -622,7 +623,7 @@ class ConstructorIoTrackingTest { val observer = ConstructorIo.trackConversionInternal("titanic replica", "TIT-REP-1997","RED",89.00, "test", null, null, null, null, mapOf("test" to "test1", "appVersion" to "150")).test() observer.assertComplete() val request = mockServer.takeRequest() - val path = "/v2/behavioral_action/conversion?key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.36.0&_dt=" + val path = "/v2/behavioral_action/conversion?key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.38.0-cdx-358-2&_dt=" val requestBody = getRequestBody(request) assertEquals("TIT-REP-1997", requestBody["item_id"]) @@ -643,7 +644,7 @@ class ConstructorIoTrackingTest { observer.assertError { true } val request = mockServer.takeRequest() val requestBody = getRequestBody(request) - val path = "/v2/behavioral_action/conversion?key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.36.0&_dt=" + val path = "/v2/behavioral_action/conversion?key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.38.0-cdx-358-2&_dt=" assertEquals("TIT-REP-1997", requestBody["item_id"]) assertEquals("titanic replica", requestBody["item_name"]) assertEquals("89.00", requestBody["revenue"]) @@ -671,7 +672,7 @@ class ConstructorIoTrackingTest { observer.assertComplete() val request = mockServer.takeRequest() val requestBody = getRequestBody(request) - val path = "/v2/behavioral_action/purchase?section=Products&key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.36.0&_dt=" + val path = "/v2/behavioral_action/purchase?section=Products&key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.38.0-cdx-358-2&_dt=" assertEquals("[{item_id:TIT-REP-1997},{item_id:QE2-REP-1969}]", requestBody["items"]) assertEquals("ORD-1312343", requestBody["order_id"]) assertEquals("12.99", requestBody["revenue"]) @@ -687,7 +688,7 @@ class ConstructorIoTrackingTest { observer.assertComplete() val request = mockServer.takeRequest() val requestBody = getRequestBody(request) - val path = "/v2/behavioral_action/purchase?section=Products&key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.36.0&_dt=" + val path = "/v2/behavioral_action/purchase?section=Products&key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.38.0-cdx-358-2&_dt=" assertEquals("[{item_id:TIT-REP-1997},{item_id:TIT-REP-1997},{item_id:QE2-REP-1969}]", requestBody["items"]) assertEquals("ORD-1312343", requestBody["order_id"]) assertEquals("12.99", requestBody["revenue"]) @@ -703,7 +704,7 @@ class ConstructorIoTrackingTest { observer.assertComplete() val request = mockServer.takeRequest() val requestBody = getRequestBody(request) - val path = "/v2/behavioral_action/purchase?section=Products&key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.36.0&_dt=" + val path = "/v2/behavioral_action/purchase?section=Products&key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.38.0-cdx-358-2&_dt=" assertEquals("[{item_id:TIT-REP-1997,variation_id:RED},{item_id:QE2-REP-1969}]", requestBody["items"]) assertEquals("ORD-1312343", requestBody["order_id"]) assertEquals("12.99", requestBody["revenue"]) @@ -719,7 +720,7 @@ class ConstructorIoTrackingTest { observer.assertComplete() val request = mockServer.takeRequest() val requestBody = getRequestBody(request) - val path = "/v2/behavioral_action/purchase?section=Products&key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.36.0&_dt=" + val path = "/v2/behavioral_action/purchase?section=Products&key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.38.0-cdx-358-2&_dt=" assertEquals("[{item_id:TIT-REP-1997,variation_id:RED},{item_id:QE2-REP-1969}]", requestBody["items"]) assertEquals("ORD-1312343", requestBody["order_id"]) assertEquals("12.99", requestBody["revenue"]) @@ -736,7 +737,7 @@ class ConstructorIoTrackingTest { observer.assertError { true } val request = mockServer.takeRequest() val requestBody = getRequestBody(request) - val path = "/v2/behavioral_action/purchase?section=Products&key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.36.0&_dt=" + val path = "/v2/behavioral_action/purchase?section=Products&key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.38.0-cdx-358-2&_dt=" assertEquals("[{item_id:TIT-REP-1997},{item_id:QE2-REP-1969}]", requestBody["items"]) assertEquals("ORD-1312343", requestBody["order_id"]) assertEquals("12.99", requestBody["revenue"]) @@ -763,7 +764,7 @@ class ConstructorIoTrackingTest { observer.assertComplete() val request = mockServer.takeRequest() val requestBody = getRequestBody(request) - val path = "/v2/behavioral_action/purchase?section=Recommendations&key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.36.0&_dt=" + val path = "/v2/behavioral_action/purchase?section=Recommendations&key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.38.0-cdx-358-2&_dt=" assertEquals("[{item_id:TIT-REP-1997},{item_id:QE2-REP-1969}]", requestBody["items"]) assertEquals("ORD-1312343", requestBody["order_id"]) assertEquals("12.99", requestBody["revenue"]) @@ -779,7 +780,7 @@ class ConstructorIoTrackingTest { observer.assertComplete() val request = mockServer.takeRequest() val requestBody = getRequestBody(request) - val path = "/v2/behavioral_action/browse_result_load?key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.36.0&_dt=" + val path = "/v2/behavioral_action/browse_result_load?key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.38.0-cdx-358-2&_dt=" assertEquals("group_id", requestBody["filter_name"]) assertEquals("Movies", requestBody["filter_value"]) assertEquals("10", requestBody["result_count"]) @@ -813,7 +814,7 @@ class ConstructorIoTrackingTest { observer.assertComplete() val request = mockServer.takeRequest() val requestBody = getRequestBody(request) - val path = "/v2/behavioral_action/browse_result_load?key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.36.0&_dt=" + val path = "/v2/behavioral_action/browse_result_load?key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.38.0-cdx-358-2&_dt=" assertEquals("group_id", requestBody["filter_name"]) assertEquals("Movies", requestBody["filter_value"]) assertEquals("10", requestBody["result_count"]) @@ -832,7 +833,7 @@ class ConstructorIoTrackingTest { observer.assertComplete() val request = mockServer.takeRequest() val requestBody = getRequestBody(request) - val path = "/v2/behavioral_action/browse_result_load?key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.36.0&_dt=" + val path = "/v2/behavioral_action/browse_result_load?key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.38.0-cdx-358-2&_dt=" assertEquals("group_id", requestBody["filter_name"]) assertEquals("Movies", requestBody["filter_value"]) assertEquals("10", requestBody["result_count"]) @@ -849,7 +850,7 @@ class ConstructorIoTrackingTest { observer.assertError { true } val request = mockServer.takeRequest() val requestBody = getRequestBody(request) - val path = "/v2/behavioral_action/browse_result_load?key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.36.0&_dt=" + val path = "/v2/behavioral_action/browse_result_load?key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.38.0-cdx-358-2&_dt=" assertEquals("group_id", requestBody["filter_name"]) assertEquals("Movies", requestBody["filter_value"]) assertEquals("10", requestBody["result_count"]) @@ -876,7 +877,7 @@ class ConstructorIoTrackingTest { observer.assertComplete() val request = mockServer.takeRequest() val requestBody = getRequestBody(request) - val path = "/v2/behavioral_action/browse_result_click?section=Products&key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.36.0&_dt=" + val path = "/v2/behavioral_action/browse_result_click?section=Products&key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.38.0-cdx-358-2&_dt=" assertEquals("group_id", requestBody["filter_name"]) assertEquals("Movies", requestBody["filter_value"]) assertEquals("TIT-REP-1997", requestBody["item_id"]) @@ -917,7 +918,7 @@ class ConstructorIoTrackingTest { observer.assertComplete() val request = mockServer.takeRequest() val requestBody = getRequestBody(request) - val path = "/v2/behavioral_action/browse_result_click?section=Products&key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.36.0&_dt=" + val path = "/v2/behavioral_action/browse_result_click?section=Products&key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.38.0-cdx-358-2&_dt=" assertEquals("group_id", requestBody["filter_name"]) assertEquals("Movies", requestBody["filter_value"]) assertEquals("TIT-REP-1997", requestBody["item_id"]) @@ -937,7 +938,7 @@ class ConstructorIoTrackingTest { observer.assertComplete() val request = mockServer.takeRequest() val requestBody = getRequestBody(request) - val path = "/v2/behavioral_action/browse_result_click?section=Products&key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.36.0&_dt=" + val path = "/v2/behavioral_action/browse_result_click?section=Products&key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.38.0-cdx-358-2&_dt=" assertEquals("group_id", requestBody["filter_name"]) assertEquals("Movies", requestBody["filter_value"]) assertEquals("TIT-REP-1997", requestBody["item_id"]) @@ -955,7 +956,7 @@ class ConstructorIoTrackingTest { observer.assertComplete() val request = mockServer.takeRequest() val requestBody = getRequestBody(request) - val path = "/v2/behavioral_action/browse_result_click?section=Products&key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.36.0&_dt=" + val path = "/v2/behavioral_action/browse_result_click?section=Products&key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.38.0-cdx-358-2&_dt=" assertEquals("group_id", requestBody["filter_name"]) assertEquals("Movies", requestBody["filter_value"]) assertEquals("TIT-REP-1997", requestBody["item_id"]) @@ -972,7 +973,7 @@ class ConstructorIoTrackingTest { observer.assertError { true } val request = mockServer.takeRequest() val requestBody = getRequestBody(request) - val path = "/v2/behavioral_action/browse_result_click?section=Products&key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.36.0&_dt=" + val path = "/v2/behavioral_action/browse_result_click?section=Products&key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.38.0-cdx-358-2&_dt=" assertEquals("group_id", requestBody["filter_name"]) assertEquals("Movies", requestBody["filter_value"]) assertEquals("TIT-REP-1997", requestBody["item_id"]) @@ -1000,7 +1001,7 @@ class ConstructorIoTrackingTest { observer.assertComplete() val request = mockServer.takeRequest() val requestBody = getRequestBody(request) - val path = "/v2/behavioral_action/item_detail_load?section=Products&key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.36.0&_dt=" + val path = "/v2/behavioral_action/item_detail_load?section=Products&key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.38.0-cdx-358-2&_dt=" assertEquals("pencil", requestBody["item_name"]) assertEquals("123", requestBody["item_id"]) assertEquals("456", requestBody["variation_id"]) @@ -1018,7 +1019,7 @@ class ConstructorIoTrackingTest { observer.assertComplete() val request = mockServer.takeRequest() val requestBody = getRequestBody(request) - val path = "/v2/behavioral_action/item_detail_load?section=Products&key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.36.0&_dt=" + val path = "/v2/behavioral_action/item_detail_load?section=Products&key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.38.0-cdx-358-2&_dt=" assertEquals("pencil", requestBody["item_name"]) assertEquals("123", requestBody["item_id"]) assertEquals("456", requestBody["variation_id"]) @@ -1037,7 +1038,7 @@ class ConstructorIoTrackingTest { observer.assertError { true } val request = mockServer.takeRequest() val requestBody = getRequestBody(request) - val path = "/v2/behavioral_action/item_detail_load?section=Products&key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.36.0&_dt=" + val path = "/v2/behavioral_action/item_detail_load?section=Products&key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.38.0-cdx-358-2&_dt=" assertEquals("pencil", requestBody["item_name"]) assertEquals("123", requestBody["item_id"]) assertEquals("456", requestBody["variation_id"]) @@ -1066,7 +1067,7 @@ class ConstructorIoTrackingTest { observer.assertComplete() val request = mockServer.takeRequest() val requestBody = getRequestBody(request) - val path = "/v2/behavioral_action/result_click?section=Products&key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.36.0&_dt=" + val path = "/v2/behavioral_action/result_click?section=Products&key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.38.0-cdx-358-2&_dt=" assertEquals("pencil", requestBody["item_name"]) assertEquals("123", requestBody["item_id"]) assertEquals("456", requestBody["variation_id"]) @@ -1083,7 +1084,7 @@ class ConstructorIoTrackingTest { observer.assertComplete() val request = mockServer.takeRequest() val requestBody = getRequestBody(request) - val path = "/v2/behavioral_action/result_click?section=Products&key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.36.0&_dt=" + val path = "/v2/behavioral_action/result_click?section=Products&key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.38.0-cdx-358-2&_dt=" assertEquals("pencil", requestBody["item_name"]) assertEquals("123", requestBody["item_id"]) assertEquals("456", requestBody["variation_id"]) @@ -1101,7 +1102,7 @@ class ConstructorIoTrackingTest { observer.assertError { true } val request = mockServer.takeRequest() val requestBody = getRequestBody(request) - val path = "/v2/behavioral_action/result_click?section=Products&key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.36.0&_dt=" + val path = "/v2/behavioral_action/result_click?section=Products&key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.38.0-cdx-358-2&_dt=" assertEquals("pencil", requestBody["item_name"]) assertEquals("123", requestBody["item_id"]) assertEquals("456", requestBody["variation_id"]) @@ -1129,7 +1130,7 @@ class ConstructorIoTrackingTest { observer.assertComplete() val request = mockServer.takeRequest() val requestBody = getRequestBody(request) - val path = "/v2/behavioral_action/recommendation_result_click?section=Products&key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.36.0&_dt=" + val path = "/v2/behavioral_action/recommendation_result_click?section=Products&key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.38.0-cdx-358-2&_dt=" assertEquals("pdp5", requestBody["pod_id"]) assertEquals("User Featured", requestBody["strategy_id"]) assertEquals("TIT-REP-1997", requestBody["item_id"]) @@ -1145,7 +1146,7 @@ class ConstructorIoTrackingTest { observer.assertComplete() val request = mockServer.takeRequest() val requestBody = getRequestBody(request) - val path = "/v2/behavioral_action/recommendation_result_click?section=Products&key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.36.0&_dt=" + val path = "/v2/behavioral_action/recommendation_result_click?section=Products&key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.38.0-cdx-358-2&_dt=" assertEquals("pdp5", requestBody["pod_id"]) assertEquals("User Featured", requestBody["strategy_id"]) assertEquals("TIT-REP-1997", requestBody["item_id"]) @@ -1162,7 +1163,7 @@ class ConstructorIoTrackingTest { observer.assertComplete() val request = mockServer.takeRequest() val requestBody = getRequestBody(request) - val path = "/v2/behavioral_action/recommendation_result_click?section=Search%20Suggestions&key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.36.0&_dt=" + val path = "/v2/behavioral_action/recommendation_result_click?section=Search%20Suggestions&key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.38.0-cdx-358-2&_dt=" assertEquals("pdp5", requestBody["pod_id"]) assertEquals("User Featured", requestBody["strategy_id"]) assertEquals("TIT-REP-1997", requestBody["item_id"]) @@ -1178,7 +1179,7 @@ class ConstructorIoTrackingTest { observer.assertError { true } val request = mockServer.takeRequest() val requestBody = getRequestBody(request) - val path = "/v2/behavioral_action/recommendation_result_click?section=Products&key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.36.0&_dt=" + val path = "/v2/behavioral_action/recommendation_result_click?section=Products&key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.38.0-cdx-358-2&_dt=" assertEquals("pdp5", requestBody["pod_id"]) assertEquals("User Featured", requestBody["strategy_id"]) assertEquals("TIT-REP-1997", requestBody["item_id"]) @@ -1205,7 +1206,7 @@ class ConstructorIoTrackingTest { observer.assertComplete() val request = mockServer.takeRequest() val requestBody = getRequestBody(request) - val path = "/v2/behavioral_action/recommendation_result_view?section=Products&key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.36.0&_dt=" + val path = "/v2/behavioral_action/recommendation_result_view?section=Products&key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.38.0-cdx-358-2&_dt=" assertEquals("pdp5", requestBody["pod_id"]) assertEquals("4", requestBody["num_results_viewed"]) assertEquals("POST", request.method) @@ -1220,7 +1221,7 @@ class ConstructorIoTrackingTest { observer.assertComplete() val request = mockServer.takeRequest() val requestBody = getRequestBody(request) - val path = "/v2/behavioral_action/recommendation_result_view?section=Products&key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.36.0&_dt=" + val path = "/v2/behavioral_action/recommendation_result_view?section=Products&key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.38.0-cdx-358-2&_dt=" assertEquals("pdp5", requestBody["pod_id"]) assertEquals("4", requestBody["num_results_viewed"]) assertEquals("{appVersion:150,appPlatform:Android,test:test1}", requestBody["analytics_tags"]) @@ -1237,7 +1238,7 @@ class ConstructorIoTrackingTest { observer.assertComplete() val request = mockServer.takeRequest() val requestBody = getRequestBody(request) - val path = "/v2/behavioral_action/recommendation_result_view?section=Products&key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.36.0&_dt=" + val path = "/v2/behavioral_action/recommendation_result_view?section=Products&key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.38.0-cdx-358-2&_dt=" assertEquals("pdp5", requestBody["pod_id"]) assertEquals("[{item_id:123},{item_id:234}]", requestBody["items"]) assertEquals("4", requestBody["num_results_viewed"]) @@ -1254,7 +1255,7 @@ class ConstructorIoTrackingTest { observer.assertComplete() val request = mockServer.takeRequest() val requestBody = getRequestBody(request) - val path = "/v2/behavioral_action/recommendation_result_view?section=Search%20Suggestions&key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.36.0&_dt=" + val path = "/v2/behavioral_action/recommendation_result_view?section=Search%20Suggestions&key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.38.0-cdx-358-2&_dt=" assertEquals("pdp5", requestBody["pod_id"]) assertEquals("4", requestBody["num_results_viewed"]) assertEquals("1", requestBody["result_page"]) @@ -1272,7 +1273,7 @@ class ConstructorIoTrackingTest { observer.assertError { true } val request = mockServer.takeRequest() val requestBody = getRequestBody(request) - val path = "/v2/behavioral_action/recommendation_result_view?section=Products&key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.36.0&_dt=" + val path = "/v2/behavioral_action/recommendation_result_view?section=Products&key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.38.0-cdx-358-2&_dt=" assertEquals("pdp5", requestBody["pod_id"]) assertEquals("4", requestBody["num_results_viewed"]) assertEquals("POST", request.method) @@ -1298,7 +1299,7 @@ class ConstructorIoTrackingTest { observer.assertComplete() val request = mockServer.takeRequest() val requestBody = getRequestBody(request) - val path = "/v2/behavioral_action/quiz_result_click?section=Products&key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.36.0&_dt=" + val path = "/v2/behavioral_action/quiz_result_click?section=Products&key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.38.0-cdx-358-2&_dt=" assertEquals("coffee-quiz", requestBody["quiz_id"]) assertEquals("23AECMA-1EFKCI", requestBody["quiz_version_id"]) assertEquals("34NCUIEI-214CDN", requestBody["quiz_session_id"]) @@ -1321,7 +1322,7 @@ class ConstructorIoTrackingTest { observer.assertComplete() val request = mockServer.takeRequest() val requestBody = getRequestBody(request) - val path = "/v2/behavioral_action/quiz_result_click?section=Products&key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.36.0&_dt=" + val path = "/v2/behavioral_action/quiz_result_click?section=Products&key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.38.0-cdx-358-2&_dt=" assertEquals("coffee-quiz", requestBody["quiz_id"]) assertEquals("23AECMA-1EFKCI", requestBody["quiz_version_id"]) assertEquals("34NCUIEI-214CDN", requestBody["quiz_session_id"]) @@ -1345,7 +1346,7 @@ class ConstructorIoTrackingTest { observer.assertComplete() val request = mockServer.takeRequest() val requestBody = getRequestBody(request) - val path = "/v2/behavioral_action/quiz_result_click?section=Search%20Suggestions&key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.36.0&_dt=" + val path = "/v2/behavioral_action/quiz_result_click?section=Search%20Suggestions&key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.38.0-cdx-358-2&_dt=" assertEquals("coffee-quiz", requestBody["quiz_id"]) assertEquals("23AECMA-1EFKCI", requestBody["quiz_version_id"]) assertEquals("34NCUIEI-214CDN", requestBody["quiz_session_id"]) @@ -1368,7 +1369,7 @@ class ConstructorIoTrackingTest { observer.assertError{ true } val request = mockServer.takeRequest() val requestBody = getRequestBody(request) - val path = "/v2/behavioral_action/quiz_result_click?section=Products&key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.36.0&_dt=" + val path = "/v2/behavioral_action/quiz_result_click?section=Products&key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.38.0-cdx-358-2&_dt=" assertEquals("coffee-quiz", requestBody["quiz_id"]) assertEquals("23AECMA-1EFKCI", requestBody["quiz_version_id"]) assertEquals("34NCUIEI-214CDN", requestBody["quiz_session_id"]) @@ -1401,7 +1402,7 @@ class ConstructorIoTrackingTest { observer.assertComplete() val request = mockServer.takeRequest() val requestBody = getRequestBody(request) - val path = "/v2/behavioral_action/quiz_conversion?section=Products&key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.36.0&_dt=" + val path = "/v2/behavioral_action/quiz_conversion?section=Products&key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.38.0-cdx-358-2&_dt=" assertEquals("coffee-quiz", requestBody["quiz_id"]) assertEquals("23AECMA-1EFKCI", requestBody["quiz_version_id"]) assertEquals("34NCUIEI-214CDN", requestBody["quiz_session_id"]) @@ -1421,7 +1422,7 @@ class ConstructorIoTrackingTest { observer.assertComplete() val request = mockServer.takeRequest() val requestBody = getRequestBody(request) - val path = "/v2/behavioral_action/quiz_conversion?section=Search%20Suggestions&key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.36.0&_dt=" + val path = "/v2/behavioral_action/quiz_conversion?section=Search%20Suggestions&key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.38.0-cdx-358-2&_dt=" assertEquals("coffee-quiz", requestBody["quiz_id"]) assertEquals("23AECMA-1EFKCI", requestBody["quiz_version_id"]) assertEquals("34NCUIEI-214CDN", requestBody["quiz_session_id"]) @@ -1444,7 +1445,7 @@ class ConstructorIoTrackingTest { observer.assertError{ true } val request = mockServer.takeRequest() val requestBody = getRequestBody(request) - val path = "/v2/behavioral_action/quiz_conversion?section=Search%20Suggestions&key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.36.0&_dt=" + val path = "/v2/behavioral_action/quiz_conversion?section=Search%20Suggestions&key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.38.0-cdx-358-2&_dt=" assertEquals("coffee-quiz", requestBody["quiz_id"]) assertEquals("23AECMA-1EFKCI", requestBody["quiz_version_id"]) assertEquals("34NCUIEI-214CDN", requestBody["quiz_session_id"]) @@ -1477,7 +1478,7 @@ class ConstructorIoTrackingTest { observer.assertComplete() val request = mockServer.takeRequest() val requestBody = getRequestBody(request) - val path = "/v2/behavioral_action/quiz_result_load?section=Products&key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.36.0&_dt=" + val path = "/v2/behavioral_action/quiz_result_load?section=Products&key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.38.0-cdx-358-2&_dt=" assertEquals("coffee-quiz", requestBody["quiz_id"]) assertEquals("23AECMA-1EFKCI", requestBody["quiz_version_id"]) assertEquals("34NCUIEI-214CDN", requestBody["quiz_session_id"]) @@ -1496,7 +1497,7 @@ class ConstructorIoTrackingTest { observer.assertComplete() val request = mockServer.takeRequest() val requestBody = getRequestBody(request) - val path = "/v2/behavioral_action/quiz_result_load?section=Search%20Suggestions&key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.36.0&_dt=" + val path = "/v2/behavioral_action/quiz_result_load?section=Search%20Suggestions&key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.38.0-cdx-358-2&_dt=" assertEquals("coffee-quiz", requestBody["quiz_id"]) assertEquals("23AECMA-1EFKCI", requestBody["quiz_version_id"]) assertEquals("34NCUIEI-214CDN", requestBody["quiz_session_id"]) @@ -1516,7 +1517,7 @@ class ConstructorIoTrackingTest { observer.assertError{ true } val request = mockServer.takeRequest() val requestBody = getRequestBody(request) - val path = "/v2/behavioral_action/quiz_result_load?section=Search%20Suggestions&key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.36.0&_dt=" + val path = "/v2/behavioral_action/quiz_result_load?section=Search%20Suggestions&key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.38.0-cdx-358-2&_dt=" assertEquals("coffee-quiz", requestBody["quiz_id"]) assertEquals("23AECMA-1EFKCI", requestBody["quiz_version_id"]) assertEquals("34NCUIEI-214CDN", requestBody["quiz_session_id"]) diff --git a/library/src/test/java/io/constructor/core/ConstructorioBrowseFacetOptionsTest.kt b/library/src/test/java/io/constructor/core/ConstructorioBrowseFacetOptionsTest.kt index b50b3f10..0ab1e6b0 100644 --- a/library/src/test/java/io/constructor/core/ConstructorioBrowseFacetOptionsTest.kt +++ b/library/src/test/java/io/constructor/core/ConstructorioBrowseFacetOptionsTest.kt @@ -49,6 +49,7 @@ class ConstructorioBrowseFacetOptionsTest { every { configMemoryHolder.userId } returns "player-two" every { configMemoryHolder.testCellParams } returns emptyList() every { configMemoryHolder.segments } returns emptyList() + every { configMemoryHolder.suppressNetworkExceptions } returns false val config = ConstructorIoConfig("dummyKey") val dataManager = createTestDataManager(preferencesHelper, configMemoryHolder) @@ -77,7 +78,7 @@ class ConstructorioBrowseFacetOptionsTest { val request = mockServer.takeRequest() val path = - "/browse/facet_options?facet_name=brands&key=silver-key&i=guapo-the-guid&ui=player-two&s=92&c=cioand-2.36.0" + "/browse/facet_options?facet_name=brands&key=silver-key&i=guapo-the-guid&ui=player-two&s=92&c=cioand-2.38.0-cdx-358-2" assert(request.path!!.startsWith(path)) } @@ -131,7 +132,7 @@ class ConstructorioBrowseFacetOptionsTest { val request = mockServer.takeRequest() val path = - "/browse/facet_options?fmt_options%5Bshow_hidden_facets%5D=true&facet_name=Brands&key=silver-key&i=guapo-the-guid&ui=player-two&s=92&c=cioand-2.36.0" + "/browse/facet_options?fmt_options%5Bshow_hidden_facets%5D=true&facet_name=Brands&key=silver-key&i=guapo-the-guid&ui=player-two&s=92&c=cioand-2.38.0-cdx-358-2" assert(request.path!!.startsWith(path)) } @@ -146,7 +147,7 @@ class ConstructorioBrowseFacetOptionsTest { val observer = constructorIo.getBrowseFacetOptions(browseFacetOptionsRequest).test() val request = mockServer.takeRequest() val path = - "/browse/facet_options?fmt_options%5Bshow_hidden_facets%5D=true&facet_name=Brands&key=silver-key&i=guapo-the-guid&ui=player-two&s=92&c=cioand-2.36.0" + "/browse/facet_options?fmt_options%5Bshow_hidden_facets%5D=true&facet_name=Brands&key=silver-key&i=guapo-the-guid&ui=player-two&s=92&c=cioand-2.38.0-cdx-358-2" assert(request.path!!.startsWith(path)) } } diff --git a/library/src/test/java/io/constructor/core/ConstructorioBrowseFacetsTest.kt b/library/src/test/java/io/constructor/core/ConstructorioBrowseFacetsTest.kt index 7e1e1a1c..956c60f2 100644 --- a/library/src/test/java/io/constructor/core/ConstructorioBrowseFacetsTest.kt +++ b/library/src/test/java/io/constructor/core/ConstructorioBrowseFacetsTest.kt @@ -49,6 +49,7 @@ class ConstructorioBrowseFacetsTest { every { configMemoryHolder.userId } returns "player-two" every { configMemoryHolder.testCellParams } returns emptyList() every { configMemoryHolder.segments } returns emptyList() + every { configMemoryHolder.suppressNetworkExceptions } returns false val config = ConstructorIoConfig("dummyKey") val dataManager = createTestDataManager(preferencesHelper, configMemoryHolder) @@ -74,7 +75,7 @@ class ConstructorioBrowseFacetsTest { val request = mockServer.takeRequest() val path = - "/browse/facets?key=silver-key&i=guapo-the-guid&ui=player-two&s=92&c=cioand-2.36.0" + "/browse/facets?key=silver-key&i=guapo-the-guid&ui=player-two&s=92&c=cioand-2.38.0-cdx-358-2" assert(request.path!!.startsWith(path)) } @@ -129,7 +130,7 @@ class ConstructorioBrowseFacetsTest { val request = mockServer.takeRequest() val path = - "/browse/facets?page=5&offset=10&num_results_per_page=20&fmt_options%5Bshow_hidden_facets%5D=true&key=silver-key&i=guapo-the-guid&ui=player-two&s=92&c=cioand-2.36.0" + "/browse/facets?page=5&offset=10&num_results_per_page=20&fmt_options%5Bshow_hidden_facets%5D=true&key=silver-key&i=guapo-the-guid&ui=player-two&s=92&c=cioand-2.38.0-cdx-358-2" assert(request.path!!.startsWith(path)) } @@ -147,7 +148,7 @@ class ConstructorioBrowseFacetsTest { val observer = constructorIo.getBrowseFacets(browseFacetsRequest).test() val request = mockServer.takeRequest() val path = - "/browse/facets?page=5&offset=10&num_results_per_page=20&fmt_options%5Bshow_hidden_facets%5D=true&key=silver-key&i=guapo-the-guid&ui=player-two&s=92&c=cioand-2.36.0" + "/browse/facets?page=5&offset=10&num_results_per_page=20&fmt_options%5Bshow_hidden_facets%5D=true&key=silver-key&i=guapo-the-guid&ui=player-two&s=92&c=cioand-2.38.0-cdx-358-2" assert(request.path!!.startsWith(path)) } } diff --git a/library/src/test/java/io/constructor/core/ConstructorioBrowseGroupsTest.kt b/library/src/test/java/io/constructor/core/ConstructorioBrowseGroupsTest.kt index 02101d86..6f1ac61e 100644 --- a/library/src/test/java/io/constructor/core/ConstructorioBrowseGroupsTest.kt +++ b/library/src/test/java/io/constructor/core/ConstructorioBrowseGroupsTest.kt @@ -49,6 +49,7 @@ class ConstructorioBrowseGroupsTest { every { configMemoryHolder.userId } returns "player-two" every { configMemoryHolder.testCellParams } returns emptyList() every { configMemoryHolder.segments } returns emptyList() + every { configMemoryHolder.suppressNetworkExceptions } returns false val config = ConstructorIoConfig("dummyKey") val dataManager = createTestDataManager(preferencesHelper, configMemoryHolder) @@ -71,7 +72,7 @@ class ConstructorioBrowseGroupsTest { val request = mockServer.takeRequest() val path = - "/browse/groups?key=silver-key&i=guapo-the-guid&ui=player-two&s=92&c=cioand-2.36.0" + "/browse/groups?key=silver-key&i=guapo-the-guid&ui=player-two&s=92&c=cioand-2.38.0-cdx-358-2" assert(request.path!!.startsWith(path)) } @@ -125,7 +126,7 @@ class ConstructorioBrowseGroupsTest { val request = mockServer.takeRequest() val path = - "/browse/groups?filters%5Bgroup_id%5D=Brand&fmt_options%5Bgroups_max_depth%5D=1&key=silver-key&i=guapo-the-guid&ui=player-two&s=92&c=cioand-2.36.0" + "/browse/groups?filters%5Bgroup_id%5D=Brand&fmt_options%5Bgroups_max_depth%5D=1&key=silver-key&i=guapo-the-guid&ui=player-two&s=92&c=cioand-2.38.0-cdx-358-2" assert(request.path!!.startsWith(path)) } @@ -141,7 +142,7 @@ class ConstructorioBrowseGroupsTest { val observer = constructorIo.getBrowseGroups(browseGroupsRequest).test() val request = mockServer.takeRequest() val path = - "/browse/groups?filters%5Bgroup_id%5D=Brand&fmt_options%5Bgroups_max_depth%5D=1&key=silver-key&i=guapo-the-guid&ui=player-two&s=92&c=cioand-2.36.0" + "/browse/groups?filters%5Bgroup_id%5D=Brand&fmt_options%5Bgroups_max_depth%5D=1&key=silver-key&i=guapo-the-guid&ui=player-two&s=92&c=cioand-2.38.0-cdx-358-2" assert(request.path!!.startsWith(path)) } } diff --git a/library/src/test/java/io/constructor/core/ConstructorioBrowseItemsTest.kt b/library/src/test/java/io/constructor/core/ConstructorioBrowseItemsTest.kt index a55751e1..7add8798 100644 --- a/library/src/test/java/io/constructor/core/ConstructorioBrowseItemsTest.kt +++ b/library/src/test/java/io/constructor/core/ConstructorioBrowseItemsTest.kt @@ -52,6 +52,7 @@ class ConstructorIoBrowseItemsTest { every { configMemoryHolder.userId } returns "player-two" every { configMemoryHolder.testCellParams } returns emptyList() every { configMemoryHolder.segments } returns emptyList() + every { configMemoryHolder.suppressNetworkExceptions } returns false val config = ConstructorIoConfig("dummyKey") val dataManager = createTestDataManager(preferencesHelper, configMemoryHolder) @@ -84,7 +85,7 @@ class ConstructorIoBrowseItemsTest { val request = mockServer.takeRequest() val path = - "/browse/items?ids=10001&ids=dai_pid_2003597&key=silver-key&i=guapo-the-guid&ui=player-two&s=92&c=cioand-2.36.0&_dt=" + "/browse/items?ids=10001&ids=dai_pid_2003597&key=silver-key&i=guapo-the-guid&ui=player-two&s=92&c=cioand-2.38.0-cdx-358-2&_dt=" assert(request.path!!.startsWith(path)) } @@ -100,7 +101,7 @@ class ConstructorIoBrowseItemsTest { } val request = mockServer.takeRequest() val path = - "/browse/items?ids=10001&ids=dai_pid_2003597&key=silver-key&i=guapo-the-guid&ui=player-two&s=92&c=cioand-2.36.0&_dt" + "/browse/items?ids=10001&ids=dai_pid_2003597&key=silver-key&i=guapo-the-guid&ui=player-two&s=92&c=cioand-2.38.0-cdx-358-2&_dt" assert(request.path!!.startsWith(path)) } @@ -118,7 +119,7 @@ class ConstructorIoBrowseItemsTest { } val request = mockServer.takeRequest() val path = - "/browse/items?ids=10001&ids=dai_pid_2003597&key=silver-key&i=guapo-the-guid&ui=player-two&s=92&c=cioand-2.36.0&_dt" + "/browse/items?ids=10001&ids=dai_pid_2003597&key=silver-key&i=guapo-the-guid&ui=player-two&s=92&c=cioand-2.38.0-cdx-358-2&_dt" assert(request.path!!.startsWith(path)) } @@ -141,7 +142,7 @@ class ConstructorIoBrowseItemsTest { val request = mockServer.takeRequest() val path = - "/browse/items?ids=10001&ids=dai_pid_2003597&key=silver-key&i=guapo-the-guid&ui=player-two&s=92&c=cioand-2.36.0&_dt" + "/browse/items?ids=10001&ids=dai_pid_2003597&key=silver-key&i=guapo-the-guid&ui=player-two&s=92&c=cioand-2.38.0-cdx-358-2&_dt" assert(request.path!!.startsWith(path)) } @@ -156,7 +157,7 @@ class ConstructorIoBrowseItemsTest { val observer = constructorIo.getBrowseItemsResults(browseItemsRequest).test() val request = mockServer.takeRequest() val path = - "/browse/items?section=Sold%20Out&ids=10001&ids=dai_pid_2003597&key=silver-key&i=guapo-the-guid&ui=player-two&s=92&c=cioand-2.36.0&_dt=" + "/browse/items?section=Sold%20Out&ids=10001&ids=dai_pid_2003597&key=silver-key&i=guapo-the-guid&ui=player-two&s=92&c=cioand-2.38.0-cdx-358-2&_dt=" assert(request.path!!.startsWith(path)) } @@ -175,7 +176,7 @@ class ConstructorIoBrowseItemsTest { val observer = constructorIo.getBrowseItemsResults(browseItemsRequest).test() val request = mockServer.takeRequest() val path = - "/browse/items?filters%5BBrand%5D=Signature%20Farms&filters%5BBrand%5D=Del%20Monte&filters%5BNutrition%5D=Organic&ids=10001&ids=dai_pid_2003597&key=silver-key&i=guapo-the-guid&ui=player-two&s=92&c=cioand-2.36.0&_dt=" + "/browse/items?filters%5BBrand%5D=Signature%20Farms&filters%5BBrand%5D=Del%20Monte&filters%5BNutrition%5D=Organic&ids=10001&ids=dai_pid_2003597&key=silver-key&i=guapo-the-guid&ui=player-two&s=92&c=cioand-2.38.0-cdx-358-2&_dt=" assert(request.path!!.startsWith(path)) } @@ -190,7 +191,7 @@ class ConstructorIoBrowseItemsTest { val observer = constructorIo.getBrowseItemsResults(browseItemsRequest).test() val request = mockServer.takeRequest() val path = - "/browse/items?fmt_options%5Bhidden_fields%5D=hiddenField1&fmt_options%5Bhidden_fields%5D=hiddenField2&ids=10001&ids=dai_pid_2003597&key=silver-key&i=guapo-the-guid&ui=player-two&s=92&c=cioand-2.36.0&_dt=" + "/browse/items?fmt_options%5Bhidden_fields%5D=hiddenField1&fmt_options%5Bhidden_fields%5D=hiddenField2&ids=10001&ids=dai_pid_2003597&key=silver-key&i=guapo-the-guid&ui=player-two&s=92&c=cioand-2.38.0-cdx-358-2&_dt=" assert(request.path!!.startsWith(path)) } @@ -206,7 +207,7 @@ class ConstructorIoBrowseItemsTest { val observer = constructorIo.getBrowseItemsResults(browseItemsRequest).test() val request = mockServer.takeRequest() val path = - "/browse/items?fmt_options%5Bhidden_facets%5D=Brand&fmt_options%5Bhidden_facets%5D=price_US&ids=10001&ids=dai_pid_2003597&key=silver-key&i=guapo-the-guid&ui=player-two&s=92&c=cioand-2.36.0&_dt=" + "/browse/items?fmt_options%5Bhidden_facets%5D=Brand&fmt_options%5Bhidden_facets%5D=price_US&ids=10001&ids=dai_pid_2003597&key=silver-key&i=guapo-the-guid&ui=player-two&s=92&c=cioand-2.38.0-cdx-358-2&_dt=" assert(request.path!!.startsWith(path)) } @@ -222,7 +223,7 @@ class ConstructorIoBrowseItemsTest { val observer = constructorIo.getBrowseItemsResults(browseItemsRequest).test() val request = mockServer.takeRequest() val path = - "/browse/items?fmt_options%5Bgroups_sort_by%5D=value&fmt_options%5Bgroups_sort_order%5D=ascending&ids=10001&ids=dai_pid_2003597&key=silver-key&i=guapo-the-guid&ui=player-two&s=92&c=cioand-2.36.0&_dt=" + "/browse/items?fmt_options%5Bgroups_sort_by%5D=value&fmt_options%5Bgroups_sort_order%5D=ascending&ids=10001&ids=dai_pid_2003597&key=silver-key&i=guapo-the-guid&ui=player-two&s=92&c=cioand-2.38.0-cdx-358-2&_dt=" assert(request.path!!.startsWith(path)) } @@ -237,7 +238,7 @@ class ConstructorIoBrowseItemsTest { .build() val observer = constructorIo.getBrowseItemsResults(browseItemsRequest).test() val request = mockServer.takeRequest() - val path = "/browse/items?fmt_options%5Bgroups_start%5D=5&fmt_options%5Bshow_hidden_facets%5D=false&fmt_options%5Bgroups_sort_order%5D=ascending&fmt_options%5Bfields%5D=false&fmt_options%5Bfields%5D=test2&ids=10001&ids=dai_pid_2003597&key=silver-key&i=guapo-the-guid&ui=player-two&s=92&c=cioand-2.36.0&_dt=" + val path = "/browse/items?fmt_options%5Bgroups_start%5D=5&fmt_options%5Bshow_hidden_facets%5D=false&fmt_options%5Bgroups_sort_order%5D=ascending&fmt_options%5Bfields%5D=false&fmt_options%5Bfields%5D=test2&ids=10001&ids=dai_pid_2003597&key=silver-key&i=guapo-the-guid&ui=player-two&s=92&c=cioand-2.38.0-cdx-358-2&_dt=" assert(request.path!!.startsWith(path)) } @@ -267,7 +268,7 @@ class ConstructorIoBrowseItemsTest { "i" to "guapo-the-guid", "ui" to "player-two", "s" to "92", - "c" to "cioand-2.36.0", + "c" to "cioand-2.38.0-cdx-358-2", "_dt" to "1", "ids" to "10001", ) diff --git a/library/src/test/java/io/constructor/core/ConstructorioBrowseTest.kt b/library/src/test/java/io/constructor/core/ConstructorioBrowseTest.kt index 705abb7d..0373ff8e 100644 --- a/library/src/test/java/io/constructor/core/ConstructorioBrowseTest.kt +++ b/library/src/test/java/io/constructor/core/ConstructorioBrowseTest.kt @@ -51,6 +51,7 @@ class ConstructorIoBrowseTest { every { configMemoryHolder.userId } returns "player-two" every { configMemoryHolder.testCellParams } returns emptyList() every { configMemoryHolder.segments } returns emptyList() + every { configMemoryHolder.suppressNetworkExceptions } returns false val config = ConstructorIoConfig("dummyKey") val dataManager = createTestDataManager(preferencesHelper, configMemoryHolder) @@ -81,7 +82,7 @@ class ConstructorIoBrowseTest { val request = mockServer.takeRequest() val path = - "/browse/group_id/Beverages?key=silver-key&i=guapo-the-guid&ui=player-two&s=92&c=cioand-2.36.0&_dt" + "/browse/group_id/Beverages?key=silver-key&i=guapo-the-guid&ui=player-two&s=92&c=cioand-2.38.0-cdx-358-2&_dt" assert(request.path!!.startsWith(path)) } @@ -95,7 +96,7 @@ class ConstructorIoBrowseTest { } val request = mockServer.takeRequest() val path = - "/browse/group_id/Beverages?key=silver-key&i=guapo-the-guid&ui=player-two&s=92&c=cioand-2.36.0&_dt" + "/browse/group_id/Beverages?key=silver-key&i=guapo-the-guid&ui=player-two&s=92&c=cioand-2.38.0-cdx-358-2&_dt" assert(request.path!!.startsWith(path)) } @@ -111,7 +112,7 @@ class ConstructorIoBrowseTest { } val request = mockServer.takeRequest() val path = - "/browse/group_id/Beverages?key=silver-key&i=guapo-the-guid&ui=player-two&s=92&c=cioand-2.36.0&_dt" + "/browse/group_id/Beverages?key=silver-key&i=guapo-the-guid&ui=player-two&s=92&c=cioand-2.38.0-cdx-358-2&_dt" assert(request.path!!.startsWith(path)) } @@ -132,7 +133,7 @@ class ConstructorIoBrowseTest { val request = mockServer.takeRequest() val path = - "/browse/group_id/Beverages?key=silver-key&i=guapo-the-guid&ui=player-two&s=92&c=cioand-2.36.0&_dt" + "/browse/group_id/Beverages?key=silver-key&i=guapo-the-guid&ui=player-two&s=92&c=cioand-2.38.0-cdx-358-2&_dt" assert(request.path!!.startsWith(path)) } @@ -154,7 +155,7 @@ class ConstructorIoBrowseTest { ).test() val request = mockServer.takeRequest() val path = - "/browse/group_id/Beverages?section=Sold%20Out&key=silver-key&i=guapo-the-guid&ui=player-two&s=92&c=cioand-2.36.0&_dt" + "/browse/group_id/Beverages?section=Sold%20Out&key=silver-key&i=guapo-the-guid&ui=player-two&s=92&c=cioand-2.38.0-cdx-358-2&_dt" assert(request.path!!.startsWith(path)) } @@ -180,7 +181,7 @@ class ConstructorIoBrowseTest { ).test() val request = mockServer.takeRequest() val path = - "/browse/group_id/Beverages?filters%5BBrand%5D=Signature%20Farms&filters%5BBrand%5D=Del%20Monte&filters%5BNutrition%5D=Organic&key=silver-key&i=guapo-the-guid&ui=player-two&s=92&c=cioand-2.36.0&_dt=" + "/browse/group_id/Beverages?filters%5BBrand%5D=Signature%20Farms&filters%5BBrand%5D=Del%20Monte&filters%5BNutrition%5D=Organic&key=silver-key&i=guapo-the-guid&ui=player-two&s=92&c=cioand-2.38.0-cdx-358-2&_dt=" assert(request.path!!.startsWith(path)) } @@ -203,7 +204,7 @@ class ConstructorIoBrowseTest { ).test() val request = mockServer.takeRequest() val path = - "/browse/group_id/Beverages?fmt_options%5Bhidden_fields%5D=hiddenField1&fmt_options%5Bhidden_fields%5D=hiddenField2&key=silver-key&i=guapo-the-guid&ui=player-two&s=92&c=cioand-2.36.0&_dt=" + "/browse/group_id/Beverages?fmt_options%5Bhidden_fields%5D=hiddenField1&fmt_options%5Bhidden_fields%5D=hiddenField2&key=silver-key&i=guapo-the-guid&ui=player-two&s=92&c=cioand-2.38.0-cdx-358-2&_dt=" assert(request.path!!.startsWith(path)) } @@ -228,7 +229,7 @@ class ConstructorIoBrowseTest { ).test() val request = mockServer.takeRequest() val path = - "/browse/group_id/Beverages?fmt_options%5Bhidden_facets%5D=Brand&fmt_options%5Bhidden_facets%5D=price_US&key=silver-key&i=guapo-the-guid&ui=player-two&s=92&c=cioand-2.36.0&_dt=" + "/browse/group_id/Beverages?fmt_options%5Bhidden_facets%5D=Brand&fmt_options%5Bhidden_facets%5D=price_US&key=silver-key&i=guapo-the-guid&ui=player-two&s=92&c=cioand-2.38.0-cdx-358-2&_dt=" assert(request.path!!.startsWith(path)) } @@ -240,7 +241,7 @@ class ConstructorIoBrowseTest { val observer = constructorIo.getBrowseResults("collection_id", "test-collection").test() val request = mockServer.takeRequest() val path = - "/browse/collection_id/test-collection?key=silver-key&i=guapo-the-guid&ui=player-two&s=92&c=cioand-2.36.0&_dt=" + "/browse/collection_id/test-collection?key=silver-key&i=guapo-the-guid&ui=player-two&s=92&c=cioand-2.38.0-cdx-358-2&_dt=" assert(request.path!!.startsWith(path)) } @@ -257,7 +258,7 @@ class ConstructorIoBrowseTest { ).test() val request = mockServer.takeRequest() val path = - "/browse/group_id/Beverages?fmt_options%5Bgroups_sort_by%5D=value&fmt_options%5Bgroups_sort_order%5D=ascending&key=silver-key&i=guapo-the-guid&ui=player-two&s=92&c=cioand-2.36.0&_dt=" + "/browse/group_id/Beverages?fmt_options%5Bgroups_sort_by%5D=value&fmt_options%5Bgroups_sort_order%5D=ascending&key=silver-key&i=guapo-the-guid&ui=player-two&s=92&c=cioand-2.38.0-cdx-358-2&_dt=" assert(request.path!!.startsWith(path)) } @@ -274,7 +275,7 @@ class ConstructorIoBrowseTest { ).test() val request = mockServer.takeRequest() val path = - "/browse/group_id/Beverages?fmt_options%5Bgroups_start%5D=5&fmt_options%5Bshow_hidden_facets%5D=false&fmt_options%5Bgroups_sort_order%5D=ascending&fmt_options%5Bfields%5D=false&fmt_options%5Bfields%5D=test2&key=silver-key&i=guapo-the-guid&ui=player-two&s=92&c=cioand-2.36.0&_dt=" + "/browse/group_id/Beverages?fmt_options%5Bgroups_start%5D=5&fmt_options%5Bshow_hidden_facets%5D=false&fmt_options%5Bgroups_sort_order%5D=ascending&fmt_options%5Bfields%5D=false&fmt_options%5Bfields%5D=test2&key=silver-key&i=guapo-the-guid&ui=player-two&s=92&c=cioand-2.38.0-cdx-358-2&_dt=" assert(request.path!!.startsWith(path)) } @@ -290,7 +291,7 @@ class ConstructorIoBrowseTest { preFilterExpression = preFilterExpression ).test() val request = mockServer.takeRequest() - val path = "/browse/group_id/Beverages?pre_filter_expression=%7B%22and%22%3A%5B%7B%22name%22%3A%22Country%22%2C%22value%22%3A%22US%22%7D%5D%7D&key=silver-key&i=guapo-the-guid&ui=player-two&s=92&c=cioand-2.36.0&_dt=" + val path = "/browse/group_id/Beverages?pre_filter_expression=%7B%22and%22%3A%5B%7B%22name%22%3A%22Country%22%2C%22value%22%3A%22US%22%7D%5D%7D&key=silver-key&i=guapo-the-guid&ui=player-two&s=92&c=cioand-2.38.0-cdx-358-2&_dt=" assert(request.path!!.startsWith(path)) } @@ -309,7 +310,7 @@ class ConstructorIoBrowseTest { val observer = constructorIo.getBrowseResults(browseRequest).test() val request = mockServer.takeRequest() val path = - "/browse/group_id/Beverages?filters%5BBrand%5D=Signature%20Farms&filters%5BBrand%5D=Del%20Monte&filters%5BNutrition%5D=Organic&key=silver-key&i=guapo-the-guid&ui=player-two&s=92&c=cioand-2.36.0&_dt=" + "/browse/group_id/Beverages?filters%5BBrand%5D=Signature%20Farms&filters%5BBrand%5D=Del%20Monte&filters%5BNutrition%5D=Organic&key=silver-key&i=guapo-the-guid&ui=player-two&s=92&c=cioand-2.38.0-cdx-358-2&_dt=" assert(request.path!!.startsWith(path)) } @@ -325,7 +326,7 @@ class ConstructorIoBrowseTest { val observer = constructorIo.getBrowseResults(browseRequest).test() val request = mockServer.takeRequest() val path = - "/browse/group_id/Beverages?fmt_options%5Bgroups_sort_by%5D=value&fmt_options%5Bgroups_sort_order%5D=ascending&key=silver-key&i=guapo-the-guid&ui=player-two&s=92&c=cioand-2.36.0&_dt=" + "/browse/group_id/Beverages?fmt_options%5Bgroups_sort_by%5D=value&fmt_options%5Bgroups_sort_order%5D=ascending&key=silver-key&i=guapo-the-guid&ui=player-two&s=92&c=cioand-2.38.0-cdx-358-2&_dt=" assert(request.path!!.startsWith(path)) } @@ -359,7 +360,7 @@ class ConstructorIoBrowseTest { "i" to "guapo-the-guid", "ui" to "player-two", "s" to "92", - "c" to "cioand-2.36.0", + "c" to "cioand-2.38.0-cdx-358-2", "_dt" to "1" ) assertThat(queryParameterNames).containsExactlyInAnyOrderElementsOf(queryParams.keys) @@ -393,7 +394,7 @@ class ConstructorIoBrowseTest { "i" to "guapo-the-guid", "ui" to "player-two", "s" to "92", - "c" to "cioand-2.36.0", + "c" to "cioand-2.38.0-cdx-358-2", "_dt" to "1" ) assertThat(queryParameterNames).containsExactlyInAnyOrderElementsOf(queryParams.keys) diff --git a/library/src/test/java/io/constructor/core/ConstructorioQuizTest.kt b/library/src/test/java/io/constructor/core/ConstructorioQuizTest.kt index 71fe992e..a469c2fe 100644 --- a/library/src/test/java/io/constructor/core/ConstructorioQuizTest.kt +++ b/library/src/test/java/io/constructor/core/ConstructorioQuizTest.kt @@ -53,6 +53,7 @@ class ConstructorioQuizTest { every { configMemoryHolder.userId } returns "player-one" every { configMemoryHolder.testCellParams } returns emptyList() every { configMemoryHolder.segments } returns emptyList() + every { configMemoryHolder.suppressNetworkExceptions } returns false val config = ConstructorIoConfig("dummyKey") val dataManager = createTestDataManager(preferencesHelper, configMemoryHolder) @@ -71,7 +72,7 @@ class ConstructorioQuizTest { quizQuestionId !== null } val request = mockServer.takeRequest() - val path = "/v1/quizzes/test-quiz/next?key=golden-key&i=guido-the-guid&ui=player-one&s=79&c=cioand-2.36.0&_dt=" + val path = "/v1/quizzes/test-quiz/next?key=golden-key&i=guido-the-guid&ui=player-one&s=79&c=cioand-2.38.0-cdx-358-2&_dt=" assert(request.path!!.startsWith(path)) } @@ -86,7 +87,7 @@ class ConstructorioQuizTest { quizQuestionId !== null } val request = mockServer.takeRequest() - val path = "/v1/quizzes/test-quiz/next?quiz_version_id=11db5ac7-67e1-4000-9000-414d8425cab3&key=golden-key&i=guido-the-guid&ui=player-one&s=79&c=cioand-2.36.0&_dt=" + val path = "/v1/quizzes/test-quiz/next?quiz_version_id=11db5ac7-67e1-4000-9000-414d8425cab3&key=golden-key&i=guido-the-guid&ui=player-one&s=79&c=cioand-2.38.0-cdx-358-2&_dt=" assert(request.path!!.startsWith(path)) } @@ -101,7 +102,7 @@ class ConstructorioQuizTest { quizQuestionId !== null } val request = mockServer.takeRequest() - val path = "/v1/quizzes/test-quiz/next?quiz_session_id=31f6bdae-6f1d-482f-b37f-f7a9e346973a&key=golden-key&i=guido-the-guid&ui=player-one&s=79&c=cioand-2.36.0&_dt=" + val path = "/v1/quizzes/test-quiz/next?quiz_session_id=31f6bdae-6f1d-482f-b37f-f7a9e346973a&key=golden-key&i=guido-the-guid&ui=player-one&s=79&c=cioand-2.38.0-cdx-358-2&_dt=" assert(request.path!!.startsWith(path)) } @@ -116,7 +117,7 @@ class ConstructorioQuizTest { quizQuestionId !== null } val request = mockServer.takeRequest() - val path = "/v1/quizzes/test-quiz/next?section=Products&key=golden-key&i=guido-the-guid&ui=player-one&s=79&c=cioand-2.36.0&_dt=" + val path = "/v1/quizzes/test-quiz/next?section=Products&key=golden-key&i=guido-the-guid&ui=player-one&s=79&c=cioand-2.38.0-cdx-358-2&_dt=" assert(request.path!!.startsWith(path)) } @@ -135,7 +136,7 @@ class ConstructorioQuizTest { quizQuestionId !== null } val request = mockServer.takeRequest() - val path = "/v1/quizzes/test-quiz/next?a=1&a=2%2C3&key=golden-key&i=guido-the-guid&ui=player-one&s=79&c=cioand-2.36.0&_dt=" + val path = "/v1/quizzes/test-quiz/next?a=1&a=2%2C3&key=golden-key&i=guido-the-guid&ui=player-one&s=79&c=cioand-2.38.0-cdx-358-2&_dt=" assert(request.path!!.startsWith(path)) } @@ -154,7 +155,7 @@ class ConstructorioQuizTest { quizId == "test-quiz" } val request = mockServer.takeRequest() - val path = "/v1/quizzes/test-quiz/results?a=1&a=2%2C3&key=golden-key&i=guido-the-guid&ui=player-one&s=79&c=cioand-2.36.0&_dt=" + val path = "/v1/quizzes/test-quiz/results?a=1&a=2%2C3&key=golden-key&i=guido-the-guid&ui=player-one&s=79&c=cioand-2.38.0-cdx-358-2&_dt=" assert(request.path!!.startsWith(path)) } @@ -173,7 +174,7 @@ class ConstructorioQuizTest { quizVersionId == "11db5ac7-67e1-4000-9000-414d8425cab3" } val request = mockServer.takeRequest() - val path = "/v1/quizzes/test-quiz/results?a=1&a=2%2C3&quiz_version_id=11db5ac7-67e1-4000-9000-414d8425cab3&key=golden-key&i=guido-the-guid&ui=player-one&s=79&c=cioand-2.36.0&_dt=" + val path = "/v1/quizzes/test-quiz/results?a=1&a=2%2C3&quiz_version_id=11db5ac7-67e1-4000-9000-414d8425cab3&key=golden-key&i=guido-the-guid&ui=player-one&s=79&c=cioand-2.38.0-cdx-358-2&_dt=" assert(request.path!!.startsWith(path)) } @@ -192,7 +193,7 @@ class ConstructorioQuizTest { quizVersionId == "11db5ac7-67e1-4000-9000-414d8425cab3" } val request = mockServer.takeRequest() - val path = "/v1/quizzes/test-quiz/results?a=1&a=2%2C3&quiz_session_id=31f6bdae-6f1d-482f-b37f-f7a9e346973a&key=golden-key&i=guido-the-guid&ui=player-one&s=79&c=cioand-2.36.0&_dt=" + val path = "/v1/quizzes/test-quiz/results?a=1&a=2%2C3&quiz_session_id=31f6bdae-6f1d-482f-b37f-f7a9e346973a&key=golden-key&i=guido-the-guid&ui=player-one&s=79&c=cioand-2.38.0-cdx-358-2&_dt=" assert(request.path!!.startsWith(path)) } @@ -211,7 +212,7 @@ class ConstructorioQuizTest { quizId == "test-quiz" } val request = mockServer.takeRequest() - val path = "/v1/quizzes/test-quiz/results?section=Products&a=1&a=2%2C3&key=golden-key&i=guido-the-guid&ui=player-one&s=79&c=cioand-2.36.0&_dt=" + val path = "/v1/quizzes/test-quiz/results?section=Products&a=1&a=2%2C3&key=golden-key&i=guido-the-guid&ui=player-one&s=79&c=cioand-2.38.0-cdx-358-2&_dt=" assert(request.path!!.startsWith(path)) } @@ -230,7 +231,7 @@ class ConstructorioQuizTest { quizId == "test-quiz" } val request = mockServer.takeRequest() - val path = "/v1/quizzes/test-quiz/results?page=2&num_results_per_page=30&a=1&a=2%2C3&key=golden-key&i=guido-the-guid&ui=player-one&s=79&c=cioand-2.36.0&_dt=" + val path = "/v1/quizzes/test-quiz/results?page=2&num_results_per_page=30&a=1&a=2%2C3&key=golden-key&i=guido-the-guid&ui=player-one&s=79&c=cioand-2.38.0-cdx-358-2&_dt=" assert(request.path!!.startsWith(path)) } @@ -249,7 +250,7 @@ class ConstructorioQuizTest { quizId == "test-quiz" } val request = mockServer.takeRequest() - val path = "/v1/quizzes/test-quiz/results?filters%5BBrand%5D=XYZ&filters%5BBrand%5D=123&filters%5Bgroup_id%5D=123&a=1&a=2%2C3&key=golden-key&i=guido-the-guid&ui=player-one&s=79&c=cioand-2.36.0&_dt=" + val path = "/v1/quizzes/test-quiz/results?filters%5BBrand%5D=XYZ&filters%5BBrand%5D=123&filters%5Bgroup_id%5D=123&a=1&a=2%2C3&key=golden-key&i=guido-the-guid&ui=player-one&s=79&c=cioand-2.38.0-cdx-358-2&_dt=" assert(request.path!!.startsWith(path)) } @@ -273,7 +274,7 @@ class ConstructorioQuizTest { quizQuestionId !== null } val request = mockServer.takeRequest() - val path = "/v1/quizzes/test-quiz/next?a=1&a=2%2C3&quiz_version_id=11db5ac7-67e1-4000-9000-414d8425cab3§ion=Products&key=golden-key&i=guido-the-guid&ui=player-one&s=79&c=cioand-2.36.0&_dt=" + val path = "/v1/quizzes/test-quiz/next?a=1&a=2%2C3&quiz_version_id=11db5ac7-67e1-4000-9000-414d8425cab3§ion=Products&key=golden-key&i=guido-the-guid&ui=player-one&s=79&c=cioand-2.38.0-cdx-358-2&_dt=" assert(request.path!!.startsWith(path)) } @@ -297,7 +298,7 @@ class ConstructorioQuizTest { quizId == "test-quiz" } val request = mockServer.takeRequest() - val path = "/v1/quizzes/test-quiz/results?section=Products&a=1&a=2%2C3&quiz_version_id=11db5ac7-67e1-4000-9000-414d8425cab3&key=golden-key&i=guido-the-guid&ui=player-one&s=79&c=cioand-2.36.0&_dt=" + val path = "/v1/quizzes/test-quiz/results?section=Products&a=1&a=2%2C3&quiz_version_id=11db5ac7-67e1-4000-9000-414d8425cab3&key=golden-key&i=guido-the-guid&ui=player-one&s=79&c=cioand-2.38.0-cdx-358-2&_dt=" assert(request.path!!.startsWith(path)) } } \ No newline at end of file diff --git a/library/src/test/java/io/constructor/core/ConstructorioSearchTest.kt b/library/src/test/java/io/constructor/core/ConstructorioSearchTest.kt index 965142e6..f8eee71c 100644 --- a/library/src/test/java/io/constructor/core/ConstructorioSearchTest.kt +++ b/library/src/test/java/io/constructor/core/ConstructorioSearchTest.kt @@ -51,6 +51,7 @@ class ConstructorIoSearchTest { every { configMemoryHolder.userId } returns "player-two" every { configMemoryHolder.testCellParams } returns emptyList() every { configMemoryHolder.segments } returns emptyList() + every { configMemoryHolder.suppressNetworkExceptions } returns false val config = ConstructorIoConfig("dummyKey") val dataManager = createTestDataManager(preferencesHelper, configMemoryHolder) @@ -82,7 +83,7 @@ class ConstructorIoSearchTest { val request = mockServer.takeRequest() val path = - "/search/corn?key=silver-key&i=guapo-the-guid&ui=player-two&s=92&c=cioand-2.36.0&_dt=" + "/search/corn?key=silver-key&i=guapo-the-guid&ui=player-two&s=92&c=cioand-2.38.0-cdx-358-2&_dt=" assert(request.path!!.startsWith(path)) } @@ -96,7 +97,7 @@ class ConstructorIoSearchTest { } val request = mockServer.takeRequest() val path = - "/search/corn?key=silver-key&i=guapo-the-guid&ui=player-two&s=92&c=cioand-2.36.0&_dt=" + "/search/corn?key=silver-key&i=guapo-the-guid&ui=player-two&s=92&c=cioand-2.38.0-cdx-358-2&_dt=" assert(request.path!!.startsWith(path)) } @@ -112,7 +113,7 @@ class ConstructorIoSearchTest { } val request = mockServer.takeRequest() val path = - "/search/corn?key=silver-key&i=guapo-the-guid&ui=player-two&s=92&c=cioand-2.36.0&_dt=" + "/search/corn?key=silver-key&i=guapo-the-guid&ui=player-two&s=92&c=cioand-2.38.0-cdx-358-2&_dt=" assert(request.path!!.startsWith(path)) } @@ -133,7 +134,7 @@ class ConstructorIoSearchTest { val request = mockServer.takeRequest() val path = - "/search/corn?key=silver-key&i=guapo-the-guid&ui=player-two&s=92&c=cioand-2.36.0&_dt=" + "/search/corn?key=silver-key&i=guapo-the-guid&ui=player-two&s=92&c=cioand-2.38.0-cdx-358-2&_dt=" assert(request.path!!.startsWith(path)) } @@ -152,7 +153,7 @@ class ConstructorIoSearchTest { val request = mockServer.takeRequest() val path = - "/search/bbq?key=silver-key&i=guapo-the-guid&ui=player-two&s=92&c=cioand-2.36.0&_dt=" + "/search/bbq?key=silver-key&i=guapo-the-guid&ui=player-two&s=92&c=cioand-2.38.0-cdx-358-2&_dt=" assert(request.path!!.startsWith(path)) } @@ -166,7 +167,7 @@ class ConstructorIoSearchTest { .test() val request = mockServer.takeRequest() val path = - "/search/bbq?section=Sold%20Out&key=silver-key&i=guapo-the-guid&ui=player-two&s=92&c=cioand-2.36.0&_dt=" + "/search/bbq?section=Sold%20Out&key=silver-key&i=guapo-the-guid&ui=player-two&s=92&c=cioand-2.38.0-cdx-358-2&_dt=" assert(request.path!!.startsWith(path)) } @@ -183,7 +184,7 @@ class ConstructorIoSearchTest { constructorIo.getSearchResults("bbq", facets, null, null, null, null, null, null).test() val request = mockServer.takeRequest() val path = - "/search/bbq?filters%5BBrand%5D=Signature%20Farms&filters%5BBrand%5D=Del%20Monte&filters%5BNutrition%5D=Organic&key=silver-key&i=guapo-the-guid&ui=player-two&s=92&c=cioand-2.36.0" + "/search/bbq?filters%5BBrand%5D=Signature%20Farms&filters%5BBrand%5D=Del%20Monte&filters%5BNutrition%5D=Organic&key=silver-key&i=guapo-the-guid&ui=player-two&s=92&c=cioand-2.38.0-cdx-358-2" assert(request.path!!.startsWith(path)) } @@ -205,7 +206,7 @@ class ConstructorIoSearchTest { ).test() val request = mockServer.takeRequest() val path = - "/search/bbq?fmt_options%5Bhidden_fields%5D=hiddenField1&fmt_options%5Bhidden_fields%5D=hiddenField2&key=silver-key&i=guapo-the-guid&ui=player-two&s=92&c=cioand-2.36.0&_dt=" + "/search/bbq?fmt_options%5Bhidden_fields%5D=hiddenField1&fmt_options%5Bhidden_fields%5D=hiddenField2&key=silver-key&i=guapo-the-guid&ui=player-two&s=92&c=cioand-2.38.0-cdx-358-2&_dt=" assert(request.path!!.startsWith(path)) } @@ -229,7 +230,7 @@ class ConstructorIoSearchTest { ).test() val request = mockServer.takeRequest() val path = - "/search/bbq?fmt_options%5Bhidden_facets%5D=Brand&fmt_options%5Bhidden_facets%5D=price_US&key=silver-key&i=guapo-the-guid&ui=player-two&s=92&c=cioand-2.36.0&_dt=" + "/search/bbq?fmt_options%5Bhidden_facets%5D=Brand&fmt_options%5Bhidden_facets%5D=price_US&key=silver-key&i=guapo-the-guid&ui=player-two&s=92&c=cioand-2.38.0-cdx-358-2&_dt=" assert(request.path!!.startsWith(path)) } @@ -241,7 +242,7 @@ class ConstructorIoSearchTest { val observer = constructorIo.getSearchResults("2% cheese").test() val request = mockServer.takeRequest() val path = - "/search/2%25%20cheese?key=silver-key&i=guapo-the-guid&ui=player-two&s=92&c=cioand-2.36.0&_dt=" + "/search/2%25%20cheese?key=silver-key&i=guapo-the-guid&ui=player-two&s=92&c=cioand-2.38.0-cdx-358-2&_dt=" assert(request.path!!.startsWith(path)) } @@ -257,7 +258,7 @@ class ConstructorIoSearchTest { ).test() val request = mockServer.takeRequest() val path = - "/search/bbq?fmt_options%5Bgroups_sort_by%5D=value&fmt_options%5Bgroups_sort_order%5D=descending&key=silver-key&i=guapo-the-guid&ui=player-two&s=92&c=cioand-2.36.0&_dt=" + "/search/bbq?fmt_options%5Bgroups_sort_by%5D=value&fmt_options%5Bgroups_sort_order%5D=descending&key=silver-key&i=guapo-the-guid&ui=player-two&s=92&c=cioand-2.38.0-cdx-358-2&_dt=" assert(request.path!!.startsWith(path)) } @@ -275,7 +276,7 @@ class ConstructorIoSearchTest { ).test() val request = mockServer.takeRequest() val path = - "/search/bbq?fmt_options%5Bgroups_sort_by%5D=value&fmt_options%5Bgroups_sort_order%5D=descending&pre_filter_expression=%7B%22and%22%3A%5B%7B%22name%22%3A%22Country%22%2C%22value%22%3A%22US%22%7D%5D%7D&key=silver-key&i=guapo-the-guid&ui=player-two&s=92&c=cioand-2.36.0&_dt=" + "/search/bbq?fmt_options%5Bgroups_sort_by%5D=value&fmt_options%5Bgroups_sort_order%5D=descending&pre_filter_expression=%7B%22and%22%3A%5B%7B%22name%22%3A%22Country%22%2C%22value%22%3A%22US%22%7D%5D%7D&key=silver-key&i=guapo-the-guid&ui=player-two&s=92&c=cioand-2.38.0-cdx-358-2&_dt=" assert(request.path!!.startsWith(path)) } @@ -291,7 +292,7 @@ class ConstructorIoSearchTest { ).test() val request = mockServer.takeRequest() val path = - "/search/bbq?fmt_options%5Bgroups_start%5D=5&fmt_options%5Bshow_hidden_facets%5D=false&fmt_options%5Bgroups_sort_order%5D=ascending&fmt_options%5Bfields%5D=false&fmt_options%5Bfields%5D=test2&key=silver-key&i=guapo-the-guid&ui=player-two&s=92&c=cioand-2.36.0&_dt=" + "/search/bbq?fmt_options%5Bgroups_start%5D=5&fmt_options%5Bshow_hidden_facets%5D=false&fmt_options%5Bgroups_sort_order%5D=ascending&fmt_options%5Bfields%5D=false&fmt_options%5Bfields%5D=test2&key=silver-key&i=guapo-the-guid&ui=player-two&s=92&c=cioand-2.38.0-cdx-358-2&_dt=" assert(request.path!!.startsWith(path)) } @@ -310,7 +311,7 @@ class ConstructorIoSearchTest { val observer = constructorIo.getSearchResults(searchRequest).test() val request = mockServer.takeRequest() val path = - "/search/bbq?filters%5BBrand%5D=Signature%20Farms&filters%5BBrand%5D=Del%20Monte&filters%5BNutrition%5D=Organic&key=silver-key&i=guapo-the-guid&ui=player-two&s=92&c=cioand-2.36.0" + "/search/bbq?filters%5BBrand%5D=Signature%20Farms&filters%5BBrand%5D=Del%20Monte&filters%5BNutrition%5D=Organic&key=silver-key&i=guapo-the-guid&ui=player-two&s=92&c=cioand-2.38.0-cdx-358-2" assert(request.path!!.startsWith(path)) } @@ -326,7 +327,7 @@ class ConstructorIoSearchTest { val observer = constructorIo.getSearchResults(searchRequest).test() val request = mockServer.takeRequest() val path = - "/search/bbq?fmt_options%5Bgroups_sort_by%5D=value&fmt_options%5Bgroups_sort_order%5D=ascending&key=silver-key&i=guapo-the-guid&ui=player-two&s=92&c=cioand-2.36.0&_dt=" + "/search/bbq?fmt_options%5Bgroups_sort_by%5D=value&fmt_options%5Bgroups_sort_order%5D=ascending&key=silver-key&i=guapo-the-guid&ui=player-two&s=92&c=cioand-2.38.0-cdx-358-2&_dt=" assert(request.path!!.startsWith(path)) } @@ -360,7 +361,7 @@ class ConstructorIoSearchTest { "i" to "guapo-the-guid", "ui" to "player-two", "s" to "92", - "c" to "cioand-2.36.0", + "c" to "cioand-2.38.0-cdx-358-2", "_dt" to "1" ) assertThat(queryParameterNames).containsExactlyInAnyOrderElementsOf(queryParams.keys) @@ -394,7 +395,7 @@ class ConstructorIoSearchTest { "i" to "guapo-the-guid", "ui" to "player-two", "s" to "92", - "c" to "cioand-2.36.0", + "c" to "cioand-2.38.0-cdx-358-2", "_dt" to "1" ) assertThat(queryParameterNames).containsExactlyInAnyOrderElementsOf(queryParams.keys) diff --git a/library/src/test/java/io/constructor/core/ConstructorioSegmentsTest.kt b/library/src/test/java/io/constructor/core/ConstructorioSegmentsTest.kt index df814e04..ece2048c 100644 --- a/library/src/test/java/io/constructor/core/ConstructorioSegmentsTest.kt +++ b/library/src/test/java/io/constructor/core/ConstructorioSegmentsTest.kt @@ -48,6 +48,7 @@ class ConstructorioSegmentsTest { every { configMemoryHolder.userId } returns "player-two" every { configMemoryHolder.testCellParams } returns emptyList() every { configMemoryHolder.segments } returns listOf("mobile", "COUNTRY_US") + every { configMemoryHolder.suppressNetworkExceptions } returns false val config = ConstructorIoConfig("dummyKey") val dataManager = createTestDataManager(preferencesHelper, configMemoryHolder) @@ -65,7 +66,7 @@ class ConstructorioSegmentsTest { suggestions?.isNotEmpty()!! && suggestions.size == 5 } val request = mockServer.takeRequest() - val path = "/autocomplete/titanic?key=aluminium-key&i=koopa-the-guid&ui=player-two&s=14&us=mobile&us=COUNTRY_US&c=cioand-2.36.0&_dt=" + val path = "/autocomplete/titanic?key=aluminium-key&i=koopa-the-guid&ui=player-two&s=14&us=mobile&us=COUNTRY_US&c=cioand-2.38.0-cdx-358-2&_dt=" assert(request.path!!.startsWith(path)) } @@ -76,7 +77,7 @@ class ConstructorioSegmentsTest { val observer = constructorIo.trackSessionStartInternal().test() observer.assertComplete() val request = mockServer.takeRequest() - val path = "/behavior?action=session_start&key=aluminium-key&i=koopa-the-guid&ui=player-two&s=14&us=mobile&us=COUNTRY_US&c=cioand-2.36.0&_dt=" + val path = "/behavior?action=session_start&key=aluminium-key&i=koopa-the-guid&ui=player-two&s=14&us=mobile&us=COUNTRY_US&c=cioand-2.38.0-cdx-358-2&_dt=" assert(request.path!!.startsWith(path)) } @@ -87,7 +88,7 @@ class ConstructorioSegmentsTest { val observer = ConstructorIo.trackInputFocusInternal("tita").test() observer.assertComplete() val request = mockServer.takeRequest() - val path = "/behavior?term=tita&action=focus&key=aluminium-key&i=koopa-the-guid&ui=player-two&s=14&us=mobile&us=COUNTRY_US&c=cioand-2.36.0&_dt=" + val path = "/behavior?term=tita&action=focus&key=aluminium-key&i=koopa-the-guid&ui=player-two&s=14&us=mobile&us=COUNTRY_US&c=cioand-2.38.0-cdx-358-2&_dt=" assert(request.path!!.startsWith(path)) } @@ -98,7 +99,7 @@ class ConstructorioSegmentsTest { val observer = ConstructorIo.trackAutocompleteSelectInternal("titanic", "tit", "Search Suggestions").test() observer.assertComplete() val request = mockServer.takeRequest() - val path = "/autocomplete/titanic/select?section=Search%20Suggestions&original_query=tit&tr=click&key=aluminium-key&i=koopa-the-guid&ui=player-two&s=14&us=mobile&us=COUNTRY_US&c=cioand-2.36.0&_dt=" + val path = "/autocomplete/titanic/select?section=Search%20Suggestions&original_query=tit&tr=click&key=aluminium-key&i=koopa-the-guid&ui=player-two&s=14&us=mobile&us=COUNTRY_US&c=cioand-2.38.0-cdx-358-2&_dt=" assert(request.path!!.startsWith(path)) } @@ -109,7 +110,7 @@ class ConstructorioSegmentsTest { val observer = ConstructorIo.trackSearchSubmitInternal("titanic", "tit", null).test() observer.assertComplete() val request = mockServer.takeRequest() - val path = "/autocomplete/titanic/search?original_query=tit&tr=search&key=aluminium-key&i=koopa-the-guid&ui=player-two&s=14&us=mobile&us=COUNTRY_US&c=cioand-2.36.0&_dt=" + val path = "/autocomplete/titanic/search?original_query=tit&tr=search&key=aluminium-key&i=koopa-the-guid&ui=player-two&s=14&us=mobile&us=COUNTRY_US&c=cioand-2.38.0-cdx-358-2&_dt=" assert(request.path!!.startsWith(path)) } @@ -120,7 +121,7 @@ class ConstructorioSegmentsTest { val observer = ConstructorIo.trackSearchResultsLoadedInternal("titanic", 10).test() observer.assertComplete() val request = mockServer.takeRequest() - val path = "/v2/behavioral_action/search_result_load?key=aluminium-key&i=koopa-the-guid&ui=player-two&s=14&us=mobile&us=COUNTRY_US&c=cioand-2.36.0&_dt=" + val path = "/v2/behavioral_action/search_result_load?key=aluminium-key&i=koopa-the-guid&ui=player-two&s=14&us=mobile&us=COUNTRY_US&c=cioand-2.38.0-cdx-358-2&_dt=" assert(request.path!!.startsWith(path)) } @@ -131,7 +132,7 @@ class ConstructorioSegmentsTest { val observer = ConstructorIo.trackSearchResultClickInternal("titanic replica", "TIT-REP-1997", null,"titanic").test() observer.assertComplete() val request = mockServer.takeRequest() - val path = "/autocomplete/titanic/click_through?name=titanic%20replica&customer_id=TIT-REP-1997§ion=Products&key=aluminium-key&i=koopa-the-guid&ui=player-two&s=14&us=mobile&us=COUNTRY_US&c=cioand-2.36.0&_dt=" + val path = "/autocomplete/titanic/click_through?name=titanic%20replica&customer_id=TIT-REP-1997§ion=Products&key=aluminium-key&i=koopa-the-guid&ui=player-two&s=14&us=mobile&us=COUNTRY_US&c=cioand-2.38.0-cdx-358-2&_dt=" assert(request.path!!.startsWith(path)) } @@ -142,7 +143,7 @@ class ConstructorioSegmentsTest { val observer = ConstructorIo.trackConversionInternal("titanic replica", "TIT-REP-1997", null, 89.00).test() observer.assertComplete() val request = mockServer.takeRequest() - val path = "/v2/behavioral_action/conversion?key=aluminium-key&i=koopa-the-guid&ui=player-two&s=14&us=mobile&us=COUNTRY_US&c=cioand-2.36.0&_dt=" + val path = "/v2/behavioral_action/conversion?key=aluminium-key&i=koopa-the-guid&ui=player-two&s=14&us=mobile&us=COUNTRY_US&c=cioand-2.38.0-cdx-358-2&_dt=" assert(request.path!!.startsWith(path)) } @@ -153,7 +154,7 @@ class ConstructorioSegmentsTest { val observer = ConstructorIo.trackPurchaseInternal(arrayOf(PurchaseItem("TIT-REP-1997"), PurchaseItem("QE2-REP-1969")), 12.99, "ORD-1312343").test() observer.assertComplete() val request = mockServer.takeRequest() - val path = "/v2/behavioral_action/purchase?section=Products&key=aluminium-key&i=koopa-the-guid&ui=player-two&s=14&us=mobile&us=COUNTRY_US&c=cioand-2.36.0&_dt=" + val path = "/v2/behavioral_action/purchase?section=Products&key=aluminium-key&i=koopa-the-guid&ui=player-two&s=14&us=mobile&us=COUNTRY_US&c=cioand-2.38.0-cdx-358-2&_dt=" assertTrue(request.bodySize > 250) assert(request.path!!.startsWith(path)) } @@ -165,7 +166,7 @@ class ConstructorioSegmentsTest { val observer = ConstructorIo.trackRecommendationResultClickInternal("pdp5", "User Featured", "prrst_shldr_bls").test() observer.assertComplete() val request = mockServer.takeRequest() - val path = "/v2/behavioral_action/recommendation_result_click?section=Products&key=aluminium-key&i=koopa-the-guid&ui=player-two&s=14&us=mobile&us=COUNTRY_US&c=cioand-2.36.0&_dt=" + val path = "/v2/behavioral_action/recommendation_result_click?section=Products&key=aluminium-key&i=koopa-the-guid&ui=player-two&s=14&us=mobile&us=COUNTRY_US&c=cioand-2.38.0-cdx-358-2&_dt=" assert(request.path!!.startsWith(path)) } @@ -176,7 +177,7 @@ class ConstructorioSegmentsTest { val observer = ConstructorIo.trackRecommendationResultsViewInternal("pdp5", null,4).test() observer.assertComplete() val request = mockServer.takeRequest() - val path = "/v2/behavioral_action/recommendation_result_view?section=Products&key=aluminium-key&i=koopa-the-guid&ui=player-two&s=14&us=mobile&us=COUNTRY_US&c=cioand-2.36.0&_dt=" + val path = "/v2/behavioral_action/recommendation_result_view?section=Products&key=aluminium-key&i=koopa-the-guid&ui=player-two&s=14&us=mobile&us=COUNTRY_US&c=cioand-2.38.0-cdx-358-2&_dt=" assert(request.path!!.startsWith(path)) } } diff --git a/library/src/test/java/io/constructor/core/ConstructorioTestCellTest.kt b/library/src/test/java/io/constructor/core/ConstructorioTestCellTest.kt index d66bd99a..18749292 100644 --- a/library/src/test/java/io/constructor/core/ConstructorioTestCellTest.kt +++ b/library/src/test/java/io/constructor/core/ConstructorioTestCellTest.kt @@ -48,6 +48,7 @@ class ConstructorioTestCellTest { every { configMemoryHolder.defaultAnalyticsTags } returns mapOf("appVersion" to "123", "appPlatform" to "Android") every { configMemoryHolder.testCellParams } returns listOf("cellone" to "vanilla", "celltwo" to "whipped-cream") every { configMemoryHolder.segments } returns emptyList() + every { configMemoryHolder.suppressNetworkExceptions } returns false val config = ConstructorIoConfig("dummyKey") @@ -66,7 +67,7 @@ class ConstructorioTestCellTest { suggestions?.isNotEmpty()!! && suggestions.size == 5 } val request = mockServer.takeRequest() - val path = "/autocomplete/titanic?key=aluminium-key&i=koopa-the-guid&ui=player-two&s=14&ef-cellone=vanilla&ef-celltwo=whipped-cream&c=cioand-2.36.0&_dt=" + val path = "/autocomplete/titanic?key=aluminium-key&i=koopa-the-guid&ui=player-two&s=14&ef-cellone=vanilla&ef-celltwo=whipped-cream&c=cioand-2.38.0-cdx-358-2&_dt=" assert(request.path!!.startsWith(path)) } @@ -77,7 +78,7 @@ class ConstructorioTestCellTest { val observer = constructorIo.trackSessionStartInternal().test() observer.assertComplete() val request = mockServer.takeRequest() - val path = "/behavior?action=session_start&key=aluminium-key&i=koopa-the-guid&ui=player-two&s=14&ef-cellone=vanilla&ef-celltwo=whipped-cream&c=cioand-2.36.0&_dt="; + val path = "/behavior?action=session_start&key=aluminium-key&i=koopa-the-guid&ui=player-two&s=14&ef-cellone=vanilla&ef-celltwo=whipped-cream&c=cioand-2.38.0-cdx-358-2&_dt="; assert(request.path!!.startsWith(path)) } @@ -88,7 +89,7 @@ class ConstructorioTestCellTest { val observer = ConstructorIo.trackInputFocusInternal("tita").test() observer.assertComplete() val request = mockServer.takeRequest() - val path = "/behavior?term=tita&action=focus&key=aluminium-key&i=koopa-the-guid&ui=player-two&s=14&ef-cellone=vanilla&ef-celltwo=whipped-cream&c=cioand-2.36.0&_dt="; + val path = "/behavior?term=tita&action=focus&key=aluminium-key&i=koopa-the-guid&ui=player-two&s=14&ef-cellone=vanilla&ef-celltwo=whipped-cream&c=cioand-2.38.0-cdx-358-2&_dt="; assert(request.path!!.startsWith(path)) } @@ -99,7 +100,7 @@ class ConstructorioTestCellTest { val observer = ConstructorIo.trackAutocompleteSelectInternal("titanic", "tit", "Search Suggestions").test() observer.assertComplete() val request = mockServer.takeRequest() - val path = "/autocomplete/titanic/select?section=Search%20Suggestions&original_query=tit&tr=click&key=aluminium-key&i=koopa-the-guid&ui=player-two&s=14&ef-cellone=vanilla&ef-celltwo=whipped-cream&c=cioand-2.36.0&_dt=" + val path = "/autocomplete/titanic/select?section=Search%20Suggestions&original_query=tit&tr=click&key=aluminium-key&i=koopa-the-guid&ui=player-two&s=14&ef-cellone=vanilla&ef-celltwo=whipped-cream&c=cioand-2.38.0-cdx-358-2&_dt=" assert(request.path!!.startsWith(path)) } @@ -110,7 +111,7 @@ class ConstructorioTestCellTest { val observer = ConstructorIo.trackSearchSubmitInternal("titanic", "tit", null).test() observer.assertComplete() val request = mockServer.takeRequest() - val path = "/autocomplete/titanic/search?original_query=tit&tr=search&key=aluminium-key&i=koopa-the-guid&ui=player-two&s=14&ef-cellone=vanilla&ef-celltwo=whipped-cream&c=cioand-2.36.0&_dt="; + val path = "/autocomplete/titanic/search?original_query=tit&tr=search&key=aluminium-key&i=koopa-the-guid&ui=player-two&s=14&ef-cellone=vanilla&ef-celltwo=whipped-cream&c=cioand-2.38.0-cdx-358-2&_dt="; assert(request.path!!.startsWith(path)) } @@ -121,7 +122,7 @@ class ConstructorioTestCellTest { val observer = ConstructorIo.trackSearchResultsLoadedInternal("titanic", 10).test() observer.assertComplete() val request = mockServer.takeRequest() - val path = "/v2/behavioral_action/search_result_load?key=aluminium-key&i=koopa-the-guid&ui=player-two&s=14&ef-cellone=vanilla&ef-celltwo=whipped-cream&c=cioand-2.36.0&_dt="; + val path = "/v2/behavioral_action/search_result_load?key=aluminium-key&i=koopa-the-guid&ui=player-two&s=14&ef-cellone=vanilla&ef-celltwo=whipped-cream&c=cioand-2.38.0-cdx-358-2&_dt="; assert(request.path!!.startsWith(path)) } @@ -132,7 +133,7 @@ class ConstructorioTestCellTest { val observer = ConstructorIo.trackSearchResultClickInternal("titanic replica", "TIT-REP-1997", null, "titanic").test() observer.assertComplete() val request = mockServer.takeRequest() - val path = "/autocomplete/titanic/click_through?name=titanic%20replica&customer_id=TIT-REP-1997§ion=Products&key=aluminium-key&i=koopa-the-guid&ui=player-two&s=14&ef-cellone=vanilla&ef-celltwo=whipped-cream&c=cioand-2.36.0&_dt="; + val path = "/autocomplete/titanic/click_through?name=titanic%20replica&customer_id=TIT-REP-1997§ion=Products&key=aluminium-key&i=koopa-the-guid&ui=player-two&s=14&ef-cellone=vanilla&ef-celltwo=whipped-cream&c=cioand-2.38.0-cdx-358-2&_dt="; assert(request.path!!.startsWith(path)) } @@ -143,7 +144,7 @@ class ConstructorioTestCellTest { val observer = ConstructorIo.trackConversionInternal("titanic replica", "TIT-REP-1997", null, 89.00).test() observer.assertComplete() val request = mockServer.takeRequest() - val path = "/v2/behavioral_action/conversion?key=aluminium-key&i=koopa-the-guid&ui=player-two&s=14&ef-cellone=vanilla&ef-celltwo=whipped-cream&c=cioand-2.36.0&_dt="; + val path = "/v2/behavioral_action/conversion?key=aluminium-key&i=koopa-the-guid&ui=player-two&s=14&ef-cellone=vanilla&ef-celltwo=whipped-cream&c=cioand-2.38.0-cdx-358-2&_dt="; assert(request.path!!.startsWith(path)) } @@ -154,7 +155,7 @@ class ConstructorioTestCellTest { val observer = ConstructorIo.trackPurchaseInternal(arrayOf(PurchaseItem("TIT-REP-1997"), PurchaseItem("QE2-REP-1969")), 12.99, "ORD-1312343").test() observer.assertComplete() val request = mockServer.takeRequest() - val path = "/v2/behavioral_action/purchase?section=Products&key=aluminium-key&i=koopa-the-guid&ui=player-two&s=14&ef-cellone=vanilla&ef-celltwo=whipped-cream&c=cioand-2.36.0&_dt="; + val path = "/v2/behavioral_action/purchase?section=Products&key=aluminium-key&i=koopa-the-guid&ui=player-two&s=14&ef-cellone=vanilla&ef-celltwo=whipped-cream&c=cioand-2.38.0-cdx-358-2&_dt="; assertTrue(request.bodySize > 230) assert(request.path!!.startsWith(path)) } @@ -166,7 +167,7 @@ class ConstructorioTestCellTest { val observer = ConstructorIo.trackRecommendationResultClickInternal("pdp5", "User Featured", "prrst_shldr_bls").test() observer.assertComplete() val request = mockServer.takeRequest() - val path = "/v2/behavioral_action/recommendation_result_click?section=Products&key=aluminium-key&i=koopa-the-guid&ui=player-two&s=14&ef-cellone=vanilla&ef-celltwo=whipped-cream&c=cioand-2.36.0&_dt=" + val path = "/v2/behavioral_action/recommendation_result_click?section=Products&key=aluminium-key&i=koopa-the-guid&ui=player-two&s=14&ef-cellone=vanilla&ef-celltwo=whipped-cream&c=cioand-2.38.0-cdx-358-2&_dt=" assert(request.path!!.startsWith(path)) } @@ -177,7 +178,7 @@ class ConstructorioTestCellTest { val observer = ConstructorIo.trackRecommendationResultsViewInternal("pdp5", null, 4).test() observer.assertComplete() val request = mockServer.takeRequest() - val path = "/v2/behavioral_action/recommendation_result_view?section=Products&key=aluminium-key&i=koopa-the-guid&ui=player-two&s=14&ef-cellone=vanilla&ef-celltwo=whipped-cream&c=cioand-2.36.0&_dt=" + val path = "/v2/behavioral_action/recommendation_result_view?section=Products&key=aluminium-key&i=koopa-the-guid&ui=player-two&s=14&ef-cellone=vanilla&ef-celltwo=whipped-cream&c=cioand-2.38.0-cdx-358-2&_dt=" assert(request.path!!.startsWith(path)) } }