Skip to content

Commit bbb58eb

Browse files
committed
Add tests
1 parent 9fd2816 commit bbb58eb

File tree

2 files changed

+179
-0
lines changed

2 files changed

+179
-0
lines changed

WooCommerce/WooCommerce.xcodeproj/project.pbxproj

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1253,6 +1253,7 @@
12531253
AEA3F91527BEC96B00B9F555 /* PriceFieldFormatterTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = AEA3F91427BEC96B00B9F555 /* PriceFieldFormatterTests.swift */; };
12541254
AEACCB6D2785FF4A000D01F0 /* NavigationRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = AEACCB6C2785FF4A000D01F0 /* NavigationRow.swift */; };
12551255
AEB4DB99290AE8F300AE4340 /* MockCookieJar.swift in Sources */ = {isa = PBXBuildFile; fileRef = AEB4DB98290AE8F300AE4340 /* MockCookieJar.swift */; };
1256+
AEB6903729770B1D00872FE0 /* ProductListViewModelTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = AEB6903629770B1D00872FE0 /* ProductListViewModelTests.swift */; };
12561257
AEB73C0C25CD734200A8454A /* AttributePickerViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = AEB73C0B25CD734200A8454A /* AttributePickerViewModel.swift */; };
12571258
AEB73C1725CD8E5800A8454A /* AttributePickerViewModelTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = AEB73C1625CD8E5800A8454A /* AttributePickerViewModelTests.swift */; };
12581259
AEBFD13F28E7655F00F598C6 /* StoreInfoView.swift in Sources */ = {isa = PBXBuildFile; fileRef = AEBFD13E28E7655F00F598C6 /* StoreInfoView.swift */; };
@@ -3303,6 +3304,7 @@
33033304
AEA3F91427BEC96B00B9F555 /* PriceFieldFormatterTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PriceFieldFormatterTests.swift; sourceTree = "<group>"; };
33043305
AEACCB6C2785FF4A000D01F0 /* NavigationRow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NavigationRow.swift; sourceTree = "<group>"; };
33053306
AEB4DB98290AE8F300AE4340 /* MockCookieJar.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockCookieJar.swift; sourceTree = "<group>"; };
3307+
AEB6903629770B1D00872FE0 /* ProductListViewModelTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProductListViewModelTests.swift; sourceTree = "<group>"; };
33063308
AEB73C0B25CD734200A8454A /* AttributePickerViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AttributePickerViewModel.swift; sourceTree = "<group>"; };
33073309
AEB73C1625CD8E5800A8454A /* AttributePickerViewModelTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AttributePickerViewModelTests.swift; sourceTree = "<group>"; };
33083310
AEBFD13E28E7655F00F598C6 /* StoreInfoView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StoreInfoView.swift; sourceTree = "<group>"; };
@@ -4766,6 +4768,7 @@
47664768
0271139924DD15D800574A07 /* ProductsTabProductViewModel+VariationTests.swift */,
47674769
573A960224F433DD0091F3A5 /* ProductsTopBannerFactoryTests.swift */,
47684770
0279F0DB252DBF1F0098D7DE /* ProductVariationDetailsFactoryTests.swift */,
4771+
AEB6903629770B1D00872FE0 /* ProductListViewModelTests.swift */,
47694772
);
47704773
path = Products;
47714774
sourceTree = "<group>";
@@ -11566,6 +11569,7 @@
1156611569
02A9A496244D84AB00757B99 /* ProductsSortOrderBottomSheetListSelectorCommandTests.swift in Sources */,
1156711570
B9B6DEF1283F8EB100901FB7 /* SitePluginsURLTests.swift in Sources */,
1156811571
D83F5935225B3CDD00626E75 /* DatePickerTableViewCellTests.swift in Sources */,
11572+
AEB6903729770B1D00872FE0 /* ProductListViewModelTests.swift in Sources */,
1156911573
314DC4C1268D28B100444C9E /* CardReaderSettingsKnownReadersStorageTests.swift in Sources */,
1157011574
262AF38A2713B67600E39AFF /* SimplePaymentsAmountViewModelTests.swift in Sources */,
1157111575
93FA787221CD2A1A00B663E5 /* CurrencySettingsTests.swift in Sources */,
Lines changed: 175 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,175 @@
1+
import XCTest
2+
import Yosemite
3+
import Fakes
4+
@testable import WooCommerce
5+
6+
final class ProductListViewModelTests: XCTestCase {
7+
private let sampleSiteID: Int64 = 123
8+
private var storesManager: MockStoresManager!
9+
10+
override func setUp() {
11+
super.setUp()
12+
storesManager = MockStoresManager(sessionManager: .makeForTesting())
13+
}
14+
15+
override func tearDown() {
16+
storesManager = nil
17+
super.tearDown()
18+
}
19+
20+
func test_selecting_and_deselecting_product_and_checking_its_state_works() {
21+
// Given
22+
let viewModel = ProductListViewModel(siteID: sampleSiteID, stores: storesManager)
23+
let sampleProduct1 = Product.fake().copy(productID: 1)
24+
XCTAssertFalse(viewModel.productIsSelected(sampleProduct1))
25+
26+
// When
27+
viewModel.selectProduct(sampleProduct1)
28+
29+
// Then
30+
XCTAssertEqual(viewModel.selectedProductsCount, 1)
31+
XCTAssertTrue(viewModel.productIsSelected(sampleProduct1))
32+
33+
// When
34+
viewModel.deselectProduct(sampleProduct1)
35+
36+
// Then
37+
XCTAssertEqual(viewModel.selectedProductsCount, 0)
38+
XCTAssertFalse(viewModel.productIsSelected(sampleProduct1))
39+
}
40+
41+
func test_deselecting_not_selected_product_does_nothing() {
42+
// Given
43+
let viewModel = ProductListViewModel(siteID: sampleSiteID, stores: storesManager)
44+
let sampleProduct1 = Product.fake().copy(productID: 1)
45+
let sampleProduct2 = Product.fake().copy(productID: 2)
46+
XCTAssertEqual(viewModel.selectedProductsCount, 0)
47+
48+
// When
49+
viewModel.deselectProduct(sampleProduct1)
50+
viewModel.selectProduct(sampleProduct2)
51+
52+
// Then
53+
XCTAssertEqual(viewModel.selectedProductsCount, 1)
54+
XCTAssertFalse(viewModel.productIsSelected(sampleProduct1))
55+
XCTAssertTrue(viewModel.productIsSelected(sampleProduct2))
56+
}
57+
58+
func test_selecting_and_deselecting_product_twice_is_ignored() {
59+
// Given
60+
let viewModel = ProductListViewModel(siteID: sampleSiteID, stores: storesManager)
61+
let sampleProduct1 = Product.fake().copy(productID: 1)
62+
XCTAssertEqual(viewModel.selectedProductsCount, 0)
63+
64+
// When
65+
viewModel.selectProduct(sampleProduct1)
66+
viewModel.selectProduct(sampleProduct1)
67+
68+
// Then
69+
XCTAssertEqual(viewModel.selectedProductsCount, 1)
70+
XCTAssertTrue(viewModel.productIsSelected(sampleProduct1))
71+
72+
// When
73+
viewModel.deselectProduct(sampleProduct1)
74+
viewModel.deselectProduct(sampleProduct1)
75+
76+
// Then
77+
XCTAssertEqual(viewModel.selectedProductsCount, 0)
78+
XCTAssertFalse(viewModel.productIsSelected(sampleProduct1))
79+
}
80+
81+
func test_bulk_edit_bool_is_set_correctly() {
82+
// Given
83+
let viewModel = ProductListViewModel(siteID: sampleSiteID, stores: storesManager)
84+
let sampleProduct1 = Product.fake().copy(productID: 1)
85+
XCTAssertFalse(viewModel.bulkEditActionIsEnabled)
86+
87+
// When
88+
viewModel.selectProduct(sampleProduct1)
89+
90+
// Then
91+
XCTAssertTrue(viewModel.bulkEditActionIsEnabled)
92+
93+
// When
94+
viewModel.deselectProduct(sampleProduct1)
95+
96+
// Then
97+
XCTAssertFalse(viewModel.bulkEditActionIsEnabled)
98+
}
99+
100+
func test_deselect_all_works_correctly() {
101+
// Given
102+
let viewModel = ProductListViewModel(siteID: sampleSiteID, stores: storesManager)
103+
let sampleProduct1 = Product.fake().copy(productID: 1)
104+
let sampleProduct2 = Product.fake().copy(productID: 2)
105+
106+
viewModel.selectProduct(sampleProduct1)
107+
viewModel.selectProduct(sampleProduct2)
108+
XCTAssertEqual(viewModel.selectedProductsCount, 2)
109+
110+
// When
111+
viewModel.deselectAll()
112+
113+
// Then
114+
XCTAssertEqual(viewModel.selectedProductsCount, 0)
115+
116+
// When - Duplicated call
117+
viewModel.deselectAll()
118+
119+
// Then
120+
XCTAssertEqual(viewModel.selectedProductsCount, 0)
121+
}
122+
123+
func test_common_status_works_correctly() {
124+
// Given
125+
let viewModel = ProductListViewModel(siteID: sampleSiteID, stores: storesManager)
126+
let sampleProduct1 = Product.fake().copy(productID: 1, statusKey: "draft")
127+
let sampleProduct2 = Product.fake().copy(productID: 2, statusKey: "draft")
128+
let sampleProduct3 = Product.fake().copy(productID: 3, statusKey: "publish")
129+
XCTAssertNil(viewModel.commonStatusForSelectedProducts)
130+
131+
// When
132+
viewModel.selectProduct(sampleProduct1)
133+
viewModel.selectProduct(sampleProduct2)
134+
135+
// Then
136+
XCTAssertEqual(viewModel.commonStatusForSelectedProducts, .draft)
137+
138+
// When
139+
viewModel.selectProduct(sampleProduct3)
140+
141+
// Then
142+
XCTAssertNil(viewModel.commonStatusForSelectedProducts)
143+
}
144+
145+
func test_updating_products_with_status_sets_correct_status() throws {
146+
// Given
147+
let viewModel = ProductListViewModel(siteID: sampleSiteID, stores: storesManager)
148+
let sampleProduct1 = Product.fake().copy(productID: 1, statusKey: "draft")
149+
let sampleProduct2 = Product.fake().copy(productID: 2, statusKey: "draft")
150+
let sampleProduct3 = Product.fake().copy(productID: 3, statusKey: "publish")
151+
152+
storesManager.whenReceivingAction(ofType: ProductAction.self) { action in
153+
switch action {
154+
case let .updateProducts(_, products, completion):
155+
XCTAssertTrue(products.allSatisfy { $0.statusKey == "publish" })
156+
completion(.success(products))
157+
default:
158+
break
159+
}
160+
}
161+
162+
// When
163+
viewModel.selectProduct(sampleProduct1)
164+
viewModel.selectProduct(sampleProduct2)
165+
viewModel.selectProduct(sampleProduct3)
166+
let result = waitFor { promise in
167+
viewModel.updateSelectedProducts(with: .published) { result in
168+
promise(result)
169+
}
170+
}
171+
172+
// Then
173+
XCTAssertTrue(result.isSuccess)
174+
}
175+
}

0 commit comments

Comments
 (0)