Skip to content

Commit 878f251

Browse files
authored
Merge pull request #8066 from woocommerce/issue/8065-extract-jitm-query-params
Extract JITM query params encoder logic into a reusable class
2 parents d7274b8 + e6357e5 commit 878f251

File tree

4 files changed

+76
-41
lines changed

4 files changed

+76
-41
lines changed
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package com.woocommerce.android.ui.jitm
2+
3+
import com.woocommerce.android.BuildConfig
4+
import com.woocommerce.android.util.BuildConfigWrapper
5+
import java.net.URLEncoder
6+
import javax.inject.Inject
7+
8+
class QueryParamsEncoder @Inject constructor(
9+
private val buildConfigWrapper: BuildConfigWrapper
10+
) {
11+
fun getEncodedQueryParams(): String {
12+
val query = if (buildConfigWrapper.debug) {
13+
"build_type=developer&platform=android&version=${BuildConfig.VERSION_NAME}"
14+
} else {
15+
"platform=android&version=${BuildConfig.VERSION_NAME}"
16+
}
17+
return URLEncoder.encode(query, Charsets.UTF_8.name())
18+
}
19+
}

WooCommerce/src/main/kotlin/com/woocommerce/android/ui/mystore/MyStoreViewModel.kt

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ import androidx.lifecycle.SavedStateHandle
99
import androidx.lifecycle.asLiveData
1010
import androidx.lifecycle.viewModelScope
1111
import com.woocommerce.android.AppPrefsWrapper
12-
import com.woocommerce.android.BuildConfig
1312
import com.woocommerce.android.R
1413
import com.woocommerce.android.analytics.AnalyticsEvent
1514
import com.woocommerce.android.analytics.AnalyticsTracker
@@ -21,6 +20,7 @@ import com.woocommerce.android.tools.NetworkStatus
2120
import com.woocommerce.android.tools.SelectedSite
2221
import com.woocommerce.android.ui.analytics.daterangeselector.AnalyticTimePeriod
2322
import com.woocommerce.android.ui.jitm.JitmTracker
23+
import com.woocommerce.android.ui.jitm.QueryParamsEncoder
2424
import com.woocommerce.android.ui.mystore.domain.GetStats
2525
import com.woocommerce.android.ui.mystore.domain.GetStats.LoadStatsResult.HasOrders
2626
import com.woocommerce.android.ui.mystore.domain.GetStats.LoadStatsResult.IsJetPackCPEnabled
@@ -63,7 +63,6 @@ import org.wordpress.android.fluxc.store.WooCommerceStore
6363
import org.wordpress.android.util.FormatUtils
6464
import org.wordpress.android.util.PhotonUtils
6565
import java.math.BigDecimal
66-
import java.net.URLEncoder
6766
import java.util.concurrent.TimeUnit
6867
import javax.inject.Inject
6968

