Skip to content

Commit

Permalink
Merge pull request #2151 from wordpress-mobile/issue/woo-4806-suspend…
Browse files Browse the repository at this point in the history
…able-delete-shipment-tracking

Issue/woo 4806 suspendable delete shipment tracking
  • Loading branch information
0nko committed Oct 15, 2021
2 parents 930debb + d7507f7 commit 2cac57a
Show file tree
Hide file tree
Showing 6 changed files with 88 additions and 120 deletions.
Expand Up @@ -21,7 +21,6 @@ import org.wordpress.android.fluxc.module.ResponseMockingInterceptor
import org.wordpress.android.fluxc.network.rest.wpcom.wc.order.CoreOrderStatus
import org.wordpress.android.fluxc.network.rest.wpcom.wc.order.OrderRestClient
import org.wordpress.android.fluxc.persistence.OrderSqlUtils
import org.wordpress.android.fluxc.store.WCOrderStore.DeleteOrderShipmentTrackingResponsePayload
import org.wordpress.android.fluxc.store.WCOrderStore.FetchHasOrdersResponsePayload
import org.wordpress.android.fluxc.store.WCOrderStore.FetchOrderShipmentProvidersResponsePayload
import org.wordpress.android.fluxc.store.WCOrderStore.FetchOrderStatusOptionsResponsePayload
Expand Down Expand Up @@ -474,22 +473,17 @@ class MockedStack_WCOrdersTest : MockedStack_Base() {
}

