Skip to content

Commit afa0557

Browse files
committed
Update tests for product form view model saveProductRemotely
1 parent 3237c78 commit afa0557

File tree

2 files changed

+61
-2
lines changed

2 files changed

+61
-2
lines changed

WooCommerce/Classes/ViewRelated/Products/Cells/ProductsTabProductTableViewCell.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -295,7 +295,8 @@ private struct ProductsTabProductTableViewCellRepresentable: UIViewRepresentable
295295

296296
struct ProductsTabProductTableViewCell_Previews: PreviewProvider {
297297
private static var nonSelectedViewModel = ProductsTabProductViewModel(product: Product.swiftUIPreviewSample(), isSelected: false)
298-
private static var selectedViewModel = ProductsTabProductViewModel(product: Product.swiftUIPreviewSample().copy(statusKey: ProductStatus.pending.rawValue), isSelected: true)
298+
private static var selectedViewModel = ProductsTabProductViewModel(product: Product.swiftUIPreviewSample().copy(statusKey: ProductStatus.pending.rawValue),
299+
isSelected: true)
299300

300301
private static func makeStack() -> some View {
301302
VStack {

WooCommerce/WooCommerceTests/ViewRelated/Products/Edit Product/ProductFormViewModel+SaveTests.swift

Lines changed: 59 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -157,26 +157,84 @@ final class ProductFormViewModel_SaveTests: XCTestCase {
157157
XCTAssertEqual(savedProduct, EditableProductModel(product: product.copy(statusKey: ProductStatus.pending.rawValue)))
158158
}
159159

160+
func test_editing_a_product_remotely_with_changes_in_details_triggers_updateProduct() throws {
161+
// Arrange
162+
let product = Product.fake().copy(statusKey: ProductStatus.published.rawValue)
163+
let viewModel = createViewModel(product: product, formType: .edit)
164+
viewModel.updateName("Test")
165+
var updateProductTriggered = false
166+
storesManager.whenReceivingAction(ofType: ProductAction.self) { action in
167+
if case let ProductAction.updateProduct(product, onCompletion) = action {
168+
updateProductTriggered = true
169+
onCompletion(.success(product.copy(name: "Test")))
170+
}
171+
}
172+
173+
// Action
174+
var savedProduct: EditableProductModel?
175+
waitForExpectation { expectation in
176+
viewModel.saveProductRemotely(status: .published) { result in
177+
savedProduct = try? result.get()
178+
expectation.fulfill()
179+
}
180+
}
181+
182+
// Assert
183+
XCTAssertTrue(updateProductTriggered)
184+
XCTAssertEqual(savedProduct, EditableProductModel(product: product.copy(name: "Test")))
185+
}
186+
187+
func test_editing_a_product_remotely_with_changes_in_uploaded_images_triggers_updateProduct() throws {
188+
// Arrange
189+
let product = Product.fake().copy(statusKey: ProductStatus.published.rawValue)
190+
let viewModel = createViewModel(product: product, formType: .edit)
191+
let newImage = ProductImage.fake().copy(imageID: 134)
192+
viewModel.updateImages([newImage])
193+
var updateProductTriggered = false
194+
storesManager.whenReceivingAction(ofType: ProductAction.self) { action in
195+
if case let ProductAction.updateProduct(product, onCompletion) = action {
196+
updateProductTriggered = true
197+
onCompletion(.success(product.copy(images: [newImage])))
198+
}
199+
}
200+
201+
// Action
202+
var savedProduct: EditableProductModel?
203+
waitForExpectation { expectation in
204+
viewModel.saveProductRemotely(status: .published) { result in
205+
savedProduct = try? result.get()
206+
expectation.fulfill()
207+
}
208+
}
209+
210+
// Assert
211+
XCTAssertTrue(updateProductTriggered)
212+
XCTAssertEqual(savedProduct, EditableProductModel(product: product.copy(images: [newImage])))
213+
}
214+
160215
func test_editing_a_product_remotely_fires_method_to_save_images_in_background_using_productImagesUploader() throws {
161216
// Given
162217
let product = Product.fake().copy(statusKey: ProductStatus.published.rawValue)
163218
let productImagesUploader = MockProductImageUploader()
164219
let viewModel = createViewModel(product: product, formType: .edit, productImagesUploader: productImagesUploader)
220+
var updateProductTriggered = false
165221
storesManager.whenReceivingAction(ofType: ProductAction.self) { action in
166222
if case let ProductAction.updateProduct(product, onCompletion) = action {
223+
updateProductTriggered = true
167224
onCompletion(.success(product))
168225
}
169226
}
170227

171228
// When
172229
waitForExpectation { expectation in
173-
viewModel.saveProductRemotely(status: .pending) { result in
230+
viewModel.saveProductRemotely(status: .published) { result in
174231
expectation.fulfill()
175232
}
176233
}
177234

178235
// Then
179236
XCTAssertTrue(productImagesUploader.saveProductImagesWhenNoneIsPendingUploadAnymoreWasCalled)
237+
XCTAssertFalse(updateProductTriggered)
180238
}
181239
}
182240

0 commit comments

Comments
 (0)