Skip to content

Commit 9130091

Browse files
authored
[Woo POS] Walkthrough code cleanup (#13799)
2 parents 74e98c1 + d510dc7 commit 9130091

File tree

6 files changed

+107
-11
lines changed

6 files changed

+107
-11
lines changed

WooCommerce/Classes/POS/ViewModels/ItemListViewModel.swift

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@ final class ItemListViewModel: ItemListViewModelProtocol {
3434

3535
var itemsPublisher: Published<[POSItem]>.Publisher { $items }
3636
var statePublisher: Published<ItemListViewModel.ItemListState>.Publisher { $state }
37-
var isHeaderBannerDismissedPublisher: Published<Bool>.Publisher { $isHeaderBannerDismissed }
3837

3938
init(itemProvider: POSItemProvider) {
4039
self.itemProvider = itemProvider
@@ -82,10 +81,6 @@ final class ItemListViewModel: ItemListViewModelProtocol {
8281
extension ItemListViewModel {
8382
enum ItemListState: Equatable {
8483
case empty
85-
// TODO:
86-
// Differentiate between loading on entering POS mode and reloading, as the
87-
// screens will be different:
88-
// https://github.com/woocommerce/woocommerce-ios/issues/13286
8984
case loading
9085
case loaded([POSItem])
9186
case error(ErrorModel)

WooCommerce/Classes/POS/ViewModels/ItemListViewModelProtocol.swift

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ protocol ItemListViewModelProtocol: ObservableObject {
1212
var selectedItemPublisher: AnyPublisher<POSItem, Never> { get }
1313
var itemsPublisher: Published<[POSItem]>.Publisher { get }
1414
var statePublisher: Published<ItemListViewModel.ItemListState>.Publisher { get }
15-
var isHeaderBannerDismissedPublisher: Published<Bool>.Publisher { get }
1615

1716
func select(_ item: POSItem)
1817
func populatePointOfSaleItems() async

WooCommerce/WooCommerceTests/POS/Mocks/MockItemListViewModel.swift

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ class MockItemListViewModel: ItemListViewModelProtocol {
1111
var statePublisher: Published<WooCommerce.ItemListViewModel.ItemListState>.Publisher { $state }
1212

1313
@Published var isHeaderBannerDismissed: Bool = false
14-
var isHeaderBannerDismissedPublisher: Published<Bool>.Publisher { $isHeaderBannerDismissed }
1514

1615
var isEmptyOrError: Bool = false
1716
var shouldShowHeaderBanner: Bool = false

WooCommerce/WooCommerceTests/POS/ViewModels/ItemListViewModelTests.swift

Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -266,6 +266,105 @@ final class ItemListViewModelTests: XCTestCase {
266266
// Then
267267
XCTAssertEqual(sut.state.isLoaded, false)
268268
}
269+
270+
func test_populatePointOfSaleItems_when_no_items_are_loaded_then_itemsPublisher_emits_no_items() async throws {
271+
let itemProvider = MockPOSItemProvider()
272+
itemProvider.shouldReturnZeroItems = true
273+
let sut = ItemListViewModel(itemProvider: itemProvider)
274+
275+
let expectation = XCTestExpectation(description: "Publisher should emit nothing")
276+
var receivedItems: [POSItem] = []
277+
sut.itemsPublisher.sink { items in
278+
receivedItems = items
279+
expectation.fulfill()
280+
}
281+
.store(in: &cancellables)
282+
283+
// When
284+
await sut.populatePointOfSaleItems()
285+
286+
// Then
287+
XCTAssertTrue(sut.state == .empty)
288+
XCTAssertTrue(receivedItems.isEmpty)
289+
}
290+
291+
func test_populatePointOfSaleItems_when_items_are_loaded_then_itemsPublisher_emits_items() async throws {
292+
// Given
293+
let items = Self.makeItems()
294+
let expectation = XCTestExpectation(description: "Publisher should emit populated items")
295+
var receivedItems: [POSItem] = []
296+
sut.itemsPublisher.sink { items in
297+
receivedItems = items
298+
expectation.fulfill()
299+
}
300+
.store(in: &cancellables)
301+
302+
// When
303+
await sut.populatePointOfSaleItems()
304+
guard let firstItem = items.first, let lastItem = items.last else {
305+
return XCTFail("Expected two items, got \(receivedItems).")
306+
}
307+
308+
// Then
309+
XCTAssertTrue(sut.state == .loaded(receivedItems))
310+
XCTAssertEqual(receivedItems.first?.productID, firstItem.productID)
311+
XCTAssertEqual(receivedItems.last?.productID, lastItem.productID)
312+
}
313+
314+
func test_populatePointOfSaleItems_when_no_items_are_loaded_then_statePublisher_emits_expected_empty_state() async throws {
315+
// Given
316+
XCTAssertEqual(sut.state, .loading, "Initial state")
317+
318+
let itemProvider = MockPOSItemProvider()
319+
itemProvider.shouldReturnZeroItems = true
320+
let sut = ItemListViewModel(itemProvider: itemProvider)
321+
let expectation = XCTestExpectation(description: "Publisher should emit state changes")
322+
323+
var receivedStates: [ItemListViewModel.ItemListState] = []
324+
sut.statePublisher
325+
.removeDuplicates()
326+
.sink { state in
327+
receivedStates.append(state)
328+
expectation.fulfill()
329+
}
330+
.store(in: &cancellables)
331+
332+
// When
333+
await sut.populatePointOfSaleItems()
334+
335+
// Then
336+
XCTAssertEqual(receivedStates, [.loading, .empty])
337+
}
338+
339+
func test_populatePointOfSaleItems_when_items_are_loaded_then_statePublisher_emits_expected_loaded_state() async throws {
340+
// Given
341+
XCTAssertEqual(sut.state, .loading, "Initial state")
342+
let expectation = XCTestExpectation(description: "Publisher should emit state changes")
343+
let items = Self.makeItems()
344+
345+
var receivedStates: [ItemListViewModel.ItemListState] = []
346+
sut.statePublisher
347+
.removeDuplicates()
348+
.sink { state in
349+
receivedStates.append(state)
350+
expectation.fulfill()
351+
}
352+
.store(in: &cancellables)
353+
354+
// When
355+
await sut.populatePointOfSaleItems()
356+
357+
// Then
358+
XCTAssertEqual(receivedStates, [.loading, .loaded(items)])
359+
}
360+
361+
func test_simpleProductsInfoButtonTapped_when_tapped_then_showSimpleProductsModal_toggled() {
362+
XCTAssertFalse(sut.showSimpleProductsModal)
363+
364+
sut.simpleProductsInfoButtonTapped()
365+
366+
XCTAssertTrue(sut.showSimpleProductsModal)
367+
}
269368
}
270369

271370
private extension ItemListViewModelTests {

Yosemite/Yosemite/PointOfSale/POSItemProvider.swift

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,14 @@ public protocol POSItem {
1212
extension POSItem {
1313
// Equatable conformance
1414
static func == (lhs: Self, rhs: Self) -> Bool {
15-
lhs.itemID == rhs.itemID
15+
lhs.itemID == rhs.itemID &&
16+
lhs.productID == rhs.productID &&
17+
lhs.name == rhs.name &&
18+
lhs.price == rhs.price &&
19+
lhs.formattedPrice == rhs.formattedPrice &&
20+
lhs.itemCategories == rhs.itemCategories &&
21+
lhs.productImageSource == rhs.productImageSource &&
22+
lhs.productType == rhs.productType
1623
}
1724
}
1825

Yosemite/Yosemite/PointOfSale/POSProductProvider.swift

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -69,9 +69,6 @@ public final class POSProductProvider: POSItemProvider {
6969
productType: product.productType)
7070
}
7171
}
72-
73-
// TODO: Mechanism to reload/sync product data.
74-
// https://github.com/woocommerce/woocommerce-ios/issues/12837
7572
}
7673

7774
private extension POSProductProvider {

0 commit comments

Comments
 (0)