From fc4f068390ddf3e56a17cf4bd1bba9c9d13d41aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ernesto=20Carri=C3=B3n?= Date: Tue, 1 Nov 2022 11:26:30 -0500 Subject: [PATCH 1/2] Add method to remove a product identity and make it look like a new product --- .../Products/Add Product/ProductFactory.swift | 7 +++++++ .../Add Product/ProductFactoryTests.swift | 21 +++++++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/WooCommerce/Classes/ViewRelated/Products/Add Product/ProductFactory.swift b/WooCommerce/Classes/ViewRelated/Products/Add Product/ProductFactory.swift index bed63a2dc64..2152d97ff0e 100644 --- a/WooCommerce/Classes/ViewRelated/Products/Add Product/ProductFactory.swift +++ b/WooCommerce/Classes/ViewRelated/Products/Add Product/ProductFactory.swift @@ -16,6 +16,13 @@ struct ProductFactory { return nil } } + + /// Copies a product by cleaning properties like `id, name, and statusKey` to their default state. + /// This is usefult to turn an existing(on core) `auto-draft` product into a new app-product ready to be saved. + /// + func newProduct(from existingProduct: Product) -> Product { + existingProduct.copy(productID: 0, name: "", statusKey: ProductStatus.published.rawValue) + } } private extension ProductFactory { diff --git a/WooCommerce/WooCommerceTests/ViewRelated/Products/Add Product/ProductFactoryTests.swift b/WooCommerce/WooCommerceTests/ViewRelated/Products/Add Product/ProductFactoryTests.swift index 46763655f1b..f550a3349db 100644 --- a/WooCommerce/WooCommerceTests/ViewRelated/Products/Add Product/ProductFactoryTests.swift +++ b/WooCommerce/WooCommerceTests/ViewRelated/Products/Add Product/ProductFactoryTests.swift @@ -1,4 +1,6 @@ import XCTest +import Fakes +import Networking @testable import WooCommerce final class ProductFactoryTests: XCTestCase { @@ -40,4 +42,23 @@ final class ProductFactoryTests: XCTestCase { let product = ProductFactory().createNewProduct(type: .custom("any"), isVirtual: false, siteID: siteID) XCTAssertNil(product) } + + func test_creating_new_product_removes_expected_fields() { + // Given + let product = Product.fake().copy(siteID: 123, productID: 1234, name: "Test Product", statusKey: ProductStatus.autoDraft.rawValue, price: "20.00") + + // When + let newProduct = ProductFactory().newProduct(from: product) + + // Then + + // Stay the same + XCTAssertEqual(newProduct.siteID, product.siteID) + XCTAssertEqual(newProduct.price, product.price) + + // Changes + XCTAssertEqual(newProduct.productID, 0) + XCTAssertEqual(newProduct.name, "") + XCTAssertEqual(newProduct.statusKey, ProductStatus.published.rawValue) + } } From 5e5cfe86fb6fc8257d820166bb039dd0aa600818 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ernesto=20Carri=C3=B3n?= Date: Tue, 1 Nov 2022 11:29:11 -0500 Subject: [PATCH 2/2] Transform the template auto-draft product into a new product ready to be used --- .../Products/Add Product/AddProductCoordinator.swift | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/WooCommerce/Classes/ViewRelated/Products/Add Product/AddProductCoordinator.swift b/WooCommerce/Classes/ViewRelated/Products/Add Product/AddProductCoordinator.swift index 5c0bb1ebb62..f16423aade7 100644 --- a/WooCommerce/Classes/ViewRelated/Products/Add Product/AddProductCoordinator.swift +++ b/WooCommerce/Classes/ViewRelated/Products/Add Product/AddProductCoordinator.swift @@ -152,7 +152,8 @@ private extension AddProductCoordinator { switch result { case .success(let product): - self.presentProduct(product, formType: .edit) // We need to strongly capture `self` because no one is retaining `AddProductCoordinator`. + let newProduct = ProductFactory().newProduct(from: product) // Transforms the auto-draft product into a new product ready to be used. + self.presentProduct(newProduct) // We need to strongly capture `self` because no one is retaining `AddProductCoordinator`. case .failure(let error): // Log error and inform the user @@ -177,12 +178,12 @@ private extension AddProductCoordinator { assertionFailure("Unable to create product of type: \(bottomSheetProductType)") return } - presentProduct(product, formType: .add) + presentProduct(product) } /// Presents a product onto the current navigation stack. /// - func presentProduct(_ product: Product, formType: ProductFormType) { + func presentProduct(_ product: Product) { let model = EditableProductModel(product: product) let currencyCode = ServiceLocator.currencySettings.currencyCode let currency = ServiceLocator.currencySettings.symbol(from: currencyCode) @@ -192,7 +193,7 @@ private extension AddProductCoordinator { isLocalID: true), originalStatuses: model.imageStatuses) let viewModel = ProductFormViewModel(product: model, - formType: formType, + formType: .add, productImageActionHandler: productImageActionHandler) let viewController = ProductFormViewController(viewModel: viewModel, eventLogger: ProductFormEventLogger(),