Skip to content
This repository was archived by the owner on May 6, 2021. It is now read-only.

Commit e13cde6

Browse files
Merge pull request #94 from nytimes/feature/APP-3750_fix_purchase_to_mock_autorenew
APP-3750: Fix Register purchase to mock autorenew so we can have a pu…
2 parents 93f0587 + cdf5720 commit e13cde6

File tree

7 files changed

+160
-76
lines changed

7 files changed

+160
-76
lines changed

CHANGELOG.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,14 @@
11
Change Log
22
==========
33

4+
Version 0.0.9
5+
-------------
6+
- [APP-3750](https://jira.nyt.net/browse/APP-3750) Update Purchase to include `autorenew` mock so can have sku type in Purchase
7+
8+
Version 0.0.9
9+
-------------
10+
internal
11+
412
Version 0.0.7
513
-------------
614
internal

README.md

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -72,15 +72,15 @@ file.json.name=newFileName.json
7272

7373
**Step 1:** Add Register as a dependency to your client app, this will install the companion app:
7474
```groovy
75-
compile 'com.nytimes.android:register-app:0.0.8'
76-
compile 'com.nytimes.android:register:0.0.8'
75+
compile 'com.nytimes.android:register-app:0.0.9'
76+
compile 'com.nytimes.android:register:0.0.9'
7777
```
7878

7979
or, on Android Gradle Plugin 3.0 or later:
8080

8181
```groovy
82-
implementation 'com.nytimes.android:register-app:0.0.8'
83-
implementation 'com.nytimes.android:register:0.0.8'
82+
implementation 'com.nytimes.android:register-app:0.0.9'
83+
implementation 'com.nytimes.android:register:0.0.9'
8484
```
8585

8686
**Step 2:** Create a test Google Service Provider (or a real provider):
@@ -119,13 +119,13 @@ See the image below for all configurable options on a response.
119119
**For Android Gradle Plugin 3.0**
120120
121121
```groovy
122-
implementation 'com.nytimes.android:register-app:0.0.8'
123-
implementation 'com.nytimes.android:register:0.0.8'
122+
implementation 'com.nytimes.android:register-app:0.0.9'
123+
implementation 'com.nytimes.android:register:0.0.9'
124124
```
125125
126126
**For projects using older versions of the plugin**
127127
128128
```groovy
129-
compile 'com.nytimes.android:register-app:0.0.8'
130-
compile 'com.nytimes.android:register:0.0.8'
129+
compile 'com.nytimes.android:register-app:0.0.9'
130+
compile 'com.nytimes.android:register:0.0.9'
131131
```

app/src/main/java/com/nytimes/android/external/register/buy/PurchaseHelper.kt

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3,29 +3,31 @@ package com.nytimes.android.external.register.buy
33
import com.nytimes.android.external.register.APIOverrides
44
import com.nytimes.android.external.register.Purchases
55
import com.nytimes.android.external.register.model.Config
6+
import com.nytimes.android.external.registerlib.GoogleUtil.BILLING_TYPE_SUBSCRIPTION
67
import com.nytimes.android.external.registerlib.InAppPurchaseData
7-
import java.util.*
8+
import java.util.Locale
89
import javax.inject.Inject
910

1011
class PurchaseHelper @Inject constructor(
11-
@JvmField private val config: Config?,
12-
private val apiOverrides: APIOverrides,
13-
private val purchases: Purchases
12+
@JvmField private val config: Config?,
13+
private val apiOverrides: APIOverrides,
14+
private val purchases: Purchases
1415
) {
1516

1617
fun onBuy(purchaseData: PurchaseData, currentTimeMillis: Long): PurchaseResult {
1718
val newReceipt = String.format(Locale.getDefault(), BuyFragment.RECEIPT_FMT,
18-
apiOverrides.usersResponse, currentTimeMillis)
19+
apiOverrides.usersResponse, currentTimeMillis)
1920
val skuToPurchase = if (purchaseData.isReplace) purchaseData.newSku else purchaseData.sku
2021
val inAppPurchaseData = InAppPurchaseData.Builder()
21-
.orderId(java.lang.Long.toString(currentTimeMillis))
22-
.packageName(config!!.skus[skuToPurchase]!!.packageName)
23-
.productId(skuToPurchase)
24-
.purchaseTime(java.lang.Long.toString(currentTimeMillis))
25-
.developerPayload(purchaseData.developerPayload)
26-
.purchaseToken(newReceipt)
27-
.purchaseState("0")
28-
.build()
22+
.orderId(currentTimeMillis.toString())
23+
.packageName(config!!.skus[skuToPurchase]!!.packageName)
24+
.productId(skuToPurchase)
25+
.purchaseTime(currentTimeMillis.toString())
26+
.developerPayload(purchaseData.developerPayload)
27+
.purchaseToken(newReceipt)
28+
.isAutoRenewing(config.skus[skuToPurchase]!!.type == BILLING_TYPE_SUBSCRIPTION)
29+
.purchaseState("0")
30+
.build()
2931
val inAppPurchaseDataStr = InAppPurchaseData.toJson(inAppPurchaseData)
3032
val result: Boolean = if (purchaseData.isReplace) {
3133
purchases.replacePurchase(inAppPurchaseDataStr, purchaseData.oldSkus!!)

app/src/test/java/com/nytimes/android/external/register/PurchasesTest.kt

Lines changed: 40 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ import org.robolectric.RuntimeEnvironment
1616

1717
@RunWith(AndroidJUnit4::class)
1818
class PurchasesTest {
19-
19+
2020
private val signer: Signer = mock()
2121

2222
private lateinit var testObject: Purchases
@@ -30,27 +30,29 @@ class PurchasesTest {
3030
@Throws(Exception::class)
3131
fun setUp() {
3232
val sharedPreferences = RuntimeEnvironment.application
33-
.getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE)
33+
.getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE)
3434

3535
inAppPurchaseData1 = InAppPurchaseData.Builder()
36-
.orderId(ORDER_ID_1)
37-
.packageName(PACKAGE_1)
38-
.productId(PRODUCT_ID_1)
39-
.purchaseTime(PURCHASE_TIME_1)
40-
.purchaseState(PURCHASE_STATE_1)
41-
.developerPayload(DEV_PAYLOAD_1)
42-
.purchaseToken(PURCHASE_TOKEN_1)
43-
.build()
36+
.orderId(ORDER_ID_1)
37+
.packageName(PACKAGE_1)
38+
.productId(PRODUCT_ID_1)
39+
.purchaseTime(PURCHASE_TIME_1)
40+
.purchaseState(PURCHASE_STATE_1)
41+
.developerPayload(DEV_PAYLOAD_1)
42+
.purchaseToken(PURCHASE_TOKEN_1)
43+
.isAutoRenewing(true)
44+
.build()
4445

4546
inAppPurchaseData2 = InAppPurchaseData.Builder()
46-
.orderId(ORDER_ID_2)
47-
.packageName(PACKAGE_2)
48-
.productId(PRODUCT_ID_2)
49-
.purchaseTime(PURCHASE_TIME_2)
50-
.purchaseState(PURCHASE_STATE_2)
51-
.developerPayload(DEV_PAYLOAD_2)
52-
.purchaseToken(PURCHASE_TOKEN_2)
53-
.build()
47+
.orderId(ORDER_ID_2)
48+
.packageName(PACKAGE_2)
49+
.productId(PRODUCT_ID_2)
50+
.purchaseTime(PURCHASE_TIME_2)
51+
.purchaseState(PURCHASE_STATE_2)
52+
.developerPayload(DEV_PAYLOAD_2)
53+
.purchaseToken(PURCHASE_TOKEN_2)
54+
.isAutoRenewing(false)
55+
.build()
5456

5557
inAppPurchaseData1Str = InAppPurchaseData.toJson(inAppPurchaseData1)
5658
inAppPurchaseData2Str = InAppPurchaseData.toJson(inAppPurchaseData2)
@@ -79,16 +81,16 @@ class PurchasesTest {
7981
testObject.addPurchase(inAppPurchaseData2Str, GoogleUtil.BILLING_TYPE_IAP)
8082

8183
val purchasesSub = testObject.getPurchasesLists(
82-
GoogleUtil.BILLING_TYPE_SUBSCRIPTION, continuationToken)
84+
GoogleUtil.BILLING_TYPE_SUBSCRIPTION, continuationToken)
8385
val purchasesIAP = testObject.getPurchasesLists(
84-
GoogleUtil.BILLING_TYPE_IAP, continuationToken)
86+
GoogleUtil.BILLING_TYPE_IAP, continuationToken)
8587
val subList = purchasesSub.purchaseDataList
8688
val iapList = purchasesIAP.purchaseDataList
8789

8890
assertThat(subList[0])
89-
.isEqualTo(inAppPurchaseData1Str)
91+
.isEqualTo(inAppPurchaseData1Str)
9092
assertThat(iapList[0])
91-
.isEqualTo(inAppPurchaseData2Str)
93+
.isEqualTo(inAppPurchaseData2Str)
9294
assertThat(purchasesSub.continuationToken).isNull()
9395
assertThat(purchasesIAP.continuationToken).isNull()
9496
}
@@ -99,21 +101,21 @@ class PurchasesTest {
99101
val overLimit = 3
100102
for (i in 0 until Purchases.PAGE_LIMIT + overLimit) {
101103
val inAppPurchaseData = InAppPurchaseData.Builder()
102-
.orderId(ORDER_ID_1 + i)
103-
.packageName(PACKAGE_1)
104-
.productId(PRODUCT_ID_1)
105-
.purchaseTime(PURCHASE_TIME_1)
106-
.purchaseState(PURCHASE_STATE_1)
107-
.developerPayload(DEV_PAYLOAD_1)
108-
.purchaseToken(PURCHASE_TOKEN_1)
109-
.build()
104+
.orderId(ORDER_ID_1 + i)
105+
.packageName(PACKAGE_1)
106+
.productId(PRODUCT_ID_1)
107+
.purchaseTime(PURCHASE_TIME_1)
108+
.purchaseState(PURCHASE_STATE_1)
109+
.developerPayload(DEV_PAYLOAD_1)
110+
.purchaseToken(PURCHASE_TOKEN_1)
111+
.build()
110112
val inAppPurchaseDataStr = InAppPurchaseData.toJson(inAppPurchaseData)
111113
testObject.addPurchase(inAppPurchaseDataStr, GoogleUtil.BILLING_TYPE_SUBSCRIPTION)
112114
}
113115

114116
// get first page
115117
var purchasesSub: PurchasesLists = testObject.getPurchasesLists(
116-
GoogleUtil.BILLING_TYPE_SUBSCRIPTION, continuationToken)
118+
GoogleUtil.BILLING_TYPE_SUBSCRIPTION, continuationToken)
117119

118120
// check
119121
var subList = purchasesSub.purchaseDataList
@@ -122,7 +124,7 @@ class PurchasesTest {
122124

123125
// get second page
124126
purchasesSub = testObject.getPurchasesLists(
125-
GoogleUtil.BILLING_TYPE_SUBSCRIPTION, purchasesSub.continuationToken)
127+
GoogleUtil.BILLING_TYPE_SUBSCRIPTION, purchasesSub.continuationToken)
126128

127129
// check
128130
subList = purchasesSub.purchaseDataList
@@ -136,9 +138,9 @@ class PurchasesTest {
136138
testObject.addPurchase(inAppPurchaseData2Str, GoogleUtil.BILLING_TYPE_IAP)
137139

138140
val actual = testObject.getReceiptsForSkus(setOf(PRODUCT_ID_1),
139-
GoogleUtil.BILLING_TYPE_SUBSCRIPTION)
141+
GoogleUtil.BILLING_TYPE_SUBSCRIPTION)
140142
assertThat(actual)
141-
.isEqualTo(setOf(PURCHASE_TOKEN_1))
143+
.isEqualTo(setOf(PURCHASE_TOKEN_1))
142144
}
143145

144146
@Test
@@ -147,9 +149,9 @@ class PurchasesTest {
147149
testObject.addPurchase(inAppPurchaseData2Str, GoogleUtil.BILLING_TYPE_IAP)
148150

149151
val actual = testObject.getReceiptsForSkus(setOf(PRODUCT_ID_1),
150-
GoogleUtil.BILLING_TYPE_IAP)
152+
GoogleUtil.BILLING_TYPE_IAP)
151153
assertThat(actual)
152-
.isEqualTo(setOf<Any>())
154+
.isEqualTo(setOf<Any>())
153155
}
154156

