diff --git a/WooCommerce/Classes/ViewRelated/Products/Add Product/AddProductCoordinator.swift b/WooCommerce/Classes/ViewRelated/Products/Add Product/AddProductCoordinator.swift index 7c2520248a6..02195e22938 100644 --- a/WooCommerce/Classes/ViewRelated/Products/Add Product/AddProductCoordinator.swift +++ b/WooCommerce/Classes/ViewRelated/Products/Add Product/AddProductCoordinator.swift @@ -62,6 +62,7 @@ final class AddProductCoordinator: Coordinator { private var addProductWithAIEligibilityChecker: ProductCreationAIEligibilityCheckerProtocol private var addProductWithAIBottomSheetPresenter: BottomSheetPresenter? + private let siteCIABEligibilityChecker: CIABEligibilityCheckerProtocol private let wooSubscriptionProductsEligibilityChecker: WooSubscriptionProductsEligibilityCheckerProtocol @@ -73,6 +74,7 @@ final class AddProductCoordinator: Coordinator { sourceNavigationController: UINavigationController, storage: StorageManagerType = ServiceLocator.storageManager, addProductWithAIEligibilityChecker: ProductCreationAIEligibilityCheckerProtocol = ProductCreationAIEligibilityChecker(), + siteCIABEligibilityChecker: CIABEligibilityCheckerProtocol = CIABEligibilityChecker(), productImageUploader: ProductImageUploaderProtocol = ServiceLocator.productImageUploader, analytics: Analytics = ServiceLocator.analytics, isFirstProduct: Bool, @@ -96,6 +98,7 @@ final class AddProductCoordinator: Coordinator { self.storage = storage self.addProductWithAIEligibilityChecker = addProductWithAIEligibilityChecker self.wooSubscriptionProductsEligibilityChecker = WooSubscriptionProductsEligibilityChecker(siteID: siteID, storage: storage) + self.siteCIABEligibilityChecker = siteCIABEligibilityChecker self.analytics = analytics self.isFirstProduct = isFirstProduct self.navigateToProductForm = navigateToProductForm @@ -152,7 +155,8 @@ private extension AddProductCoordinator { let viewProperties = BottomSheetListSelectorViewProperties(subtitle: subtitle) let command = ProductTypeBottomSheetListSelectorCommand( source: .creationForm, - subscriptionProductsEligibilityChecker: wooSubscriptionProductsEligibilityChecker + subscriptionProductsEligibilityChecker: wooSubscriptionProductsEligibilityChecker, + siteCIABEligibilityChecker: siteCIABEligibilityChecker ) { [weak self] selectedBottomSheetProductType in guard let self else { return } self.analytics.track(event: .ProductCreation diff --git a/WooCommerce/Classes/ViewRelated/Products/Edit Product/BottomSheetListSelector/ProductTypeBottomSheetListSelectorCommand.swift b/WooCommerce/Classes/ViewRelated/Products/Edit Product/BottomSheetListSelector/ProductTypeBottomSheetListSelectorCommand.swift index 9daad5b9377..1f0d07e6c75 100644 --- a/WooCommerce/Classes/ViewRelated/Products/Edit Product/BottomSheetListSelector/ProductTypeBottomSheetListSelectorCommand.swift +++ b/WooCommerce/Classes/ViewRelated/Products/Edit Product/BottomSheetListSelector/ProductTypeBottomSheetListSelectorCommand.swift @@ -16,9 +16,9 @@ final class ProductTypeBottomSheetListSelectorCommand: BottomSheetListSelectorCo .simple(isVirtual: false), .simple(isVirtual: true), isEligibleForSubscriptionProducts ? .subscription : nil, - .variable, + siteCIABEligibilityChecker.isFeatureSupportedForCurrentSite(.variableProducts) ? .variable : nil, isEligibleForSubscriptionProducts ? .variableSubscription : nil, - .grouped, + siteCIABEligibilityChecker.isFeatureSupportedForCurrentSite(.groupedProducts) ? .grouped : nil, .affiliate ].compactMap { $0 } @@ -35,13 +35,16 @@ final class ProductTypeBottomSheetListSelectorCommand: BottomSheetListSelectorCo private let source: Source private let onSelection: (BottomSheetProductType) -> Void private let isEligibleForSubscriptionProducts: Bool + private let siteCIABEligibilityChecker: CIABEligibilityCheckerProtocol init(source: Source, subscriptionProductsEligibilityChecker: WooSubscriptionProductsEligibilityCheckerProtocol, + siteCIABEligibilityChecker: CIABEligibilityCheckerProtocol = CIABEligibilityChecker(), onSelection: @escaping (BottomSheetProductType) -> Void) { self.source = source self.onSelection = onSelection self.isEligibleForSubscriptionProducts = subscriptionProductsEligibilityChecker.isSiteEligible() + self.siteCIABEligibilityChecker = siteCIABEligibilityChecker if case let .editForm(selected) = source { self.selected = selected } else { diff --git a/WooCommerce/Classes/ViewRelated/Products/Edit Product/ProductFormViewController.swift b/WooCommerce/Classes/ViewRelated/Products/Edit Product/ProductFormViewController.swift index 16985fefbbd..0ecc0e06e26 100644 --- a/WooCommerce/Classes/ViewRelated/Products/Edit Product/ProductFormViewController.swift +++ b/WooCommerce/Classes/ViewRelated/Products/Edit Product/ProductFormViewController.swift @@ -79,6 +79,7 @@ final class ProductFormViewController: private let aiEligibilityChecker: ProductFormAIEligibilityChecker private var descriptionAICoordinator: ProductDescriptionAICoordinator? private let subscriptionProductsEligibilityChecker: WooSubscriptionProductsEligibilityCheckerProtocol + private let siteCIABEligibilityChecker: CIABEligibilityCheckerProtocol = CIABEligibilityChecker() private lazy var tooltipUseCase = ProductDescriptionAITooltipUseCase(isDescriptionAIEnabled: aiEligibilityChecker.isFeatureEnabled(.description)) private var didShowTooltip = false { @@ -1630,7 +1631,8 @@ private extension ProductFormViewController { let productType = BottomSheetProductType(productType: viewModel.productModel.productType, isVirtual: viewModel.productModel.virtual) let command = ProductTypeBottomSheetListSelectorCommand( source: .editForm(selected: productType), - subscriptionProductsEligibilityChecker: subscriptionProductsEligibilityChecker + subscriptionProductsEligibilityChecker: subscriptionProductsEligibilityChecker, + siteCIABEligibilityChecker: siteCIABEligibilityChecker ) { [weak self] (selectedProductType) in self?.dismiss(animated: true, completion: nil) diff --git a/WooCommerce/WooCommerceTests/Mocks/MockCIABEligibilityChecker.swift b/WooCommerce/WooCommerceTests/Mocks/MockCIABEligibilityChecker.swift index d2507f01465..c2164f25a90 100644 --- a/WooCommerce/WooCommerceTests/Mocks/MockCIABEligibilityChecker.swift +++ b/WooCommerce/WooCommerceTests/Mocks/MockCIABEligibilityChecker.swift @@ -22,7 +22,7 @@ final class MockCIABEligibilityChecker: CIABEligibilityCheckerProtocol { } func isFeatureSupportedForCurrentSite(_ feature: CIABAffectedFeature) -> Bool { - return !mockedCIABDisabledFeatures.contains(feature) + return !mockedCIABDisabledFeatures.contains(feature) || !isCurrentSiteCIAB } func isFeatureSupported(_ feature: CIABAffectedFeature, for site: Site) -> Bool { diff --git a/WooCommerce/WooCommerceTests/ViewRelated/Products/BottomSheetListSelector/ProductTypeBottomSheetListSelectorCommandTests.swift b/WooCommerce/WooCommerceTests/ViewRelated/Products/BottomSheetListSelector/ProductTypeBottomSheetListSelectorCommandTests.swift index d0d2e330409..450eb9e59ca 100644 --- a/WooCommerce/WooCommerceTests/ViewRelated/Products/BottomSheetListSelector/ProductTypeBottomSheetListSelectorCommandTests.swift +++ b/WooCommerce/WooCommerceTests/ViewRelated/Products/BottomSheetListSelector/ProductTypeBottomSheetListSelectorCommandTests.swift @@ -120,4 +120,72 @@ final class ProductTypeBottomSheetListSelectorCommandTests: XCTestCase { ] XCTAssertEqual(selectedActions, expectedActions) } + + func test_creation_form_data_does_not_contain_grouped_and_variable_types_if_site_is_ciab() { + // Given + let subscriptionEligibilityChecker = MockWooSubscriptionProductsEligibilityChecker(isEligible: true) + let siteCIABEligibilityChecker = MockCIABEligibilityChecker(mockedIsCurrentSiteCIAB: true) + + // When + let command = ProductTypeBottomSheetListSelectorCommand( + source: .creationForm, + subscriptionProductsEligibilityChecker: subscriptionEligibilityChecker, + siteCIABEligibilityChecker: siteCIABEligibilityChecker + ) { _ in } + + // Then + XCTAssertFalse(command.data.contains(.grouped), "'command.data' should not contain grouped product type") + XCTAssertFalse(command.data.contains(.variable), "'command.data' should not contain variable product type") + } + + func test_creation_form_data_contains_grouped_and_variable_types_if_site_is_non_ciab_and_other_requirements_met() { + // Given + let subscriptionEligibilityChecker = MockWooSubscriptionProductsEligibilityChecker(isEligible: true) + let siteCIABEligibilityChecker = MockCIABEligibilityChecker(mockedIsCurrentSiteCIAB: false) + + // When + let command = ProductTypeBottomSheetListSelectorCommand( + source: .creationForm, + subscriptionProductsEligibilityChecker: subscriptionEligibilityChecker, + siteCIABEligibilityChecker: siteCIABEligibilityChecker + ) { _ in } + + // Then + XCTAssertTrue(command.data.contains(.grouped), "'command.data' should contain grouped product type") + XCTAssertTrue(command.data.contains(.variable), "'command.data' should contain variable product type") + } + + func test_edit_form_data_does_not_contain_grouped_and_variable_types_if_site_is_ciab() { + // Given + let subscriptionEligibilityChecker = MockWooSubscriptionProductsEligibilityChecker(isEligible: true) + let siteCIABEligibilityChecker = MockCIABEligibilityChecker(mockedIsCurrentSiteCIAB: true) + + // When + let command = ProductTypeBottomSheetListSelectorCommand( + source: .editForm(selected: .simple(isVirtual: false)), + subscriptionProductsEligibilityChecker: subscriptionEligibilityChecker, + siteCIABEligibilityChecker: siteCIABEligibilityChecker + ) { _ in } + + // Then + XCTAssertFalse(command.data.contains(.grouped), "'command.data' should not contain grouped product type") + XCTAssertFalse(command.data.contains(.variable), "'command.data' should not contain variable product type") + } + + func test_edit_form_data_contains_grouped_and_variable_types_if_site_is_non_ciab_and_other_requirements_met() { + // Given + let subscriptionEligibilityChecker = MockWooSubscriptionProductsEligibilityChecker(isEligible: true) + let siteCIABEligibilityChecker = MockCIABEligibilityChecker(mockedIsCurrentSiteCIAB: false) + + // When + let command = ProductTypeBottomSheetListSelectorCommand( + source: .editForm(selected: .simple(isVirtual: false)), + subscriptionProductsEligibilityChecker: subscriptionEligibilityChecker, + siteCIABEligibilityChecker: siteCIABEligibilityChecker + ) { _ in } + + // Then + XCTAssertTrue(command.data.contains(.grouped), "'command.data' should contain grouped product type") + XCTAssertTrue(command.data.contains(.variable), "'command.data' should contain variable product type") + } }