Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -133,6 +133,9 @@ interface WCDatabaseModule {
@Provides internal fun provideRevenueStatsDao(database: WCAndroidDatabase) = database.revenueStatsDao

@Provides internal fun provideShippingLabelDao(database: WCAndroidDatabase) = database.shippingLabelDao

@Provides internal fun provideShippingLabelCreationEligibilityDao(database: WCAndroidDatabase) =
database.shippingLabelCreationEligibilityDao
}
@Binds fun bindTransactionExecutor(database: WCAndroidDatabase): TransactionExecutor
}
Original file line number Diff line number Diff line change
@@ -1,26 +1,19 @@
package org.wordpress.android.fluxc.model.shippinglabels

import com.yarolegovich.wellsql.core.Identifiable
import com.yarolegovich.wellsql.core.annotation.Column
import com.yarolegovich.wellsql.core.annotation.PrimaryKey
import com.yarolegovich.wellsql.core.annotation.Table
import org.wordpress.android.fluxc.persistence.WellSqlConfig
import androidx.room.Entity
import org.wordpress.android.fluxc.model.LocalOrRemoteId.LocalId
import org.wordpress.android.fluxc.model.LocalOrRemoteId.RemoteId

@Table(addOn = WellSqlConfig.ADDON_WOOCOMMERCE)
class WCShippingLabelCreationEligibility(@PrimaryKey @Column private var id: Int = 0) : Identifiable {
@Column var localSiteId = 0
@Column var remoteOrderId = 0L
@Column var canCreatePackage = false
@Column var canCreatePaymentMethod = false
@Column var canCreateCustomsForm = false
@Column var isEligible = false
@JvmName("setIsEligible")
set
@Column var reason: String? = null

override fun setId(id: Int) {
this.id = id
}

override fun getId(): Int = id
}
@Entity(
tableName = "ShippingLabelCreationEligibilityEntity",
primaryKeys = ["localSiteId", "remoteOrderId"]
)
data class WCShippingLabelCreationEligibility(
val localSiteId: LocalId,
val remoteOrderId: RemoteId,
val canCreatePackage: Boolean,
val canCreatePaymentMethod: Boolean,
val canCreateCustomsForm: Boolean,
val isEligible: Boolean,
val reason: String?
)
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ import org.wordpress.android.fluxc.model.WCRevenueStatsModel
import org.wordpress.android.fluxc.model.attribute.WCGlobalAttributeModel
import org.wordpress.android.fluxc.model.customer.WCCustomerModel
import org.wordpress.android.fluxc.model.data.WCLocationModel
import org.wordpress.android.fluxc.model.shippinglabels.WCShippingLabelCreationEligibility
import org.wordpress.android.fluxc.model.shippinglabels.WCShippingLabelModel
import org.wordpress.android.fluxc.model.taxes.TaxBasedOnSettingEntity
import org.wordpress.android.fluxc.model.taxes.TaxRateEntity
Expand Down Expand Up @@ -62,6 +63,7 @@ import org.wordpress.android.fluxc.persistence.dao.ProductsDao
import org.wordpress.android.fluxc.persistence.dao.RefundDao
import org.wordpress.android.fluxc.persistence.dao.RevenueStatsDao
import org.wordpress.android.fluxc.persistence.dao.SettingsDao
import org.wordpress.android.fluxc.persistence.dao.ShippingLabelCreationEligibilityDao
import org.wordpress.android.fluxc.persistence.dao.ShippingLabelDao
import org.wordpress.android.fluxc.persistence.dao.ShippingMethodDao
import org.wordpress.android.fluxc.persistence.dao.TaxBasedOnDao
Expand Down Expand Up @@ -131,7 +133,7 @@ import org.wordpress.android.fluxc.persistence.migrations.MIGRATION_7_8
import org.wordpress.android.fluxc.persistence.migrations.MIGRATION_8_9
import org.wordpress.android.fluxc.persistence.migrations.MIGRATION_9_10

const val WC_DATABASE_VERSION = 75
const val WC_DATABASE_VERSION = 76