155157
@Test
@@ -158,9 +160,9 @@ class PurchasesTest {
158160
testObject.addPurchase(inAppPurchaseData2Str, GoogleUtil.BILLING_TYPE_IAP)
159161
testObject.purgePurchases()
160162
assertThat(testObject.getInAppPurchaseData(GoogleUtil.BILLING_TYPE_SUBSCRIPTION).size)
161-
.isEqualTo(0)
163+
.isEqualTo(0)
162164
assertThat(testObject.getInAppPurchaseData(GoogleUtil.BILLING_TYPE_IAP).size)
163-
.isEqualTo(0)
165+
.isEqualTo(0)
164166
}
165167

166168
companion object {
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
package com.nytimes.android.external.register.buy
2+
3+
import com.nhaarman.mockitokotlin2.mock
4+
import com.nhaarman.mockitokotlin2.whenever
5+
import com.nytimes.android.external.register.APIOverrides
6+
import com.nytimes.android.external.register.Purchases
7+
import com.nytimes.android.external.register.model.Config
8+
import com.nytimes.android.external.register.model.ConfigSku
9+
import com.nytimes.android.external.registerlib.GoogleUtil.BILLING_TYPE_IAP
10+
import com.nytimes.android.external.registerlib.GoogleUtil.BILLING_TYPE_SUBSCRIPTION
11+
import org.assertj.core.api.Assertions.assertThat
12+
import org.junit.Before
13+
import org.junit.Test
14+
15+
class PurchaseHelperTest {
16+
private val config: Config = mock()
17+
private val apiOverrides: APIOverrides = mock()
18+
private val purchases: Purchases = mock()
19+
private val testSKU = "testSKU"
20+
private val purchaseData = PurchaseData(
21+
sku = testSKU,
22+
itemtype = "test"
23+
)
24+
private val mockSKU: ConfigSku = mock()
25+
private lateinit var testObject: PurchaseHelper
26+
27+
@Before
28+
fun setup() {
29+
testObject = PurchaseHelper(config, apiOverrides, purchases)
30+
whenever(apiOverrides.usersResponse).thenReturn("testResponse")
31+
whenever(config.skus).thenReturn(mapOf(Pair(testSKU, mockSKU)))
32+
whenever(mockSKU.type).thenReturn("subs")
33+
}
34+
35+
@Test
36+
fun `onBuy - subscription purchase - adds auto renewing subscription purchase`() {
37+
// Setup
38+
whenever(mockSKU.type).thenReturn(BILLING_TYPE_SUBSCRIPTION)
39+
40+
// Exercise
41+
val result = testObject.onBuy(purchaseData, System.currentTimeMillis())
42+
43+
// Verify
44+
assertThat(result.inAppPurchaseData.isAutoRenewing()).isTrue()
45+
}
46+
47+
@Test
48+
fun `onBuy - inapp purchase - adds non auto renewing purchase`() {
49+
// Setup
50+
whenever(mockSKU.type).thenReturn(BILLING_TYPE_IAP)
51+
52+
// Exercise
53+
val result = testObject.onBuy(purchaseData, System.currentTimeMillis())
54+
55+
// Verify
56+
assertThat(result.inAppPurchaseData.isAutoRenewing()).isFalse()
57+
}
58+
}

build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ ext {
5555

5656
// POM file
5757
GROUP = "com.nytimes.android"
58-
VERSION_NAME = "0.0.8-SNAPSHOT"
58+
VERSION_NAME = "0.0.9-SNAPSHOT"
5959
POM_PACKAGING = "pom"
6060
POM_DESCRIPTION = "register"
6161

0 commit comments

Comments
 (0)