Skip to content

Commit 011c0c2

Browse files
committed
Move product form bottom sheet actions calculation to a separate struct ProductFormBottomSheetActionsFactory. Move existing unit tests to the factory.
1 parent 7681f2e commit 011c0c2

File tree

6 files changed

+163
-141
lines changed

6 files changed

+163
-141
lines changed
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import Yosemite
2+
3+
struct ProductFormBottomSheetActionsFactory {
4+
/// Retruns an array of actions that are visible in the product form bottom sheet.
5+
static func actions(product: Product, isEditProductsRelease2Enabled: Bool, isEditProductsRelease3Enabled: Bool) -> [ProductFormBottomSheetAction] {
6+
let shouldShowShippingSettingsRow = product.isShippingEnabled
7+
let shouldShowCategoriesRow = isEditProductsRelease3Enabled
8+
let shouldShowShortDescriptionRow = isEditProductsRelease2Enabled
9+
let actions: [ProductFormBottomSheetAction?] = [
10+
.editInventorySettings,
11+
shouldShowShippingSettingsRow ? .editShippingSettings: nil,
12+
shouldShowCategoriesRow ? .editCategories: nil,
13+
shouldShowShortDescriptionRow ? .editBriefDescription: nil
14+
]
15+
return actions.compactMap({ $0 }).filter({ $0.isVisible(product: product) })
16+
}
17+
}

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

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -12,20 +12,10 @@ final class ProductFormBottomSheetListSelectorCommand: BottomSheetListSelectorCo
1212

1313
private let onSelection: (ProductFormBottomSheetAction) -> Void
1414