@Test
fun testDeleteOrderShipmentTrackingSuccess() {
fun testDeleteOrderShipmentTrackingSuccess() = runBlocking {
val orderModel = WCOrderModel(5).apply { localSiteId = siteModel.id }
val trackingModel = WCOrderShipmentTrackingModel().apply {
remoteTrackingId = "95bb641d79d7c6974001d6a03fbdabc0"
}

interceptor.respondWith("wc-delete-order-shipment-tracking-success.json")
orderRestClient.deleteShipmentTrackingForOrder(
val payload = orderRestClient.deleteShipmentTrackingForOrder(
siteModel, orderModel.id, orderModel.remoteOrderId, trackingModel
)

countDownLatch = CountDownLatch(1)
assertTrue(countDownLatch.await(TestUtils.DEFAULT_TIMEOUT_MS.toLong(), MILLISECONDS))

assertEquals(WCOrderAction.DELETED_ORDER_SHIPMENT_TRACKING, lastAction!!.type)
val payload = lastAction!!.payload as DeleteOrderShipmentTrackingResponsePayload
assertNull(payload.error)
assertNotNull(payload.tracking)

Expand Down
Expand Up @@ -4,11 +4,11 @@ import kotlinx.coroutines.runBlocking
import org.greenrobot.eventbus.Subscribe
import org.greenrobot.eventbus.ThreadMode
import org.junit.Assert.assertEquals
import org.junit.Assert.assertFalse
import org.junit.Assert.assertNotNull
import org.junit.Assert.assertTrue
import org.junit.Test
import org.wordpress.android.fluxc.TestUtils
import org.wordpress.android.fluxc.action.WCOrderAction.DELETE_ORDER_SHIPMENT_TRACKING
import org.wordpress.android.fluxc.example.BuildConfig
import org.wordpress.android.fluxc.generated.WCOrderActionBuilder
import org.wordpress.android.fluxc.model.WCOrderModel
Expand All @@ -19,7 +19,6 @@ import org.wordpress.android.fluxc.store.WCOrderStore
import org.wordpress.android.fluxc.store.WCOrderStore.AddOrderShipmentTrackingPayload
import org.wordpress.android.fluxc.store.WCOrderStore.DeleteOrderShipmentTrackingPayload
import org.wordpress.android.fluxc.store.WCOrderStore.FetchOrderShipmentProvidersPayload
import org.wordpress.android.fluxc.store.WCOrderStore.OnOrderChanged
import org.wordpress.android.fluxc.store.WCOrderStore.OnOrderShipmentProvidersChanged
import org.wordpress.android.fluxc.store.WCOrderStore.OrderError
import java.text.SimpleDateFormat
Expand All @@ -31,7 +30,6 @@ import javax.inject.Inject
class ReleaseStack_WCOrderExtTest : ReleaseStack_WCBase() {
internal enum class TestEvent {
NONE,
DELETE_ORDER_SHIPMENT_TRACKING,
FETCHED_ORDER_SHIPMENT_PROVIDERS
}

Expand Down Expand Up @@ -149,13 +147,11 @@ class ReleaseStack_WCOrderExtTest : ReleaseStack_WCBase() {
/*
* TEST 2: Delete the previously added shipment tracking record
*/
nextEvent = TestEvent.DELETE_ORDER_SHIPMENT_TRACKING
mCountDownLatch = CountDownLatch(1)

mDispatcher.dispatch(WCOrderActionBuilder.newDeleteOrderShipmentTrackingAction(
DeleteOrderShipmentTrackingPayload(sSite, orderModel.id, orderModel.remoteOrderId, trackingResult!!)))
assertTrue(mCountDownLatch.await(TestUtils.DEFAULT_TIMEOUT_MS.toLong(), MILLISECONDS))
val onOrderChanged = orderStore.deleteOrderShipmentTracking(
DeleteOrderShipmentTrackingPayload(sSite, orderModel.id, orderModel.remoteOrderId, trackingResult!!)
)

assertFalse(onOrderChanged.isError)
// Verify the tracking record is no longer in the database
var currentCount = trackings.size
trackings = orderStore.getShipmentTrackingsForOrder(sSite, orderModel.id)
Expand Down Expand Up @@ -218,13 +214,11 @@ class ReleaseStack_WCOrderExtTest : ReleaseStack_WCBase() {
/*
* TEST 2: Delete the previously added shipment tracking record
*/
nextEvent = TestEvent.DELETE_ORDER_SHIPMENT_TRACKING
mCountDownLatch = CountDownLatch(1)

mDispatcher.dispatch(WCOrderActionBuilder.newDeleteOrderShipmentTrackingAction(
DeleteOrderShipmentTrackingPayload(sSite, orderModel.id, orderModel.remoteOrderId, trackingResult!!)))
assertTrue(mCountDownLatch.await(TestUtils.DEFAULT_TIMEOUT_MS.toLong(), MILLISECONDS))
val onOrderChanged = orderStore.deleteOrderShipmentTracking(
DeleteOrderShipmentTrackingPayload(sSite, orderModel.id, orderModel.remoteOrderId, trackingResult!!)
)

assertFalse(onOrderChanged.isError)
// Verify the tracking record is no longer in the database
var currentCount = trackings.size
trackings = orderStore.getShipmentTrackingsForOrder(sSite, orderModel.id)
Expand Down Expand Up @@ -259,24 +253,6 @@ class ReleaseStack_WCOrderExtTest : ReleaseStack_WCBase() {
assertTrue(providers.isNotEmpty())
}

@Suppress("unused")
@Subscribe(threadMode = ThreadMode.MAIN)
fun onOrderChanged(event: OnOrderChanged) {
event.error?.let {
throw AssertionError("OnOrderChanged has unexpected error: " + it.type)
}

lastEvent = event

when (event.causeOfChange) {
DELETE_ORDER_SHIPMENT_TRACKING -> {
assertEquals(TestEvent.DELETE_ORDER_SHIPMENT_TRACKING, nextEvent)
mCountDownLatch.countDown()
}
else -> throw AssertionError("Unexpected cause of change: " + event.causeOfChange)
}
}

@Suppress("unused")
@Subscribe(threadMode = ThreadMode.MAIN)
fun onOrderShipmentProvidersChanged(event: OnOrderShipmentProvidersChanged) {
Expand Down
Expand Up @@ -13,7 +13,6 @@ import kotlinx.coroutines.launch
import org.greenrobot.eventbus.Subscribe
import org.greenrobot.eventbus.ThreadMode
import org.wordpress.android.fluxc.Dispatcher
import org.wordpress.android.fluxc.action.WCOrderAction.DELETE_ORDER_SHIPMENT_TRACKING
import org.wordpress.android.fluxc.action.WCOrderAction.FETCH_HAS_ORDERS
import org.wordpress.android.fluxc.action.WCOrderAction.FETCH_ORDERS
import org.wordpress.android.fluxc.action.WCOrderAction.FETCH_ORDERS_COUNT
Expand Down Expand Up @@ -59,7 +58,6 @@ class WooOrdersFragment : StoreSelectingFragment(), WCAddOrderShipmentTrackingDi

private var pendingFetchOrdersFilter: List<String>? = null
private var pendingFetchCompletedOrders: Boolean = false
private var pendingDeleteShipmentTracking: WCOrderShipmentTrackingModel? = null
private var pendingOpenAddShipmentTracking: Boolean = false

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? =
Expand Down Expand Up @@ -331,11 +329,19 @@ class WooOrdersFragment : StoreSelectingFragment(), WCAddOrderShipmentTrackingDi
"remoteOrderId: ${order.remoteOrderId}")

wcOrderStore.getShipmentTrackingsForOrder(site, order.id).firstOrNull()?.let { tracking ->
pendingDeleteShipmentTracking = tracking
val payload = DeleteOrderShipmentTrackingPayload(
site, order.id, order.remoteOrderId, tracking
)
dispatcher.dispatch(WCOrderActionBuilder.newDeleteOrderShipmentTrackingAction(payload))
coroutineScope.launch {
val onOrderChanged = wcOrderStore.deleteOrderShipmentTracking(
DeleteOrderShipmentTrackingPayload(
site, order.id, order.remoteOrderId, tracking
)
)
onOrderChanged.takeUnless { it.isError }?.let {
prependToLog(
"Shipment tracking deleted successfully! " +
"[${onOrderChanged.rowsAffected}] db rows affected."
)
} ?: prependToLog("Shipment tracking deletion FAILED!")
}
} ?: prependToLog("No shipment trackings in the db for remoteOrderId: $remoteOrderId, " +
"please fetch records first for this order")
} ?: prependToLog("No order found in the db for remoteOrderId: $remoteOrderId, " +
Expand Down Expand Up @@ -445,13 +451,6 @@ class WooOrdersFragment : StoreSelectingFragment(), WCAddOrderShipmentTrackingDi
val hasOrders = event.rowsAffected > 0
prependToLog("Store has orders: $hasOrders")
}
DELETE_ORDER_SHIPMENT_TRACKING -> {
pendingDeleteShipmentTracking?.let {
prependToLog("Shipment tracking deleted successfully! [${event.rowsAffected}] db rows " +
"affected.")
pendingDeleteShipmentTracking = null
}
}
else -> prependToLog("Order store was updated from a " + event.causeOfChange)
}
}
Expand Down
Expand Up @@ -3,8 +3,6 @@
import org.wordpress.android.fluxc.annotations.Action;
import org.wordpress.android.fluxc.annotations.ActionEnum;
import org.wordpress.android.fluxc.annotations.action.IAction;
import org.wordpress.android.fluxc.store.WCOrderStore.DeleteOrderShipmentTrackingPayload;
import org.wordpress.android.fluxc.store.WCOrderStore.DeleteOrderShipmentTrackingResponsePayload;
import org.wordpress.android.fluxc.store.WCOrderStore.FetchHasOrdersPayload;
import org.wordpress.android.fluxc.store.WCOrderStore.FetchHasOrdersResponsePayload;
import org.wordpress.android.fluxc.store.WCOrderStore.FetchOrderListPayload;
Expand Down Expand Up @@ -43,8 +41,6 @@ public enum WCOrderAction implements IAction {
SEARCH_ORDERS,
@Action(payloadType = FetchOrderStatusOptionsPayload.class)
FETCH_ORDER_STATUS_OPTIONS,
@Action(payloadType = DeleteOrderShipmentTrackingPayload.class)
DELETE_ORDER_SHIPMENT_TRACKING,
@Action(payloadType = FetchOrderShipmentProvidersPayload.class)
FETCH_ORDER_SHIPMENT_PROVIDERS,

Expand All @@ -63,8 +59,6 @@ public enum WCOrderAction implements IAction {
SEARCHED_ORDERS,
@Action(payloadType = FetchOrderStatusOptionsResponsePayload.class)
FETCHED_ORDER_STATUS_OPTIONS,
@Action(payloadType = DeleteOrderShipmentTrackingResponsePayload.class)
DELETED_ORDER_SHIPMENT_TRACKING,
@Action(payloadType = FetchOrderShipmentProvidersResponsePayload.class)
FETCHED_ORDER_SHIPMENT_PROVIDERS
}
Expand Up @@ -622,43 +622,53 @@ class OrderRestClient @Inject constructor(
* via the Jetpack tunnel (see [JetpackTunnelGsonRequest].
*
* Note this is currently not supported in v3, but will be in the future.
*
* Dispatches a [WCOrderAction.DELETED_ORDER_SHIPMENT_TRACKING] action with the results
*/
fun deleteShipmentTrackingForOrder(
suspend fun deleteShipmentTrackingForOrder(
site: SiteModel,
localOrderId: Int,
remoteOrderId: Long,
tracking: WCOrderShipmentTrackingModel
) {
): DeleteOrderShipmentTrackingResponsePayload {
val url = WOOCOMMERCE.orders.id(remoteOrderId)
.shipment_trackings.tracking(tracking.remoteTrackingId).pathV2

val responseType = object : TypeToken<OrderShipmentTrackingApiResponse>() {}.type
val params = emptyMap<String, String>()
val request = JetpackTunnelGsonRequest.buildDeleteRequest(url, site.siteId, params, responseType,
{ response: OrderShipmentTrackingApiResponse? ->
val trackingResponse = response?.let {
orderShipmentTrackingResponseToModel(it).apply {
localSiteId = site.id
this.localOrderId = localOrderId
id = tracking.id
}
val response = jetpackTunnelGsonRequestBuilder.syncDeleteRequest(
this,
site,
url,
OrderShipmentTrackingApiResponse::class.java
)
return when (response) {
is JetpackSuccess -> {
response.data?.let {
val model = orderShipmentTrackingResponseToModel(it).apply {
localSiteId = site.id
this.localOrderId = localOrderId
id = tracking.id
}

val payload = DeleteOrderShipmentTrackingResponsePayload(
site, localOrderId, remoteOrderId, trackingResponse
)
dispatcher.dispatch(WCOrderActionBuilder.newDeletedOrderShipmentTrackingAction(payload))
},
WPComErrorListener { networkError ->
val trackingsError = networkErrorToOrderError(networkError)
val payload = DeleteOrderShipmentTrackingResponsePayload(
trackingsError, site, localOrderId, remoteOrderId, tracking
DeleteOrderShipmentTrackingResponsePayload(
site,
localOrderId,
remoteOrderId,
model
)
dispatcher.dispatch(WCOrderActionBuilder.newDeletedOrderShipmentTrackingAction(payload))
})
add(request)
} ?: DeleteOrderShipmentTrackingResponsePayload(
OrderError(type = GENERIC_ERROR, message = "Success response with empty data"),
site,
localOrderId,
remoteOrderId,
tracking
)
}
is JetpackError -> {
DeleteOrderShipmentTrackingResponsePayload(
networkErrorToOrderError(response.error),
site,
localOrderId,
remoteOrderId,
tracking
)
}
}
}

/**
Expand Down
Expand Up @@ -436,8 +436,6 @@ class WCOrderStore @Inject constructor(
WCOrderAction.SEARCH_ORDERS -> searchOrders(action.payload as SearchOrdersPayload)
WCOrderAction.FETCH_ORDER_STATUS_OPTIONS ->
fetchOrderStatusOptions(action.payload as FetchOrderStatusOptionsPayload)
WCOrderAction.DELETE_ORDER_SHIPMENT_TRACKING ->
deleteOrderShipmentTracking(action.payload as DeleteOrderShipmentTrackingPayload)
WCOrderAction.FETCH_ORDER_SHIPMENT_PROVIDERS ->
fetchOrderShipmentProviders(action.payload as FetchOrderShipmentProvidersPayload)

Expand All @@ -454,8 +452,6 @@ class WCOrderStore @Inject constructor(
WCOrderAction.SEARCHED_ORDERS -> handleSearchOrdersCompleted(action.payload as SearchOrdersResponsePayload)
WCOrderAction.FETCHED_ORDER_STATUS_OPTIONS ->
handleFetchOrderStatusOptionsCompleted(action.payload as FetchOrderStatusOptionsResponsePayload)
WCOrderAction.DELETED_ORDER_SHIPMENT_TRACKING ->
handleDeleteOrderShipmentTrackingCompleted(action.payload as DeleteOrderShipmentTrackingResponsePayload)
WCOrderAction.FETCHED_ORDER_SHIPMENT_PROVIDERS ->
handleFetchOrderShipmentProvidersCompleted(
action.payload as FetchOrderShipmentProvidersResponsePayload)
Expand Down Expand Up @@ -613,22 +609,36 @@ class WCOrderStore @Inject constructor(
}

suspend fun addOrderShipmentTracking(payload: AddOrderShipmentTrackingPayload): OnOrderChanged {
val result = with(payload) {
wcOrderRestClient.addOrderShipmentTrackingForOrder(
site, localOrderId, remoteOrderId, tracking, isCustomProvider
)
}
return coroutineEngine.withDefaultContext(T.API, this, "addOrderShipmentTracking") {
val result = with(payload) {
wcOrderRestClient.addOrderShipmentTrackingForOrder(
site, localOrderId, remoteOrderId, tracking, isCustomProvider
)
}

return if (result.isError) {
OnOrderChanged(0).also { it.error = result.error }
} else {
val rowsAffected = result.tracking?.let { OrderSqlUtils.insertOrIgnoreOrderShipmentTracking(it) } ?: 0
OnOrderChanged(rowsAffected)
return@withDefaultContext if (result.isError) {
OnOrderChanged(0).also { it.error = result.error }
} else {
val rowsAffected = result.tracking?.let { OrderSqlUtils.insertOrIgnoreOrderShipmentTracking(it) } ?: 0
OnOrderChanged(rowsAffected)
}
}
}

private fun deleteOrderShipmentTracking(payload: DeleteOrderShipmentTrackingPayload) {
with(payload) { wcOrderRestClient.deleteShipmentTrackingForOrder(site, localOrderId, remoteOrderId, tracking) }
suspend fun deleteOrderShipmentTracking(payload: DeleteOrderShipmentTrackingPayload): OnOrderChanged {
return coroutineEngine.withDefaultContext(T.API, this, "addOrderShipmentTracking") {
val result = with(payload) {
wcOrderRestClient.deleteShipmentTrackingForOrder(site, localOrderId, remoteOrderId, tracking)
}

return@withDefaultContext if (result.isError) {
OnOrderChanged(0).also { it.error = result.error }
} else {
// Remove the record from the database and send response
val rowsAffected = result.tracking?.let { OrderSqlUtils.deleteOrderShipmentTrackingById(it) } ?: 0
OnOrderChanged(rowsAffected)
}
}
}

private fun fetchOrderShipmentProviders(payload: FetchOrderShipmentProvidersPayload) {
Expand Down Expand Up @@ -823,21 +833,6 @@ class WCOrderStore @Inject constructor(
emitChange(onOrderStatusLabelsChanged)
}

private fun handleDeleteOrderShipmentTrackingCompleted(payload: DeleteOrderShipmentTrackingResponsePayload) {
val onOrderChanged: OnOrderChanged

if (payload.isError) {
onOrderChanged = OnOrderChanged(0).also { it.error = payload.error }
} else {
// Remove the record from the database and send response
val rowsAffected = payload.tracking?.let { OrderSqlUtils.deleteOrderShipmentTrackingById(it) } ?: 0
onOrderChanged = OnOrderChanged(rowsAffected)
}

onOrderChanged.causeOfChange = WCOrderAction.DELETE_ORDER_SHIPMENT_TRACKING
emitChange(onOrderChanged)
}

private fun handleFetchOrderShipmentProvidersCompleted(
payload: FetchOrderShipmentProvidersResponsePayload
) {
Expand Down

0 comments on commit 2cac57a

Please sign in to comment.