diff --git a/WooCommerce/Classes/POS/Presentation/CartView.swift b/WooCommerce/Classes/POS/Presentation/CartView.swift index 83fa91f8bb2..dba3539d99a 100644 --- a/WooCommerce/Classes/POS/Presentation/CartView.swift +++ b/WooCommerce/Classes/POS/Presentation/CartView.swift @@ -1,10 +1,13 @@ import SwiftUI +import protocol Yosemite.POSItem struct CartView: View { @ObservedObject private var viewModel: PointOfSaleDashboardViewModel + @ObservedObject private var cartViewModel: CartViewModel - init(viewModel: PointOfSaleDashboardViewModel) { + init(viewModel: PointOfSaleDashboardViewModel, cartViewModel: CartViewModel) { self.viewModel = viewModel + self.cartViewModel = cartViewModel } var body: some View { @@ -13,16 +16,17 @@ struct CartView: View { Text("Cart") .foregroundColor(Color.posPrimaryTexti3) Spacer() - if let temsInCartLabel = viewModel.itemsInCartLabel { + if let temsInCartLabel = cartViewModel.itemsInCartLabel { Text(temsInCartLabel) .foregroundColor(Color.posPrimaryTexti3) Button { - viewModel.removeAllItemsFromCart() + cartViewModel.removeAllItemsFromCart() } label: { Text("Clear all") .foregroundColor(Color.init(uiColor: .wooCommercePurple(.shade60))) } .padding(.horizontal, 8) + .renderedIf(cartViewModel.canDeleteItemsFromCart) } } .frame(maxWidth: .infinity, alignment: .leading) @@ -32,19 +36,19 @@ struct CartView: View { .foregroundColor(Color.white) ScrollViewReader { proxy in ScrollView { - ForEach(viewModel.itemsInCart, id: \.id) { cartItem in + ForEach(cartViewModel.itemsInCart, id: \.id) { cartItem in ItemRowView(cartItem: cartItem, - onItemRemoveTapped: viewModel.canDeleteItemsFromCart ? { - viewModel.removeItemFromCart(cartItem) + onItemRemoveTapped: cartViewModel.canDeleteItemsFromCart ? { + cartViewModel.removeItemFromCart(cartItem) } : nil) .id(cartItem.id) .background(Color.posBackgroundGreyi3) .padding(.horizontal, 32) } } - .onChange(of: viewModel.itemToScrollToWhenCartUpdated?.id) { _ in + .onChange(of: cartViewModel.itemToScrollToWhenCartUpdated?.id) { _ in if viewModel.orderStage == .building, - let last = viewModel.itemToScrollToWhenCartUpdated?.id { + let last = cartViewModel.itemToScrollToWhenCartUpdated?.id { withAnimation { proxy.scrollTo(last) } @@ -72,7 +76,7 @@ struct CartView: View { private extension CartView { var checkoutButton: some View { Button { - viewModel.submitCart() + cartViewModel.submitCart() } label: { HStack { Spacer() @@ -88,7 +92,7 @@ private extension CartView { var addMoreButton: some View { Button { - viewModel.addMoreToCart() + cartViewModel.addMoreToCart() } label: { Spacer() Text("Add More") @@ -102,9 +106,18 @@ private extension CartView { } #if DEBUG +import Combine #Preview { - CartView(viewModel: PointOfSaleDashboardViewModel(itemProvider: POSItemProviderPreview(), - cardPresentPaymentService: CardPresentPaymentPreviewService(), - orderService: POSOrderPreviewService())) + // TODO: + // Simplify this by mocking `CartViewModel` + // https://github.com/woocommerce/woocommerce-ios/issues/13207 + let orderStageSubject = PassthroughSubject() + let orderStagePublisher = orderStageSubject.eraseToAnyPublisher() + let dashboardViewModel = PointOfSaleDashboardViewModel(itemProvider: POSItemProviderPreview(), + cardPresentPaymentService: CardPresentPaymentPreviewService(), + orderService: POSOrderPreviewService()) + let cartViewModel = CartViewModel(orderStage: orderStagePublisher) + + return CartView(viewModel: dashboardViewModel, cartViewModel: cartViewModel) } #endif diff --git a/WooCommerce/Classes/POS/Presentation/PointOfSaleDashboardView.swift b/WooCommerce/Classes/POS/Presentation/PointOfSaleDashboardView.swift index 23f2156d47d..8ea83901452 100644 --- a/WooCommerce/Classes/POS/Presentation/PointOfSaleDashboardView.swift +++ b/WooCommerce/Classes/POS/Presentation/PointOfSaleDashboardView.swift @@ -62,8 +62,9 @@ private extension PointOfSaleDashboardView { } var cartView: some View { - CartView(viewModel: viewModel) - .frame(maxWidth: .infinity) + CartView(viewModel: viewModel, + cartViewModel: viewModel.cartViewModel) + .frame(maxWidth: .infinity) } var totalsView: some View { diff --git a/WooCommerce/Classes/POS/ViewModels/CartViewModel.swift b/WooCommerce/Classes/POS/ViewModels/CartViewModel.swift new file mode 100644 index 00000000000..121a413ea1a --- /dev/null +++ b/WooCommerce/Classes/POS/ViewModels/CartViewModel.swift @@ -0,0 +1,64 @@ +import SwiftUI +import Combine +import protocol Yosemite.POSItem + +final class CartViewModel: ObservableObject { + /// Emits cart items when the CTA is tapped to submit the cart. + let cartSubmissionPublisher: AnyPublisher<[CartItem], Never> + private let cartSubmissionSubject: PassthroughSubject<[CartItem], Never> = .init() + + /// Emits a signal when the CTA is tapped to update the cart. + let addMoreToCartActionPublisher: AnyPublisher + private let addMoreToCartActionSubject: PassthroughSubject = .init() + + @Published private(set) var itemsInCart: [CartItem] = [] + + // It should be synced with the source of truth in `PointOfSaleDashboardViewModel`. + @Published private var orderStage: PointOfSaleDashboardViewModel.OrderStage = .building + + var canDeleteItemsFromCart: Bool { + orderStage != .finalizing + } + + init(orderStage: AnyPublisher) { + cartSubmissionPublisher = cartSubmissionSubject.eraseToAnyPublisher() + addMoreToCartActionPublisher = addMoreToCartActionSubject.eraseToAnyPublisher() + orderStage.assign(to: &$orderStage) + } + + func addItemToCart(_ item: POSItem) { + let cartItem = CartItem(id: UUID(), item: item, quantity: 1) + itemsInCart.append(cartItem) + } + + func removeItemFromCart(_ cartItem: CartItem) { + itemsInCart.removeAll(where: { $0.id == cartItem.id }) + } + + func removeAllItemsFromCart() { + itemsInCart.removeAll() + } + + var itemToScrollToWhenCartUpdated: CartItem? { + return itemsInCart.last + } + + var itemsInCartLabel: String? { + switch itemsInCart.count { + case 0: + return nil + default: + return String.pluralize(itemsInCart.count, + singular: "%1$d item", + plural: "%1$d items") + } + } + + func submitCart() { + cartSubmissionSubject.send(itemsInCart) + } + + func addMoreToCart() { + addMoreToCartActionSubject.send(()) + } +} diff --git a/WooCommerce/Classes/POS/ViewModels/PointOfSaleDashboardViewModel.swift b/WooCommerce/Classes/POS/ViewModels/PointOfSaleDashboardViewModel.swift index 575dda07db7..4cd43701d42 100644 --- a/WooCommerce/Classes/POS/ViewModels/PointOfSaleDashboardViewModel.swift +++ b/WooCommerce/Classes/POS/ViewModels/PointOfSaleDashboardViewModel.swift @@ -37,12 +37,9 @@ final class PointOfSaleDashboardViewModel: ObservableObject { } let itemSelectorViewModel: ItemSelectorViewModel + private(set) lazy var cartViewModel: CartViewModel = CartViewModel(orderStage: $orderStage.eraseToAnyPublisher()) - @Published private(set) var itemsInCart: [CartItem] = [] { - didSet { - checkIfCartEmpty() - } - } + @Published private(set) var isCartCollapsed: Bool = true // Total amounts @Published private(set) var formattedCartTotalPrice: String? @@ -72,10 +69,16 @@ final class PointOfSaleDashboardViewModel: ObservableObject { } @Published private(set) var orderStage: OrderStage = .building - @Published private(set) var paymentState: PointOfSaleDashboardViewModel.PaymentState = .acceptingCard + @Published private(set) var isAddMoreDisabled: Bool = false @Published var isExitPOSDisabled: Bool = false + private var cancellables: Set = [] + + // TODO: 12998 - move the following properties to totals view model + @Published private(set) var paymentState: PointOfSaleDashboardViewModel.PaymentState = .acceptingCard + private var itemsInCart: [CartItem] = [] + /// Order created the first time the checkout is shown for a given transaction. /// If the merchant goes back to the product selection screen and makes changes, this should be updated when they return to the checkout. @Published private var order: POSOrder? @@ -86,8 +89,6 @@ final class PointOfSaleDashboardViewModel: ObservableObject { private let currencyFormatter = CurrencyFormatter(currencySettings: ServiceLocator.currencySettings) - private var cancellables: Set = [] - init(itemProvider: POSItemProvider, cardPresentPaymentService: CardPresentPaymentFacade, orderService: POSOrderServiceProtocol) { @@ -98,64 +99,15 @@ final class PointOfSaleDashboardViewModel: ObservableObject { self.itemSelectorViewModel = .init(itemProvider: itemProvider) observeSelectedItemToAddToCart() + observeCartItemsForCollapsedState() + observeCartSubmission() + observeCartAddMoreAction() + observeCartItemsToCheckIfCartIsEmpty() observeCardPresentPaymentEvents() observeItemsInCartForCartTotal() observePaymentStateForButtonDisabledProperties() } - var canDeleteItemsFromCart: Bool { - return orderStage != .finalizing - } - - var isCartCollapsed: Bool { - itemsInCart.isEmpty - } - - var itemToScrollToWhenCartUpdated: CartItem? { - return itemsInCart.last - } - - func addItemToCart(_ item: POSItem) { - let cartItem = CartItem(id: UUID(), item: item, quantity: 1) - itemsInCart.append(cartItem) - } - - func removeItemFromCart(_ cartItem: CartItem) { - itemsInCart.removeAll(where: { $0.id == cartItem.id }) - } - - func removeAllItemsFromCart() { - itemsInCart.removeAll() - } - - var itemsInCartLabel: String? { - switch itemsInCart.count { - case 0: - return nil - default: - return String.pluralize(itemsInCart.count, - singular: "%1$d item", - plural: "%1$d items") - } - } - - private func checkIfCartEmpty() { - if itemsInCart.isEmpty { - orderStage = .building - } - } - - func submitCart() { - // TODO: https://github.com/woocommerce/woocommerce-ios/issues/12810 - orderStage = .finalizing - - startSyncingOrder() - } - - func addMoreToCart() { - orderStage = .building - } - var areAmountsFullyCalculated: Bool { return isSyncingOrder == false && formattedOrderTotalTaxPrice != nil && formattedOrderTotalPrice != nil } @@ -208,18 +160,22 @@ final class PointOfSaleDashboardViewModel: ObservableObject { } func calculateAmountsTapped() { - startSyncingOrder() + // TODO: 12998 - move to the totals view model + startSyncingOrder(cartItems: itemsInCart) } - private func startSyncingOrder() { + private func startSyncingOrder(cartItems: [CartItem]) { + // TODO: 12998 - move to the totals view model + // At this point, this should happen in the TotalsViewModel Task { @MainActor in - await syncOrder(for: itemsInCart) + itemsInCart = cartItems + await syncOrder(for: cartItems) } } func startNewTransaction() { // clear cart - itemsInCart.removeAll() + cartViewModel.removeAllItemsFromCart() orderStage = .building paymentState = .acceptingCard order = nil @@ -234,15 +190,47 @@ final class PointOfSaleDashboardViewModel: ObservableObject { private extension PointOfSaleDashboardViewModel { func observeSelectedItemToAddToCart() { itemSelectorViewModel.selectedItemPublisher.sink { [weak self] selectedItem in - self?.addItemToCart(selectedItem) + self?.cartViewModel.addItemToCart(selectedItem) } .store(in: &cancellables) } + + func observeCartItemsForCollapsedState() { + cartViewModel.$itemsInCart + .map { $0.isEmpty } + .assign(to: &$isCartCollapsed) + } + + func observeCartSubmission() { + cartViewModel.cartSubmissionPublisher.sink { [weak self] cartItems in + guard let self else { return } + orderStage = .finalizing + startSyncingOrder(cartItems: cartItems) + } + .store(in: &cancellables) + } + + func observeCartAddMoreAction() { + cartViewModel.addMoreToCartActionPublisher.sink { [weak self] in + guard let self else { return } + orderStage = .building + } + .store(in: &cancellables) + } + + func observeCartItemsToCheckIfCartIsEmpty() { + cartViewModel.$itemsInCart + .filter { $0.isEmpty } + .sink { [weak self] _ in + self?.orderStage = .building + } + .store(in: &cancellables) + } } private extension PointOfSaleDashboardViewModel { func observeItemsInCartForCartTotal() { - $itemsInCart + cartViewModel.$itemsInCart .map { [weak self] in guard let self else { return "-" } let totalValue: Decimal = $0.reduce(0) { partialResult, cartItem in diff --git a/WooCommerce/WooCommerce.xcodeproj/project.pbxproj b/WooCommerce/WooCommerce.xcodeproj/project.pbxproj index 7ed6fb7d268..b9d472d137f 100644 --- a/WooCommerce/WooCommerce.xcodeproj/project.pbxproj +++ b/WooCommerce/WooCommerce.xcodeproj/project.pbxproj @@ -1470,6 +1470,8 @@ 683421642ACE9391009021D7 /* ProductDiscountView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 683421632ACE9391009021D7 /* ProductDiscountView.swift */; }; 683763162C2E44B800AD51D0 /* ItemSelectorViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 683763152C2E44B800AD51D0 /* ItemSelectorViewModel.swift */; }; 683763182C2E497000AD51D0 /* ItemSelectorViewModelTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 683763172C2E497000AD51D0 /* ItemSelectorViewModelTests.swift */; }; + 6837631A2C2E6F5900AD51D0 /* CartViewModelTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 683763192C2E6F5900AD51D0 /* CartViewModelTests.swift */; }; + 6837631C2C2E847D00AD51D0 /* CartViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6837631B2C2E847D00AD51D0 /* CartViewModel.swift */; }; 683AA9D62A303CB70099F7BA /* UpgradesViewModelTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 683AA9D52A303CB70099F7BA /* UpgradesViewModelTests.swift */; }; 684AB83A2870677F003DFDD1 /* CardReaderManualsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 684AB8392870677F003DFDD1 /* CardReaderManualsView.swift */; }; 684AB83C2873DF04003DFDD1 /* CardReaderManualsViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 684AB83B2873DF04003DFDD1 /* CardReaderManualsViewModel.swift */; }; @@ -4395,6 +4397,8 @@ 683421632ACE9391009021D7 /* ProductDiscountView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProductDiscountView.swift; sourceTree = ""; }; 683763152C2E44B800AD51D0 /* ItemSelectorViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ItemSelectorViewModel.swift; sourceTree = ""; }; 683763172C2E497000AD51D0 /* ItemSelectorViewModelTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ItemSelectorViewModelTests.swift; sourceTree = ""; }; + 683763192C2E6F5900AD51D0 /* CartViewModelTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CartViewModelTests.swift; sourceTree = ""; }; + 6837631B2C2E847D00AD51D0 /* CartViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CartViewModel.swift; sourceTree = ""; }; 683AA9D52A303CB70099F7BA /* UpgradesViewModelTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UpgradesViewModelTests.swift; sourceTree = ""; }; 684AB8392870677F003DFDD1 /* CardReaderManualsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CardReaderManualsView.swift; sourceTree = ""; }; 684AB83B2873DF04003DFDD1 /* CardReaderManualsViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CardReaderManualsViewModel.swift; sourceTree = ""; }; @@ -6628,6 +6632,7 @@ children = ( 026826922BF59D830036F959 /* PointOfSaleDashboardViewModel.swift */, 683763152C2E44B800AD51D0 /* ItemSelectorViewModel.swift */, + 6837631B2C2E847D00AD51D0 /* CartViewModel.swift */, ); path = ViewModels; sourceTree = ""; @@ -12143,6 +12148,7 @@ children = ( DABF35262C11B426006AF826 /* PointOfSaleDashboardViewModelTests.swift */, 683763172C2E497000AD51D0 /* ItemSelectorViewModelTests.swift */, + 683763192C2E6F5900AD51D0 /* CartViewModelTests.swift */, ); path = ViewModels; sourceTree = ""; @@ -14735,6 +14741,7 @@ 026826AF2BF59DF70036F959 /* PointOfSaleEntryPointView.swift in Sources */, CC770C8A27B1497700CE6ABC /* SearchHeader.swift in Sources */, 02BAB02724D13A6400F8B06E /* ProductVariationFormActionsFactory.swift in Sources */, + 6837631C2C2E847D00AD51D0 /* CartViewModel.swift in Sources */, 45CDAFAE2434CFCA00F83C22 /* ProductCatalogVisibilityViewController.swift in Sources */, D85B8333222FABD1002168F3 /* StatusListTableViewCell.swift in Sources */, 683763162C2E44B800AD51D0 /* ItemSelectorViewModel.swift in Sources */, @@ -16497,6 +16504,7 @@ C7533D1E2C1E38E0002EBAE7 /* OrderSearchUICommandTests.swift in Sources */, 748C7784211E2D8400814F2C /* DoubleWooTests.swift in Sources */, 03F8D87D2A7A76DE00DD6D2F /* MockCardPresentPaymentPreflightController.swift in Sources */, + 6837631A2C2E6F5900AD51D0 /* CartViewModelTests.swift in Sources */, 02524A5D252ED5C60033E7BD /* ProductVariationLoadUseCaseTests.swift in Sources */, EE94258F29DDA49E0063B499 /* StoreCreationProgressViewModelTests.swift in Sources */, 023B3EBA2A4E73BD003A720A /* LocalAnnouncementViewModelTests.swift in Sources */, diff --git a/WooCommerce/WooCommerceTests/POS/ViewModels/CartViewModelTests.swift b/WooCommerce/WooCommerceTests/POS/ViewModels/CartViewModelTests.swift new file mode 100644 index 00000000000..d9135165751 --- /dev/null +++ b/WooCommerce/WooCommerceTests/POS/ViewModels/CartViewModelTests.swift @@ -0,0 +1,157 @@ +import XCTest +import Combine +@testable import WooCommerce +@testable import protocol Yosemite.POSItem +@testable import struct Yosemite.POSProduct + +final class CartViewModelTests: XCTestCase { + + private var orderStageSubject: PassthroughSubject! + private var sut: CartViewModel! + + override func setUp() { + super.setUp() + orderStageSubject = PassthroughSubject() + sut = CartViewModel(orderStage: orderStageSubject.eraseToAnyPublisher()) + } + + override func tearDown() { + orderStageSubject = nil + sut = nil + super.tearDown() + } + + func test_canDeleteItemsFromCart_when_orderStage_is_building_then_returns_true() { + // Given/When + XCTAssertEqual(sut.canDeleteItemsFromCart, true, "Initial state") + orderStageSubject.send(.finalizing) + + // Then + XCTAssertEqual(sut.canDeleteItemsFromCart, false) + } + + func test_canDeleteItemsFromCart_when_orderStage_is_finalizing_then_returns_false() { + // Given/When + orderStageSubject.send(.finalizing) + + // Then + XCTAssertEqual(sut.canDeleteItemsFromCart, false) + } + + func test_cart_when_submitCart_is_invoked_then_cartSubmissionPublisher_emits_cart_items() { + // Given + var cancellables: Set = [] + let item = Self.makeItem() + let anotherItem = Self.makeItem() + + // When + sut.addItemToCart(item) + sut.addItemToCart(anotherItem) + sut.cartSubmissionPublisher.sink(receiveValue: { cartItems in + // Then + XCTAssertEqual(cartItems.count, 2) + }) + .store(in: &cancellables) + + sut.submitCart() + } + + func test_cart_when_addItemToCart_is_invoked_then_adds_item_to_cart() { + // Given + XCTAssertTrue(sut.itemsInCart.isEmpty, "Initial state") + let item = Self.makeItem() + + // When + sut.addItemToCart(item) + + // Then + XCTAssertTrue(sut.itemsInCart.isNotEmpty) + } + + func test_removeItemFromCart() { + /* TODO: + https://github.com/woocommerce/woocommerce-ios/issues/13209 + The unique UUID for CartItem is set on init, but CartItem is only internal to addItemToCart() + We need to extract this to a separate function and assure that ID's are correct, + otherwise the UUID's for testing won't match + */ + } + + func test_removeItemFromCart_after_adding_2_items_removes_item() throws { + // Given + let item = Self.makeItem(name: "Item 1") + let anotherItem = Self.makeItem(name: "Item 2") + sut.addItemToCart(item) + sut.addItemToCart(anotherItem) + XCTAssertEqual(sut.itemsInCart.count, 2) + XCTAssertEqual(sut.itemsInCart.map { $0.item.name }, [item, anotherItem].map { $0.name }) + + // When + let firstCartItem = try XCTUnwrap(sut.itemsInCart.first) + sut.removeItemFromCart(firstCartItem) + + // Then + XCTAssertEqual(sut.itemsInCart.count, 1) + XCTAssertEqual(sut.itemsInCart.map { $0.item.name }, [anotherItem.name]) + } + + func test_cart_when_removeAllItemsFromCart_is_invoked_then_removes_all_items_from_cart() { + // Given + let item = Self.makeItem() + let anotherItem = Self.makeItem() + + sut.addItemToCart(item) + sut.addItemToCart(anotherItem) + XCTAssertEqual(sut.itemsInCart.count, 2) + + // When + sut.removeAllItemsFromCart() + + // Then + XCTAssertEqual(sut.itemsInCart.count, 0) + } + + func test_cart_when_itemToScrollToWhenCartUpdated_is_invoked_then_returns_the_last_cart_item() { + // Given + let firstItem = Self.makeItem() + let lastItem = Self.makeItem() + + sut.addItemToCart(firstItem) + sut.addItemToCart(lastItem) + + guard let expectedItem = sut.itemToScrollToWhenCartUpdated else { + return XCTFail("Expected item, found nil.") + } + + // Then + XCTAssertEqual(expectedItem.item.itemID, lastItem.itemID) + } + + func test_itemsInCartLabel() { + XCTAssertNil(sut.itemsInCartLabel, "Initial state") + + // Given + let anItem = Self.makeItem() + let anotherItem = Self.makeItem() + + // When/Then + sut.addItemToCart(anItem) + XCTAssertEqual(sut.itemsInCartLabel, "1 item") + + sut.addItemToCart(anotherItem) + XCTAssertEqual(sut.itemsInCartLabel, "2 items") + } +} + +private extension CartViewModelTests { + static func makeItem(name: String = "") -> POSItem { + return POSProduct(itemID: UUID(), + productID: 0, + name: name, + price: "", + formattedPrice: "", + itemCategories: [], + productImageSource: nil, + productType: .simple) + } +} diff --git a/WooCommerce/WooCommerceTests/POS/ViewModels/PointOfSaleDashboardViewModelTests.swift b/WooCommerce/WooCommerceTests/POS/ViewModels/PointOfSaleDashboardViewModelTests.swift index 1bf3f2df09b..1a66e0ec884 100644 --- a/WooCommerce/WooCommerceTests/POS/ViewModels/PointOfSaleDashboardViewModelTests.swift +++ b/WooCommerce/WooCommerceTests/POS/ViewModels/PointOfSaleDashboardViewModelTests.swift @@ -32,55 +32,8 @@ final class PointOfSaleDashboardViewModelTests: XCTestCase { super.tearDown() } - func test_cart_is_empty_initially() { - // Given/Then - XCTAssertTrue(sut.itemsInCart.isEmpty) - } - - func test_cart_is_collapsed_when_empty_then_not_collapsed_when_has_items() { - XCTAssertTrue(sut.itemsInCart.isEmpty, "Precondition") - XCTAssertTrue(sut.isCartCollapsed, "Precondition") - - // Given - let product = POSProduct(itemID: UUID(), - productID: 0, - name: "Choco", - price: "2.00", - formattedPrice: "$2.00", - itemCategories: [], - productImageSource: nil, - productType: .simple) - - // When - sut.addItemToCart(product) - - // Then - XCTAssertFalse(sut.itemsInCart.isEmpty) - XCTAssertFalse(sut.isCartCollapsed) - } - - func test_removeAllItemsFromCart_removes_all_items_from_cart() { - // Given - let numberOfItems = Int.random(in: 1...5) - for i in 1...numberOfItems { - let product = POSProduct(itemID: UUID(), - productID: Int64(i), - name: "Choco", - price: "2.00", - formattedPrice: "$2.00", - itemCategories: [], - productImageSource: nil, - productType: .simple) - sut.addItemToCart(product) - } - XCTAssertEqual(sut.itemsInCart.count, numberOfItems) - - // When - sut.removeAllItemsFromCart() - - // Then - XCTAssertEqual(sut.itemsInCart.count, 0) - } + // TODO: + // https://github.com/woocommerce/woocommerce-ios/issues/13210 } private extension PointOfSaleDashboardViewModelTests {