Skip to content

Commit ff2f8ee

Browse files
[CIAB] Hide grouped and variable products types from selector (#16130)
2 parents 396948d + 433d647 commit ff2f8ee

File tree

5 files changed

+82
-5
lines changed

5 files changed

+82
-5
lines changed

WooCommerce/Classes/ViewRelated/Products/Add Product/AddProductCoordinator.swift

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ final class AddProductCoordinator: Coordinator {
6262

6363
private var addProductWithAIEligibilityChecker: ProductCreationAIEligibilityCheckerProtocol
6464
private var addProductWithAIBottomSheetPresenter: BottomSheetPresenter?
65+
private let siteCIABEligibilityChecker: CIABEligibilityCheckerProtocol
6566

6667
private let wooSubscriptionProductsEligibilityChecker: WooSubscriptionProductsEligibilityCheckerProtocol
6768

@@ -73,6 +74,7 @@ final class AddProductCoordinator: Coordinator {
7374
sourceNavigationController: UINavigationController,
7475
storage: StorageManagerType = ServiceLocator.storageManager,
7576
addProductWithAIEligibilityChecker: ProductCreationAIEligibilityCheckerProtocol = ProductCreationAIEligibilityChecker(),
77+
siteCIABEligibilityChecker: CIABEligibilityCheckerProtocol = CIABEligibilityChecker(),
7678
productImageUploader: ProductImageUploaderProtocol = ServiceLocator.productImageUploader,
7779
analytics: Analytics = ServiceLocator.analytics,
7880
isFirstProduct: Bool,
@@ -96,6 +98,7 @@ final class AddProductCoordinator: Coordinator {
9698
self.storage = storage
9799
self.addProductWithAIEligibilityChecker = addProductWithAIEligibilityChecker
98100
self.wooSubscriptionProductsEligibilityChecker = WooSubscriptionProductsEligibilityChecker(siteID: siteID, storage: storage)
101+
self.siteCIABEligibilityChecker = siteCIABEligibilityChecker
99102
self.analytics = analytics
100103
self.isFirstProduct = isFirstProduct
101104
self.navigateToProductForm = navigateToProductForm
@@ -152,7 +155,8 @@ private extension AddProductCoordinator {
152155
let viewProperties = BottomSheetListSelectorViewProperties(subtitle: subtitle)
153156
let command = ProductTypeBottomSheetListSelectorCommand(
154157
source: .creationForm,
155-
subscriptionProductsEligibilityChecker: wooSubscriptionProductsEligibilityChecker
158+
subscriptionProductsEligibilityChecker: wooSubscriptionProductsEligibilityChecker,
159+
siteCIABEligibilityChecker: siteCIABEligibilityChecker
156160
) { [weak self] selectedBottomSheetProductType in
157161
guard let self else { return }
158162
self.analytics.track(event: .ProductCreation

WooCommerce/Classes/ViewRelated/Products/Edit Product/BottomSheetListSelector/ProductTypeBottomSheetListSelectorCommand.swift

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,9 @@ final class ProductTypeBottomSheetListSelectorCommand: BottomSheetListSelectorCo
1616
.simple(isVirtual: false),
1717
.simple(isVirtual: true),
1818
isEligibleForSubscriptionProducts ? .subscription : nil,
19-
.variable,
19+
siteCIABEligibilityChecker.isFeatureSupportedForCurrentSite(.variableProducts) ? .variable : nil,
2020
isEligibleForSubscriptionProducts ? .variableSubscription : nil,
21-
.grouped,
21+
siteCIABEligibilityChecker.isFeatureSupportedForCurrentSite(.groupedProducts) ? .grouped : nil,
2222
.affiliate
2323
].compactMap { $0 }
2424

@@ -35,13 +35,16 @@ final class ProductTypeBottomSheetListSelectorCommand: BottomSheetListSelectorCo
3535
private let source: Source
3636
private let onSelection: (BottomSheetProductType) -> Void
3737
private let isEligibleForSubscriptionProducts: Bool
38+
private let siteCIABEligibilityChecker: CIABEligibilityCheckerProtocol
3839

3940
init(source: Source,
4041
subscriptionProductsEligibilityChecker: WooSubscriptionProductsEligibilityCheckerProtocol,
42+
siteCIABEligibilityChecker: CIABEligibilityCheckerProtocol = CIABEligibilityChecker(),
4143
onSelection: @escaping (BottomSheetProductType) -> Void) {
4244
self.source = source
4345
self.onSelection = onSelection
4446
self.isEligibleForSubscriptionProducts = subscriptionProductsEligibilityChecker.isSiteEligible()
47+
self.siteCIABEligibilityChecker = siteCIABEligibilityChecker
4548
if case let .editForm(selected) = source {
4649
self.selected = selected
4750
} else {

WooCommerce/Classes/ViewRelated/Products/Edit Product/ProductFormViewController.swift

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@ final class ProductFormViewController<ViewModel: ProductFormViewModelProtocol>:
7979
private let aiEligibilityChecker: ProductFormAIEligibilityChecker
8080
private var descriptionAICoordinator: ProductDescriptionAICoordinator?
8181
private let subscriptionProductsEligibilityChecker: WooSubscriptionProductsEligibilityCheckerProtocol
82+
private let siteCIABEligibilityChecker: CIABEligibilityCheckerProtocol = CIABEligibilityChecker()
8283

8384
private lazy var tooltipUseCase = ProductDescriptionAITooltipUseCase(isDescriptionAIEnabled: aiEligibilityChecker.isFeatureEnabled(.description))
8485
private var didShowTooltip = false {
@@ -1630,7 +1631,8 @@ private extension ProductFormViewController {
16301631
let productType = BottomSheetProductType(productType: viewModel.productModel.productType, isVirtual: viewModel.productModel.virtual)
16311632
let command = ProductTypeBottomSheetListSelectorCommand(
16321633
source: .editForm(selected: productType),
1633-
subscriptionProductsEligibilityChecker: subscriptionProductsEligibilityChecker
1634+
subscriptionProductsEligibilityChecker: subscriptionProductsEligibilityChecker,
1635+
siteCIABEligibilityChecker: siteCIABEligibilityChecker
16341636
) { [weak self] (selectedProductType) in
16351637
self?.dismiss(animated: true, completion: nil)
16361638

WooCommerce/WooCommerceTests/Mocks/MockCIABEligibilityChecker.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ final class MockCIABEligibilityChecker: CIABEligibilityCheckerProtocol {
2222
}
2323

2424
func isFeatureSupportedForCurrentSite(_ feature: CIABAffectedFeature) -> Bool {
25-
return !mockedCIABDisabledFeatures.contains(feature)
25+
return !mockedCIABDisabledFeatures.contains(feature) || !isCurrentSiteCIAB
2626
}
2727

2828
func isFeatureSupported(_ feature: CIABAffectedFeature, for site: Site) -> Bool {

WooCommerce/WooCommerceTests/ViewRelated/Products/BottomSheetListSelector/ProductTypeBottomSheetListSelectorCommandTests.swift

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,4 +120,72 @@ final class ProductTypeBottomSheetListSelectorCommandTests: XCTestCase {
120120
]
121121
XCTAssertEqual(selectedActions, expectedActions)
122122
}
123+
124+
func test_creation_form_data_does_not_contain_grouped_and_variable_types_if_site_is_ciab() {
125+
// Given
126+
let subscriptionEligibilityChecker = MockWooSubscriptionProductsEligibilityChecker(isEligible: true)
127+
let siteCIABEligibilityChecker = MockCIABEligibilityChecker(mockedIsCurrentSiteCIAB: true)
128+
129+
// When
130+
let command = ProductTypeBottomSheetListSelectorCommand(
131+
source: .creationForm,
132+
subscriptionProductsEligibilityChecker: subscriptionEligibilityChecker,
133+
siteCIABEligibilityChecker: siteCIABEligibilityChecker
134+
) { _ in }
135+
136+
// Then
137+
XCTAssertFalse(command.data.contains(.grouped), "'command.data' should not contain grouped product type")
138+
XCTAssertFalse(command.data.contains(.variable), "'command.data' should not contain variable product type")
139+
}
140+
141+
func test_creation_form_data_contains_grouped_and_variable_types_if_site_is_non_ciab_and_other_requirements_met() {
142+
// Given
143+
let subscriptionEligibilityChecker = MockWooSubscriptionProductsEligibilityChecker(isEligible: true)
144+
let siteCIABEligibilityChecker = MockCIABEligibilityChecker(mockedIsCurrentSiteCIAB: false)
145+
146+
// When
147+
let command = ProductTypeBottomSheetListSelectorCommand(
148+
source: .creationForm,
149+
subscriptionProductsEligibilityChecker: subscriptionEligibilityChecker,
150+
siteCIABEligibilityChecker: siteCIABEligibilityChecker
151+
) { _ in }
152+
153+
// Then
154+
XCTAssertTrue(command.data.contains(.grouped), "'command.data' should contain grouped product type")
155+
XCTAssertTrue(command.data.contains(.variable), "'command.data' should contain variable product type")
156+
}
157+
158+
func test_edit_form_data_does_not_contain_grouped_and_variable_types_if_site_is_ciab() {
159+
// Given
160+
let subscriptionEligibilityChecker = MockWooSubscriptionProductsEligibilityChecker(isEligible: true)
161+
let siteCIABEligibilityChecker = MockCIABEligibilityChecker(mockedIsCurrentSiteCIAB: true)
162+
163+
// When
164+
let command = ProductTypeBottomSheetListSelectorCommand(
165+
source: .editForm(selected: .simple(isVirtual: false)),
166+
subscriptionProductsEligibilityChecker: subscriptionEligibilityChecker,
167+
siteCIABEligibilityChecker: siteCIABEligibilityChecker
168+
) { _ in }
169+
170+
// Then
171+
XCTAssertFalse(command.data.contains(.grouped), "'command.data' should not contain grouped product type")
172+
XCTAssertFalse(command.data.contains(.variable), "'command.data' should not contain variable product type")
173+
}
174+
175+
func test_edit_form_data_contains_grouped_and_variable_types_if_site_is_non_ciab_and_other_requirements_met() {
176+
// Given
177+
let subscriptionEligibilityChecker = MockWooSubscriptionProductsEligibilityChecker(isEligible: true)
178+
let siteCIABEligibilityChecker = MockCIABEligibilityChecker(mockedIsCurrentSiteCIAB: false)
179+
180+
// When
181+
let command = ProductTypeBottomSheetListSelectorCommand(
182+
source: .editForm(selected: .simple(isVirtual: false)),
183+
subscriptionProductsEligibilityChecker: subscriptionEligibilityChecker,
184+
siteCIABEligibilityChecker: siteCIABEligibilityChecker
185+
) { _ in }
186+
187+
// Then
188+
XCTAssertTrue(command.data.contains(.grouped), "'command.data' should contain grouped product type")
189+
XCTAssertTrue(command.data.contains(.variable), "'command.data' should contain variable product type")
190+
}
123191
}

0 commit comments

Comments
 (0)