15-
init(product: Product,
16-
isEditProductsRelease3Enabled: Bool,
15+
init(actions: [ProductFormBottomSheetAction],
1716
onSelection: @escaping (ProductFormBottomSheetAction) -> Void) {
1817
self.onSelection = onSelection
19-
20-
let shouldShowShippingSettingsRow = product.isShippingEnabled
21-
let shouldShowCategoriesRow = isEditProductsRelease3Enabled
22-
let actions: [ProductFormBottomSheetAction?] = [
23-
.editInventorySettings,
24-
shouldShowShippingSettingsRow ? .editShippingSettings: nil,
25-
shouldShowCategoriesRow ? .editCategories: nil,
26-
.editBriefDescription
27-
]
28-
self.data = actions.compactMap({ $0 }).filter({ $0.isVisible(product: product) })
18+
self.data = actions
2919
}
3020

3121
func configureCell(cell: ImageAndTitleAndTextTableViewCell, model: ProductFormBottomSheetAction) {

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

Lines changed: 8 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -229,11 +229,6 @@ private extension ProductFormViewController {
229229
}
230230

231231
func configureMoreDetailsContainerView() {
232-
guard isEditProductsRelease2Enabled else {
233-
moreDetailsContainerView.isHidden = true
234-
return
235-
}
236-
237232
let title = NSLocalizedString("Add more details", comment: "Title of the button at the bottom of the product form to add more product details.")
238233
let viewModel = BottomButtonContainerView.ViewModel(style: .link,
239234
title: title,
@@ -258,8 +253,10 @@ private extension ProductFormViewController {
258253
let title = NSLocalizedString("Add more details",
259254
comment: "Title of the bottom sheet from the product form to add more product details.")
260255
let viewProperties = BottomSheetListSelectorViewProperties(title: title)
261-
let dataSource = ProductFormBottomSheetListSelectorCommand(product: product,
262-
isEditProductsRelease3Enabled: isEditProductsRelease3Enabled) { [weak self] action in
256+
let actions = ProductFormBottomSheetActionsFactory.actions(product: product,
257+
isEditProductsRelease2Enabled: isEditProductsRelease2Enabled,
258+
isEditProductsRelease3Enabled: isEditProductsRelease3Enabled)
259+
let dataSource = ProductFormBottomSheetListSelectorCommand(actions: actions) { [weak self] action in
263260
self?.dismiss(animated: true) { [weak self] in
264261
switch action {
265262
case .editInventorySettings:
@@ -282,16 +279,10 @@ private extension ProductFormViewController {
282279
}
283280

284281
func updateMoreDetailsButtonVisibility(product: Product) {
285-
guard isEditProductsRelease2Enabled else {
286-
moreDetailsContainerView.isHidden = true
287-
return
288-
}
289-
290-
let moreDetailsActions: [ProductFormBottomSheetAction] = isEditProductsRelease3Enabled ?
291-
[.editInventorySettings, .editShippingSettings, .editCategories, .editBriefDescription]:
292-
[.editInventorySettings, .editShippingSettings, .editBriefDescription]
293-
let hasVisibleActions = moreDetailsActions.map({ $0.isVisible(product: product) }).contains(true)
294-
moreDetailsContainerView.isHidden = hasVisibleActions == false
282+
let moreDetailsActions = ProductFormBottomSheetActionsFactory.actions(product: product,
283+
isEditProductsRelease2Enabled: isEditProductsRelease2Enabled,
284+
isEditProductsRelease3Enabled: isEditProductsRelease3Enabled)
285+
moreDetailsContainerView.isHidden = moreDetailsActions.isEmpty
295286
}
296287
}
297288

WooCommerce/WooCommerce.xcodeproj/project.pbxproj

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,8 @@
9292
0235595B24496E88004BE2B8 /* BottomSheetListSelectorViewController+DrawerPresentable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0235595A24496E88004BE2B8 /* BottomSheetListSelectorViewController+DrawerPresentable.swift */; };
9393
02357B2A23CDB3E300147C2B /* ProductImageViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02357B2823CDB3E300147C2B /* ProductImageViewController.swift */; };
9494
02357B2B23CDB3E300147C2B /* ProductImageViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 02357B2923CDB3E300147C2B /* ProductImageViewController.xib */; };
95+
0235BFD9246E959500778909 /* ProductFormBottomSheetActionsFactory.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0235BFD8246E959500778909 /* ProductFormBottomSheetActionsFactory.swift */; };
96+
0235BFDB246E99A700778909 /* ProductFormBottomSheetActionsFactoryTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0235BFDA246E99A700778909 /* ProductFormBottomSheetActionsFactoryTests.swift */; };
9597
02396251239948470096F34C /* UIImage+TintColor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02396250239948470096F34C /* UIImage+TintColor.swift */; };
9698
023A059A24135F2600E3FC99 /* ReviewsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 023A059824135F2600E3FC99 /* ReviewsViewController.swift */; };
9799
023A059B24135F2600E3FC99 /* ReviewsViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 023A059924135F2600E3FC99 /* ReviewsViewController.xib */; };
@@ -938,6 +940,8 @@
938940
0235595A24496E88004BE2B8 /* BottomSheetListSelectorViewController+DrawerPresentable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "BottomSheetListSelectorViewController+DrawerPresentable.swift"; sourceTree = "<group>"; };
939941
02357B2823CDB3E300147C2B /* ProductImageViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProductImageViewController.swift; sourceTree = "<group>"; };
940942
02357B2923CDB3E300147C2B /* ProductImageViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = ProductImageViewController.xib; sourceTree = "<group>"; };
943+
0235BFD8246E959500778909 /* ProductFormBottomSheetActionsFactory.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProductFormBottomSheetActionsFactory.swift; sourceTree = "<group>"; };
944+
0235BFDA246E99A700778909 /* ProductFormBottomSheetActionsFactoryTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProductFormBottomSheetActionsFactoryTests.swift; sourceTree = "<group>"; };
941945
02396250239948470096F34C /* UIImage+TintColor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIImage+TintColor.swift"; sourceTree = "<group>"; };
942946
023A059824135F2600E3FC99 /* ReviewsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReviewsViewController.swift; sourceTree = "<group>"; };
943947
023A059924135F2600E3FC99 /* ReviewsViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = ReviewsViewController.xib; sourceTree = "<group>"; };
@@ -1764,6 +1768,7 @@
17641768
children = (
17651769
0212276024498A270042161F /* ProductFormBottomSheetListSelectorCommand.swift */,
17661770
0212276224498CDC0042161F /* ProductFormBottomSheetAction.swift */,
1771+
0235BFD8246E959500778909 /* ProductFormBottomSheetActionsFactory.swift */,
17671772
);
17681773
path = BottomSheetListSelector;
17691774
sourceTree = "<group>";
@@ -2199,6 +2204,7 @@
21992204
children = (
22002205
02A9A495244D84AB00757B99 /* ProductsSortOrderBottomSheetListSelectorCommandTests.swift */,
22012206
02E493EE245C1087000AEA9E /* ProductFormBottomSheetListSelectorCommandTests.swift */,
2207+
0235BFDA246E99A700778909 /* ProductFormBottomSheetActionsFactoryTests.swift */,
22022208
);
22032209
path = BottomSheetListSelector;
22042210
sourceTree = "<group>";
@@ -4727,6 +4733,7 @@
47274733
D8C251DB230D288A00F49782 /* PushNotesManager.swift in Sources */,
47284734
748D34E12148291E00E21A2F /* TopPerformerDataViewController.swift in Sources */,
47294735
02C887712450285100E4470F /* BottomButtonContainerView.swift in Sources */,
4736+
0235BFD9246E959500778909 /* ProductFormBottomSheetActionsFactory.swift in Sources */,
47304737
024EFA6923FCC10B00F36918 /* Product+Media.swift in Sources */,
47314738
5795F23023E26B5300F6707C /* OrderSearchStarterViewModel.swift in Sources */,
47324739
0202B68D23876BC100F3EBE0 /* ProductsTabProductViewModel+ProductVariation.swift in Sources */,
@@ -4950,6 +4957,7 @@
49504957
02BA23C022EE9DAF009539E7 /* AsyncDictionaryTests.swift in Sources */,
49514958
B555531121B57E6F00449E71 /* MockupApplicationAdapter.swift in Sources */,
49524959
021E2A2023AA274700B1DE07 /* ProductBackordersSettingListSelectorCommandTests.swift in Sources */,
4960+
0235BFDB246E99A700778909 /* ProductFormBottomSheetActionsFactoryTests.swift in Sources */,
49534961
020BE76723B49FE9007FE54C /* AztecBoldFormatBarCommandTests.swift in Sources */,
49544962
CE4DA5C821DD759400074607 /* CurrencyFormatterTests.swift in Sources */,
49554963
B57C745120F56EE900EEFC87 /* UITableViewCellHelpersTests.swift in Sources */,
Lines changed: 126 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,126 @@
1+
import XCTest
2+
@testable import WooCommerce
3+
@testable import Yosemite
4+
5+
final class ProductFormBottomSheetActionsFactoryTests: XCTestCase {
6+
7+
// M3 feature flag off & M2 feature flag is on
8+
9+
func testDataHasNoEditProductsRelease3ActionsForAPhysicalProductWhenFeatureFlagIsOff() {
10+
let product = Fixtures.physicalProduct
11+
let isEditProductsRelease2Enabled = true
12+
let isEditProductsRelease3Enabled = false
13+
let actions = ProductFormBottomSheetActionsFactory.actions(product: product,
14+
isEditProductsRelease2Enabled: isEditProductsRelease2Enabled,
15+
isEditProductsRelease3Enabled: isEditProductsRelease3Enabled)
16+
17+
let expectedActions: [ProductFormBottomSheetAction] = [
18+
.editInventorySettings,
19+
.editShippingSettings,
20+
.editBriefDescription
21+
]
22+
XCTAssertEqual(actions, expectedActions)
23+
}
24+
25+
func testDataHasNoEditProductsRelease3AndShippingActionsForAVirtualProductWhenFeatureFlagIsOff() {
26+
let product = Fixtures.virtualProduct
27+
let isEditProductsRelease2Enabled = true
28+
let isEditProductsRelease3Enabled = false
29+
let actions = ProductFormBottomSheetActionsFactory.actions(product: product,
30+
isEditProductsRelease2Enabled: isEditProductsRelease2Enabled,
31+
isEditProductsRelease3Enabled: isEditProductsRelease3Enabled)
32+
33+
let expectedActions: [ProductFormBottomSheetAction] = [
34+
.editInventorySettings,
35+
.editBriefDescription
36+
]
37+
XCTAssertEqual(actions, expectedActions)
38+
}
39+
40+
func testDataHasNoEditProductsRelease3AndShippingActionsForADownloadableProductWhenFeatureFlagIsOff() {
41+
let product = Fixtures.downloadableProduct
42+
let isEditProductsRelease2Enabled = true
43+
let isEditProductsRelease3Enabled = false
44+
let actions = ProductFormBottomSheetActionsFactory.actions(product: product,
45+
isEditProductsRelease2Enabled: isEditProductsRelease2Enabled,
46+
isEditProductsRelease3Enabled: isEditProductsRelease3Enabled)
47+
48+
let expectedActions: [ProductFormBottomSheetAction] = [
49+
.editInventorySettings,
50+
.editBriefDescription
51+
]
52+
XCTAssertEqual(actions, expectedActions)
53+
}
54+
55+
// M3 feature flag on & M2 feature flag is on
56+
57+
func testDataHasEditProductsRelease3ActionsForAPhysicalProductWhenFeatureFlagIsOn() {
58+
let product = Fixtures.physicalProduct
59+
let isEditProductsRelease2Enabled = true
60+
let isEditProductsRelease3Enabled = true
61+
let actions = ProductFormBottomSheetActionsFactory.actions(product: product,
62+
isEditProductsRelease2Enabled: isEditProductsRelease2Enabled,
63+
isEditProductsRelease3Enabled: isEditProductsRelease3Enabled)
64+
65+
let expectedActions: [ProductFormBottomSheetAction] = [
66+
.editInventorySettings,
67+
.editShippingSettings,
68+
.editCategories,
69+
.editBriefDescription
70+
]
71+
XCTAssertEqual(actions, expectedActions)
72+
}
73+
74+
func testDataHasEditProductsRelease3ButNoShippingActionsForAVirtualProductWhenFeatureFlagIsOn() {
75+
let product = Fixtures.virtualProduct
76+
let isEditProductsRelease2Enabled = true
77+
let isEditProductsRelease3Enabled = true
78+
let actions = ProductFormBottomSheetActionsFactory.actions(product: product,
79+
isEditProductsRelease2Enabled: isEditProductsRelease2Enabled,
80+
isEditProductsRelease3Enabled: isEditProductsRelease3Enabled)
81+
82+
let expectedActions: [ProductFormBottomSheetAction] = [
83+
.editInventorySettings,
84+
.editCategories,
85+
.editBriefDescription
86+
]
87+
XCTAssertEqual(actions, expectedActions)
88+
}
89+
90+
func testDataHasEditProductsRelease3ButNoShippingActionsForADownloadableProductWhenFeatureFlagIsOn() {
91+
let product = Fixtures.downloadableProduct
92+
let isEditProductsRelease2Enabled = true
93+
let isEditProductsRelease3Enabled = true
94+
let actions = ProductFormBottomSheetActionsFactory.actions(product: product,
95+
isEditProductsRelease2Enabled: isEditProductsRelease2Enabled,
96+
isEditProductsRelease3Enabled: isEditProductsRelease3Enabled)
97+
98+
let expectedActions: [ProductFormBottomSheetAction] = [
99+
.editInventorySettings,
100+
.editCategories,
101+
.editBriefDescription
102+
]
103+
XCTAssertEqual(actions, expectedActions)
104+
}
105+
106+
}
107+
108+
private extension ProductFormBottomSheetActionsFactoryTests {
109+
enum Fixtures {
110+
// downloadable: false, virtual: false, missing inventory/shipping/categories/brief description
111+
static let physicalProduct = MockProduct().product(downloadable: false, briefDescription: "", manageStock: true, sku: nil, stockQuantity: nil,
112+
dimensions: ProductDimensions(length: "", width: "", height: ""), weight: nil,
113+
virtual: false,
114+
categories: [])
115+
// downloadable: false, virtual: true, missing inventory/shipping/categories/brief description
116+
static let virtualProduct = MockProduct().product(downloadable: false, briefDescription: "", manageStock: true, sku: nil, stockQuantity: nil,
117+
dimensions: ProductDimensions(length: "", width: "", height: ""), weight: nil,
118+
virtual: true,
119+
categories: [])
120+
// downloadable: true, virtual: true, missing inventory/shipping/categories/brief description
121+
static let downloadableProduct = MockProduct().product(downloadable: true, briefDescription: "", manageStock: true, sku: nil, stockQuantity: nil,
122+
dimensions: ProductDimensions(length: "", width: "", height: ""), weight: nil,
123+
virtual: true,
124+
categories: [])
125+
}
126+
}

0 commit comments

Comments
 (0)