@@ -84,6 +83,7 @@ class MyStoreViewModel @Inject constructor(
8483
private val jitmStore: JitmStore,
8584
private val jitmTracker: JitmTracker,
8685
private val myStoreUtmProvider: MyStoreUtmProvider,
86+
private val queryParamsEncoder: QueryParamsEncoder,
8787
) : ScopedViewModel(savedState) {
8888
companion object {
8989
private const val DAYS_TO_REDISPLAY_JP_BENEFITS_BANNER = 5
@@ -148,21 +148,12 @@ class MyStoreViewModel @Inject constructor(
148148
val response = jitmStore.fetchJitmMessage(
149149
selectedSite.get(),
150150
JITM_MESSAGE_PATH,
151-
getEncodedQueryParams(),
151+
queryParamsEncoder.getEncodedQueryParams(),
152152
)
153153
populateResultToUI(response)
154154
}
155155
}
156156

157-
private fun getEncodedQueryParams(): String {
158-
val query = if (BuildConfig.DEBUG) {
159-
"build_type=developer&platform=android&version=${BuildConfig.VERSION_NAME}"
160-
} else {
161-
"platform=android&version=${BuildConfig.VERSION_NAME}"
162-
}
163-
return URLEncoder.encode(query, Charsets.UTF_8.name())
164-
}
165-
166157
private fun populateResultToUI(response: WooResult<Array<JITMApiResponse>>) {
167158
if (response.isError) {
168159
jitmTracker.trackJitmFetchFailure(UTM_SOURCE, response.error.type, response.error.message)

WooCommerce/src/test/kotlin/com/woocommerce/android/ui/mystore/MyStoreViewModelTest.kt

Lines changed: 6 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import com.woocommerce.android.model.UiString
1313
import com.woocommerce.android.tools.NetworkStatus
1414
import com.woocommerce.android.tools.SelectedSite
1515
import com.woocommerce.android.ui.jitm.JitmTracker
16+
import com.woocommerce.android.ui.jitm.QueryParamsEncoder
1617
import com.woocommerce.android.ui.mystore.MyStoreViewModel.Companion.UTM_SOURCE
1718
import com.woocommerce.android.ui.mystore.MyStoreViewModel.MyStoreEvent.OnJitmCtaClicked
1819
import com.woocommerce.android.ui.mystore.domain.GetStats
@@ -50,7 +51,6 @@ import org.wordpress.android.fluxc.network.rest.wpcom.wc.jitm.JITMCta
5051
import org.wordpress.android.fluxc.store.JitmStore
5152
import org.wordpress.android.fluxc.store.WCStatsStore.StatsGranularity
5253
import org.wordpress.android.fluxc.store.WooCommerceStore
53-
import java.net.URLEncoder
5454
import kotlin.test.assertTrue
5555

5656
@ExperimentalCoroutinesApi
@@ -69,13 +69,17 @@ class MyStoreViewModelTest : BaseUnitTest() {
6969
private val jitmStore: JitmStore = mock()
7070
private val jitmTracker: JitmTracker = mock()
7171
private val utmProvider: MyStoreUtmProvider = mock()
72+
private val queryParamsEncoder: QueryParamsEncoder = mock()
7273

7374
private lateinit var sut: MyStoreViewModel
7475

7576
@Before
7677
fun setup() = testBlocking {
7778
givenStatsLoadingResult(GetStats.LoadStatsResult.VisitorsStatsError)
7879
givenFetchTopPerformersResult(Result.failure(WooException(WOO_GENERIC_ERROR)))
80+
whenever(queryParamsEncoder.getEncodedQueryParams()).thenReturn(
81+
"build_type=developer&platform=android&version=${BuildConfig.VERSION_NAME}"
82+
)
7983
}
8084

8185
@Test
@@ -433,34 +437,6 @@ class MyStoreViewModelTest : BaseUnitTest() {
433437
}
434438
}
435439

436-
@Test
437-
fun `when viewmodel init, then proper encoded query params are passed to fetch jitm`() {
438-
testBlocking {
439-
givenNetworkConnectivity(connected = true)
440-
whenever(selectedSite.get()).thenReturn(SiteModel())
441-
val captor = argumentCaptor<String>()
442-
443-
whenViewModelIsCreated()
444-
verify(jitmStore).fetchJitmMessage(any(), any(), captor.capture())
445-
446-
if (BuildConfig.DEBUG) {
447-
assertThat(captor.firstValue).isEqualTo(
448-
URLEncoder.encode(
449-
"build_type=developer&platform=android&version=${BuildConfig.VERSION_NAME}",
450-
Charsets.UTF_8.name()
451-
)
452-
)
453-
} else {
454-
assertThat(captor.firstValue).isEqualTo(
455-
URLEncoder.encode(
456-
"platform=android&version=${BuildConfig.VERSION_NAME}",
457-
Charsets.UTF_8.name()
458-
)
459-
)
460-
}
461-
}
462-
}
463-
464440
@Test
465441
fun `given store setup in US, when viewmodel init, then request for jitm with valid message path`() {
466442
testBlocking {
@@ -1382,6 +1358,7 @@ class MyStoreViewModelTest : BaseUnitTest() {
13821358
jitmStore,
13831359
jitmTracker,
13841360
utmProvider,
1361+
queryParamsEncoder
13851362
)
13861363
}
13871364

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
package com.woocommerce.android.util
2+
3+
import com.woocommerce.android.BuildConfig
4+
import com.woocommerce.android.ui.jitm.QueryParamsEncoder
5+
import org.assertj.core.api.Assertions.assertThat
6+
import org.junit.Test
7+
import org.mockito.kotlin.mock
8+
import org.mockito.kotlin.whenever
9+
import java.net.URLEncoder
10+
11+
class QueryParamsEncoderTest {
12+
private val buildConfigWrapper: BuildConfigWrapper = mock()
13+
private val queryParramsEncoder = QueryParamsEncoder(buildConfigWrapper)
14+
15+
@Test
16+
fun `given debug build, when getEncodedQueryParams called, then proper encoded query params returned`() {
17+
// GIVEN
18+
whenever(buildConfigWrapper.debug).thenReturn(BuildConfig.DEBUG)
19+
20+
// WHEN
21+
val encoderQueryParams = queryParramsEncoder.getEncodedQueryParams()
22+
23+
// THEN
24+
assertThat(encoderQueryParams).isEqualTo(
25+
URLEncoder.encode(
26+
"build_type=developer&platform=android&version=${BuildConfig.VERSION_NAME}",
27+
Charsets.UTF_8.name()
28+
)
29+
)
30+
}
31+
32+
@Test
33+
fun `given release build, when getEncodedQueryParams called, then proper encoded query params returned`() {
34+
// GIVEN
35+
whenever(buildConfigWrapper.debug).thenReturn(false)
36+
37+
// WHEN
38+
val encoderQueryParams = queryParramsEncoder.getEncodedQueryParams()
39+
40+
// THEN
41+
assertThat(encoderQueryParams).isEqualTo(
42+
URLEncoder.encode(
43+
"platform=android&version=${BuildConfig.VERSION_NAME}",
44+
Charsets.UTF_8.name()
45+
)
46+
)
47+
}
48+
}

0 commit comments

Comments
 (0)