Skip to content

Commit 8ca49f5

Browse files
authored
Merge pull request #6550 from woocommerce/issue/6509-order-creation-products-tests
Order Creation: Add unit tests for test coverage gaps in the Products section
2 parents 2aeee10 + 2a8386b commit 8ca49f5

File tree

7 files changed

+96
-10
lines changed

7 files changed

+96
-10
lines changed

WooCommerce/Classes/ViewRelated/Orders/Order Creation/ProductsSection/AddProductToOrder.swift

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -72,8 +72,7 @@ struct AddProductToOrder: View {
7272
/// Creates the `ProductRow` for a product, depending on whether the product is variable.
7373
///
7474
@ViewBuilder private func createProductRow(rowViewModel: ProductRowViewModel) -> some View {
75-
if rowViewModel.numberOfVariations > 0,
76-
let addVariationToOrderVM = viewModel.getVariationsViewModel(for: rowViewModel.productOrVariationID) {
75+
if let addVariationToOrderVM = viewModel.getVariationsViewModel(for: rowViewModel.productOrVariationID) {
7776
LazyNavigationLink(destination: AddProductVariationToOrder(isPresented: $isPresented, viewModel: addVariationToOrderVM)) {
7877
HStack {
7978
ProductRow(viewModel: rowViewModel)

WooCommerce/Classes/ViewRelated/Orders/Order Creation/ProductsSection/AddProductToOrderViewModel.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ final class AddProductToOrderViewModel: ObservableObject {
119119
/// Get the view model for a list of product variations to add to the order
120120
///
121121
func getVariationsViewModel(for productID: Int64) -> AddProductVariationToOrderViewModel? {
122-
guard let variableProduct = products.first(where: { $0.productID == productID }) else {
122+
guard let variableProduct = products.first(where: { $0.productID == productID }), variableProduct.variations.isNotEmpty else {
123123
return nil
124124
}
125125
return AddProductVariationToOrderViewModel(siteID: siteID, product: variableProduct, onVariationSelected: onVariationSelected)

WooCommerce/Classes/ViewRelated/Orders/Order Creation/ProductsSection/ProductInOrderViewModel.swift

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,4 @@ final class ProductInOrderViewModel: Identifiable {
1616
self.productRowViewModel = productRowViewModel
1717
self.onRemoveProduct = onRemoveProduct
1818
}
19-
20-
convenience init(product: Product,
21-
onRemoveProduct: @escaping () -> Void) {
22-
let viewModel = ProductRowViewModel(product: product, canChangeQuantity: false)
23-
self.init(productRowViewModel: viewModel,
24-
onRemoveProduct: onRemoveProduct)
25-
}
2619
}

WooCommerce/WooCommerceTests/ViewRelated/Orders/Order Creation/AddProductToOrderViewModelTests.swift

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -279,6 +279,51 @@ class AddProductToOrderViewModelTests: XCTestCase {
279279
// Then
280280
XCTAssertEqual(notice, AddProductToOrderViewModel.NoticeFactory.productSearchNotice(retryAction: {}))
281281
}
282+
283+
func test_selectProduct_invokes_onProductSelected_closure_for_existing_product() {
284+
// Given
285+
var selectedProduct: Int64?
286+
let product = Product.fake().copy(siteID: sampleSiteID, productID: 1, purchasable: true)
287+
insert(product)
288+
let viewModel = AddProductToOrderViewModel(siteID: sampleSiteID,
289+
storageManager: storageManager,
290+
onProductSelected: { selectedProduct = $0.productID })
291+
292+
// When
293+
viewModel.selectProduct(product.productID)
294+
295+
// Then
296+
XCTAssertEqual(selectedProduct, product.productID)
297+
}
298+
299+
func test_getVariationsViewModel_returns_expected_view_model_for_variable_product() throws {
300+
// Given
301+
let product = Product.fake().copy(siteID: sampleSiteID, productID: 1, name: "Test Product", purchasable: true, variations: [1, 2])
302+
insert(product)
303+
let viewModel = AddProductToOrderViewModel(siteID: sampleSiteID,
304+
storageManager: storageManager)
305+
306+
// When
307+
let variationsViewModel = viewModel.getVariationsViewModel(for: product.productID)
308+
309+
// Then
310+
let actualViewModel = try XCTUnwrap(variationsViewModel)
311+
XCTAssertEqual(actualViewModel.productName, product.name)
312+
}
313+
314+
func test_getVariationsViewModel_returns_nil_for_simple_product() {
315+
// Given
316+
let product = Product.fake().copy(siteID: sampleSiteID, productID: 1, name: "Test Product", purchasable: true)
317+
insert(product)
318+
let viewModel = AddProductToOrderViewModel(siteID: sampleSiteID,
319+
storageManager: storageManager)
320+
321+
// When
322+
let variationsViewModel = viewModel.getVariationsViewModel(for: product.productID)
323+
324+
// Then
325+
XCTAssertNil(variationsViewModel)
326+
}
282327
}
283328

284329
// MARK: - Utils

WooCommerce/WooCommerceTests/ViewRelated/Orders/Order Creation/AddProductVariationToOrderViewModelTests.swift

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -204,6 +204,24 @@ class AddProductVariationToOrderViewModelTests: XCTestCase {
204204
// Then
205205
XCTAssertEqual(viewModel.notice, AddProductVariationToOrderViewModel.NoticeFactory.productVariationSyncNotice(retryAction: {}))
206206
}
207+
208+
func test_selectVariation_invokes_onVariationSelected_closure_for_existing_variation() {
209+
// Given
210+
var selectedVariationID: Int64?
211+
let product = Product.fake().copy(productID: sampleProductID)
212+
let productVariation = sampleProductVariation.copy(productVariationID: 1)
213+
insert(productVariation)
214+
let viewModel = AddProductVariationToOrderViewModel(siteID: sampleSiteID,
215+
product: product,
216+
storageManager: storageManager,
217+
onVariationSelected: { selectedVariationID = $0.productVariationID })
218+
219+
// When
220+
viewModel.selectVariation(productVariation.productVariationID)
221+
222+
// Then
223+
XCTAssertEqual(selectedVariationID, productVariation.productVariationID)
224+
}
207225
}
208226

209227
// MARK: - Utils

WooCommerce/WooCommerceTests/ViewRelated/Orders/Order Creation/NewOrderViewModelTests.swift

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -221,6 +221,24 @@ final class NewOrderViewModelTests: XCTestCase {
221221
XCTAssertEqual(viewModel.productRows[safe: 1]?.quantity, 1)
222222
}
223223

224+
func test_product_is_selected_when_quantity_is_decremented_below_1() {
225+
// Given
226+
let product = Product.fake().copy(siteID: sampleSiteID, productID: sampleProductID, purchasable: true)
227+
let storageManager = MockStorageManager()
228+
storageManager.insertSampleProduct(readOnlyProduct: product)
229+
let viewModel = NewOrderViewModel(siteID: sampleSiteID, storageManager: storageManager)
230+
231+
// Product quantity is 1
232+
viewModel.addProductViewModel.selectProduct(product.productID)
233+
XCTAssertEqual(viewModel.productRows[0].quantity, 1)
234+
235+
// When
236+
viewModel.productRows[0].decrementQuantity()
237+
238+
// Then
239+
XCTAssertNotNil(viewModel.selectedProductViewModel)
240+
}
241+
224242
func test_selectOrderItem_selects_expected_order_item() throws {
225243
// Given
226244
let product = Product.fake().copy(siteID: sampleSiteID, productID: sampleProductID, purchasable: true)

WooCommerce/WooCommerceTests/ViewRelated/Orders/Order Creation/ProductRowViewModelTests.swift

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -268,4 +268,17 @@ class ProductRowViewModelTests: XCTestCase {
268268
// Then
269269
XCTAssertTrue(productRemoved)
270270
}
271+
272+
func test_productAccessibilityLabel_is_created_with_expected_details_from_product() {
273+
// Given
274+
let product = Product.fake().copy(name: "Test Product", sku: "123456", price: "10", stockStatusKey: "instock", variations: [1, 2])
275+
let currencyFormatter = CurrencyFormatter(currencySettings: CurrencySettings()) // Defaults to US currency & format
276+
277+
// When
278+
let viewModel = ProductRowViewModel(product: product, canChangeQuantity: false, currencyFormatter: currencyFormatter)
279+
280+
// Then
281+
let expectedLabel = "Test Product. In stock. $10.00. 2 variations. SKU: 123456"
282+
XCTAssertEqual(viewModel.productAccessibilityLabel, expectedLabel)
283+
}
271284
}

0 commit comments

Comments
 (0)