From 7bcb9da12f21db06f92c29465f6f2068814e86a9 Mon Sep 17 00:00:00 2001 From: Zubin Tiku Date: Tue, 7 Jul 2020 11:23:17 -0400 Subject: [PATCH 1/3] Split tracking functions into internal and external functions --- .../java/io/constructor/core/ConstructorIo.kt | 52 ++++++++++++++++--- .../java/io/constructor/util/Extensions.kt | 2 + .../core/ConstructorIoTrackingTest.kt | 48 ++++++++--------- .../core/ConstructorioTestCellTest.kt | 14 ++--- 4 files changed, 78 insertions(+), 38 deletions(-) diff --git a/library/src/main/java/io/constructor/core/ConstructorIo.kt b/library/src/main/java/io/constructor/core/ConstructorIo.kt index 86108ad8..1f928526 100755 --- a/library/src/main/java/io/constructor/core/ConstructorIo.kt +++ b/library/src/main/java/io/constructor/core/ConstructorIo.kt @@ -14,9 +14,11 @@ import io.constructor.injection.component.DaggerAppComponent import io.constructor.injection.module.AppModule import io.constructor.injection.module.NetworkModule import io.constructor.util.broadcastIntent +import io.constructor.util.e import io.constructor.util.urlEncode import io.reactivex.Completable import io.reactivex.Observable +import io.reactivex.disposables.CompositeDisposable import io.reactivex.schedulers.Schedulers import java.util.* @@ -30,6 +32,7 @@ object ConstructorIo { private lateinit var configMemoryHolder: ConfigMemoryHolder private lateinit var context: Context private var broadcast = true + private var disposable = CompositeDisposable() var userId: String? get() = configMemoryHolder.userId @@ -132,7 +135,12 @@ object ConstructorIo { /** * Tracks input focus events */ - fun trackInputFocus(term: String?): Completable { + fun trackInputFocus(term: String?) { + disposable.add(trackInputFocusInternal(term).subscribe({}, { + t -> e("Input Focus event error: ${t.message}") + })) + } + internal fun trackInputFocusInternal(term: String?): Completable { preferenceHelper.getSessionId(sessionIncrementHandler) return dataManager.trackInputFocus(term, arrayOf( Constants.QueryConstants.ACTION to Constants.QueryValues.EVENT_INPUT_FOCUS @@ -142,7 +150,12 @@ object ConstructorIo { /** * Tracks autocomplete select events */ - fun trackAutocompleteSelect(searchTerm: String, originalQuery: String, sectionName: String, group: Group? = null, resultID: String? = null): Completable { + fun trackAutocompleteSelect(searchTerm: String, originalQuery: String, sectionName: String, group: Group? = null, resultID: String? = null) { + disposable.add(trackAutocompleteSelectInternal(searchTerm, originalQuery, sectionName, group, resultID).subscribe({}, { + t -> e("Autocomplete Select error: ${t.message}") + })) + } + internal fun trackAutocompleteSelectInternal(searchTerm: String, originalQuery: String, sectionName: String, group: Group? = null, resultID: String? = null): Completable { preferenceHelper.getSessionId(sessionIncrementHandler) val encodedParams: ArrayList> = arrayListOf() group?.groupId?.let { encodedParams.add(Constants.QueryConstants.GROUP_ID.urlEncode() to it) } @@ -166,7 +179,12 @@ object ConstructorIo { /** * Tracks search submit events */ - fun trackSearchSubmit(searchTerm: String, originalQuery: String, group: Group?): Completable { + fun trackSearchSubmit(searchTerm: String, originalQuery: String, group: Group?) { + disposable.add(trackSearchSubmitInternal(searchTerm, originalQuery, group).subscribe({}, { + t -> e("Search Submit error: ${t.message}") + })) + } + internal fun trackSearchSubmitInternal(searchTerm: String, originalQuery: String, group: Group?): Completable { preferenceHelper.getSessionId(sessionIncrementHandler) val encodedParams: ArrayList> = arrayListOf() group?.groupId?.let { encodedParams.add(Constants.QueryConstants.GROUP_ID.urlEncode() to it) } @@ -188,7 +206,12 @@ object ConstructorIo { /** * Tracks search results loaded (a.k.a. search results viewed) events */ - fun trackSearchResultsLoaded(term: String, resultCount: Int): Completable { + fun trackSearchResultsLoaded(term: String, resultCount: Int) { + disposable.add(trackSearchResultsLoadedInternal(term, resultCount).subscribe({}, { + t -> e("Search Results Loaded error: ${t.message}") + })) + } + internal fun trackSearchResultsLoadedInternal(term: String, resultCount: Int): Completable { preferenceHelper.getSessionId(sessionIncrementHandler) return dataManager.trackSearchResultsLoaded(term, resultCount, arrayOf( Constants.QueryConstants.ACTION to Constants.QueryValues.EVENT_SEARCH_RESULTS @@ -198,7 +221,12 @@ object ConstructorIo { /** * Tracks search result click events */ - fun trackSearchResultClick(itemName: String, customerId: String, searchTerm: String = Constants.QueryConstants.TERM_UNKNOWN, sectionName: String? = null, resultID: String? = null): Completable { + fun trackSearchResultClick(itemName: String, customerId: String, searchTerm: String = Constants.QueryConstants.TERM_UNKNOWN, sectionName: String? = null, resultID: String? = null) { + disposable.add(trackSearchResultClickInternal(itemName, customerId, searchTerm, sectionName, resultID).subscribe({}, { + t -> e("Search Result Click error: ${t.message}") + })) + } + internal fun trackSearchResultClickInternal(itemName: String, customerId: String, searchTerm: String = Constants.QueryConstants.TERM_UNKNOWN, sectionName: String? = null, resultID: String? = null): Completable { preferenceHelper.getSessionId(sessionIncrementHandler) val encodedParams: ArrayList> = arrayListOf() resultID?.let { encodedParams.add(Constants.QueryConstants.RESULT_ID.urlEncode() to it.urlEncode()) } @@ -212,7 +240,12 @@ object ConstructorIo { /** * Tracks conversion (a.k.a add to cart) events */ - fun trackConversion(itemName: String, customerId: String, revenue: Double?, searchTerm: String = Constants.QueryConstants.TERM_UNKNOWN, sectionName: String? = null): Completable { + fun trackConversion(itemName: String, customerId: String, revenue: Double?, searchTerm: String = Constants.QueryConstants.TERM_UNKNOWN, sectionName: String? = null) { + disposable.add(trackConversionInternal(itemName, customerId, revenue, searchTerm, sectionName).subscribe({}, { + t -> e("Conversion error: ${t.message}") + })) + } + internal fun trackConversionInternal(itemName: String, customerId: String, revenue: Double?, searchTerm: String = Constants.QueryConstants.TERM_UNKNOWN, sectionName: String? = null): Completable { preferenceHelper.getSessionId(sessionIncrementHandler) val revenueString = revenue?.let { "%.2f".format(revenue) } return dataManager.trackConversion(searchTerm, itemName, customerId, revenueString, arrayOf( @@ -223,7 +256,12 @@ object ConstructorIo { /** * Tracks purchase events */ - fun trackPurchase(clientIds: Array, revenue: Double?, orderID: String, sectionName: String? = null): Completable { + fun trackPurchase(clientIds: Array, revenue: Double?, orderID: String, sectionName: String? = null) { + disposable.add(trackPurchaseInternal(clientIds, revenue, orderID, sectionName).subscribe({}, { + t -> e("Purchase error: ${t.message}") + })) + } + internal fun trackPurchaseInternal(clientIds: Array, revenue: Double?, orderID: String, sectionName: String? = null): Completable { preferenceHelper.getSessionId(sessionIncrementHandler) val sectionNameParam = sectionName ?: preferenceHelper.defaultItemSection val revenueString = revenue?.let { "%.2f".format(revenue) } diff --git a/library/src/main/java/io/constructor/util/Extensions.kt b/library/src/main/java/io/constructor/util/Extensions.kt index 41b8cae2..43f7aa26 100755 --- a/library/src/main/java/io/constructor/util/Extensions.kt +++ b/library/src/main/java/io/constructor/util/Extensions.kt @@ -37,6 +37,8 @@ fun String.urlEncode() = URLEncoder.encode(this, "UTF-8").replace("+", "%20") fun Any.d(msg: String) = Log.d(this::class.qualifiedName, msg) +fun Any.e(msg: String) = Log.e(this::class.qualifiedName, msg) + fun String.base64Encode(): String? { return String(Base64.encode(toByteArray(), Base64.NO_WRAP or Base64.NO_PADDING)) } diff --git a/library/src/test/java/io/constructor/core/ConstructorIoTrackingTest.kt b/library/src/test/java/io/constructor/core/ConstructorIoTrackingTest.kt index 473f028d..c480fa8c 100755 --- a/library/src/test/java/io/constructor/core/ConstructorIoTrackingTest.kt +++ b/library/src/test/java/io/constructor/core/ConstructorIoTrackingTest.kt @@ -90,7 +90,7 @@ class ConstructorIoTest { fun trackInputFocus() { val mockResponse = MockResponse().setResponseCode(204) mockServer.enqueue(mockResponse) - val observer = ConstructorIo.trackInputFocus("tita").test() + 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.1.0&_dt="; @@ -101,7 +101,7 @@ class ConstructorIoTest { fun trackInputFocus500() { val mockResponse = MockResponse().setResponseCode(500).setBody("Internal server error") mockServer.enqueue(mockResponse) - val observer = ConstructorIo.trackInputFocus("tita").test() + 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.1.0&_dt="; @@ -113,7 +113,7 @@ class ConstructorIoTest { val mockResponse = MockResponse().setResponseCode(500).setBody("Internal server error") mockResponse.throttleBody(0, 5, TimeUnit.SECONDS) mockServer.enqueue(mockResponse) - val observer = ConstructorIo.trackInputFocus("tita").test() + 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.1.0&_dt="; @@ -124,7 +124,7 @@ class ConstructorIoTest { fun trackAutocompleteSelect() { val mockResponse = MockResponse().setResponseCode(204) mockServer.enqueue(mockResponse) - val observer = ConstructorIo.trackAutocompleteSelect("titanic", "tit", "Search Suggestions").test() + val observer = ConstructorIo.trackAutocompleteSelectInternal("titanic", "tit", "Search Suggestions").test() observer.assertComplete() val request = mockServer.takeRequest() val path = "/autocomplete/titanic/select?autocomplete_section=Search%20Suggestions&original_query=tit&tr=click&key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.1.0&_dt=" @@ -135,7 +135,7 @@ class ConstructorIoTest { fun trackAutocompleteSelectWithSectionAndResultID() { val mockResponse = MockResponse().setResponseCode(204) mockServer.enqueue(mockResponse) - val observer = ConstructorIo.trackAutocompleteSelect("titanic", "tit", "Search Suggestions", Group("recommended", "123123"), "2346784").test() + val observer = ConstructorIo.trackAutocompleteSelectInternal("titanic", "tit", "Search Suggestions", Group("recommended", "123123"), "2346784").test() observer.assertComplete() val request = mockServer.takeRequest() val path = "/autocomplete/titanic/select?autocomplete_section=Search%20Suggestions&original_query=tit&tr=click&group%5Bgroup_id%5D=123123&group%5Bdisplay_name%5D=recommended&result_id=2346784&key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.1.0&_dt=" @@ -146,7 +146,7 @@ class ConstructorIoTest { fun trackAutocompleteSelectWithServerError() { val mockResponse = MockResponse().setResponseCode(500).setBody("Internal server error") mockServer.enqueue(mockResponse) - val observer = ConstructorIo.trackAutocompleteSelect("titanic", "tit", "Search Suggestions").test() + val observer = ConstructorIo.trackAutocompleteSelectInternal("titanic", "tit", "Search Suggestions").test() observer.assertError { true } val request = mockServer.takeRequest() val path = "/autocomplete/titanic/select?autocomplete_section=Search%20Suggestions&original_query=tit&tr=click&key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.1.0&_dt=" @@ -158,7 +158,7 @@ class ConstructorIoTest { val mockResponse = MockResponse().setResponseCode(500).setBody("Internal server error") mockResponse.throttleBody(0, 5, TimeUnit.SECONDS) mockServer.enqueue(mockResponse) - val observer = ConstructorIo.trackAutocompleteSelect("titanic", "tit", "Search Suggestions").test() + val observer = ConstructorIo.trackAutocompleteSelectInternal("titanic", "tit", "Search Suggestions").test() observer.assertError(SocketTimeoutException::class.java) val request = mockServer.takeRequest() val path = "/autocomplete/titanic/select?autocomplete_section=Search%20Suggestions&original_query=tit&tr=click&key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.1.0&_dt=" @@ -169,7 +169,7 @@ class ConstructorIoTest { fun trackSearchSubmit() { val mockResponse = MockResponse().setResponseCode(204) mockServer.enqueue(mockResponse) - val observer = ConstructorIo.trackSearchSubmit("titanic", "tit", null).test() + 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.1.0&_dt="; @@ -180,7 +180,7 @@ class ConstructorIoTest { fun trackSearchSubmit500() { val mockResponse = MockResponse().setResponseCode(500).setBody("Internal server error") mockServer.enqueue(mockResponse) - val observer = ConstructorIo.trackSearchSubmit("titanic", "tit", null).test() + 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.1.0&_dt="; @@ -192,7 +192,7 @@ class ConstructorIoTest { val mockResponse = MockResponse().setResponseCode(500).setBody("Internal server error") mockResponse.throttleBody(0, 5, TimeUnit.SECONDS) mockServer.enqueue(mockResponse) - val observer = ConstructorIo.trackSearchSubmit("titanic", "tit", null).test() + 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.1.0&_dt="; @@ -203,7 +203,7 @@ class ConstructorIoTest { fun trackSearchResultLoaded() { val mockResponse = MockResponse().setResponseCode(204) mockServer.enqueue(mockResponse) - val observer = ConstructorIo.trackSearchResultsLoaded("titanic", 10).test() + val observer = ConstructorIo.trackSearchResultsLoadedInternal("titanic", 10).test() observer.assertComplete() val request = mockServer.takeRequest() val path = "/behavior?term=titanic&num_results=10&action=search-results&key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.1.0&_dt="; @@ -214,7 +214,7 @@ class ConstructorIoTest { fun trackSearchResultLoaded500() { val mockResponse = MockResponse().setResponseCode(500).setBody("Internal server error") mockServer.enqueue(mockResponse) - val observer = ConstructorIo.trackSearchResultsLoaded("titanic", 10).test() + val observer = ConstructorIo.trackSearchResultsLoadedInternal("titanic", 10).test() observer.assertError { true } val request = mockServer.takeRequest() val path = "/behavior?term=titanic&num_results=10&action=search-results&key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.1.0&_dt="; @@ -226,7 +226,7 @@ class ConstructorIoTest { val mockResponse = MockResponse().setResponseCode(500).setBody("Internal server error") mockResponse.throttleBody(0, 5, TimeUnit.SECONDS) mockServer.enqueue(mockResponse) - val observer = ConstructorIo.trackSearchResultsLoaded("titanic", 10).test() + val observer = ConstructorIo.trackSearchResultsLoadedInternal("titanic", 10).test() observer.assertError(SocketTimeoutException::class.java) val request = mockServer.takeRequest() val path = "/behavior?term=titanic&num_results=10&action=search-results&key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.1.0&_dt="; @@ -237,7 +237,7 @@ class ConstructorIoTest { fun trackSearchResultClick() { val mockResponse = MockResponse().setResponseCode(204) mockServer.enqueue(mockResponse) - val observer = ConstructorIo.trackSearchResultClick("titanic replica", "TIT-REP-1997", "titanic").test() + val observer = ConstructorIo.trackSearchResultClickInternal("titanic replica", "TIT-REP-1997", "titanic").test() observer.assertComplete() val request = mockServer.takeRequest() val path = "/autocomplete/titanic/click_through?name=titanic%20replica&customer_id=TIT-REP-1997&autocomplete_section=Products&key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.1.0&_dt="; @@ -248,7 +248,7 @@ class ConstructorIoTest { fun trackSearchResultClickWithSectionAndResultID() { val mockResponse = MockResponse().setResponseCode(204) mockServer.enqueue(mockResponse) - val observer = ConstructorIo.trackSearchResultClick("titanic replica", "TIT-REP-1997", "titanic", "Products","3467632").test() + val observer = ConstructorIo.trackSearchResultClickInternal("titanic replica", "TIT-REP-1997", "titanic", "Products","3467632").test() observer.assertComplete() val request = mockServer.takeRequest() val path = "/autocomplete/titanic/click_through?name=titanic%20replica&customer_id=TIT-REP-1997&autocomplete_section=Products&result_id=3467632&key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.1.0&_dt="; @@ -259,7 +259,7 @@ class ConstructorIoTest { fun trackSearchResultClick500() { val mockResponse = MockResponse().setResponseCode(500).setBody("Internal server error") mockServer.enqueue(mockResponse) - val observer = ConstructorIo.trackSearchResultClick("titanic replica", "TIT-REP-1997", "titanic").test() + val observer = ConstructorIo.trackSearchResultClickInternal("titanic replica", "TIT-REP-1997", "titanic").test() observer.assertError { true } val request = mockServer.takeRequest() val path = "/autocomplete/titanic/click_through?name=titanic%20replica&customer_id=TIT-REP-1997&autocomplete_section=Products&key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.1.0&_dt="; @@ -271,7 +271,7 @@ class ConstructorIoTest { val mockResponse = MockResponse().setResponseCode(500).setBody("Internal server error") mockResponse.throttleBody(0, 5, TimeUnit.SECONDS) mockServer.enqueue(mockResponse) - val observer = ConstructorIo.trackSearchResultClick("titanic replica", "TIT-REP-1997", "titanic").test() + val observer = ConstructorIo.trackSearchResultClickInternal("titanic replica", "TIT-REP-1997", "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&autocomplete_section=Products&key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.1.0&_dt="; @@ -282,7 +282,7 @@ class ConstructorIoTest { fun trackConversion() { val mockResponse = MockResponse().setResponseCode(204) mockServer.enqueue(mockResponse) - val observer = ConstructorIo.trackConversion("titanic replica", "TIT-REP-1997", 89.00).test() + val observer = ConstructorIo.trackConversionInternal("titanic replica", "TIT-REP-1997", 89.00).test() observer.assertComplete() val request = mockServer.takeRequest() val path = "/autocomplete/TERM_UNKNOWN/conversion?name=titanic%20replica&customer_id=TIT-REP-1997&revenue=89.00&autocomplete_section=Products&key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.1.0&_dt="; @@ -293,7 +293,7 @@ class ConstructorIoTest { fun trackConversion500() { val mockResponse = MockResponse().setResponseCode(500).setBody("Internal server error") mockServer.enqueue(mockResponse) - val observer = ConstructorIo.trackConversion("titanic replica", "TIT-REP-1997", 89.00).test() + val observer = ConstructorIo.trackConversionInternal("titanic replica", "TIT-REP-1997", 89.00).test() observer.assertError { true } val request = mockServer.takeRequest() val path = "/autocomplete/TERM_UNKNOWN/conversion?name=titanic%20replica&customer_id=TIT-REP-1997&revenue=89.00&autocomplete_section=Products&key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.1.0&_dt="; @@ -305,7 +305,7 @@ class ConstructorIoTest { val mockResponse = MockResponse().setResponseCode(500).setBody("Internal server error") mockResponse.throttleBody(0, 5, TimeUnit.SECONDS) mockServer.enqueue(mockResponse) - val observer = ConstructorIo.trackConversion("titanic replica", "TIT-REP-1997", 89.00).test() + val observer = ConstructorIo.trackConversionInternal("titanic replica", "TIT-REP-1997", 89.00).test() observer.assertError(SocketTimeoutException::class.java) val request = mockServer.takeRequest() val path = "/autocomplete/TERM_UNKNOWN/conversion?name=titanic%20replica&customer_id=TIT-REP-1997&revenue=89.00&autocomplete_section=Products&key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.1.0&_dt="; @@ -316,7 +316,7 @@ class ConstructorIoTest { fun trackPurchase() { val mockResponse = MockResponse().setResponseCode(204) mockServer.enqueue(mockResponse) - val observer = ConstructorIo.trackPurchase(arrayOf("TIT-REP-1997", "QE2-REP-1969"), 12.99, "ORD-1312343").test() + val observer = ConstructorIo.trackPurchaseInternal(arrayOf("TIT-REP-1997", "QE2-REP-1969"), 12.99, "ORD-1312343").test() observer.assertComplete() val request = mockServer.takeRequest() val path = "/autocomplete/TERM_UNKNOWN/purchase?customer_ids=TIT-REP-1997&customer_ids=QE2-REP-1969&revenue=12.99&order_id=ORD-1312343&autocomplete_section=Products&key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.1.0&_dt="; @@ -327,7 +327,7 @@ class ConstructorIoTest { fun trackPurchase500() { val mockResponse = MockResponse().setResponseCode(500).setBody("Internal server error") mockServer.enqueue(mockResponse) - val observer = ConstructorIo.trackPurchase(arrayOf("TIT-REP-1997", "QE2-REP-1969"), 12.99, "ORD-1312343").test() + val observer = ConstructorIo.trackPurchaseInternal(arrayOf("TIT-REP-1997", "QE2-REP-1969"), 12.99, "ORD-1312343").test() observer.assertError { true } val request = mockServer.takeRequest() val path = "/autocomplete/TERM_UNKNOWN/purchase?customer_ids=TIT-REP-1997&customer_ids=QE2-REP-1969&revenue=12.99&order_id=ORD-1312343&autocomplete_section=Products&key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.1.0&_dt="; @@ -339,7 +339,7 @@ class ConstructorIoTest { val mockResponse = MockResponse().setResponseCode(500).setBody("Internal server error") mockResponse.throttleBody(0, 5, TimeUnit.SECONDS) mockServer.enqueue(mockResponse) - val observer = ConstructorIo.trackPurchase(arrayOf("TIT-REP-1997", "QE2-REP-1969"), 12.99,"ORD-1312343").test() + val observer = ConstructorIo.trackPurchaseInternal(arrayOf("TIT-REP-1997", "QE2-REP-1969"), 12.99,"ORD-1312343").test() observer.assertError(SocketTimeoutException::class.java) val request = mockServer.takeRequest() val path = "/autocomplete/TERM_UNKNOWN/purchase?customer_ids=TIT-REP-1997&customer_ids=QE2-REP-1969&revenue=12.99&order_id=ORD-1312343&autocomplete_section=Products&key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.1.0&_dt="; @@ -350,7 +350,7 @@ class ConstructorIoTest { fun trackPurchaseWithSection() { val mockResponse = MockResponse().setResponseCode(204) mockServer.enqueue(mockResponse) - val observer = ConstructorIo.trackPurchase(arrayOf("TIT-REP-1997", "QE2-REP-1969"), 12.99, "ORD-1312343", "Recommendations").test() + val observer = ConstructorIo.trackPurchaseInternal(arrayOf("TIT-REP-1997", "QE2-REP-1969"), 12.99, "ORD-1312343", "Recommendations").test() observer.assertComplete() val request = mockServer.takeRequest() val path = "/autocomplete/TERM_UNKNOWN/purchase?customer_ids=TIT-REP-1997&customer_ids=QE2-REP-1969&revenue=12.99&order_id=ORD-1312343&autocomplete_section=Recommendations&key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.1.0&_dt="; diff --git a/library/src/test/java/io/constructor/core/ConstructorioTestCellTest.kt b/library/src/test/java/io/constructor/core/ConstructorioTestCellTest.kt index ba75d470..527028c2 100644 --- a/library/src/test/java/io/constructor/core/ConstructorioTestCellTest.kt +++ b/library/src/test/java/io/constructor/core/ConstructorioTestCellTest.kt @@ -79,7 +79,7 @@ class ConstructorioTestCellTest { fun trackInputFocus() { val mockResponse = MockResponse().setResponseCode(204) mockServer.enqueue(mockResponse) - val observer = ConstructorIo.trackInputFocus("tita").test() + 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.1.0&_dt="; @@ -90,7 +90,7 @@ class ConstructorioTestCellTest { fun trackAutocompleteSelect() { val mockResponse = MockResponse().setResponseCode(204) mockServer.enqueue(mockResponse) - val observer = ConstructorIo.trackAutocompleteSelect("titanic", "tit", "Search Suggestions").test() + val observer = ConstructorIo.trackAutocompleteSelectInternal("titanic", "tit", "Search Suggestions").test() observer.assertComplete() val request = mockServer.takeRequest() val path = "/autocomplete/titanic/select?autocomplete_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.1.0&_dt=" @@ -101,7 +101,7 @@ class ConstructorioTestCellTest { fun trackSearchSubmit() { val mockResponse = MockResponse().setResponseCode(204) mockServer.enqueue(mockResponse) - val observer = ConstructorIo.trackSearchSubmit("titanic", "tit", null).test() + 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.1.0&_dt="; @@ -112,7 +112,7 @@ class ConstructorioTestCellTest { fun trackSearchResultLoaded() { val mockResponse = MockResponse().setResponseCode(204) mockServer.enqueue(mockResponse) - val observer = ConstructorIo.trackSearchResultsLoaded("titanic", 10).test() + val observer = ConstructorIo.trackSearchResultsLoadedInternal("titanic", 10).test() observer.assertComplete() val request = mockServer.takeRequest() val path = "/behavior?term=titanic&num_results=10&action=search-results&key=aluminium-key&i=koopa-the-guid&ui=player-two&s=14&ef-cellone=vanilla&ef-celltwo=whipped-cream&c=cioand-2.1.0&_dt="; @@ -123,7 +123,7 @@ class ConstructorioTestCellTest { fun trackSearchResultClick() { val mockResponse = MockResponse().setResponseCode(204) mockServer.enqueue(mockResponse) - val observer = ConstructorIo.trackSearchResultClick("titanic replica", "TIT-REP-1997", "titanic").test() + val observer = ConstructorIo.trackSearchResultClickInternal("titanic replica", "TIT-REP-1997", "titanic").test() observer.assertComplete() val request = mockServer.takeRequest() val path = "/autocomplete/titanic/click_through?name=titanic%20replica&customer_id=TIT-REP-1997&autocomplete_section=Products&key=aluminium-key&i=koopa-the-guid&ui=player-two&s=14&ef-cellone=vanilla&ef-celltwo=whipped-cream&c=cioand-2.1.0&_dt="; @@ -134,7 +134,7 @@ class ConstructorioTestCellTest { fun trackConversion() { val mockResponse = MockResponse().setResponseCode(204) mockServer.enqueue(mockResponse) - val observer = ConstructorIo.trackConversion("titanic replica", "TIT-REP-1997", 89.00).test() + val observer = ConstructorIo.trackConversionInternal("titanic replica", "TIT-REP-1997", 89.00).test() observer.assertComplete() val request = mockServer.takeRequest() val path = "/autocomplete/TERM_UNKNOWN/conversion?name=titanic%20replica&customer_id=TIT-REP-1997&revenue=89.00&autocomplete_section=Products&key=aluminium-key&i=koopa-the-guid&ui=player-two&s=14&ef-cellone=vanilla&ef-celltwo=whipped-cream&c=cioand-2.1.0&_dt="; @@ -145,7 +145,7 @@ class ConstructorioTestCellTest { fun trackPurchase() { val mockResponse = MockResponse().setResponseCode(204) mockServer.enqueue(mockResponse) - val observer = ConstructorIo.trackPurchase(arrayOf("TIT-REP-1997", "QE2-REP-1969"), 12.99, "ORD-1312343").test() + val observer = ConstructorIo.trackPurchaseInternal(arrayOf("TIT-REP-1997", "QE2-REP-1969"), 12.99, "ORD-1312343").test() observer.assertComplete() val request = mockServer.takeRequest() val path = "/autocomplete/TERM_UNKNOWN/purchase?customer_ids=TIT-REP-1997&customer_ids=QE2-REP-1969&revenue=12.99&order_id=ORD-1312343&autocomplete_section=Products&key=aluminium-key&i=koopa-the-guid&ui=player-two&s=14&ef-cellone=vanilla&ef-celltwo=whipped-cream&c=cioand-2.1.0&_dt="; From 533ffc44ecca205201eb62f34803e21d38d504f2 Mon Sep 17 00:00:00 2001 From: Zubin Tiku Date: Tue, 7 Jul 2020 11:53:35 -0400 Subject: [PATCH 2/3] Updated code --- .../java/io/constructor/core/ConstructorIo.kt | 47 ++++++++----------- 1 file changed, 20 insertions(+), 27 deletions(-) diff --git a/library/src/main/java/io/constructor/core/ConstructorIo.kt b/library/src/main/java/io/constructor/core/ConstructorIo.kt index 1f928526..ccaaf6b7 100755 --- a/library/src/main/java/io/constructor/core/ConstructorIo.kt +++ b/library/src/main/java/io/constructor/core/ConstructorIo.kt @@ -31,7 +31,6 @@ object ConstructorIo { private lateinit var preferenceHelper: PreferencesHelper private lateinit var configMemoryHolder: ConfigMemoryHolder private lateinit var context: Context - private var broadcast = true private var disposable = CompositeDisposable() var userId: String? @@ -87,7 +86,6 @@ object ConstructorIo { this.dataManager = dataManager this.preferenceHelper = preferenceHelper this.configMemoryHolder = configMemoryHolder - this.broadcast = false } fun appMovedToForeground() { @@ -136,7 +134,8 @@ object ConstructorIo { * Tracks input focus events */ fun trackInputFocus(term: String?) { - disposable.add(trackInputFocusInternal(term).subscribe({}, { + var completable = trackInputFocusInternal(term) + disposable.add(completable.subscribeOn(Schedulers.io()).subscribe({}, { t -> e("Input Focus event error: ${t.message}") })) } @@ -151,7 +150,10 @@ object ConstructorIo { * Tracks autocomplete select events */ fun trackAutocompleteSelect(searchTerm: String, originalQuery: String, sectionName: String, group: Group? = null, resultID: String? = null) { - disposable.add(trackAutocompleteSelectInternal(searchTerm, originalQuery, sectionName, group, resultID).subscribe({}, { + var completable = trackAutocompleteSelectInternal(searchTerm, originalQuery, sectionName, group, resultID); + disposable.add(completable.subscribeOn(Schedulers.io()).subscribe({ + context.broadcastIntent(Constants.EVENT_QUERY_SENT, Constants.EXTRA_TERM to searchTerm) + }, { t -> e("Autocomplete Select error: ${t.message}") })) } @@ -161,26 +163,21 @@ object ConstructorIo { group?.groupId?.let { encodedParams.add(Constants.QueryConstants.GROUP_ID.urlEncode() to it) } group?.displayName?.let { encodedParams.add(Constants.QueryConstants.GROUP_DISPLAY_NAME.urlEncode() to it.urlEncode()) } resultID?.let { encodedParams.add(Constants.QueryConstants.RESULT_ID.urlEncode() to it.urlEncode()) } - val completable = dataManager.trackAutocompleteSelect(searchTerm, arrayOf( + return dataManager.trackAutocompleteSelect(searchTerm, arrayOf( Constants.QueryConstants.AUTOCOMPLETE_SECTION to sectionName, Constants.QueryConstants.ORIGINAL_QUERY to originalQuery, Constants.QueryConstants.EVENT to Constants.QueryValues.EVENT_CLICK ), encodedParams.toTypedArray()).subscribeOn(Schedulers.io()) - - if (this.broadcast) { - completable.subscribeOn(Schedulers.io()).subscribe { - context.broadcastIntent(Constants.EVENT_QUERY_SENT, Constants.EXTRA_TERM to searchTerm) - } - } - - return completable } /** * Tracks search submit events */ fun trackSearchSubmit(searchTerm: String, originalQuery: String, group: Group?) { - disposable.add(trackSearchSubmitInternal(searchTerm, originalQuery, group).subscribe({}, { + var completable = trackSearchSubmitInternal(searchTerm, originalQuery, group) + disposable.add(completable.subscribeOn(Schedulers.io()).subscribe({ + context.broadcastIntent(Constants.EVENT_QUERY_SENT, Constants.EXTRA_TERM to searchTerm) + }, { t -> e("Search Submit error: ${t.message}") })) } @@ -189,25 +186,18 @@ object ConstructorIo { val encodedParams: ArrayList> = arrayListOf() group?.groupId?.let { encodedParams.add(Constants.QueryConstants.GROUP_ID.urlEncode() to it) } group?.displayName?.let { encodedParams.add(Constants.QueryConstants.GROUP_DISPLAY_NAME.urlEncode() to it.urlEncode()) } - val completable = dataManager.trackSearchSubmit(searchTerm, arrayOf( + return dataManager.trackSearchSubmit(searchTerm, arrayOf( Constants.QueryConstants.ORIGINAL_QUERY to originalQuery, Constants.QueryConstants.EVENT to Constants.QueryValues.EVENT_SEARCH ), encodedParams.toTypedArray()) - - if (this.broadcast) { - completable.subscribeOn(Schedulers.io()).subscribe { - context.broadcastIntent(Constants.EVENT_QUERY_SENT, Constants.EXTRA_TERM to searchTerm) - } - } - - return completable } /** * Tracks search results loaded (a.k.a. search results viewed) events */ fun trackSearchResultsLoaded(term: String, resultCount: Int) { - disposable.add(trackSearchResultsLoadedInternal(term, resultCount).subscribe({}, { + var completable = trackSearchResultsLoadedInternal(term, resultCount) + disposable.add(completable.subscribeOn(Schedulers.io()).subscribe({}, { t -> e("Search Results Loaded error: ${t.message}") })) } @@ -222,7 +212,8 @@ object ConstructorIo { * Tracks search result click events */ fun trackSearchResultClick(itemName: String, customerId: String, searchTerm: String = Constants.QueryConstants.TERM_UNKNOWN, sectionName: String? = null, resultID: String? = null) { - disposable.add(trackSearchResultClickInternal(itemName, customerId, searchTerm, sectionName, resultID).subscribe({}, { + var completable = trackSearchResultClickInternal(itemName, customerId, searchTerm, sectionName, resultID) + disposable.add(completable.subscribeOn(Schedulers.io()).subscribe({}, { t -> e("Search Result Click error: ${t.message}") })) } @@ -241,7 +232,8 @@ object ConstructorIo { * Tracks conversion (a.k.a add to cart) events */ fun trackConversion(itemName: String, customerId: String, revenue: Double?, searchTerm: String = Constants.QueryConstants.TERM_UNKNOWN, sectionName: String? = null) { - disposable.add(trackConversionInternal(itemName, customerId, revenue, searchTerm, sectionName).subscribe({}, { + var completable = trackConversionInternal(itemName, customerId, revenue, searchTerm, sectionName) + disposable.add(completable.subscribeOn(Schedulers.io()).subscribe({}, { t -> e("Conversion error: ${t.message}") })) } @@ -257,7 +249,8 @@ object ConstructorIo { * Tracks purchase events */ fun trackPurchase(clientIds: Array, revenue: Double?, orderID: String, sectionName: String? = null) { - disposable.add(trackPurchaseInternal(clientIds, revenue, orderID, sectionName).subscribe({}, { + var completable = trackPurchaseInternal(clientIds, revenue, orderID, sectionName) + disposable.add(completable.subscribeOn(Schedulers.io()).subscribe({}, { t -> e("Purchase error: ${t.message}") })) } From da7c2700fec0f2abe34f483862ea83fa15e71b55 Mon Sep 17 00:00:00 2001 From: Zubin Tiku Date: Tue, 7 Jul 2020 12:00:11 -0400 Subject: [PATCH 3/3] Updates --- .../main/java/io/constructor/core/ConstructorIo.kt | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/library/src/main/java/io/constructor/core/ConstructorIo.kt b/library/src/main/java/io/constructor/core/ConstructorIo.kt index ccaaf6b7..4ee74c39 100755 --- a/library/src/main/java/io/constructor/core/ConstructorIo.kt +++ b/library/src/main/java/io/constructor/core/ConstructorIo.kt @@ -47,7 +47,7 @@ object ConstructorIo { } private var sessionIncrementHandler: (String) -> Unit = { - trackSessionStartInternal() + trackSessionStart() } fun init(context: Context?, constructorIoConfig: ConstructorIoConfig) { @@ -122,8 +122,14 @@ object ConstructorIo { } /** - * Tracks Session Start Events + * Tracks session start events */ + private fun trackSessionStart() { + var completable = trackSessionStartInternal() + disposable.add(completable.subscribeOn(Schedulers.io()).subscribe({}, { + t -> e("Session Start event error: ${t.message}") + })) + } internal fun trackSessionStartInternal (): Completable { return dataManager.trackSessionStart( arrayOf(Constants.QueryConstants.ACTION to Constants.QueryValues.EVENT_SESSION_START) @@ -167,7 +173,7 @@ object ConstructorIo { Constants.QueryConstants.AUTOCOMPLETE_SECTION to sectionName, Constants.QueryConstants.ORIGINAL_QUERY to originalQuery, Constants.QueryConstants.EVENT to Constants.QueryValues.EVENT_CLICK - ), encodedParams.toTypedArray()).subscribeOn(Schedulers.io()) + ), encodedParams.toTypedArray()) } /** @@ -261,5 +267,4 @@ object ConstructorIo { val params = mutableListOf(Constants.QueryConstants.AUTOCOMPLETE_SECTION to sectionNameParam) return dataManager.trackPurchase(clientIds.toList(), revenueString, orderID, params.toTypedArray()) } - } \ No newline at end of file