Skip to content

Commit 5f8125e

Browse files
authored
Merge pull request #8005 from woocommerce/issue/7949-auto-draft-support
Products Onboarding: Support template products
2 parents 491104c + 5e5cfe8 commit 5f8125e

File tree

3 files changed

+33
-4
lines changed

3 files changed

+33
-4
lines changed

WooCommerce/Classes/ViewRelated/Products/Add Product/AddProductCoordinator.swift

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,8 @@ private extension AddProductCoordinator {
152152

153153
switch result {
154154
case .success(let product):
155-
self.presentProduct(product, formType: .edit) // We need to strongly capture `self` because no one is retaining `AddProductCoordinator`.
155+
let newProduct = ProductFactory().newProduct(from: product) // Transforms the auto-draft product into a new product ready to be used.
156+
self.presentProduct(newProduct) // We need to strongly capture `self` because no one is retaining `AddProductCoordinator`.
156157

157158
case .failure(let error):
158159
// Log error and inform the user
@@ -177,12 +178,12 @@ private extension AddProductCoordinator {
177178
assertionFailure("Unable to create product of type: \(bottomSheetProductType)")
178179
return
179180
}
180-
presentProduct(product, formType: .add)
181+
presentProduct(product)
181182
}
182183

183184
/// Presents a product onto the current navigation stack.
184185
///
185-
func presentProduct(_ product: Product, formType: ProductFormType) {
186+
func presentProduct(_ product: Product) {
186187
let model = EditableProductModel(product: product)
187188
let currencyCode = ServiceLocator.currencySettings.currencyCode
188189
let currency = ServiceLocator.currencySettings.symbol(from: currencyCode)
@@ -192,7 +193,7 @@ private extension AddProductCoordinator {
192193
isLocalID: true),
193194
originalStatuses: model.imageStatuses)
194195
let viewModel = ProductFormViewModel(product: model,
195-
formType: formType,
196+
formType: .add,
196197
productImageActionHandler: productImageActionHandler)
197198
let viewController = ProductFormViewController(viewModel: viewModel,
198199
eventLogger: ProductFormEventLogger(),

WooCommerce/Classes/ViewRelated/Products/Add Product/ProductFactory.swift

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,13 @@ struct ProductFactory {
1616
return nil
1717
}
1818
}
19+
20+
/// Copies a product by cleaning properties like `id, name, and statusKey` to their default state.
21+
/// This is usefult to turn an existing(on core) `auto-draft` product into a new app-product ready to be saved.
22+
///
23+
func newProduct(from existingProduct: Product) -> Product {
24+
existingProduct.copy(productID: 0, name: "", statusKey: ProductStatus.published.rawValue)
25+
}
1926
}
2027

2128
private extension ProductFactory {

WooCommerce/WooCommerceTests/ViewRelated/Products/Add Product/ProductFactoryTests.swift

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
import XCTest
2+
import Fakes
3+
import Networking
24
@testable import WooCommerce
35

46
final class ProductFactoryTests: XCTestCase {
@@ -40,4 +42,23 @@ final class ProductFactoryTests: XCTestCase {
4042
let product = ProductFactory().createNewProduct(type: .custom("any"), isVirtual: false, siteID: siteID)
4143
XCTAssertNil(product)
4244
}
45+
46+
func test_creating_new_product_removes_expected_fields() {
47+
// Given
48+
let product = Product.fake().copy(siteID: 123, productID: 1234, name: "Test Product", statusKey: ProductStatus.autoDraft.rawValue, price: "20.00")
49+
50+
// When
51+
let newProduct = ProductFactory().newProduct(from: product)
52+
53+
// Then
54+
55+
// Stay the same
56+
XCTAssertEqual(newProduct.siteID, product.siteID)
57+
XCTAssertEqual(newProduct.price, product.price)
58+
59+
// Changes
60+
XCTAssertEqual(newProduct.productID, 0)
61+
XCTAssertEqual(newProduct.name, "")
62+
XCTAssertEqual(newProduct.statusKey, ProductStatus.published.rawValue)
63+
}
4364
}

0 commit comments

Comments
 (0)