Skip to content

Fix incorrect image upload error message #11493

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 24 commits into from
May 15, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
43ffd4c
Add a new feature flag for dynamic dashboard M2
hichamboushaba May 9, 2024
ee0f775
Update the widgets store to add new cards when enabled
hichamboushaba May 9, 2024
1c4541a
Use the view's lifecycle owner instead of fragment's one
hichamboushaba May 10, 2024
53d96e7
Remove the toolbar callback when the fragment's view is destroyed
hichamboushaba May 10, 2024
aa4a166
Merge pull request #11485 from woocommerce/merge/18.6-code-freeze-int…
samiuelson May 10, 2024
5496f82
Merge branch 'trunk' into dynamic-dashboard/feature-flag-m2
hichamboushaba May 10, 2024
7c3391b
Introduce a common component to use as header of the filterable cards
hichamboushaba May 10, 2024
58c5a93
Merge pull request #11475 from woocommerce/dynamic-dashboard/feature-…
0nko May 10, 2024
e734909
Merge pull request #11488 from woocommerce/dynamic-dashboard/filter-h…
hichamboushaba May 11, 2024
c0aad30
Merge branch 'trunk' into products/attempt-fix-crash
hichamboushaba May 13, 2024
b8867f0
Add a release notes entry
hichamboushaba May 13, 2024
796a359
Merge pull request #11484 from woocommerce/products/attempt-fix-crash
hichamboushaba May 13, 2024
e2dd7e7
Woo POS FF
kidinov May 13, 2024
bc8f3b6
POS button to MORE menu
kidinov May 13, 2024
213de23
Added tests
kidinov May 13, 2024
c6199cc
Dummy WooPosActivity with opening it from the fragment
kidinov May 13, 2024
30bb126
Merge pull request #11502 from woocommerce/11494-woo-pos-ff-entry-poi…
samiuelson May 13, 2024
5ed1a5c
Merge pull request #11492 from woocommerce/merge/18.6-rc-2-into-trunk
samiuelson May 13, 2024
fd623f0
Remove unused code
0nko May 13, 2024
900d37e
Use the correct private site check
0nko May 13, 2024
b03c8a0
Merge branch 'refs/heads/trunk' into fix/image-upload-error
0nko May 14, 2024
fe6ed3b
Revert last merge commit
0nko May 14, 2024
ea0892e
Fix the unit tests
0nko May 14, 2024
dcd4c0c
Fix the broken unit tests
0nko May 15, 2024
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
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ import android.text.TextUtils
import com.woocommerce.android.ui.plans.domain.FREE_TRIAL_PLAN_ID
import com.woocommerce.android.util.WooLog
import org.wordpress.android.fluxc.model.SiteModel
import org.wordpress.android.fluxc.store.SiteStore.SiteVisibility
import org.wordpress.android.fluxc.store.SiteStore.SiteVisibility.PUBLIC
import org.wordpress.android.fluxc.utils.SiteUtils.getNormalizedTimezone
import org.wordpress.android.fluxc.utils.extensions.slashJoin
Expand Down Expand Up @@ -74,14 +73,5 @@ val SiteModel?.isFreeTrial: Boolean
val SiteModel?.isSitePublic: Boolean
get() = this?.let { !isWPComAtomic || publishedStatus == PUBLIC.value() } ?: false

val SiteModel?.isSitePrivate: Boolean
get() = this?.publishedStatus == SiteVisibility.PRIVATE.value()

val SiteModel.isEligibleForAI: Boolean
get() = isWPComAtomic || planActiveFeatures.orEmpty().contains("ai-assistant")

