Skip to content

Commit be188ce

Browse files
authored
Merge pull request #14817 from woocommerce/feat/WOOMOB-1154-POS-Order-email-receipt-fetch
[POS Orders] Fetch order when sending receipt if it's not in DB
2 parents 501dbce + ea90d56 commit be188ce

File tree

2 files changed

+73
-17
lines changed

2 files changed

+73
-17
lines changed

WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/emailreceipt/WooPosEmailReceiptRepository.kt

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ class WooPosEmailReceiptRepository @Inject constructor(
2222
private val getWooCoreVersion: GetWooCorePluginCachedVersion
2323
) {
2424
suspend fun sendReceiptByEmail(orderId: Long, email: String): Result<Unit> = withContext(Dispatchers.IO) {
25-
val order = getOrderById(orderId)
25+
val order = getOrderById(orderId) ?: fetchOrderById(orderId)
2626
if (order == null) {
2727
return@withContext Result.failure(Exception("Failed to get order"))
2828
}
@@ -65,6 +65,19 @@ class WooPosEmailReceiptRepository @Inject constructor(
6565
orderMapper.toAppModel(it)
6666
}
6767

68+
private suspend fun fetchOrderById(orderId: Long): Order? {
69+
val result = orderStore.fetchSingleOrder(
70+
selectedSite.get(),
71+
orderId
72+
)
73+
74+
return if (!result.isError) {
75+
getOrderById(orderId)
76+
} else {
77+
null
78+
}
79+
}
80+
6881
private fun isWooCoreSupportsPOSReceipts(): Boolean {
6982
val wooCoreVersion = getWooCoreVersion() ?: return false
7083
return wooCoreVersion.semverCompareTo(WC_VERSION_SUPPORTS_POS_RECEIPTS) >= 0

WooCommerce/src/test/kotlin/com/woocommerce/android/ui/woopos/emailreceipt/WooPosEmailReceiptRepositoryTest.kt

Lines changed: 59 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package com.woocommerce.android.ui.woopos.emailreceipt
33
import com.woocommerce.android.model.Order
44
import com.woocommerce.android.model.OrderMapper
55
import com.woocommerce.android.tools.SelectedSite
6+
import com.woocommerce.android.ui.orders.OrderTestUtils
67
import com.woocommerce.android.ui.orders.creation.OrderCreateEditRepository
78
import com.woocommerce.android.ui.orders.creation.OrderCreationSource
89
import com.woocommerce.android.util.GetWooCorePluginCachedVersion
@@ -13,12 +14,15 @@ import org.mockito.kotlin.any
1314
import org.mockito.kotlin.anyOrNull
1415
import org.mockito.kotlin.eq
1516
import org.mockito.kotlin.mock
17+
import org.mockito.kotlin.verify
1618
import org.mockito.kotlin.whenever
19+
import org.wordpress.android.fluxc.model.LocalOrRemoteId
1720
import org.wordpress.android.fluxc.model.SiteModel
1821
import org.wordpress.android.fluxc.network.BaseRequest.GenericErrorType
1922
import org.wordpress.android.fluxc.network.rest.wpcom.wc.WooError
2023
import org.wordpress.android.fluxc.network.rest.wpcom.wc.WooErrorType
2124
import org.wordpress.android.fluxc.network.rest.wpcom.wc.WooPayload
25+
import org.wordpress.android.fluxc.persistence.entity.OrderEntity
2226
import org.wordpress.android.fluxc.store.WCOrderStore
2327
import java.util.regex.Pattern
2428

@@ -83,10 +87,7 @@ class WooPosEmailReceiptRepositoryTest {
8387
// GIVEN
8488
val orderId = 1L
8589
val email = "[email protected]"
86-
val mockOrder: Order = mock {
87-
on { billingAddress }.thenReturn(mock())
88-
on { customer }.thenReturn(mock())
89-
}
90+
val mockOrder: Order = OrderTestUtils.generateTestOrder()
9091

9192
whenever(getWooCoreVersion.invoke()).thenReturn("9.9.0")
9293
whenever(orderStore.getOrderByIdAndSite(orderId, siteModel)).thenReturn(mock())
@@ -113,10 +114,7 @@ class WooPosEmailReceiptRepositoryTest {
113114
// GIVEN
114115
val orderId = 1L
115116
val email = "[email protected]"
116-
val mockOrder: Order = mock {
117-
on { billingAddress }.thenReturn(mock())
118-
on { customer }.thenReturn(mock())
119-
}
117+
val mockOrder: Order = OrderTestUtils.generateTestOrder()
120118

121119
whenever(getWooCoreVersion.invoke()).thenReturn("10.0.0")
122120
whenever(orderStore.getOrderByIdAndSite(orderId, siteModel)).thenReturn(mock())
@@ -146,6 +144,11 @@ class WooPosEmailReceiptRepositoryTest {
146144
whenever(selectedSite.get()).thenReturn(siteModel)
147145
whenever(orderStore.getOrderByIdAndSite(orderId, siteModel)).thenReturn(null)
148146

147+
val onOrderChangedError = WCOrderStore.OnOrderChanged(
148+
orderError = WCOrderStore.OrderError()
149+
)
150+
whenever(orderStore.fetchSingleOrder(siteModel, orderId)).thenReturn(onOrderChangedError)
151+
149152
// WHEN
150153
val result = repository.sendReceiptByEmail(orderId, email)
151154

@@ -158,10 +161,7 @@ class WooPosEmailReceiptRepositoryTest {
158161
// GIVEN
159162
val email = "[email protected]"
160163
val orderId = 1L
161-
val mockOrder: Order = mock {
162-
on { billingAddress }.thenReturn(mock())
163-
on { customer }.thenReturn(mock())
164-
}
164+
val mockOrder: Order = OrderTestUtils.generateTestOrder()
165165

166166
whenever(selectedSite.get()).thenReturn(siteModel)
167167
whenever(orderStore.getOrderByIdAndSite(orderId, siteModel)).thenReturn(mock())
@@ -188,10 +188,7 @@ class WooPosEmailReceiptRepositoryTest {
188188
// GIVEN
189189
val orderId = 1L
190190
val email = "[email protected]"
191-
val mockOrder: Order = mock {
192-
on { billingAddress }.thenReturn(mock())
193-
on { customer }.thenReturn(mock())
194-
}
191+
val mockOrder: Order = OrderTestUtils.generateTestOrder()
195192
whenever(selectedSite.get()).thenReturn(siteModel)
196193
whenever(orderStore.getOrderByIdAndSite(orderId, siteModel)).thenReturn(mock())
197194
whenever(orderMapper.toAppModel(any())).thenReturn(mockOrder)
@@ -218,4 +215,50 @@ class WooPosEmailReceiptRepositoryTest {
218215
// THEN
219216
assertThat(result.isFailure).isTrue()
220217
}
218+
219+
@Test
220+
fun `given order not in DB, when sendReceiptByEmail, then fetches remotely and succeeds`() = runTest {
221+
// GIVEN
222+
val orderId = 123L
223+
val email = "[email protected]"
224+
225+
val mockOrder: Order = OrderTestUtils.generateTestOrder()
226+
227+
whenever(selectedSite.get()).thenReturn(siteModel)
228+
229+
val dbEntity = OrderEntity(LocalOrRemoteId.LocalId(1), orderId = orderId)
230+
whenever(orderStore.getOrderByIdAndSite(orderId, siteModel))
231+
.thenReturn(null, dbEntity)
232+
233+
val onOrderChangedSuccess = WCOrderStore.OnOrderChanged()
234+
235+
whenever(orderStore.fetchSingleOrder(siteModel, orderId)).thenReturn(onOrderChangedSuccess)
236+
237+
whenever(orderMapper.toAppModel(dbEntity)).thenReturn(mockOrder)
238+
239+
whenever(
240+
orderCreateEditRepository.createOrUpdateOrder(
241+
any(),
242+
eq(OrderCreationSource.POINT_OF_SALE),
243+
eq("")
244+
)
245+
).thenReturn(
246+
Result.success(mockOrder)
247+
)
248+
249+
whenever(getWooCoreVersion.invoke()).thenReturn("9.9.0")
250+
251+
val sendOrderReceiptResult = WooPayload<Unit>(Unit)
252+
whenever(orderStore.sendOrderReceipt(siteModel, orderId)).thenReturn(sendOrderReceiptResult)
253+
254+
// WHEN
255+
val result = repository.sendReceiptByEmail(orderId, email)
256+
257+
// THEN
258+
assertThat(result.isSuccess).isTrue()
259+
260+
verify(orderStore).fetchSingleOrder(siteModel, orderId)
261+
verify(orderStore, org.mockito.kotlin.times(2)).getOrderByIdAndSite(orderId, siteModel)
262+
verify(orderStore).sendOrderReceipt(siteModel, orderId)
263+
}
221264
}

0 commit comments

Comments
 (0)