From 28eeec59b3545084d87d7fc03356f01d2f29a2db Mon Sep 17 00:00:00 2001 From: qbasso Date: Wed, 24 Oct 2018 08:25:58 +0200 Subject: [PATCH 1/2] added config object --- .../java/io/constructor/core/ConstructorIo.kt | 23 ++++++------------- .../constructor/core/ConstructorIoConfig.kt | 8 +++++++ .../io/constructor/core/ConstructorIoTest.kt | 5 ++-- .../java/io/constructor/sample/SampleApp.kt | 3 ++- 4 files changed, 19 insertions(+), 20 deletions(-) create mode 100644 library/src/main/java/io/constructor/core/ConstructorIoConfig.kt diff --git a/library/src/main/java/io/constructor/core/ConstructorIo.kt b/library/src/main/java/io/constructor/core/ConstructorIo.kt index 605c8e41..b349af39 100755 --- a/library/src/main/java/io/constructor/core/ConstructorIo.kt +++ b/library/src/main/java/io/constructor/core/ConstructorIo.kt @@ -2,7 +2,6 @@ package io.constructor.core import android.annotation.SuppressLint import android.content.Context -import io.constructor.BuildConfig import io.constructor.data.DataManager import io.constructor.data.local.PreferencesHelper import io.constructor.data.memory.ConfigMemoryHolder @@ -49,8 +48,7 @@ object ConstructorIo { })) } - fun init(context: Context?, apiKey: String, autocompleteResultCount: Map = mapOf(Constants.QueryValues.SEARCH_SUGGESTIONS to 10, - Constants.QueryValues.PRODUCTS to 0), defaultItemSection: String = BuildConfig.AUTOCOMPLETE_SECTION) { + fun init(context: Context?, constructorIoConfig: ConstructorIoConfig) { if (context == null) { throw IllegalStateException("context is null, please init library using ConstructorIo.with(context)") } @@ -58,10 +56,11 @@ object ConstructorIo { dataManager = component.dataManager() preferenceHelper = component.preferenceHelper() configMemoryHolder = component.configMemoryHolder() - configMemoryHolder.autocompleteResultCount = autocompleteResultCount - preferenceHelper.token = apiKey + configMemoryHolder.autocompleteResultCount = constructorIoConfig.autocompleteResultCount + configMemoryHolder.testCellParams = constructorIoConfig.testCells + preferenceHelper.token = constructorIoConfig.apiKey - preferenceHelper.defaultItemSection = defaultItemSection + preferenceHelper.defaultItemSection = constructorIoConfig.defaultItemSection if (preferenceHelper.id.isBlank()) { preferenceHelper.id = UUID.randomUUID().toString() } @@ -71,15 +70,7 @@ object ConstructorIo { fun getClientId() = preferenceHelper.id - fun setTestCellValues(pair1: Pair, pair2: Pair? = null, pair3: Pair? = null) { - configMemoryHolder.testCellParams = listOf(pair1, pair2, pair3) - } - - fun clearTestCellValues() { - configMemoryHolder.testCellParams = emptyList() - } - - internal fun testInit(context: Context?, apiKey: String, dataManager: DataManager, preferenceHelper: PreferencesHelper, configMemoryHolder: ConfigMemoryHolder) { + internal fun testInit(context: Context?, constructorIoConfig: ConstructorIoConfig, dataManager: DataManager, preferenceHelper: PreferencesHelper, configMemoryHolder: ConfigMemoryHolder) { if (context == null) { throw IllegalStateException("Context is null, please init library using ConstructorIo.with(context)") } @@ -87,7 +78,7 @@ object ConstructorIo { this.dataManager = dataManager this.preferenceHelper = preferenceHelper this.configMemoryHolder = configMemoryHolder - preferenceHelper.token = apiKey + preferenceHelper.token = constructorIoConfig.apiKey if (preferenceHelper.id.isBlank()) { preferenceHelper.id = UUID.randomUUID().toString() } diff --git a/library/src/main/java/io/constructor/core/ConstructorIoConfig.kt b/library/src/main/java/io/constructor/core/ConstructorIoConfig.kt new file mode 100644 index 00000000..61356839 --- /dev/null +++ b/library/src/main/java/io/constructor/core/ConstructorIoConfig.kt @@ -0,0 +1,8 @@ +package io.constructor.core + +import io.constructor.BuildConfig + +data class ConstructorIoConfig(val apiKey: String, + val autocompleteResultCount: Map = mapOf(Constants.QueryValues.SEARCH_SUGGESTIONS to 10, Constants.QueryValues.PRODUCTS to 0), + val defaultItemSection: String = BuildConfig.AUTOCOMPLETE_SECTION, + val testCells: List> = emptyList()) \ No newline at end of file diff --git a/library/src/test/java/io/constructor/core/ConstructorIoTest.kt b/library/src/test/java/io/constructor/core/ConstructorIoTest.kt index c0a0795f..bdcb2efb 100755 --- a/library/src/test/java/io/constructor/core/ConstructorIoTest.kt +++ b/library/src/test/java/io/constructor/core/ConstructorIoTest.kt @@ -44,7 +44,8 @@ class ConstructorIoTest { every { pref.id } returns "1" every { pref.getSessionId() } returns 1 every { pref.getSessionId(any()) } returns 1 - constructorIo.testInit(ctx, "dummyKey", data, pref, configMemoryHolder) + constructorIo.testInit(ctx, ConstructorIoConfig("dummyKey", + testCells = listOf("1" to "2", "3" to "4")), data, pref, configMemoryHolder) } @After @@ -213,8 +214,6 @@ class ConstructorIoTest { every { configMemoryHolder.testCellParams = any() } just Runs every { configMemoryHolder.autocompleteResultCount } returns mapOf(Constants.QueryValues.SEARCH_SUGGESTIONS to 10, Constants.QueryValues.PRODUCTS to 0) every { configMemoryHolder.testCellParams } returns listOf("ef-1" to "2", "ef-3" to "4") - constructorIo.setTestCellValues("1" to "2", "3" to "4") - verify(exactly = 1) { configMemoryHolder.testCellParams = any() } mockServer.start() mockServer.enqueue(MockResponse()) var client = OkHttpClient.Builder().addInterceptor(TokenInterceptor(ctx, pref, configMemoryHolder)).build() diff --git a/sample/src/main/java/io/constructor/sample/SampleApp.kt b/sample/src/main/java/io/constructor/sample/SampleApp.kt index 724ff37b..599d6171 100755 --- a/sample/src/main/java/io/constructor/sample/SampleApp.kt +++ b/sample/src/main/java/io/constructor/sample/SampleApp.kt @@ -2,12 +2,13 @@ package io.constructor.sample import android.app.Application import io.constructor.core.ConstructorIo +import io.constructor.core.ConstructorIoConfig class SampleApp : Application() { override fun onCreate() { super.onCreate() - ConstructorIo.init(this, "key_OucJxxrfiTVUQx0C") + ConstructorIo.init(this, ConstructorIoConfig("key_OucJxxrfiTVUQx0C")) ConstructorIo.setTestCellValues("ab" to "cd", "11" to "22") } } \ No newline at end of file From 00ba809ed13cc028c6795ee6889850090d4e0ef7 Mon Sep 17 00:00:00 2001 From: qbasso Date: Fri, 26 Oct 2018 13:22:45 +0200 Subject: [PATCH 2/2] use autocomplete result limits only in autocomplete calls --- .../main/java/io/constructor/core/ConstructorIo.kt | 11 ++++++++++- .../src/main/java/io/constructor/data/DataManager.kt | 2 +- .../constructor/data/interceptor/TokenInterceptor.kt | 3 --- .../java/io/constructor/data/remote/ConstructorApi.kt | 2 +- .../test/java/io/constructor/data/DataManagerTest.kt | 11 ++++++----- .../src/main/java/io/constructor/sample/SampleApp.kt | 4 ++-- 6 files changed, 20 insertions(+), 13 deletions(-) diff --git a/library/src/main/java/io/constructor/core/ConstructorIo.kt b/library/src/main/java/io/constructor/core/ConstructorIo.kt index b349af39..44e98f21 100755 --- a/library/src/main/java/io/constructor/core/ConstructorIo.kt +++ b/library/src/main/java/io/constructor/core/ConstructorIo.kt @@ -2,9 +2,11 @@ package io.constructor.core import android.annotation.SuppressLint import android.content.Context +import io.constructor.data.ConstructorData import io.constructor.data.DataManager import io.constructor.data.local.PreferencesHelper import io.constructor.data.memory.ConfigMemoryHolder +import io.constructor.data.model.Suggestion import io.constructor.data.model.SuggestionViewModel import io.constructor.injection.component.AppComponent import io.constructor.injection.component.DaggerAppComponent @@ -14,6 +16,7 @@ import io.constructor.util.broadcastIntent import io.constructor.util.d import io.constructor.util.e import io.constructor.util.urlEncode +import io.reactivex.Observable import io.reactivex.disposables.CompositeDisposable import io.reactivex.schedulers.Schedulers import java.util.* @@ -84,7 +87,13 @@ object ConstructorIo { } } - fun getAutocompleteResults(query: String) = dataManager.getAutocompleteResults(query) + fun getAutocompleteResults(query: String): Observable?>> { + val params = mutableListOf>() + configMemoryHolder.autocompleteResultCount?.entries?.forEach { + params.add(Pair(Constants.QueryConstants.NUM_RESULTS+it.key, it.value.toString())) + } + return dataManager.getAutocompleteResults(query, params.toTypedArray()) + } fun trackSelect(query: String, suggestion: SuggestionViewModel, errorCallback: ConstructorError = null) { val sessionId = preferenceHelper.getSessionId(sessionIncrementEventHandler) diff --git a/library/src/main/java/io/constructor/data/DataManager.kt b/library/src/main/java/io/constructor/data/DataManager.kt index 947f2bb0..69836bca 100755 --- a/library/src/main/java/io/constructor/data/DataManager.kt +++ b/library/src/main/java/io/constructor/data/DataManager.kt @@ -11,7 +11,7 @@ import javax.inject.Singleton class DataManager @Inject constructor(private val constructorApi: ConstructorApi) { - fun getAutocompleteResults(text: String): Observable?>> = constructorApi.getSuggestions(text).map { + fun getAutocompleteResults(text: String, params: Array> = arrayOf()): Observable?>> = constructorApi.getSuggestions(text, params.toMap()).map { if (!it.isError) { it.response()?.let { if (it.isSuccessful) { diff --git a/library/src/main/java/io/constructor/data/interceptor/TokenInterceptor.kt b/library/src/main/java/io/constructor/data/interceptor/TokenInterceptor.kt index 584c02e1..469af45f 100755 --- a/library/src/main/java/io/constructor/data/interceptor/TokenInterceptor.kt +++ b/library/src/main/java/io/constructor/data/interceptor/TokenInterceptor.kt @@ -23,9 +23,6 @@ class TokenInterceptor(val context: Context, private val preferencesHelper: Pref builder.addQueryParameter(it.first, it.second) } } - configMemoryHolder.autocompleteResultCount?.entries?.forEach { - builder.addQueryParameter(Constants.QueryConstants.NUM_RESULTS+it.key, it.value.toString()) - } val url = builder.build() request = request.newBuilder().url(url).build() return chain.proceed(request) diff --git a/library/src/main/java/io/constructor/data/remote/ConstructorApi.kt b/library/src/main/java/io/constructor/data/remote/ConstructorApi.kt index b3ccb8a6..bf4df469 100755 --- a/library/src/main/java/io/constructor/data/remote/ConstructorApi.kt +++ b/library/src/main/java/io/constructor/data/remote/ConstructorApi.kt @@ -12,7 +12,7 @@ import retrofit2.http.QueryMap interface ConstructorApi { @GET(ApiPaths.URL_GET_SUGGESTIONS) - fun getSuggestions(@Path("value") value: String): Single> + fun getSuggestions(@Path("value") value: String, @QueryMap data: Map): Single> @GET(ApiPaths.URL_SELECT_EVENT) fun trackSelect(@Path("term") term: String, @QueryMap data: Map, @QueryMap(encoded = true) encodedData: Map): Completable diff --git a/library/src/test/java/io/constructor/data/DataManagerTest.kt b/library/src/test/java/io/constructor/data/DataManagerTest.kt index 530efc43..9cf58c93 100755 --- a/library/src/test/java/io/constructor/data/DataManagerTest.kt +++ b/library/src/test/java/io/constructor/data/DataManagerTest.kt @@ -27,7 +27,7 @@ class DataManagerTest { @Test fun getSuggestions() { - every { constructorApi.getSuggestions("titanic") } returns Single.just(Result.response(Response.success(TestDataLoader.loadResponse()))) + every { constructorApi.getSuggestions("titanic", any()) } returns Single.just(Result.response(Response.success(TestDataLoader.loadResponse()))) val observer = dataManager.getAutocompleteResults("titanic").test() observer.assertComplete().assertValue { it.get()!!.isNotEmpty() && it.get()!!.size == 5 @@ -36,7 +36,7 @@ class DataManagerTest { @Test fun getSuggestionsBadServerResponse() { - every { constructorApi.getSuggestions("titanic") } returns Single.just(Result.response(Response.error(500, ResponseBody.create(MediaType.parse("text/plain"), "Error")))) + every { constructorApi.getSuggestions("titanic", any()) } returns Single.just(Result.response(Response.error(500, ResponseBody.create(MediaType.parse("text/plain"), "Error")))) val observer = dataManager.getAutocompleteResults("titanic").test() observer.assertComplete().assertValue { it.networkError @@ -45,7 +45,7 @@ class DataManagerTest { @Test fun getSuggestionsException() { - every { constructorApi.getSuggestions("titanic") } returns Single.just(Result.error(Exception())) + every { constructorApi.getSuggestions("titanic", any()) } returns Single.just(Result.error(Exception())) val observer = dataManager.getAutocompleteResults("titanic").test() observer.assertComplete().assertValue { it.isError @@ -54,7 +54,7 @@ class DataManagerTest { @Test fun getSuggestionsUnexpectedDataResponse() { - every { constructorApi.getSuggestions("titanic") } returns Single.just(Result.response(Response.success(TestDataLoader.loadResponseWithUnexpectedData()))) + every { constructorApi.getSuggestions("titanic", any()) } returns Single.just(Result.response(Response.success(TestDataLoader.loadResponseWithUnexpectedData()))) val observer = dataManager.getAutocompleteResults("titanic").test() observer.assertComplete().assertValue { it.get()!!.isNotEmpty() && it.get()!!.size == 5 @@ -63,7 +63,8 @@ class DataManagerTest { @Test fun getSuggestionsEmptyResponse() { - every { constructorApi.getSuggestions("titanic") } returns Single.just(Result.response(Response.success(TestDataLoader.loadEmptyResponse()))) + every { constructorApi.getSuggestions("titanic", any() + ) } returns Single.just(Result.response(Response.success(TestDataLoader.loadEmptyResponse()))) val observer = dataManager.getAutocompleteResults("titanic").test() observer.assertComplete().assertValue { it.isEmpty diff --git a/sample/src/main/java/io/constructor/sample/SampleApp.kt b/sample/src/main/java/io/constructor/sample/SampleApp.kt index 599d6171..5bfacc5c 100755 --- a/sample/src/main/java/io/constructor/sample/SampleApp.kt +++ b/sample/src/main/java/io/constructor/sample/SampleApp.kt @@ -8,7 +8,7 @@ class SampleApp : Application() { override fun onCreate() { super.onCreate() - ConstructorIo.init(this, ConstructorIoConfig("key_OucJxxrfiTVUQx0C")) - ConstructorIo.setTestCellValues("ab" to "cd", "11" to "22") + ConstructorIo.init(this, ConstructorIoConfig("key_OucJxxrfiTVUQx0C", + testCells = listOf("ab" to "cd", "11" to "22"))) } } \ No newline at end of file