@Database(
version = WC_DATABASE_VERSION,
Expand Down Expand Up @@ -185,6 +187,7 @@ const val WC_DATABASE_VERSION = 75
BookingResourceEntity::class,
WCRevenueStatsModel::class,
WCShippingLabelModel::class,
WCShippingLabelCreationEligibility::class,
],
autoMigrations = [
AutoMigration(from = 12, to = 13),
Expand Down Expand Up @@ -241,6 +244,7 @@ const val WC_DATABASE_VERSION = 75
AutoMigration(from = 72, to = 73),
AutoMigration(from = 73, to = 74),
AutoMigration(from = 74, to = 75),
AutoMigration(from = 75, to = 76),
]
)
@TypeConverters(
Expand Down Expand Up @@ -294,6 +298,7 @@ abstract class WCAndroidDatabase : RoomDatabase(), TransactionExecutor {
internal abstract val newVisitorStatsDao: NewVisitorStatsDao
internal abstract val revenueStatsDao: RevenueStatsDao
internal abstract val shippingLabelDao: ShippingLabelDao
internal abstract val shippingLabelCreationEligibilityDao: ShippingLabelCreationEligibilityDao

companion object {
fun buildDb(
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package org.wordpress.android.fluxc.persistence.dao

import androidx.room.Dao
import androidx.room.Query
import androidx.room.Upsert
import org.wordpress.android.fluxc.model.LocalOrRemoteId.LocalId
import org.wordpress.android.fluxc.model.LocalOrRemoteId.RemoteId
import org.wordpress.android.fluxc.model.shippinglabels.WCShippingLabelCreationEligibility

@Dao
internal abstract class ShippingLabelCreationEligibilityDao {

@Upsert
abstract suspend fun upsertShippingLabelCreationEligibility(
eligibility: WCShippingLabelCreationEligibility
)

@Query(
"""
SELECT * FROM ShippingLabelCreationEligibilityEntity
WHERE localSiteId = :siteId
AND remoteOrderId = :orderId
LIMIT 1
"""
)
abstract suspend fun getShippingLabelCreationEligibility(
siteId: LocalId,
orderId: RemoteId
): WCShippingLabelCreationEligibility?
}
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ import org.wordpress.android.fluxc.network.rest.wpcom.wc.shippinglabels.Shipping
import org.wordpress.android.fluxc.network.rest.wpcom.wc.shippinglabels.ShippingLabelRestClient.GetPackageTypesResponse.FormSchema.PackageOption.PackageDefinition
import org.wordpress.android.fluxc.network.rest.wpcom.wc.shippinglabels.ShippingLabelStatusApiResponse
import org.wordpress.android.fluxc.network.rest.wpcom.wc.shippinglabels.UpdateSettingsApiRequest
import org.wordpress.android.fluxc.persistence.WCShippingLabelSqlUtils
import org.wordpress.android.fluxc.persistence.dao.ShippingLabelCreationEligibilityDao
import org.wordpress.android.fluxc.persistence.dao.ShippingLabelDao
import org.wordpress.android.fluxc.tools.CoroutineEngine
import org.wordpress.android.fluxc.utils.Poller
Expand All @@ -48,11 +48,12 @@ import javax.inject.Singleton
private const val PURCHASE_SHIPPING_LABELS_DELAY = 2000L

@Singleton
class WCShippingLabelStore @Inject constructor(
class WCShippingLabelStore @Inject internal constructor(
private val restClient: ShippingLabelRestClient,
private val coroutineEngine: CoroutineEngine,
private val mapper: WCShippingLabelMapper,
private val shippingLabelDao: ShippingLabelDao
private val shippingLabelDao: ShippingLabelDao,
private val shippingLabelCreationEligibilityDao: ShippingLabelCreationEligibilityDao
) {
/**
* returns a list of shipping labels for an order from the database
Expand Down Expand Up @@ -139,8 +140,12 @@ class WCShippingLabelStore @Inject constructor(
canCreatePaymentMethod: Boolean,
canCreateCustomsForm: Boolean
): WCShippingLabelCreationEligibility? {
val eligibility = WCShippingLabelSqlUtils.getSLCreationEligibilityForOrder(site.id, orderId)
?: return null
val eligibility = runBlocking {
shippingLabelCreationEligibilityDao.getShippingLabelCreationEligibility(
site.localId(),
RemoteId(orderId)
)
} ?: return null

return if (eligibility.canCreatePackage == canCreatePackage &&
eligibility.canCreatePaymentMethod == canCreatePaymentMethod &&
Expand Down Expand Up @@ -171,16 +176,16 @@ class WCShippingLabelStore @Inject constructor(
WooResult(response.error)
}
response.result != null -> {
val eligibility = WCShippingLabelCreationEligibility().apply {
this.localSiteId = site.id
this.remoteOrderId = orderId
this.canCreatePackage = canCreatePackage
this.canCreatePaymentMethod = canCreatePaymentMethod
this.canCreateCustomsForm = canCreateCustomsForm
this.isEligible = response.result.isEligible
this.reason = response.result.reason
}
WCShippingLabelSqlUtils.insertOrUpdateSLCreationEligibility(eligibility)
val eligibility = WCShippingLabelCreationEligibility(
localSiteId = site.localId(),
remoteOrderId = RemoteId(orderId),
canCreatePackage = canCreatePackage,
canCreatePaymentMethod = canCreatePaymentMethod,
canCreateCustomsForm = canCreateCustomsForm,
isEligible = response.result.isEligible,
reason = response.result.reason
)
shippingLabelCreationEligibilityDao.upsertShippingLabelCreationEligibility(eligibility)

WooResult(eligibility)
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,146 @@
package org.wordpress.android.fluxc.persistence.dao

import android.app.Application
import androidx.test.core.app.ApplicationProvider
import kotlinx.coroutines.test.runTest
import org.assertj.core.api.Assertions.assertThat
import org.junit.Before
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
import org.robolectric.RobolectricTestRunner
import org.wordpress.android.fluxc.model.LocalOrRemoteId.LocalId
import org.wordpress.android.fluxc.model.LocalOrRemoteId.RemoteId
import org.wordpress.android.fluxc.model.shippinglabels.WCShippingLabelCreationEligibility
import org.wordpress.android.fluxc.persistence.DatabaseTestRule

@RunWith(RobolectricTestRunner::class)
class ShippingLabelCreationEligibilityDaoTest {

private lateinit var dao: ShippingLabelCreationEligibilityDao

@Rule
@JvmField
val databaseRule = DatabaseTestRule(ApplicationProvider.getApplicationContext<Application>())

private val defaultSiteId = LocalId(6)
private val defaultOrderId = RemoteId(12L)

@Before
fun setUp() {
dao = databaseRule.db.shippingLabelCreationEligibilityDao
}

@Test
fun `when eligibility is upserted, then it can be retrieved`() = runTest {
val eligibility = generateEligibility(
siteId = defaultSiteId,
orderId = defaultOrderId,
isEligible = true
)
dao.upsertShippingLabelCreationEligibility(eligibility)

val result = dao.getShippingLabelCreationEligibility(defaultSiteId, defaultOrderId)

assertThat(result).isEqualTo(eligibility)
}

@Test
fun `when eligibility does not exist, then null is returned`() = runTest {
val result = dao.getShippingLabelCreationEligibility(defaultSiteId, defaultOrderId)

assertThat(result).isNull()
}

@Test
fun `when eligibility is updated, then changes are persisted`() = runTest {
val eligibility = generateEligibility(
siteId = defaultSiteId,
orderId = defaultOrderId,
isEligible = false,
canCreatePackage = false
)
dao.upsertShippingLabelCreationEligibility(eligibility)

val updatedEligibility = eligibility.copy(
isEligible = true,
canCreatePackage = true,
reason = null
)
dao.upsertShippingLabelCreationEligibility(updatedEligibility)
val result = dao.getShippingLabelCreationEligibility(defaultSiteId, defaultOrderId)

assertThat(result).isEqualTo(updatedEligibility)
}

@Test
fun `when multiple eligibilities exist for different sites, then they can be retrieved separately`() = runTest {
val siteId1 = LocalId(1)
val siteId2 = LocalId(2)
val orderId = RemoteId(100L)

val eligibility1 = generateEligibility(siteId = siteId1, orderId = orderId, isEligible = true)
val eligibility2 = generateEligibility(siteId = siteId2, orderId = orderId, isEligible = false)

dao.upsertShippingLabelCreationEligibility(eligibility1)
dao.upsertShippingLabelCreationEligibility(eligibility2)

val result1 = dao.getShippingLabelCreationEligibility(siteId1, orderId)
val result2 = dao.getShippingLabelCreationEligibility(siteId2, orderId)

assertThat(result1).isEqualTo(eligibility1)
assertThat(result2).isEqualTo(eligibility2)
}

@Test
fun `when multiple eligibilities exist for different orders, then they can be retrieved separately`() = runTest {
val orderId1 = RemoteId(100L)
val orderId2 = RemoteId(200L)

val eligibility1 = generateEligibility(siteId = defaultSiteId, orderId = orderId1, isEligible = true)
val eligibility2 = generateEligibility(siteId = defaultSiteId, orderId = orderId2, isEligible = false)

dao.upsertShippingLabelCreationEligibility(eligibility1)
dao.upsertShippingLabelCreationEligibility(eligibility2)

val result1 = dao.getShippingLabelCreationEligibility(defaultSiteId, orderId1)
val result2 = dao.getShippingLabelCreationEligibility(defaultSiteId, orderId2)

assertThat(result1).isEqualTo(eligibility1)
assertThat(result2).isEqualTo(eligibility2)
}

@Test
fun `when eligibility is not eligible with reason, then reason is persisted`() = runTest {
val reason = "Missing shipping address"
val eligibility = generateEligibility(
siteId = defaultSiteId,
orderId = defaultOrderId,
isEligible = false,
reason = reason
)

dao.upsertShippingLabelCreationEligibility(eligibility)
val result = dao.getShippingLabelCreationEligibility(defaultSiteId, defaultOrderId)

assertThat(result).isEqualTo(eligibility)
}

private fun generateEligibility(
siteId: LocalId,
orderId: RemoteId,
canCreatePackage: Boolean = false,
canCreatePaymentMethod: Boolean = false,
canCreateCustomsForm: Boolean = false,
isEligible: Boolean = false,
reason: String? = "test reason"
) = WCShippingLabelCreationEligibility(
localSiteId = siteId,
remoteOrderId = orderId,
canCreatePackage = canCreatePackage,
canCreatePaymentMethod = canCreatePaymentMethod,
canCreateCustomsForm = canCreateCustomsForm,
isEligible = isEligible,
reason = reason
)
}
Loading