@@ -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