From 4165887d19b1507a7e0cc9ff496edc38203db277 Mon Sep 17 00:00:00 2001 From: Josh Heald Date: Thu, 21 Nov 2024 10:27:18 +0000 Subject: [PATCH 1/2] 14458 Simplify cart view model --- .../Classes/POS/Presentation/CartView.swift | 13 +-- .../PointOfSaleDashboardView.swift | 12 +-- .../PointOfSaleEntryPointView.swift | 7 +- .../POS/ViewModels/CartViewModel.swift | 13 +-- .../ViewModels/CartViewModelProtocol.swift | 10 --- .../PointOfSaleDashboardViewModel.swift | 4 - .../WooCommerce.xcodeproj/project.pbxproj | 8 -- .../POS/Mocks/MockCartViewModel.swift | 32 ------- .../POS/ViewModels/CartViewModelTests.swift | 85 +++---------------- .../PointOfSaleDashboardViewModelTests.swift | 4 - 10 files changed, 20 insertions(+), 168 deletions(-) delete mode 100644 WooCommerce/Classes/POS/ViewModels/CartViewModelProtocol.swift delete mode 100644 WooCommerce/WooCommerceTests/POS/Mocks/MockCartViewModel.swift diff --git a/WooCommerce/Classes/POS/Presentation/CartView.swift b/WooCommerce/Classes/POS/Presentation/CartView.swift index 6b0fb68781a..737f945c64d 100644 --- a/WooCommerce/Classes/POS/Presentation/CartView.swift +++ b/WooCommerce/Classes/POS/Presentation/CartView.swift @@ -5,7 +5,7 @@ struct CartView: View { @EnvironmentObject private var posModel: PointOfSaleAggregateModel @ObservedObject private var viewModel: PointOfSaleDashboardViewModel - @ObservedObject private var cartViewModel: CartViewModel + private let cartViewModel = CartViewModel() @Environment(\.floatingControlAreaSize) var floatingControlAreaSize: CGSize @Environment(\.dynamicTypeSize) var dynamicTypeSize @Environment(\.colorScheme) var colorScheme @@ -16,9 +16,8 @@ struct CartView: View { posModel.cart.isNotEmpty && offSetPosition < 0 } - init(viewModel: PointOfSaleDashboardViewModel, cartViewModel: CartViewModel) { + init(viewModel: PointOfSaleDashboardViewModel) { self.viewModel = viewModel - self.cartViewModel = cartViewModel } var body: some View { @@ -37,7 +36,7 @@ struct CartView: View { Spacer() - if let itemsInCartLabel = cartViewModel.itemsInCartLabel { + if let itemsInCartLabel = cartViewModel.itemsInCartLabel(for: posModel.cart.count) { Text(itemsInCartLabel) .font(Constants.itemsFont) .foregroundColor(Color.posSecondaryText) @@ -260,12 +259,8 @@ import class WooFoundation.MockAnalyticsProviderPreview itemProvider: POSItemProviderPreview(), cardPresentPaymentService: CardPresentPaymentPreviewService(), orderService: POSOrderPreviewService()) - // TODO: - // Simplify this by mocking `CartViewModel` - let cartViewModel = CartViewModel(posModel: posModel) let dashboardViewModel = PointOfSaleDashboardViewModel(posModel: posModel, - cartViewModel: cartViewModel, connectivityObserver: POSConnectivityObserverPreview()) - CartView(viewModel: dashboardViewModel, cartViewModel: cartViewModel) + CartView(viewModel: dashboardViewModel) } #endif diff --git a/WooCommerce/Classes/POS/Presentation/PointOfSaleDashboardView.swift b/WooCommerce/Classes/POS/Presentation/PointOfSaleDashboardView.swift index 8ec694c2b18..9751c2e5572 100644 --- a/WooCommerce/Classes/POS/Presentation/PointOfSaleDashboardView.swift +++ b/WooCommerce/Classes/POS/Presentation/PointOfSaleDashboardView.swift @@ -3,12 +3,9 @@ import SwiftUI struct PointOfSaleDashboardView: View { @EnvironmentObject private var posModel: PointOfSaleAggregateModel @ObservedObject private var viewModel: PointOfSaleDashboardViewModel - @ObservedObject private var cartViewModel: CartViewModel - init(viewModel: PointOfSaleDashboardViewModel, - cartViewModel: CartViewModel) { + init(viewModel: PointOfSaleDashboardViewModel) { self.viewModel = viewModel - self.cartViewModel = cartViewModel } @State private var floatingSize: CGSize = .zero @@ -173,7 +170,7 @@ private extension PointOfSaleDashboardView { /// Helpers to generate all Dashboard subviews private extension PointOfSaleDashboardView { var cartView: some View { - CartView(viewModel: viewModel, cartViewModel: cartViewModel) + CartView(viewModel: viewModel) } var productListView: some View { @@ -190,14 +187,11 @@ import class WooFoundation.MockAnalyticsProviderPreview itemProvider: POSItemProviderPreview(), cardPresentPaymentService: CardPresentPaymentPreviewService(), orderService: POSOrderPreviewService()) - let cartVM = CartViewModel(posModel: posModel) let posVM = PointOfSaleDashboardViewModel(posModel: posModel, - cartViewModel: cartVM, connectivityObserver: POSConnectivityObserverPreview()) return NavigationStack { - PointOfSaleDashboardView(viewModel: posVM, - cartViewModel: cartVM) + PointOfSaleDashboardView(viewModel: posVM) } } #endif diff --git a/WooCommerce/Classes/POS/Presentation/PointOfSaleEntryPointView.swift b/WooCommerce/Classes/POS/Presentation/PointOfSaleEntryPointView.swift index 6e008ee7743..4f952e2e6c1 100644 --- a/WooCommerce/Classes/POS/Presentation/PointOfSaleEntryPointView.swift +++ b/WooCommerce/Classes/POS/Presentation/PointOfSaleEntryPointView.swift @@ -7,7 +7,6 @@ import protocol WooFoundation.Analytics struct PointOfSaleEntryPointView: View { @StateObject private var posModel: PointOfSaleAggregateModel @StateObject private var viewModel: PointOfSaleDashboardViewModel - @StateObject private var cartViewModel: CartViewModel @StateObject private var posModalManager = POSModalManager() private let onPointOfSaleModeActiveStateChange: ((Bool) -> Void) @@ -23,20 +22,16 @@ struct PointOfSaleEntryPointView: View { let posModel = PointOfSaleAggregateModel(itemProvider: itemProvider, cardPresentPaymentService: cardPresentPaymentService, orderService: orderService) - let cartViewModel = CartViewModel(posModel: posModel) self._posModel = StateObject(wrappedValue: posModel) self._viewModel = StateObject(wrappedValue: PointOfSaleDashboardViewModel( posModel: posModel, - cartViewModel: cartViewModel, connectivityObserver: ServiceLocator.connectivityObserver) ) - self._cartViewModel = StateObject(wrappedValue: cartViewModel) } var body: some View { - PointOfSaleDashboardView(viewModel: viewModel, - cartViewModel: cartViewModel) + PointOfSaleDashboardView(viewModel: viewModel) .environmentObject(posModalManager) .environmentObject(posModel) .onAppear { diff --git a/WooCommerce/Classes/POS/ViewModels/CartViewModel.swift b/WooCommerce/Classes/POS/ViewModels/CartViewModel.swift index 86e17958f5b..1566a27a583 100644 --- a/WooCommerce/Classes/POS/ViewModels/CartViewModel.swift +++ b/WooCommerce/Classes/POS/ViewModels/CartViewModel.swift @@ -2,15 +2,8 @@ import SwiftUI import Combine import protocol Yosemite.POSItem -final class CartViewModel: CartViewModelProtocol { - let posModel: PointOfSaleAggregateModel - - init(posModel: PointOfSaleAggregateModel) { - self.posModel = posModel - } - - var itemsInCartLabel: String? { - let itemsCount = posModel.cart.count +final class CartViewModel { + func itemsInCartLabel(for itemsCount: Int) -> String? { guard itemsCount > 0 else { return nil } @@ -28,8 +21,6 @@ final class CartViewModel: CartViewModelProtocol { } } - - private extension PointOfSalePaymentState { var allowsCartEditing: Bool { switch self { diff --git a/WooCommerce/Classes/POS/ViewModels/CartViewModelProtocol.swift b/WooCommerce/Classes/POS/ViewModels/CartViewModelProtocol.swift deleted file mode 100644 index b5437f4d9ce..00000000000 --- a/WooCommerce/Classes/POS/ViewModels/CartViewModelProtocol.swift +++ /dev/null @@ -1,10 +0,0 @@ -import SwiftUI -import Combine -import protocol Yosemite.POSItem - -protocol CartViewModelProtocol: ObservableObject { - var itemsInCartLabel: String? { get } - - func shouldPreventCartEditing(orderState: PointOfSaleOrderState, - paymentState: PointOfSalePaymentState) -> Bool -} diff --git a/WooCommerce/Classes/POS/ViewModels/PointOfSaleDashboardViewModel.swift b/WooCommerce/Classes/POS/ViewModels/PointOfSaleDashboardViewModel.swift index bf7ac9bd66d..e68cc9aee88 100644 --- a/WooCommerce/Classes/POS/ViewModels/PointOfSaleDashboardViewModel.swift +++ b/WooCommerce/Classes/POS/ViewModels/PointOfSaleDashboardViewModel.swift @@ -7,8 +7,6 @@ import struct Yosemite.POSCartItem import struct Yosemite.Order final class PointOfSaleDashboardViewModel: ObservableObject { - let cartViewModel: any CartViewModelProtocol - @ObservedObject var posModel: PointOfSaleAggregateModel private let connectivityObserver: ConnectivityObserver @@ -20,10 +18,8 @@ final class PointOfSaleDashboardViewModel: ObservableObject { private var cancellables: Set = [] init(posModel: PointOfSaleAggregateModel, - cartViewModel: any CartViewModelProtocol, connectivityObserver: ConnectivityObserver) { self.posModel = posModel - self.cartViewModel = cartViewModel self.connectivityObserver = connectivityObserver observeConnectivity() diff --git a/WooCommerce/WooCommerce.xcodeproj/project.pbxproj b/WooCommerce/WooCommerce.xcodeproj/project.pbxproj index d576712c4ed..2b569be521a 100644 --- a/WooCommerce/WooCommerce.xcodeproj/project.pbxproj +++ b/WooCommerce/WooCommerce.xcodeproj/project.pbxproj @@ -30,7 +30,6 @@ 015D99AA2C58C780001D7186 /* PointOfSaleCardPresentPaymentLayout.swift in Sources */ = {isa = PBXBuildFile; fileRef = 015D99A92C58C780001D7186 /* PointOfSaleCardPresentPaymentLayout.swift */; }; 01620C4E2C5394B200D3EA2F /* POSProgressViewStyle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01620C4D2C5394B200D3EA2F /* POSProgressViewStyle.swift */; }; 01664F9E2C50E685007CB5DD /* POSFontStyle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01664F9D2C50E685007CB5DD /* POSFontStyle.swift */; }; - 016BCAFF2C4F907F009D8367 /* CartViewModelProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 016BCAFE2C4F907F009D8367 /* CartViewModelProtocol.swift */; }; 016C6B972C74AB17000D86FD /* POSConnectivityView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 016C6B962C74AB17000D86FD /* POSConnectivityView.swift */; }; 0174DDBB2CE5FD60005D20CA /* ReceiptEmailViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0174DDBA2CE5FD5D005D20CA /* ReceiptEmailViewModel.swift */; }; 0174DDBF2CE600C5005D20CA /* ReceiptEmailViewModelTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0174DDBE2CE600C0005D20CA /* ReceiptEmailViewModelTests.swift */; }; @@ -2059,7 +2058,6 @@ C0A37CB8282957EB00E0826D /* orders_3337_add_customer_details.json in Resources */ = {isa = PBXBuildFile; fileRef = C0A37CB7282957EB00E0826D /* orders_3337_add_customer_details.json */; }; C0CE1F84282AB1590019138E /* countries.json in Resources */ = {isa = PBXBuildFile; fileRef = C0CE1F83282AB1590019138E /* countries.json */; }; C7533D1E2C1E38E0002EBAE7 /* OrderSearchUICommandTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C7533D1D2C1E38E0002EBAE7 /* OrderSearchUICommandTests.swift */; }; - C7F746C32C485B3B0023ADD0 /* MockCartViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = C7F746C22C485B3B0023ADD0 /* MockCartViewModel.swift */; }; CC0324A3263AD9F40056C6B7 /* MockShippingLabelAccountSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = CC0324A2263AD9F40056C6B7 /* MockShippingLabelAccountSettings.swift */; }; CC04918D292BB74500F719D8 /* StatsDataTextFormatter.swift in Sources */ = {isa = PBXBuildFile; fileRef = CC04918C292BB74500F719D8 /* StatsDataTextFormatter.swift */; }; CC04918F292BD6AC00F719D8 /* StatsDataTextFormatterTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = CC04918E292BD6AC00F719D8 /* StatsDataTextFormatterTests.swift */; }; @@ -3144,7 +3142,6 @@ 015D99A92C58C780001D7186 /* PointOfSaleCardPresentPaymentLayout.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PointOfSaleCardPresentPaymentLayout.swift; sourceTree = ""; }; 01620C4D2C5394B200D3EA2F /* POSProgressViewStyle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = POSProgressViewStyle.swift; sourceTree = ""; }; 01664F9D2C50E685007CB5DD /* POSFontStyle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = POSFontStyle.swift; sourceTree = ""; }; - 016BCAFE2C4F907F009D8367 /* CartViewModelProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CartViewModelProtocol.swift; sourceTree = ""; }; 016C6B962C74AB17000D86FD /* POSConnectivityView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = POSConnectivityView.swift; sourceTree = ""; }; 0174DDBA2CE5FD5D005D20CA /* ReceiptEmailViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReceiptEmailViewModel.swift; sourceTree = ""; }; 0174DDBE2CE600C0005D20CA /* ReceiptEmailViewModelTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReceiptEmailViewModelTests.swift; sourceTree = ""; }; @@ -5144,7 +5141,6 @@ C0CE1F83282AB1590019138E /* countries.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = countries.json; sourceTree = ""; }; C5EFBA3D6E428FD34F5A4171 /* Pods_NotificationExtension.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_NotificationExtension.framework; sourceTree = BUILT_PRODUCTS_DIR; }; C7533D1D2C1E38E0002EBAE7 /* OrderSearchUICommandTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OrderSearchUICommandTests.swift; sourceTree = ""; }; - C7F746C22C485B3B0023ADD0 /* MockCartViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockCartViewModel.swift; sourceTree = ""; }; CB4839361AA061340BE98DA9 /* Pods-StoreWidgetsExtension.release-alpha.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-StoreWidgetsExtension.release-alpha.xcconfig"; path = "../Pods/Target Support Files/Pods-StoreWidgetsExtension/Pods-StoreWidgetsExtension.release-alpha.xcconfig"; sourceTree = ""; }; CC0324A2263AD9F40056C6B7 /* MockShippingLabelAccountSettings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockShippingLabelAccountSettings.swift; sourceTree = ""; }; CC04918C292BB74500F719D8 /* StatsDataTextFormatter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StatsDataTextFormatter.swift; sourceTree = ""; }; @@ -6853,7 +6849,6 @@ children = ( 026826922BF59D830036F959 /* PointOfSaleDashboardViewModel.swift */, 6885E2CB2C32B14B004C8D70 /* TotalsViewModel.swift */, - 016BCAFE2C4F907F009D8367 /* CartViewModelProtocol.swift */, 6837631B2C2E847D00AD51D0 /* CartViewModel.swift */, ); path = ViewModels; @@ -7369,7 +7364,6 @@ children = ( 02CD3BFD2C35D04C00E575C4 /* MockCardPresentPaymentService.swift */, 207E71CA2C60F765008540FC /* MockPOSOrderService.swift */, - C7F746C22C485B3B0023ADD0 /* MockCartViewModel.swift */, 20FCBCE02CE24CE70082DCA3 /* MockPOSItemProvider.swift */, 20FCBCE22CE24F5D0082DCA3 /* MockPointOfSaleAggregateModel.swift */, ); @@ -15890,7 +15884,6 @@ 020886572499E643001D784E /* ProductExternalLinkViewController.swift in Sources */, DEC2962526C122DF005A056B /* ShippingLabelCustomsFormInputViewModel.swift in Sources */, 02F4F50F237AFC1E00E13A9C /* ImageAndTitleAndTextTableViewCell.swift in Sources */, - 016BCAFF2C4F907F009D8367 /* CartViewModelProtocol.swift in Sources */, 26E7EE7029300F6200793045 /* DeltaTag.swift in Sources */, 021E2A1C23AA0DD100B1DE07 /* ProductBackordersSettingListSelectorCommand.swift in Sources */, 26F94E21267A41BE00DB6CCF /* ProductAddOnsListViewModel.swift in Sources */, @@ -16958,7 +16951,6 @@ 023EC2E024DA87460021DA91 /* ProductInventorySettingsViewModelTests.swift in Sources */, AEB73C1725CD8E5800A8454A /* AttributePickerViewModelTests.swift in Sources */, 02DE5CAB279F8754007CBEF3 /* Double+RoundingTests.swift in Sources */, - C7F746C32C485B3B0023ADD0 /* MockCartViewModel.swift in Sources */, AE90475C27A99D6000073E1D /* CreateOrderAddressFormViewModelTests.swift in Sources */, B56C721421B5BBC000E5E85B /* MockStoresManager.swift in Sources */, 26B119C024D0C69500FED5C7 /* SurveyViewControllerTests.swift in Sources */, diff --git a/WooCommerce/WooCommerceTests/POS/Mocks/MockCartViewModel.swift b/WooCommerce/WooCommerceTests/POS/Mocks/MockCartViewModel.swift deleted file mode 100644 index cfd6c8c8bb3..00000000000 --- a/WooCommerce/WooCommerceTests/POS/Mocks/MockCartViewModel.swift +++ /dev/null @@ -1,32 +0,0 @@ -import Combine -import SwiftUI -@testable import WooCommerce -import protocol Yosemite.POSItem - -class MockCartViewModel: CartViewModelProtocol { - lazy var cartSubmissionPublisher = cartSubmissionSubject.eraseToAnyPublisher() - let cartSubmissionSubject: PassthroughSubject<[CartItem], Never> = .init() - - var itemsInCartLabel: String? = nil - - func submitCart() { - submitCartCalled = true - } - - // Mock variables - var submitCartCalled = false - - func shouldPreventCartEditing(orderState: PointOfSaleOrderState, - paymentState: PointOfSalePaymentState) -> Bool { - return false - } -} - -// MARK: - Helpers - -extension MockCartViewModel { - func submitCart(with items: [CartItem]) { - cartSubmissionSubject.send(items) - submitCart() - } -} diff --git a/WooCommerce/WooCommerceTests/POS/ViewModels/CartViewModelTests.swift b/WooCommerce/WooCommerceTests/POS/ViewModels/CartViewModelTests.swift index 01f69b6db0a..aed8d6395fd 100644 --- a/WooCommerce/WooCommerceTests/POS/ViewModels/CartViewModelTests.swift +++ b/WooCommerce/WooCommerceTests/POS/ViewModels/CartViewModelTests.swift @@ -1,81 +1,8 @@ -import XCTest -@testable import WooCommerce -@testable import protocol Yosemite.POSItem -@testable import struct Yosemite.POSProduct - -final class LegacyCartViewModelTests: XCTestCase { - - private var sut: CartViewModel! - private var posModel: PointOfSaleAggregateModel! - - override func setUp() { - super.setUp() - posModel = PointOfSaleAggregateModel(itemProvider: MockPOSItemProvider(), - cardPresentPaymentService: MockCardPresentPaymentService(), - orderService: MockPOSOrderService()) - sut = CartViewModel(posModel: posModel) - } - - override func tearDown() { - sut = nil - super.tearDown() - } - - 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_itemsInCartLabel_when_addItemToCart_then_label_updates_accordingly() { - XCTAssertNil(sut.itemsInCartLabel, "Initial state") - - // Given - let anItem = makeItem() - let anotherItem = makeItem() - - // When/Then - posModel.addToCart(anItem) - XCTAssertEqual(sut.itemsInCartLabel, "1 item") - - posModel.addToCart(anotherItem) - XCTAssertEqual(sut.itemsInCartLabel, "2 items") - } -} - -private func makeItem(name: String = "") -> POSItem { - return POSProduct(itemID: UUID(), - productID: 0, - name: name, - price: "", - formattedPrice: "", - itemCategories: [], - productImageSource: nil, - productType: .simple) -} - import Testing +@testable import WooCommerce struct CartViewModelTests { - let orderService: MockPOSOrderService - let cardPresentPaymentService: MockCardPresentPaymentService - let posModel: PointOfSaleAggregateModel - let sut: CartViewModel - - init () async throws { - let orderService = MockPOSOrderService() - self.orderService = orderService - let cardPresentPaymentService = MockCardPresentPaymentService() - self.cardPresentPaymentService = cardPresentPaymentService - let posModel = PointOfSaleAggregateModel(itemProvider: MockPOSItemProvider(), - cardPresentPaymentService: cardPresentPaymentService, - orderService: orderService) - self.posModel = posModel - sut = CartViewModel(posModel: posModel) - } + let sut = CartViewModel() @Test func shouldPreventCartEditing_when_paymentState_idle_and_order_is_syncing() async throws { // Given @@ -133,4 +60,12 @@ struct CartViewModelTests { paymentState: .validatingOrderError) == false) } + @Test(arguments: zip([0, 1, 2, 3], [nil, "1 item", "2 items", "3 items"])) + func itemsInCartLabel(_ count: Int, _ expected: String?) async throws { + // Given + + // When, Then + #expect(sut.itemsInCartLabel(for: count) == expected) + } + } diff --git a/WooCommerce/WooCommerceTests/POS/ViewModels/PointOfSaleDashboardViewModelTests.swift b/WooCommerce/WooCommerceTests/POS/ViewModels/PointOfSaleDashboardViewModelTests.swift index 514b66205c9..02d35c19fa1 100644 --- a/WooCommerce/WooCommerceTests/POS/ViewModels/PointOfSaleDashboardViewModelTests.swift +++ b/WooCommerce/WooCommerceTests/POS/ViewModels/PointOfSaleDashboardViewModelTests.swift @@ -9,7 +9,6 @@ final class PointOfSaleDashboardViewModelTests: XCTestCase { private var mockPOSModel: PointOfSaleAggregateModel! private var cardPresentPaymentService: MockCardPresentPaymentService! private var itemProvider: MockPOSItemProvider! - private var mockCartViewModel: MockCartViewModel! private var mockConnectivityObserver: MockConnectivityObserver! private var cancellables: Set! @@ -18,7 +17,6 @@ final class PointOfSaleDashboardViewModelTests: XCTestCase { super.setUp() cardPresentPaymentService = MockCardPresentPaymentService() itemProvider = MockPOSItemProvider() - mockCartViewModel = MockCartViewModel() mockConnectivityObserver = MockConnectivityObserver() let mockOrderService = MockPOSOrderService() mockOrderService.orderToReturn = Order.fake() @@ -27,14 +25,12 @@ final class PointOfSaleDashboardViewModelTests: XCTestCase { cardPresentPaymentService: cardPresentPaymentService, orderService: mockOrderService) sut = PointOfSaleDashboardViewModel(posModel: mockPOSModel, - cartViewModel: mockCartViewModel, connectivityObserver: mockConnectivityObserver) cancellables = [] } override func tearDown() { cardPresentPaymentService = nil - mockCartViewModel = nil mockConnectivityObserver = nil sut = nil cancellables = [] From ab3af49d33db5a89cc146d2a923af938a5efb7da Mon Sep 17 00:00:00 2001 From: Josh Heald Date: Thu, 21 Nov 2024 10:47:21 +0000 Subject: [PATCH 2/2] 14458 Remove unused dashboard view model dependency --- .../Classes/POS/Presentation/CartView.swift | 23 ++++--------------- .../PointOfSaleDashboardView.swift | 15 ++---------- 2 files changed, 6 insertions(+), 32 deletions(-) diff --git a/WooCommerce/Classes/POS/Presentation/CartView.swift b/WooCommerce/Classes/POS/Presentation/CartView.swift index 737f945c64d..e625ba07dbf 100644 --- a/WooCommerce/Classes/POS/Presentation/CartView.swift +++ b/WooCommerce/Classes/POS/Presentation/CartView.swift @@ -3,9 +3,8 @@ import protocol Yosemite.POSItem struct CartView: View { @EnvironmentObject private var posModel: PointOfSaleAggregateModel + private let viewModel = CartViewModel() - @ObservedObject private var viewModel: PointOfSaleDashboardViewModel - private let cartViewModel = CartViewModel() @Environment(\.floatingControlAreaSize) var floatingControlAreaSize: CGSize @Environment(\.dynamicTypeSize) var dynamicTypeSize @Environment(\.colorScheme) var colorScheme @@ -16,10 +15,6 @@ struct CartView: View { posModel.cart.isNotEmpty && offSetPosition < 0 } - init(viewModel: PointOfSaleDashboardViewModel) { - self.viewModel = viewModel - } - var body: some View { VStack { DynamicHStack(spacing: Constants.cartHeaderSpacing) { @@ -36,7 +31,7 @@ struct CartView: View { Spacer() - if let itemsInCartLabel = cartViewModel.itemsInCartLabel(for: posModel.cart.count) { + if let itemsInCartLabel = viewModel.itemsInCartLabel(for: posModel.cart.count) { Text(itemsInCartLabel) .font(Constants.itemsFont) .foregroundColor(Color.posSecondaryText) @@ -149,7 +144,7 @@ private extension CartView { } var shouldPreventCartEditing: Bool { - cartViewModel.shouldPreventCartEditing( + viewModel.shouldPreventCartEditing( orderState: posModel.orderState, paymentState: posModel.paymentState) } @@ -250,17 +245,7 @@ private extension CartView { } #if DEBUG -import Combine -import class WooFoundation.MockAnalyticsPreview -import class WooFoundation.MockAnalyticsProviderPreview - #Preview { - let posModel = PointOfSaleAggregateModel( - itemProvider: POSItemProviderPreview(), - cardPresentPaymentService: CardPresentPaymentPreviewService(), - orderService: POSOrderPreviewService()) - let dashboardViewModel = PointOfSaleDashboardViewModel(posModel: posModel, - connectivityObserver: POSConnectivityObserverPreview()) - CartView(viewModel: dashboardViewModel) + CartView() } #endif diff --git a/WooCommerce/Classes/POS/Presentation/PointOfSaleDashboardView.swift b/WooCommerce/Classes/POS/Presentation/PointOfSaleDashboardView.swift index 9751c2e5572..370985e6690 100644 --- a/WooCommerce/Classes/POS/Presentation/PointOfSaleDashboardView.swift +++ b/WooCommerce/Classes/POS/Presentation/PointOfSaleDashboardView.swift @@ -80,13 +80,13 @@ struct PointOfSaleDashboardView: View { GeometryReader { geometry in HStack { if posModel.orderStage == .building { - productListView + ItemListView() .accessibilitySortPriority(2) .transition(.move(edge: .leading)) } if !posModel.paymentState.shownFullScreen { - cartView + CartView() .accessibilitySortPriority(1) .frame(width: geometry.size.width * Constants.cartWidth) .ignoresSafeArea(edges: .bottom) @@ -167,17 +167,6 @@ private extension PointOfSaleDashboardView { } } -/// Helpers to generate all Dashboard subviews -private extension PointOfSaleDashboardView { - var cartView: some View { - CartView(viewModel: viewModel) - } - - var productListView: some View { - ItemListView() - } -} - #if DEBUG import class WooFoundation.MockAnalyticsPreview import class WooFoundation.MockAnalyticsProviderPreview