val SiteModel?.isWooExpressSiteReadyToUse: Boolean
get() = this?.isJetpackInstalled == true &&
this.isJetpackConnected &&
this.isWpComStore &&
this.hasWooCommerce
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,6 @@ import com.woocommerce.android.extensions.fastStripHtml
import com.woocommerce.android.extensions.getList
import com.woocommerce.android.extensions.isEligibleForAI
import com.woocommerce.android.extensions.isEmpty
import com.woocommerce.android.extensions.isSitePrivate
import com.woocommerce.android.extensions.isSitePublic
import com.woocommerce.android.extensions.orNullIfEmpty
import com.woocommerce.android.extensions.removeItem
Expand Down Expand Up @@ -171,7 +170,7 @@ class ProductDetailViewModel @Inject constructor(
// view state for the product detail screen
val productDetailViewStateData = LiveDataDelegate(
savedState = savedState,
initialValue = ProductDetailViewState(areImagesAvailable = !selectedSite.get().isSitePrivate)
initialValue = ProductDetailViewState(areImagesAvailable = !selectedSite.get().isPrivate)
) { old, new ->
if (old?.productDraft != new.productDraft || old?.draftPassword != new.draftPassword) {
new.productDraft?.let {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import com.woocommerce.android.media.ProductImagesServiceWrapper
import com.woocommerce.android.model.RequestResult
import com.woocommerce.android.model.VariantOption
import com.woocommerce.android.tools.NetworkStatus
import com.woocommerce.android.tools.SelectedSite
import com.woocommerce.android.ui.media.MediaFileUploadHandler
import com.woocommerce.android.ui.products.ParameterRepository
import com.woocommerce.android.ui.products.ProductTestUtils
Expand Down Expand Up @@ -40,6 +41,7 @@ import org.mockito.kotlin.spy
import org.mockito.kotlin.stub
import org.mockito.kotlin.verify
import org.mockito.kotlin.whenever
import org.wordpress.android.fluxc.model.SiteModel
import org.wordpress.android.fluxc.store.WooCommerceStore

@ExperimentalCoroutinesApi
Expand Down Expand Up @@ -78,6 +80,10 @@ class ProductDetailViewModelGenerateVariationFlowTest : BaseUnitTest() {
private val product = ProductTestUtils.generateProduct(PRODUCT_REMOTE_ID)
private val isWindowClassLargeThanCompact: IsWindowClassLargeThanCompact = mock()

private var selectedSite: SelectedSite = mock {
on { get() } doReturn SiteModel().apply { setIsPrivate(false) }
}

private lateinit var viewModel: ProductDetailViewModel

@Before
Expand Down Expand Up @@ -111,7 +117,7 @@ class ProductDetailViewModelGenerateVariationFlowTest : BaseUnitTest() {
generateVariationCandidates = generateVariationCandidates,
duplicateProduct = mock(),
tracker = tracker,
selectedSite = mock(),
selectedSite = selectedSite,
getProductQuantityRules = mock(),
getBundledProductsCount = mock(),
getComponentProducts = mock(),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,6 @@ import org.mockito.kotlin.whenever
import org.wordpress.android.fluxc.model.MediaModel
import org.wordpress.android.fluxc.model.SiteModel
import org.wordpress.android.fluxc.store.MediaStore
import org.wordpress.android.fluxc.store.SiteStore.SiteVisibility
import org.wordpress.android.fluxc.store.WCProductStore
import org.wordpress.android.fluxc.store.WooCommerceStore
import java.math.BigDecimal
Expand All @@ -78,9 +77,6 @@ class ProductDetailViewModelTest : BaseUnitTest() {
private val productTagsRepository: ProductTagsRepository = mock()
private val mediaFilesRepository: MediaFilesRepository = mock()
private val variationRepository: VariationRepository = mock()
private var selectedSite: SelectedSite = mock {
on { get() } doReturn SiteModel()
}

private val resources: ResourceProvider = mock {
on(it.getString(any())).thenAnswer { i -> i.arguments[0].toString() }
Expand Down Expand Up @@ -131,12 +127,16 @@ class ProductDetailViewModelTest : BaseUnitTest() {

private lateinit var viewModel: ProductDetailViewModel

private var selectedSite: SelectedSite = mock {
on { get() } doReturn SiteModel().apply { setIsPrivate(false) }
}

private val productWithParameters = ProductDetailViewModel.ProductDetailViewState(
productDraft = product,
auxiliaryState = ProductDetailViewModel.ProductDetailViewState.AuxiliaryState.None,
uploadingImageUris = emptyList(),
showBottomSheetButton = true,
areImagesAvailable = false,
areImagesAvailable = true,
)

private val expectedCards = listOf(
Expand Down Expand Up @@ -1067,22 +1067,10 @@ class ProductDetailViewModelTest : BaseUnitTest() {
@Test
fun `given selected site is private, when product detail is opened, then images are not available`() = testBlocking {
// GIVEN
viewModel.start()

// WHEN
var productData: ProductDetailViewModel.ProductDetailViewState? = null
viewModel.productDetailViewStateData.observeForever { _, new -> productData = new }

// THEN
Assertions.assertThat(productData?.areImagesAvailable).isFalse()
}

@Test
fun `given selected site is public, when product detail is opened, then images are available`() = testBlocking {
// GIVEN
selectedSite = mock {
on { get() } doReturn SiteModel().apply { publishedStatus = SiteVisibility.COMING_SOON.value() }
val selectedSite: SelectedSite = mock {
on { get() } doReturn SiteModel().apply { setIsPrivate(true) }
}

savedState = ProductDetailFragmentArgs(ProductDetailFragment.Mode.ShowProduct(PRODUCT_REMOTE_ID))
.toSavedStateHandle()
viewModel = spy(
Expand Down Expand Up @@ -1114,52 +1102,19 @@ class ProductDetailViewModelTest : BaseUnitTest() {
isWindowClassLargeThanCompact = isWindowClassLargeThanCompact,
)
)
viewModel.start()

// WHEN
var productData: ProductDetailViewModel.ProductDetailViewState? = null
viewModel.productDetailViewStateData.observeForever { _, new -> productData = new }

// THEN
Assertions.assertThat(productData?.areImagesAvailable).isTrue()
Assertions.assertThat(productData?.areImagesAvailable).isFalse()
}

@Test
fun `given selected site is coming soon, when product detail is opened, then images are available`() = testBlocking {
fun `given selected site is public, when product detail is opened, then images are available`() = testBlocking {
// GIVEN
selectedSite = mock {
on { get() } doReturn SiteModel().apply { publishedStatus = SiteVisibility.COMING_SOON.value() }
}
savedState = ProductDetailFragmentArgs(ProductDetailFragment.Mode.ShowProduct(PRODUCT_REMOTE_ID))
.toSavedStateHandle()
viewModel = spy(
ProductDetailViewModel(
savedState = savedState,
dispatchers = coroutinesTestRule.testDispatchers,
parameterRepository = parameterRepository,
productRepository = productRepository,
networkStatus = networkStatus,
currencyFormatter = currencyFormatter,
resources = resources,
productCategoriesRepository = productCategoriesRepository,
productTagsRepository = productTagsRepository,
mediaFilesRepository = mediaFilesRepository,
variationRepository = variationRepository,
mediaFileUploadHandler = mediaFileUploadHandler,
appPrefsWrapper = prefsWrapper,
addonRepository = addonRepository,
generateVariationCandidates = generateVariationCandidates,
duplicateProduct = mock(),
tracker = tracker,
selectedSite = selectedSite,
getProductQuantityRules = mock(),
getBundledProductsCount = mock(),
getComponentProducts = mock(),
productListRepository = mock(),
isBlazeEnabled = isBlazeEnabled,
isProductCurrentlyPromoted = mock(),
isWindowClassLargeThanCompact = isWindowClassLargeThanCompact,
)
)
viewModel.start()

// WHEN
Expand Down
Loading