Skip to content

Commit 10b7298

Browse files
crgee1rubikzube
andauthored
[CH12120] Change Method to POST (#54)
* Change method to POST * browse timeout tests do not timeout and still need to be fixed * Update tests * Lint * Update tests * PR comment revisions * Add params to request body * Lint * Create browsebody in constructorio.kt * Tweaks Co-authored-by: Zubin Tiku <[email protected]>
1 parent 1f79f3b commit 10b7298

File tree

7 files changed

+128
-32
lines changed

7 files changed

+128
-32
lines changed

library/src/main/java/io/constructor/core/Constants.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,10 @@ class Constants {
3535
const val FILTER_GROUP_ID = "filters[group_id]"
3636
const val FILTER_FACET = "filters[%s]"
3737
const val RESULT_ID = "result_id"
38+
const val FILTER_NAME = "filter_name"
39+
const val FILTER_VALUE = "filter_value"
40+
const val RESULT_POSITION_ON_PAGE = "result_position_on_page"
41+
const val RESULT_COUNT = "result_count"
3842
}
3943

4044
object QueryValues {

library/src/main/java/io/constructor/core/ConstructorIo.kt

Lines changed: 47 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package io.constructor.core
22

33
import android.annotation.SuppressLint
44
import android.content.Context
5+
import io.constructor.BuildConfig
56
import io.constructor.data.ConstructorData
67
import io.constructor.data.DataManager
78
import io.constructor.data.local.PreferencesHelper
@@ -10,6 +11,8 @@ import io.constructor.data.model.autocomplete.AutocompleteResponse
1011
import io.constructor.data.model.common.ResultGroup
1112
import io.constructor.data.model.search.SearchResponse
1213
import io.constructor.data.model.browse.BrowseResponse
14+
import io.constructor.data.model.browse.BrowseResultClickRequestBody
15+
import io.constructor.data.model.browse.BrowseResultLoadRequestBody
1316
import io.constructor.injection.component.AppComponent
1417
import io.constructor.injection.component.DaggerAppComponent
1518
import io.constructor.injection.module.AppModule
@@ -354,9 +357,27 @@ object ConstructorIo {
354357
}
355358
internal fun trackBrowseResultsLoadedInternal(filterName: String, filterValue: String, resultCount: Int): Completable {
356359
preferenceHelper.getSessionId(sessionIncrementHandler)
357-
return dataManager.trackBrowseResultsLoaded(filterName, filterValue, resultCount, arrayOf(
358-
Constants.QueryConstants.ACTION to Constants.QueryValues.EVENT_BROWSE_RESULTS
359-
))
360+
val browseResultLoadRequestBody = BrowseResultLoadRequestBody(
361+
filterName,
362+
filterValue,
363+
resultCount,
364+
BuildConfig.CLIENT_VERSION,
365+
preferenceHelper.id,
366+
preferenceHelper.getSessionId(),
367+
preferenceHelper.apiKey,
368+
configMemoryHolder.userId,
369+
configMemoryHolder.segments,
370+
true,
371+
preferenceHelper.defaultItemSection,
372+
System.currentTimeMillis().toString()
373+
)
374+
375+
return dataManager.trackBrowseResultsLoaded(
376+
browseResultLoadRequestBody,
377+
arrayOf(
378+
Constants.QueryConstants.ACTION to Constants.QueryValues.EVENT_BROWSE_RESULTS
379+
)
380+
)
360381
}
361382

362383
/**
@@ -377,10 +398,29 @@ object ConstructorIo {
377398
preferenceHelper.getSessionId(sessionIncrementHandler)
378399
val encodedParams: ArrayList<Pair<String, String>> = arrayListOf()
379400
resultID?.let { encodedParams.add(Constants.QueryConstants.RESULT_ID.urlEncode() to it.urlEncode()) }
380-
val sName = sectionName ?: preferenceHelper.defaultItemSection
381-
return dataManager.trackBrowseResultClick(filterName, filterValue, customerId, resultPositionOnPage, arrayOf(
382-
Constants.QueryConstants.AUTOCOMPLETE_SECTION to sName
383-
), encodedParams.toTypedArray())
401+
val section = sectionName ?: preferenceHelper.defaultItemSection
402+
val browseResultClickRequestBody = BrowseResultClickRequestBody(
403+
filterName,
404+
filterValue,
405+
customerId,
406+
resultPositionOnPage,
407+
BuildConfig.CLIENT_VERSION,
408+
preferenceHelper.id,
409+
preferenceHelper.getSessionId(),
410+
preferenceHelper.apiKey,
411+
configMemoryHolder.userId,
412+
configMemoryHolder.segments,
413+
true,
414+
section,
415+
System.currentTimeMillis().toString()
416+
)
417+
418+
return dataManager.trackBrowseResultClick(
419+
browseResultClickRequestBody,
420+
arrayOf(
421+
Constants.QueryConstants.AUTOCOMPLETE_SECTION to section
422+
), encodedParams.toTypedArray()
423+
)
384424

385425
}
386426

library/src/main/java/io/constructor/data/DataManager.kt

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ import com.squareup.moshi.Moshi
44
import io.constructor.data.model.autocomplete.AutocompleteResponse
55
import io.constructor.data.model.search.SearchResponse
66
import io.constructor.data.model.browse.BrowseResponse
7+
import io.constructor.data.model.browse.BrowseResultClickRequestBody
8+
import io.constructor.data.model.browse.BrowseResultLoadRequestBody
79
import io.constructor.data.remote.ApiPaths
810
import io.constructor.data.remote.ConstructorApi
911
import io.reactivex.Completable
@@ -115,12 +117,12 @@ constructor(private val constructorApi: ConstructorApi, private val moshi: Moshi
115117
}.toObservable()
116118
}
117119

118-
fun trackBrowseResultClick(filterName: String, filterValue: String, customerId: String, resultPositionOnPage: Int, params: Array<Pair<String, String>> = arrayOf(), encodedParams: Array<Pair<String, String>> = arrayOf()): Completable {
119-
return constructorApi.trackBrowseResultClick(filterName, filterValue, customerId, resultPositionOnPage, params.toMap(), encodedParams.toMap())
120+
fun trackBrowseResultsLoaded(browseResultLoadRequestBody: BrowseResultLoadRequestBody, params: Array<Pair<String, String>>): Completable {
121+
return constructorApi.trackBrowseResultsLoaded(browseResultLoadRequestBody, params.toMap())
120122
}
121123

122-
fun trackBrowseResultsLoaded(filterName: String, filterValue: String, resultCount: Int, params: Array<Pair<String, String>>): Completable {
123-
return constructorApi.trackBrowseResultsLoaded(filterName, filterValue, resultCount, params.toMap())
124+
fun trackBrowseResultClick(browseResultClickRequestBody: BrowseResultClickRequestBody, params: Array<Pair<String, String>> = arrayOf(), encodedParams: Array<Pair<String, String>> = arrayOf()): Completable {
125+
return constructorApi.trackBrowseResultClick(browseResultClickRequestBody, params.toMap(), encodedParams.toMap())
124126
}
125127

126128
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package io.constructor.data.model.browse
2+
3+
import com.squareup.moshi.Json
4+
import io.constructor.data.model.common.*;
5+
import java.io.Serializable
6+
7+
data class BrowseResultClickRequestBody(
8+
@Json(name = "filter_name") val filterName: String,
9+
@Json(name = "filter_value") val filterValue: String,
10+
@Json(name = "item_id") val item_id: String,
11+
@Json(name = "result_position_on_page") val resultPositionOnPage: Int,
12+
@Json(name = "c") val c: String,
13+
@Json(name = "i") val i: String,
14+
@Json(name = "s") val s: Int,
15+
@Json(name = "key") val key: String,
16+
@Json(name = "ui") val ui: String?,
17+
@Json(name = "us") val us: List<String?>,
18+
@Json(name= "beacon") val beacon: Boolean?,
19+
@Json(name= "autocomplete_section") val autocomplete_section: String?,
20+
@Json(name= "_dt") val _dt: String?
21+
) : Serializable
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package io.constructor.data.model.browse
2+
3+
import com.squareup.moshi.Json
4+
import io.constructor.data.model.common.*;
5+
import java.io.Serializable
6+
7+
data class BrowseResultLoadRequestBody(
8+
@Json(name = "filter_name") val filterName: String,
9+
@Json(name = "filter_value") val filterValue: String,
10+
@Json(name = "result_count") val resultCount: Int,
11+
@Json(name = "c") val c: String,
12+
@Json(name = "i") val i: String,
13+
@Json(name = "s") val s: Int,
14+
@Json(name = "key") val key: String,
15+
@Json(name = "ui") val ui: String?,
16+
@Json(name = "us") val us: List<String?>,
17+
@Json(name= "beacon") val beacon: Boolean?,
18+
@Json(name= "autocomplete_section") val autocomplete_section: String?,
19+
@Json(name= "_dt") val _dt: String?
20+
) : Serializable

library/src/main/java/io/constructor/data/remote/ConstructorApi.kt

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ package io.constructor.data.remote
22

33
import io.constructor.core.Constants
44
import io.constructor.data.model.autocomplete.AutocompleteResponse
5+
import io.constructor.data.model.browse.BrowseResultClickRequestBody
6+
import io.constructor.data.model.browse.BrowseResultLoadRequestBody
57
import io.reactivex.Completable
68
import io.reactivex.Single
79
import okhttp3.ResponseBody
@@ -61,18 +63,13 @@ interface ConstructorApi {
6163
@GET
6264
fun getBrowseResults(@Url browseUrl: String): Single<Result<ResponseBody>>
6365

64-
@GET(ApiPaths.URL_BROWSE_RESULT_CLICK_EVENT)
65-
fun trackBrowseResultClick(@Query("filter_name") filterName: String,
66-
@Query("filter_value") filterValue: String,
67-
@Query("customer_id") customerId: String,
68-
@Query("result_position_on_page") resultPositionOnPage: Int,
69-
@QueryMap params: Map<String, String>,
66+
@POST(ApiPaths.URL_BROWSE_RESULT_CLICK_EVENT)
67+
fun trackBrowseResultClick(@Body browseResultClickRequestBody: BrowseResultClickRequestBody,
68+
@QueryMap params: Map<String, String?>,
7069
@QueryMap(encoded = true) encodedData: Map<String, String>): Completable
7170

72-
@GET(ApiPaths.URL_BROWSE_RESULT_LOAD_EVENT)
73-
fun trackBrowseResultsLoaded(@Query("filter_name") filterName: String,
74-
@Query("filter_value") filterValue: String,
75-
@Query("num_results") resultCount: Int,
71+
@POST(ApiPaths.URL_BROWSE_RESULT_LOAD_EVENT)
72+
fun trackBrowseResultsLoaded(@Body browseRequestBody: BrowseResultLoadRequestBody,
7673
@QueryMap params: Map<String, String>): Completable
7774

7875
}

library/src/test/java/io/constructor/core/ConstructorIoTrackingTest.kt

Lines changed: 23 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ import org.junit.Rule
1515
import org.junit.Test
1616
import java.net.SocketTimeoutException
1717
import java.util.concurrent.TimeUnit
18+
import kotlin.test.assertEquals
19+
import kotlin.test.assertTrue
1820

1921
class ConstructorIoTest {
2022

@@ -365,8 +367,11 @@ class ConstructorIoTest {
365367
val observer = ConstructorIo.trackBrowseResultsLoadedInternal("group_id", "Movies", 10).test()
366368
observer.assertComplete()
367369
val request = mockServer.takeRequest()
368-
val path = "/v2/behavioral_action/browse_result_load?filter_name=group_id&filter_value=Movies&num_results=10&action=browse-results&key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.3.1&_dt=";
370+
val path = "/v2/behavioral_action/browse_result_load?action=browse-results&key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.3.1&_dt="
371+
print(request.body.readUtf8())
369372
assert(request.path.startsWith(path))
373+
assertTrue(request.bodySize > 220)
374+
assertEquals("POST", request.method)
370375
}
371376

372377
@Test
@@ -376,8 +381,10 @@ class ConstructorIoTest {
376381
val observer = ConstructorIo.trackBrowseResultsLoadedInternal("group_id", "Movies", 10).test()
377382
observer.assertError { true }
378383
val request = mockServer.takeRequest()
379-
val path = "/v2/behavioral_action/browse_result_load?filter_name=group_id&filter_value=Movies&num_results=10&action=browse-results&key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.3.1&_dt=";
384+
val path = "/v2/behavioral_action/browse_result_load?action=browse-results&key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.3.1&_dt="
380385
assert(request.path.startsWith(path))
386+
assertTrue(request.bodySize > 220)
387+
assertEquals("POST", request.method)
381388
}
382389

383390
@Test
@@ -387,9 +394,8 @@ class ConstructorIoTest {
387394
mockServer.enqueue(mockResponse)
388395
val observer = ConstructorIo.trackBrowseResultsLoadedInternal("group_id", "Movies", 10).test()
389396
observer.assertError(SocketTimeoutException::class.java)
390-
val request = mockServer.takeRequest()
391-
val path = "/v2/behavioral_action/browse_result_load?filter_name=group_id&filter_value=Movies&num_results=10&action=browse-results&key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.3.1&_dt=";
392-
assert(request.path.startsWith(path))
397+
val request = mockServer.takeRequest(10, TimeUnit.SECONDS)
398+
assertEquals(null, request)
393399
}
394400

395401
@Test
@@ -399,8 +405,11 @@ class ConstructorIoTest {
399405
val observer = ConstructorIo.trackBrowseResultClickInternal("group_id", "Movies","TIT-REP-1997", 4).test()
400406
observer.assertComplete()
401407
val request = mockServer.takeRequest()
402-
val path = "/v2/behavioral_action/browse_result_click?filter_name=group_id&filter_value=Movies&customer_id=TIT-REP-1997&result_position_on_page=4&autocomplete_section=Products&key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.3.1&_dt=";
408+
val path = "/v2/behavioral_action/browse_result_click?autocomplete_section=Products&key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.3.1&_dt=";
409+
print(request.body.readUtf8())
403410
assert(request.path.startsWith(path))
411+
assertTrue(request.bodySize > 250)
412+
assertEquals("POST", request.method)
404413
}
405414

406415
@Test
@@ -410,8 +419,10 @@ class ConstructorIoTest {
410419
val observer = ConstructorIo.trackBrowseResultClickInternal("group_id", "Movies","TIT-REP-1997", 4, "Products", "3467632").test()
411420
observer.assertComplete()
412421
val request = mockServer.takeRequest()
413-
val path = "/v2/behavioral_action/browse_result_click?filter_name=group_id&filter_value=Movies&customer_id=TIT-REP-1997&result_position_on_page=4&autocomplete_section=Products&result_id=3467632&key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.3.1&_dt=";
422+
val path = "/v2/behavioral_action/browse_result_click?autocomplete_section=Products&result_id=3467632&key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.3.1&_dt=";
414423
assert(request.path.startsWith(path))
424+
assertTrue(request.bodySize > 250)
425+
assertEquals("POST", request.method)
415426
}
416427

417428
@Test
@@ -421,8 +432,10 @@ class ConstructorIoTest {
421432
val observer = ConstructorIo.trackBrowseResultClickInternal("group_id", "Movies","TIT-REP-1997", 4).test()
422433
observer.assertError { true }
423434
val request = mockServer.takeRequest()
424-
val path = "/v2/behavioral_action/browse_result_click?filter_name=group_id&filter_value=Movies&customer_id=TIT-REP-1997&result_position_on_page=4&autocomplete_section=Products&key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.3.1&_dt=";
435+
val path = "/v2/behavioral_action/browse_result_click?autocomplete_section=Products&key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.3.1&_dt=";
425436
assert(request.path.startsWith(path))
437+
assertTrue(request.bodySize > 250)
438+
assertEquals("POST", request.method)
426439
}
427440

428441
@Test
@@ -432,9 +445,8 @@ class ConstructorIoTest {
432445
mockServer.enqueue(mockResponse)
433446
val observer = ConstructorIo.trackBrowseResultClickInternal("group_id", "Movies","TIT-REP-1997", 4).test()
434447
observer.assertError(SocketTimeoutException::class.java)
435-
val request = mockServer.takeRequest()
436-
val path = "/v2/behavioral_action/browse_result_click?filter_name=group_id&filter_value=Movies&customer_id=TIT-REP-1997&result_position_on_page=4&autocomplete_section=Products&key=copper-key&i=wacko-the-guid&ui=player-three&s=67&c=cioand-2.3.1&_dt=";
437-
assert(request.path.startsWith(path))
448+
val request = mockServer.takeRequest(10, TimeUnit.SECONDS)
449+
assertEquals(null, request)
438450
}
439451

440452
}

0 commit comments

Comments
 (0)