diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/packages/WooShippingLabelPackageCreationFragment.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/packages/WooShippingLabelPackageCreationFragment.kt index 8f6391eab0cc..790675534ab5 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/packages/WooShippingLabelPackageCreationFragment.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/packages/WooShippingLabelPackageCreationFragment.kt @@ -17,6 +17,7 @@ import com.woocommerce.android.ui.compose.theme.WooThemeWithBackground import com.woocommerce.android.ui.orders.wooshippinglabels.packages.WooShippingLabelPackageCreationViewModel.PackageSelected import com.woocommerce.android.ui.orders.wooshippinglabels.packages.WooShippingLabelPackageCreationViewModel.PackageType import com.woocommerce.android.ui.orders.wooshippinglabels.packages.WooShippingLabelPackageCreationViewModel.ShowPackageTypeDialog +import com.woocommerce.android.ui.orders.wooshippinglabels.packages.ui.PackageData import dagger.hilt.android.AndroidEntryPoint @AndroidEntryPoint diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/packages/WooShippingLabelPackageCreationScreen.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/packages/WooShippingLabelPackageCreationScreen.kt index 24c9826faccd..be2d715990a2 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/packages/WooShippingLabelPackageCreationScreen.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/packages/WooShippingLabelPackageCreationScreen.kt @@ -21,14 +21,14 @@ import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.tooling.preview.Preview import com.woocommerce.android.ui.compose.theme.WooThemeWithBackground -import com.woocommerce.android.ui.orders.wooshippinglabels.packages.WooShippingLabelPackageCreationViewModel.PackageType import com.woocommerce.android.ui.orders.wooshippinglabels.packages.WooShippingLabelPackageCreationViewModel.PageTab import com.woocommerce.android.ui.orders.wooshippinglabels.packages.WooShippingLabelPackageCreationViewModel.PageType.CARRIER import com.woocommerce.android.ui.orders.wooshippinglabels.packages.WooShippingLabelPackageCreationViewModel.PageType.CUSTOM import com.woocommerce.android.ui.orders.wooshippinglabels.packages.WooShippingLabelPackageCreationViewModel.PageType.SAVED -import com.woocommerce.android.ui.orders.wooshippinglabels.packages.forms.WooShippingCarrierPackageScreen -import com.woocommerce.android.ui.orders.wooshippinglabels.packages.forms.WooShippingCustomPackageCreationScreen -import com.woocommerce.android.ui.orders.wooshippinglabels.packages.forms.WooShippingSavedPackageScreen +import com.woocommerce.android.ui.orders.wooshippinglabels.packages.ui.PackageData +import com.woocommerce.android.ui.orders.wooshippinglabels.packages.ui.WooShippingCarrierPackageScreen +import com.woocommerce.android.ui.orders.wooshippinglabels.packages.ui.WooShippingCustomPackageCreationScreen +import com.woocommerce.android.ui.orders.wooshippinglabels.packages.ui.WooShippingSavedPackageScreen @Composable fun WooShippingLabelPackageCreationScreen( @@ -126,31 +126,22 @@ fun WooShippingLabelsPackageCreationScreenPreview() { WooShippingSavedPackageScreen( savedPackages = listOf( PackageData( - type = PackageType.ENVELOPE, name = "Small Flat Rate Box", - description = "USPS Priority Mail Flat Rate Boxes", - length = "10", - width = "10", - height = "10", - isSelected = true + dimensions = "10 x 10 x 10 cm", + isSelected = true, + isLetter = true ), PackageData( - type = PackageType.BOX, name = "Small Flat Rate Box", - description = "Custom package", - length = "20", - width = "20", - height = "20", - isSelected = false + dimensions = "20 x 20 x 20 cm", + isSelected = false, + isLetter = false ), PackageData( - type = PackageType.BOX, name = "Small Flat Rate Box", - description = "DHL Express", - length = "30", - width = "30", - height = "30", - isSelected = false + dimensions = "30 x 30 x 30 cm", + isSelected = false, + isLetter = false ) ), isAddPackageEnabled = true, diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/packages/WooShippingLabelPackageCreationViewModel.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/packages/WooShippingLabelPackageCreationViewModel.kt index 5b90808d7e3b..46df8e85ff49 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/packages/WooShippingLabelPackageCreationViewModel.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/packages/WooShippingLabelPackageCreationViewModel.kt @@ -5,14 +5,20 @@ import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.asLiveData import androidx.lifecycle.viewModelScope import com.woocommerce.android.R -import com.woocommerce.android.ui.orders.wooshippinglabels.packages.datasource.FetchCarrierPackagesFromStore -import com.woocommerce.android.ui.orders.wooshippinglabels.packages.datasource.FetchSavedPackagesFromStore +import com.woocommerce.android.ui.orders.wooshippinglabels.packages.datasource.FetchPredefinedPackagesFromStore +import com.woocommerce.android.ui.orders.wooshippinglabels.packages.ui.Carrier +import com.woocommerce.android.ui.orders.wooshippinglabels.packages.ui.CarrierPackageGroup +import com.woocommerce.android.ui.orders.wooshippinglabels.packages.ui.CarrierPackageSelection +import com.woocommerce.android.ui.orders.wooshippinglabels.packages.ui.CustomPackageCreationData +import com.woocommerce.android.ui.orders.wooshippinglabels.packages.ui.PackageData +import com.woocommerce.android.ui.orders.wooshippinglabels.packages.ui.SavedPackageSelection import com.woocommerce.android.viewmodel.MultiLiveEvent import com.woocommerce.android.viewmodel.ResourceProvider import com.woocommerce.android.viewmodel.ScopedViewModel import com.woocommerce.android.viewmodel.getStateFlow import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.update +import kotlinx.coroutines.launch import kotlinx.parcelize.Parcelize import javax.inject.Inject @@ -20,8 +26,7 @@ import javax.inject.Inject class WooShippingLabelPackageCreationViewModel @Inject constructor( savedState: SavedStateHandle, private val resourceProvider: ResourceProvider, - private val fetchSavedPackages: FetchSavedPackagesFromStore, - private val fetchCarrierPackages: FetchCarrierPackagesFromStore + private val fetchPredefinedPackages: FetchPredefinedPackagesFromStore ) : ScopedViewModel(savedState) { private val _viewState = savedState.getStateFlow( @@ -47,11 +52,15 @@ class WooShippingLabelPackageCreationViewModel @Inject constructor( ) init { - _viewState.update { viewState -> - viewState.copy( - savedPackageSelection = SavedPackageSelection(fetchSavedPackages()), - carrierPackageSection = CarrierPackageSelection(fetchCarrierPackages()) - ) + launch { + fetchPredefinedPackages()?.let { + _viewState.update { viewState -> + viewState.copy( + savedPackageSelection = it.savedPackageSelection, + carrierPackageSection = it.carrierPackageSelection + ) + } + } } } @@ -90,7 +99,7 @@ class WooShippingLabelPackageCreationViewModel @Inject constructor( fun onAddCustomPackageClick() { _viewState.value.customPackageCreationData - .asPackageData + .toPackageData() .let { triggerEvent(PackageSelected(it)) } } diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/packages/components/WooShippingPackageListItem.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/packages/components/WooShippingPackageListItem.kt index 8cc58273b7f9..a14de381e29a 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/packages/components/WooShippingPackageListItem.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/packages/components/WooShippingPackageListItem.kt @@ -12,10 +12,11 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.res.colorResource +import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import com.woocommerce.android.R import com.woocommerce.android.ui.compose.component.SelectionCheck -import com.woocommerce.android.ui.orders.wooshippinglabels.packages.PackageData +import com.woocommerce.android.ui.orders.wooshippinglabels.packages.ui.PackageData @Composable fun WooSavedPackageListItem( @@ -39,7 +40,7 @@ fun WooSavedPackageListItem( ) Column(verticalArrangement = Arrangement.spacedBy(4.dp)) { Text( - text = packageData.description, + text = stringResource(id = packageData.descriptionResId), style = MaterialTheme.typography.caption, color = colorResource(id = R.color.color_on_surface_disabled) ) @@ -48,7 +49,7 @@ fun WooSavedPackageListItem( style = MaterialTheme.typography.body1 ) Text( - text = packageData.dimensionsForDisplay, + text = packageData.dimensions, style = MaterialTheme.typography.body2 ) } diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/packages/datasource/FetchCarrierPackagesFromStore.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/packages/datasource/FetchCarrierPackagesFromStore.kt deleted file mode 100644 index 2ee95f8bfadf..000000000000 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/packages/datasource/FetchCarrierPackagesFromStore.kt +++ /dev/null @@ -1,99 +0,0 @@ -package com.woocommerce.android.ui.orders.wooshippinglabels.packages.datasource - -import com.woocommerce.android.R -import com.woocommerce.android.ui.orders.wooshippinglabels.packages.Carrier -import com.woocommerce.android.ui.orders.wooshippinglabels.packages.CarrierPackageGroup -import com.woocommerce.android.ui.orders.wooshippinglabels.packages.PackageData -import com.woocommerce.android.ui.orders.wooshippinglabels.packages.WooShippingLabelPackageCreationViewModel.PackageType -import javax.inject.Inject - -class FetchCarrierPackagesFromStore @Inject constructor() { - @Suppress("LongMethod") - operator fun invoke(): Map> { - // This is a mocked response. - // When fully implemented, this will be sorted from the Shipping plugin API. - return mapOf( - Carrier( - id = "dhl", - name = "DHL Express", - logoRes = R.drawable.dhl_logo - ) to listOf( - CarrierPackageGroup( - groupName = "Group 1", - packages = listOf( - PackageData( - type = PackageType.BOX, - name = "Package 1 - Carrier 1", - description = "Description 1", - length = "10", - width = "10", - height = "10", - isSelected = false - ), - PackageData( - type = PackageType.BOX, - name = "Package 2 - Carrier 1", - description = "Description 2", - length = "20", - width = "20", - height = "20", - isSelected = false - ) - ) - ), - CarrierPackageGroup( - groupName = "Group 2", - packages = listOf( - PackageData( - type = PackageType.BOX, - name = "Package 3 - Carrier 1", - description = "Description 3", - length = "30", - width = "30", - height = "30", - isSelected = false - ), - PackageData( - type = PackageType.BOX, - name = "Package 4 - Carrier 1", - description = "Description 4", - length = "40", - width = "40", - height = "40", - isSelected = false - ) - ) - ) - ), - Carrier( - id = "usps", - name = "USPS", - logoRes = R.drawable.usps_logo - ) to listOf( - CarrierPackageGroup( - groupName = "Group 2", - packages = listOf( - PackageData( - type = PackageType.BOX, - name = "Package 1 - Carrier 2", - description = "Description 1", - length = "10", - width = "10", - height = "10", - isSelected = false - ), - PackageData( - type = PackageType.BOX, - name = "Package 2 Carrier - 2", - description = "Description 2", - length = "20", - width = "20", - height = "20", - isSelected = false - ) - ) - ) - ) - ) - } -} diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/packages/datasource/FetchPredefinedPackagesFromStore.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/packages/datasource/FetchPredefinedPackagesFromStore.kt new file mode 100644 index 000000000000..42155986aecd --- /dev/null +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/packages/datasource/FetchPredefinedPackagesFromStore.kt @@ -0,0 +1,70 @@ +package com.woocommerce.android.ui.orders.wooshippinglabels.packages.datasource + +import com.woocommerce.android.tools.SelectedSite +import com.woocommerce.android.ui.orders.wooshippinglabels.packages.ui.Carrier +import com.woocommerce.android.ui.orders.wooshippinglabels.packages.ui.CarrierPackageGroup +import com.woocommerce.android.ui.orders.wooshippinglabels.packages.ui.CarrierPackageSelection +import com.woocommerce.android.ui.orders.wooshippinglabels.packages.ui.PackageData +import com.woocommerce.android.ui.orders.wooshippinglabels.packages.ui.SavedPackageSelection +import com.woocommerce.android.ui.orders.wooshippinglabels.packages.ui.StorePredefinedPackages +import javax.inject.Inject + +class FetchPredefinedPackagesFromStore @Inject constructor( + private val selectedSite: SelectedSite, + private val packageRepository: WooShippingLabelPackageRepository +) { + suspend operator fun invoke(): StorePredefinedPackages? { + val storePackages = selectedSite.getOrNull() + ?.let { packageRepository.fetchAllStorePackages(it) } + ?.takeIf { it.isError.not() } + ?.model + ?: return null + + return StorePredefinedPackages( + savedPackageSelection = storePackages + .filterSavedData() + .let { SavedPackageSelection(it) }, + carrierPackageSelection = storePackages + .filterCarrierData() + .let { CarrierPackageSelection(it) } + ) + } + + private fun StorePackagesDAO.filterSavedData() = + savedPackages.map { packageDAO -> + PackageData( + name = packageDAO.name, + dimensions = packageDAO.dimensions, + isSelected = false, + isLetter = packageDAO.isLetter + ) + } + + private fun StorePackagesDAO.filterCarrierData() = mapOf( + carrierPackages + .parseCarrierData(CarrierType.USPS) + .let { Carrier.USPS to it }, + + carrierPackages + .parseCarrierData(CarrierType.DHL) + .let { Carrier.DHL to it } + ) + + private fun Map.parseCarrierData( + carrierType: CarrierType + ) = get(carrierType)?.let { + it.packageGroup.map { group -> + CarrierPackageGroup( + groupName = group.description, + packages = group.packages.map { packageItem -> + PackageData( + name = packageItem.name, + dimensions = packageItem.dimensions, + isSelected = false, + isLetter = packageItem.isLetter + ) + } + ) + } + } ?: emptyList() +} diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/packages/datasource/FetchSavedPackagesFromStore.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/packages/datasource/FetchSavedPackagesFromStore.kt deleted file mode 100644 index e229047f956c..000000000000 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/packages/datasource/FetchSavedPackagesFromStore.kt +++ /dev/null @@ -1,41 +0,0 @@ -package com.woocommerce.android.ui.orders.wooshippinglabels.packages.datasource - -import com.woocommerce.android.ui.orders.wooshippinglabels.packages.PackageData -import com.woocommerce.android.ui.orders.wooshippinglabels.packages.WooShippingLabelPackageCreationViewModel.PackageType -import javax.inject.Inject - -class FetchSavedPackagesFromStore @Inject constructor() { - operator fun invoke(): List { - // This is a mocked response. - // When fully implemented, this will be sorted from the Shipping plugin API. - return listOf( - PackageData( - type = PackageType.ENVELOPE, - name = "Small Flat Rate Box", - description = "USPS Priority Mail Flat Rate Boxes", - length = "10", - width = "10", - height = "10", - isSelected = true - ), - PackageData( - type = PackageType.BOX, - name = "Small Flat Rate Box", - description = "Custom package", - length = "20", - width = "20", - height = "20", - isSelected = false - ), - PackageData( - type = PackageType.BOX, - name = "Small Flat Rate Box", - description = "DHL Express", - length = "30", - width = "30", - height = "30", - isSelected = false - ) - ) - } -} diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/packages/datasource/PackageDAOs.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/packages/datasource/PackageDAOs.kt new file mode 100644 index 000000000000..1e37f06efd54 --- /dev/null +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/packages/datasource/PackageDAOs.kt @@ -0,0 +1,27 @@ +package com.woocommerce.android.ui.orders.wooshippinglabels.packages.datasource + +data class StorePackagesDAO( + val savedPackages: List, + val carrierPackages: Map +) + +data class PackageDAO( + val id: String, + val name: String, + val dimensions: String, + val isLetter: Boolean +) + +data class CarrierDAO( + val packageGroup: List +) + +data class CarrierPackageGroupDAO( + val description: String, + val packages: List +) + +enum class CarrierType { + USPS, + DHL +} diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/packages/datasource/WooShippingLabelPackageMapper.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/packages/datasource/WooShippingLabelPackageMapper.kt index 0ac9296fe112..3ea362d7feae 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/packages/datasource/WooShippingLabelPackageMapper.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/packages/datasource/WooShippingLabelPackageMapper.kt @@ -1,8 +1,7 @@ package com.woocommerce.android.ui.orders.wooshippinglabels.packages.datasource -import com.woocommerce.android.ui.orders.wooshippinglabels.packages.datasource.WooShippingLabelPackageRepository.CarrierGroup -import com.woocommerce.android.ui.orders.wooshippinglabels.packages.datasource.WooShippingLabelPackageRepository.Package -import com.woocommerce.android.ui.orders.wooshippinglabels.packages.datasource.WooShippingLabelPackageRepository.StorePackages +import com.woocommerce.android.ui.orders.wooshippinglabels.packages.datasource.CarrierType.DHL +import com.woocommerce.android.ui.orders.wooshippinglabels.packages.datasource.CarrierType.USPS import com.woocommerce.android.ui.orders.wooshippinglabels.packages.networking.CarrierPackageGroupDTO import com.woocommerce.android.ui.orders.wooshippinglabels.packages.networking.CarrierPredefinedPackagesDTO import com.woocommerce.android.ui.orders.wooshippinglabels.packages.networking.PackageResponse @@ -10,46 +9,58 @@ import com.woocommerce.android.ui.orders.wooshippinglabels.packages.networking.P import javax.inject.Inject class WooShippingLabelPackageMapper @Inject constructor() { - operator fun invoke(response: PackageResponse): StorePackages { + operator fun invoke(response: PackageResponse): StorePackagesDAO { val savedPackagesResponse = response.packages?.saved?.predefined ?: emptyList() - return StorePackages( + return StorePackagesDAO( savedPackages = mapSavedPackages(savedPackagesResponse), carrierPackages = mapCarrierPackages(response.packages?.predefined) ) } - private fun mapSavedPackages(savedResponse: List): List { + private fun mapSavedPackages(savedResponse: List): List { return savedResponse.map { - Package( + PackageDAO( id = it.id.orEmpty(), name = it.name.orEmpty(), - dimensions = it.dimensions.orEmpty() + dimensions = it.dimensions.orEmpty(), + isLetter = it.isLetter ?: false ) } } - private fun mapCarrierPackages(carrierPackagesResponse: CarrierPredefinedPackagesDTO?): List { - return mutableListOf().apply { + private fun mapCarrierPackages( + carrierPackagesResponse: CarrierPredefinedPackagesDTO? + ): Map { + val uspsPackages = mutableListOf().apply { carrierPackagesResponse?.usps?.let { usps -> usps.flatBoxes?.toCarrierGroup()?.let { add(it) } usps.boxes?.toCarrierGroup()?.let { add(it) } usps.expressBoxes?.toCarrierGroup()?.let { add(it) } usps.envelopes?.toCarrierGroup()?.let { add(it) } } + }.let { CarrierDAO(it) } + + val dhlPackages = mutableListOf().apply { carrierPackagesResponse?.dhlExpress?.let { dhl -> dhl.domesticAndInternationalPackages?.toCarrierGroup()?.let { add(it) } } - } + }.let { CarrierDAO(it) } + + return mapOf( + USPS to uspsPackages, + DHL to dhlPackages + ) } - private fun CarrierPackageGroupDTO.toCarrierGroup() = CarrierGroup( + private fun CarrierPackageGroupDTO.toCarrierGroup() = CarrierPackageGroupDAO( description = title.orEmpty(), packages = definitions?.map { - Package( + PackageDAO( id = it.id.orEmpty(), name = it.name.orEmpty(), - dimensions = it.dimensions.orEmpty() + dimensions = it.dimensions.orEmpty(), + isLetter = it.isLetter ?: false ) } ?: emptyList() ) diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/packages/datasource/WooShippingLabelPackageRepository.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/packages/datasource/WooShippingLabelPackageRepository.kt index 9f236b7ebd1a..ad844dfafa85 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/packages/datasource/WooShippingLabelPackageRepository.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/packages/datasource/WooShippingLabelPackageRepository.kt @@ -21,20 +21,4 @@ class WooShippingLabelPackageRepository @Inject constructor( ?.let { WooResult(it) } ?: WooResult(error) } - - data class StorePackages( - val savedPackages: List, - val carrierPackages: List - ) - - data class Package( - val id: String, - val name: String, - val dimensions: String - ) - - data class CarrierGroup( - val description: String, - val packages: List - ) } diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/packages/Models.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/packages/ui/UIModels.kt similarity index 55% rename from WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/packages/Models.kt rename to WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/packages/ui/UIModels.kt index 0e6336662b6f..9971cbe781a7 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/packages/Models.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/packages/ui/UIModels.kt @@ -1,22 +1,64 @@ -package com.woocommerce.android.ui.orders.wooshippinglabels.packages +package com.woocommerce.android.ui.orders.wooshippinglabels.packages.ui import android.os.Parcelable +import com.woocommerce.android.R import com.woocommerce.android.ui.orders.wooshippinglabels.packages.WooShippingLabelPackageCreationViewModel.PackageType import kotlinx.parcelize.Parcelize @Parcelize data class PackageData( - val type: PackageType, val name: String, - val description: String, + val dimensions: String, + val isSelected: Boolean, + val isLetter: Boolean +) : Parcelable { + val descriptionResId: Int + get() = when (isLetter) { + true -> R.string.woo_shipping_labels_package_creation_envelope_type + false -> R.string.woo_shipping_labels_package_creation_box_type + } +} + +@Parcelize +data class PredefinedPackage( + val boxWeight: Double, + val isFlatRate: Boolean, + val id: String, + val name: String, + val dimensions: String, + val maxWeight: Double, + val isLetter: Boolean, + val groupId: String, + val canShipInternational: Boolean +) : Parcelable + +@Parcelize +data class CustomPackageCreationData( + val type: PackageType, val length: String, val width: String, val height: String, - val isSelected: Boolean, - val dimensionUnit: String = "cm" + val saveAsTemplate: Boolean ) : Parcelable { - val dimensionsForDisplay: String - get() = "$length x $width x $height $dimensionUnit" + val isValid: Boolean + get() = height.isNotEmpty() && length.isNotEmpty() && width.isNotEmpty() + + fun toPackageData(dimensionUnit: String = "cm") = PackageData( + name = "", + dimensions = "$length x $width x $height $dimensionUnit", + isSelected = true, + isLetter = type == PackageType.ENVELOPE + ) + + companion object { + val EMPTY = CustomPackageCreationData( + type = PackageType.BOX, + length = "", + width = "", + height = "", + saveAsTemplate = false + ) + } } @Parcelize @@ -26,10 +68,28 @@ data class CarrierPackageGroup( ) : Parcelable @Parcelize -data class Carrier( +sealed class Carrier( val id: String, val name: String, val logoRes: Int? = null, +) : Parcelable { + data object USPS : Carrier( + id = "usps", + name = "USPS", + logoRes = R.drawable.usps_logo + ) + + data object DHL : Carrier( + id = "dhl", + name = "DHL", + logoRes = R.drawable.dhl_logo + ) +} + +@Parcelize +data class StorePredefinedPackages( + val carrierPackageSelection: CarrierPackageSelection, + val savedPackageSelection: SavedPackageSelection ) : Parcelable @Parcelize @@ -49,36 +109,3 @@ data class SavedPackageSelection( val hasSelection: Boolean get() = packages.find { it.isSelected } != null } - -@Parcelize -data class CustomPackageCreationData( - val type: PackageType, - val length: String, - val width: String, - val height: String, - val saveAsTemplate: Boolean -) : Parcelable { - val isValid: Boolean - get() = height.isNotEmpty() && length.isNotEmpty() && width.isNotEmpty() - - val asPackageData: PackageData - get() = PackageData( - type = type, - name = "", - description = "", - length = length, - width = width, - height = height, - isSelected = true - ) - - companion object { - val EMPTY = CustomPackageCreationData( - type = PackageType.BOX, - length = "", - width = "", - height = "", - saveAsTemplate = false - ) - } -} diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/packages/forms/WooShippingCarrierPackageScreen.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/packages/ui/WooShippingCarrierPackageScreen.kt similarity index 78% rename from WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/packages/forms/WooShippingCarrierPackageScreen.kt rename to WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/packages/ui/WooShippingCarrierPackageScreen.kt index 35fdb3027a89..e105d5f4c781 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/packages/forms/WooShippingCarrierPackageScreen.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/packages/ui/WooShippingCarrierPackageScreen.kt @@ -1,4 +1,4 @@ -package com.woocommerce.android.ui.orders.wooshippinglabels.packages.forms +package com.woocommerce.android.ui.orders.wooshippinglabels.packages.ui import androidx.annotation.DrawableRes import androidx.compose.foundation.ExperimentalFoundationApi @@ -39,11 +39,7 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import com.woocommerce.android.R import com.woocommerce.android.ui.compose.theme.WooThemeWithBackground -import com.woocommerce.android.ui.orders.wooshippinglabels.packages.Carrier -import com.woocommerce.android.ui.orders.wooshippinglabels.packages.CarrierPackageGroup -import com.woocommerce.android.ui.orders.wooshippinglabels.packages.PackageData import com.woocommerce.android.ui.orders.wooshippinglabels.packages.WooShippingLabelPackageCreationViewModel -import com.woocommerce.android.ui.orders.wooshippinglabels.packages.WooShippingLabelPackageCreationViewModel.PackageType import com.woocommerce.android.ui.orders.wooshippinglabels.packages.components.WooSavedPackageListItem import kotlinx.coroutines.launch @@ -229,31 +225,21 @@ fun WooShippingCarrierPackageScreenPreview() { WooThemeWithBackground { WooShippingCarrierPackageScreen( carrierPackages = mapOf( - Carrier( - id = "dhl", - name = "DHL Express", - logoRes = R.drawable.dhl_logo - ) to listOf( + Carrier.DHL to listOf( CarrierPackageGroup( groupName = "Group 1", packages = listOf( PackageData( - type = PackageType.BOX, name = "Package 1 - Carrier 1", - description = "Description 1", - length = "10", - width = "10", - height = "10", - isSelected = false + dimensions = "10 x 10 x 10 cm", + isSelected = false, + isLetter = false ), PackageData( - type = PackageType.BOX, name = "Package 2 - Carrier 1", - description = "Description 2", - length = "20", - width = "20", - height = "20", - isSelected = false + dimensions = "20 x 20 x 20 cm", + isSelected = false, + isLetter = false ) ) ), @@ -261,51 +247,35 @@ fun WooShippingCarrierPackageScreenPreview() { groupName = "Group 2", packages = listOf( PackageData( - type = PackageType.BOX, name = "Package 3 - Carrier 1", - description = "Description 3", - length = "30", - width = "30", - height = "30", - isSelected = false + dimensions = "30 x 30 x 30 cm", + isSelected = false, + isLetter = false ), PackageData( - type = PackageType.BOX, name = "Package 4 - Carrier 1", - description = "Description 4", - length = "40", - width = "40", - height = "40", - isSelected = false + dimensions = "40 x 40 x 40 cm", + isSelected = false, + isLetter = false ) ) ) ), - Carrier( - id = "usps", - name = "USPS", - logoRes = R.drawable.usps_logo - ) to listOf( + Carrier.USPS to listOf( CarrierPackageGroup( groupName = "Group 2", packages = listOf( PackageData( - type = PackageType.BOX, name = "Package 1 - Carrier 2", - description = "Description 1", - length = "10", - width = "10", - height = "10", - isSelected = false + dimensions = "10 x 10 x 10 cm", + isSelected = false, + isLetter = false ), PackageData( - type = PackageType.BOX, name = "Package 2 Carrier - 2", - description = "Description 2", - length = "20", - width = "20", - height = "20", - isSelected = false + dimensions = "20 x 20 x 20 cm", + isSelected = false, + isLetter = false ) ) ) diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/packages/forms/WooShippingCustomPackageScreen.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/packages/ui/WooShippingCustomPackageScreen.kt similarity index 99% rename from WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/packages/forms/WooShippingCustomPackageScreen.kt rename to WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/packages/ui/WooShippingCustomPackageScreen.kt index 83bcb39f4398..92b66513eb16 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/packages/forms/WooShippingCustomPackageScreen.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/packages/ui/WooShippingCustomPackageScreen.kt @@ -1,4 +1,4 @@ -package com.woocommerce.android.ui.orders.wooshippinglabels.packages.forms +package com.woocommerce.android.ui.orders.wooshippinglabels.packages.ui import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/packages/forms/WooShippingSavedPackageScreen.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/packages/ui/WooShippingSavedPackageScreen.kt similarity index 78% rename from WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/packages/forms/WooShippingSavedPackageScreen.kt rename to WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/packages/ui/WooShippingSavedPackageScreen.kt index 54e3517c5511..29577581f722 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/packages/forms/WooShippingSavedPackageScreen.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/packages/ui/WooShippingSavedPackageScreen.kt @@ -1,4 +1,4 @@ -package com.woocommerce.android.ui.orders.wooshippinglabels.packages.forms +package com.woocommerce.android.ui.orders.wooshippinglabels.packages.ui import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxSize @@ -17,9 +17,7 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import com.woocommerce.android.R import com.woocommerce.android.ui.compose.theme.WooThemeWithBackground -import com.woocommerce.android.ui.orders.wooshippinglabels.packages.PackageData import com.woocommerce.android.ui.orders.wooshippinglabels.packages.WooShippingLabelPackageCreationViewModel -import com.woocommerce.android.ui.orders.wooshippinglabels.packages.WooShippingLabelPackageCreationViewModel.PackageType import com.woocommerce.android.ui.orders.wooshippinglabels.packages.components.WooSavedPackageListItem @Composable @@ -82,31 +80,22 @@ fun WooShippingSavedPackageScreenPreview() { WooShippingSavedPackageScreen( savedPackages = listOf( PackageData( - type = PackageType.ENVELOPE, name = "Small Flat Rate Box", - description = "USPS Priority Mail Flat Rate Boxes", - length = "10", - width = "10", - height = "10", - isSelected = true + dimensions = "10 x 10 x 10 cm", + isSelected = true, + isLetter = true ), PackageData( - type = PackageType.BOX, name = "Small Flat Rate Box", - description = "Custom package", - length = "20", - width = "20", - height = "20", - isSelected = false + dimensions = "20 x 20 x 20 cm", + isSelected = false, + isLetter = false ), PackageData( - type = PackageType.BOX, name = "Small Flat Rate Box", - description = "DHL Express", - length = "30", - width = "30", - height = "30", - isSelected = false + dimensions = "30 x 30 x 30 cm", + isSelected = false, + isLetter = false ) ), isAddPackageEnabled = true, diff --git a/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/packages/WooShippingLabelPackageCreationViewModelTest.kt b/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/packages/WooShippingLabelPackageCreationViewModelTest.kt index 8784cef11170..a5c3cd6ea210 100644 --- a/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/packages/WooShippingLabelPackageCreationViewModelTest.kt +++ b/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/packages/WooShippingLabelPackageCreationViewModelTest.kt @@ -6,8 +6,14 @@ import com.woocommerce.android.ui.orders.wooshippinglabels.packages.WooShippingL import com.woocommerce.android.ui.orders.wooshippinglabels.packages.WooShippingLabelPackageCreationViewModel.PackageType import com.woocommerce.android.ui.orders.wooshippinglabels.packages.WooShippingLabelPackageCreationViewModel.ShowPackageTypeDialog import com.woocommerce.android.ui.orders.wooshippinglabels.packages.WooShippingLabelPackageCreationViewModel.ViewState -import com.woocommerce.android.ui.orders.wooshippinglabels.packages.datasource.FetchCarrierPackagesFromStore -import com.woocommerce.android.ui.orders.wooshippinglabels.packages.datasource.FetchSavedPackagesFromStore +import com.woocommerce.android.ui.orders.wooshippinglabels.packages.datasource.FetchPredefinedPackagesFromStore +import com.woocommerce.android.ui.orders.wooshippinglabels.packages.ui.Carrier +import com.woocommerce.android.ui.orders.wooshippinglabels.packages.ui.CarrierPackageGroup +import com.woocommerce.android.ui.orders.wooshippinglabels.packages.ui.CarrierPackageSelection +import com.woocommerce.android.ui.orders.wooshippinglabels.packages.ui.CustomPackageCreationData +import com.woocommerce.android.ui.orders.wooshippinglabels.packages.ui.PackageData +import com.woocommerce.android.ui.orders.wooshippinglabels.packages.ui.SavedPackageSelection +import com.woocommerce.android.ui.orders.wooshippinglabels.packages.ui.StorePredefinedPackages import com.woocommerce.android.viewmodel.BaseUnitTest import com.woocommerce.android.viewmodel.MultiLiveEvent import com.woocommerce.android.viewmodel.ResourceProvider @@ -23,8 +29,7 @@ class WooShippingLabelPackageCreationViewModelTest : BaseUnitTest() { private lateinit var sut: WooShippingLabelPackageCreationViewModel private val resourceProvider: ResourceProvider = mock() - private val fetchSavedPackages: FetchSavedPackagesFromStore = mock() - private val fetchCarrierPackages: FetchCarrierPackagesFromStore = mock() + private val fetchPredefinedPackages: FetchPredefinedPackagesFromStore = mock() @Before fun setUp() { @@ -38,12 +43,10 @@ class WooShippingLabelPackageCreationViewModelTest : BaseUnitTest() { resourceProvider.getString(R.string.woo_shipping_labels_package_creation_tab_saved) ).thenReturn("Saved") - whenever(fetchSavedPackages()).thenReturn(emptyList()) sut = WooShippingLabelPackageCreationViewModel( SavedStateHandle(), resourceProvider, - fetchSavedPackages, - fetchCarrierPackages + fetchPredefinedPackages ) } @@ -68,7 +71,7 @@ class WooShippingLabelPackageCreationViewModelTest : BaseUnitTest() { sut.onAddCustomPackageClick() - assertThat(lastEvent).isEqualTo(PackageSelected(customPackageData.asPackageData)) + assertThat(lastEvent).isEqualTo(PackageSelected(customPackageData.toPackageData())) } @Test @@ -138,30 +141,30 @@ class WooShippingLabelPackageCreationViewModelTest : BaseUnitTest() { fun `onSavedPackageSelected selects only one package at a time`() = testBlocking { var lastViewState: ViewState? = null val package1 = PackageData( - type = PackageType.BOX, name = "Package 1", - description = "Description 1", - length = "10", - width = "10", - height = "10", - isSelected = false + dimensions = "10 x 10 x 10 cm", + isSelected = false, + isLetter = false ) val package2 = PackageData( - type = PackageType.ENVELOPE, name = "Package 2", - description = "Description 2", - length = "20", - width = "20", - height = "20", - isSelected = false + dimensions = "20 x 20 x 20 cm", + isSelected = false, + isLetter = true + ) + whenever(fetchPredefinedPackages()).thenReturn( + StorePredefinedPackages( + carrierPackageSelection = CarrierPackageSelection(emptyMap()), + savedPackageSelection = SavedPackageSelection( + listOf(package1, package2) + ) + ) ) - whenever(fetchSavedPackages()).thenReturn(listOf(package1, package2)) sut = WooShippingLabelPackageCreationViewModel( SavedStateHandle(), resourceProvider, - fetchSavedPackages, - fetchCarrierPackages + fetchPredefinedPackages ) sut.viewState.observeForever { lastViewState = it } sut.onSavedPackageSelected(package1, true) @@ -175,24 +178,18 @@ class WooShippingLabelPackageCreationViewModelTest : BaseUnitTest() { @Test fun `onCarrierPackageSelected selects only one package at a time`() = testBlocking { var lastViewState: ViewState? = null - val carrier = Carrier(id = "dhl", name = "DHL Express", logoRes = R.drawable.dhl_logo) + val carrier: Carrier = Carrier.DHL val package1 = PackageData( - type = PackageType.BOX, name = "Package 1", - description = "Description 1", - length = "10", - width = "10", - height = "10", - isSelected = false + dimensions = "10 x 10 x 10 cm", + isSelected = false, + isLetter = false ) val package2 = PackageData( - type = PackageType.ENVELOPE, name = "Package 2", - description = "Description 2", - length = "20", - width = "20", - height = "20", - isSelected = false + dimensions = "20 x 20 x 20 cm", + isSelected = false, + isLetter = true ) val carrierPackages = mapOf( carrier to listOf( @@ -202,13 +199,19 @@ class WooShippingLabelPackageCreationViewModelTest : BaseUnitTest() { ) ) ) - whenever(fetchCarrierPackages()).thenReturn(carrierPackages) + whenever(fetchPredefinedPackages()).thenReturn( + StorePredefinedPackages( + carrierPackageSelection = CarrierPackageSelection(carrierPackages), + savedPackageSelection = SavedPackageSelection( + emptyList() + ) + ) + ) sut = WooShippingLabelPackageCreationViewModel( SavedStateHandle(), resourceProvider, - fetchSavedPackages, - fetchCarrierPackages + fetchPredefinedPackages ) sut.viewState.observeForever { lastViewState = it } sut.onCarrierPackageSelected(package1, true) @@ -225,43 +228,31 @@ class WooShippingLabelPackageCreationViewModelTest : BaseUnitTest() { @Suppress("LongMethod") fun `onCarrierPackageSelected selects only one package at a time with multiple carriers`() = testBlocking { var lastViewState: ViewState? = null - val carrier1 = Carrier(id = "dhl", name = "DHL Express", logoRes = R.drawable.dhl_logo) - val carrier2 = Carrier(id = "usps", name = "USPS", logoRes = R.drawable.usps_logo) + val carrier1: Carrier = Carrier.DHL + val carrier2: Carrier = Carrier.USPS val package1 = PackageData( - type = PackageType.BOX, name = "Package 1 - Carrier 1", - description = "Description 1", - length = "10", - width = "10", - height = "10", - isSelected = false + dimensions = "10 x 10 x 10 cm", + isSelected = false, + isLetter = false ) val package2 = PackageData( - type = PackageType.ENVELOPE, name = "Package 2 - Carrier 1", - description = "Description 2", - length = "20", - width = "20", - height = "20", - isSelected = false + dimensions = "20 x 20 x 20 cm", + isSelected = false, + isLetter = true ) val package3 = PackageData( - type = PackageType.BOX, name = "Package 1 - Carrier 2", - description = "Description 3", - length = "30", - width = "30", - height = "30", - isSelected = false + dimensions = "30 x 30 x 30 cm", + isSelected = false, + isLetter = false ) val package4 = PackageData( - type = PackageType.ENVELOPE, name = "Package 2 - Carrier 2", - description = "Description 4", - length = "40", - width = "40", - height = "40", - isSelected = false + dimensions = "40 x 40 x 40 cm", + isSelected = false, + isLetter = true ) val carrierPackages = mapOf( carrier1 to listOf( @@ -277,13 +268,19 @@ class WooShippingLabelPackageCreationViewModelTest : BaseUnitTest() { ) ) ) - whenever(fetchCarrierPackages()).thenReturn(carrierPackages) + whenever(fetchPredefinedPackages()).thenReturn( + StorePredefinedPackages( + carrierPackageSelection = CarrierPackageSelection(carrierPackages), + savedPackageSelection = SavedPackageSelection( + emptyList() + ) + ) + ) sut = WooShippingLabelPackageCreationViewModel( SavedStateHandle(), resourceProvider, - fetchSavedPackages, - fetchCarrierPackages + fetchPredefinedPackages ) sut.viewState.observeForever { lastViewState = it } sut.onCarrierPackageSelected(package1, true) diff --git a/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/packages/datasource/FetchPredefinedPackagesFromStoreTest.kt b/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/packages/datasource/FetchPredefinedPackagesFromStoreTest.kt new file mode 100644 index 000000000000..0a6bc832511f --- /dev/null +++ b/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/packages/datasource/FetchPredefinedPackagesFromStoreTest.kt @@ -0,0 +1,121 @@ +package com.woocommerce.android.ui.orders.wooshippinglabels.packages.datasource + +import com.woocommerce.android.tools.SelectedSite +import com.woocommerce.android.ui.orders.wooshippinglabels.packages.ui.Carrier +import com.woocommerce.android.ui.orders.wooshippinglabels.packages.ui.CarrierPackageGroup +import com.woocommerce.android.ui.orders.wooshippinglabels.packages.ui.PackageData +import com.woocommerce.android.viewmodel.BaseUnitTest +import kotlinx.coroutines.ExperimentalCoroutinesApi +import org.assertj.core.api.Assertions.assertThat +import org.junit.Test +import org.mockito.kotlin.mock +import org.mockito.kotlin.whenever +import org.wordpress.android.fluxc.model.SiteModel +import org.wordpress.android.fluxc.network.BaseRequest +import org.wordpress.android.fluxc.network.rest.wpcom.wc.WooError +import org.wordpress.android.fluxc.network.rest.wpcom.wc.WooErrorType +import org.wordpress.android.fluxc.network.rest.wpcom.wc.WooResult + +@OptIn(ExperimentalCoroutinesApi::class) +class FetchPredefinedPackagesFromStoreTest : BaseUnitTest() { + + private val packageRepository: WooShippingLabelPackageRepository = mock() + private val selectedSite: SelectedSite = mock() + private val fetchPredefinedPackagesFromStore = FetchPredefinedPackagesFromStore( + selectedSite, + packageRepository + ) + + @Test + fun `invoke should return StorePredefinedPackages with carrier and saved packages`() = testBlocking { + val storePackages = generatePackagesData() + val site = SiteModel().apply { id = 1 } + whenever(selectedSite.getOrNull()).thenReturn(site) + whenever(packageRepository.fetchAllStorePackages(site)).thenReturn(WooResult(storePackages)) + + val result = fetchPredefinedPackagesFromStore()!! + + assertThat(result.savedPackageSelection.packages).containsExactly( + PackageData( + name = "Saved Package 1", + dimensions = "dimensions", + isSelected = false, + isLetter = false + ), + PackageData( + name = "Saved Package 2", + dimensions = "dimensions", + isSelected = false, + isLetter = false + ) + ) + assertThat(result.carrierPackageSelection.carrierPackages[Carrier.USPS]).containsExactly( + CarrierPackageGroup( + groupName = "Group 1", + packages = listOf( + PackageData( + name = "Carrier Package 1", + dimensions = "dimensions", + isSelected = false, + isLetter = false + ) + ) + ) + ) + } + + @Test + fun `invoke should return null StorePredefinedPackages when fetchAllStorePackages returns error`() = testBlocking { + val error = WooError(WooErrorType.GENERIC_ERROR, BaseRequest.GenericErrorType.UNKNOWN) + val site = SiteModel().apply { id = 1 } + whenever(selectedSite.getOrNull()).thenReturn(site) + whenever(packageRepository.fetchAllStorePackages(site)).thenReturn(WooResult(error)) + + val result = fetchPredefinedPackagesFromStore() + + assertThat(result).isNull() + } + + @Test + fun `invoke should return null StorePredefinedPackages when site is not available`() = testBlocking { + whenever(selectedSite.getOrNull()).thenReturn(null) + + val result = fetchPredefinedPackagesFromStore() + + assertThat(result).isNull() + } + + private fun generatePackagesData() = StorePackagesDAO( + savedPackages = listOf( + PackageDAO( + id = "1", + name = "Saved Package 1", + dimensions = "dimensions", + isLetter = false + ), + PackageDAO( + id = "2", + name = "Saved Package 2", + dimensions = "dimensions", + isLetter = false + ) + ), + carrierPackages = mapOf( + CarrierType.USPS to CarrierDAO( + packageGroup = listOf( + CarrierPackageGroupDAO( + description = "Group 1", + packages = listOf( + PackageDAO( + id = "1", + name = "Carrier Package 1", + dimensions = "dimensions", + isLetter = false + ) + ) + ) + ) + ) + ) + ) +} diff --git a/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/packages/datasource/WooShippingLabelPackageRepositoryTest.kt b/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/packages/datasource/WooShippingLabelPackageRepositoryTest.kt index 3bd5e3424a09..be057e3fc93d 100644 --- a/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/packages/datasource/WooShippingLabelPackageRepositoryTest.kt +++ b/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/packages/datasource/WooShippingLabelPackageRepositoryTest.kt @@ -33,18 +33,18 @@ class WooShippingLabelPackageRepositoryTest : BaseUnitTest() { @Test fun `fetchAllStorePackages returns WooResult with result`() = testBlocking { - val storePackages = WooShippingLabelPackageRepository.StorePackages( + val storePackagesDAO = StorePackagesDAO( savedPackages = listOf(), - carrierPackages = listOf() + carrierPackages = mapOf() ) val packageResponse = mock() whenever(packageRestClient.fetchShippingLabelPackages(siteModel)).thenReturn(WooPayload(packageResponse)) - whenever(packageMapper(packageResponse)).thenReturn(storePackages) + whenever(packageMapper(packageResponse)).thenReturn(storePackagesDAO) val result = repository.fetchAllStorePackages() assertThat(result.isError).isFalse - assertThat(storePackages).isEqualTo(result.model) + assertThat(storePackagesDAO).isEqualTo(result.model) } @Test