Skip to content

Commit 02eb646

Browse files
committed
Add PriceInputViewModelTests
1 parent 0e8bae1 commit 02eb646

File tree

2 files changed

+109
-0
lines changed

2 files changed

+109
-0
lines changed

WooCommerce/WooCommerce.xcodeproj/project.pbxproj

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1278,6 +1278,7 @@
12781278
AEFF77A42978389400667F7A /* PriceInputViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = AEFF77A32978389400667F7A /* PriceInputViewController.swift */; };
12791279
AEFF77A629783CA600667F7A /* PriceInputViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = AEFF77A529783CA600667F7A /* PriceInputViewModel.swift */; };
12801280
AEFF77A829786A2900667F7A /* PriceInputViewControllerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = AEFF77A729786A2900667F7A /* PriceInputViewControllerTests.swift */; };
1281+
AEFF77AA29786DAA00667F7A /* PriceInputViewModelTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = AEFF77A929786DAA00667F7A /* PriceInputViewModelTests.swift */; };
12811282
B50911302049E27A007D25DC /* DashboardViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = B509112D2049E27A007D25DC /* DashboardViewController.swift */; };
12821283
B509FED121C041DF000076A9 /* Locale+Woo.swift in Sources */ = {isa = PBXBuildFile; fileRef = B509FED021C041DF000076A9 /* Locale+Woo.swift */; };
12831284
B509FED321C05121000076A9 /* SupportManagerAdapter.swift in Sources */ = {isa = PBXBuildFile; fileRef = B509FED221C05121000076A9 /* SupportManagerAdapter.swift */; };
@@ -3335,6 +3336,7 @@
33353336
AEFF77A32978389400667F7A /* PriceInputViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PriceInputViewController.swift; sourceTree = "<group>"; };
33363337
AEFF77A529783CA600667F7A /* PriceInputViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PriceInputViewModel.swift; sourceTree = "<group>"; };
33373338
AEFF77A729786A2900667F7A /* PriceInputViewControllerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PriceInputViewControllerTests.swift; sourceTree = "<group>"; };
3339+
AEFF77A929786DAA00667F7A /* PriceInputViewModelTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PriceInputViewModelTests.swift; sourceTree = "<group>"; };
33383340
B509112D2049E27A007D25DC /* DashboardViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DashboardViewController.swift; sourceTree = "<group>"; };
33393341
B509FED021C041DF000076A9 /* Locale+Woo.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Locale+Woo.swift"; sourceTree = "<group>"; };
33403342
B509FED221C05121000076A9 /* SupportManagerAdapter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SupportManagerAdapter.swift; sourceTree = "<group>"; };
@@ -5436,6 +5438,7 @@
54365438
093B265827DF15100026F92D /* BulkUpdatePriceViewControllerTests.swift */,
54375439
09BE3A9027C921A70070B69D /* BulkUpdatePriceSettingsViewModelTests.swift */,
54385440
AEFF77A729786A2900667F7A /* PriceInputViewControllerTests.swift */,
5441+
AEFF77A929786DAA00667F7A /* PriceInputViewModelTests.swift */,
54395442
);
54405443
path = "Bulk Edit Price";
54415444
sourceTree = "<group>";
@@ -11517,6 +11520,7 @@
1151711520
0257285C230ACC7E00A288C4 /* StoreStatsV4ChartAxisHelperTests.swift in Sources */,
1151811521
FEED57FA2686544D00E47FD9 /* RoleErrorViewModelTests.swift in Sources */,
1151911522
03CF78D127C3DBC000523706 /* WCPayCardBrand+IconsTests.swift in Sources */,
11523+
AEFF77AA29786DAA00667F7A /* PriceInputViewModelTests.swift in Sources */,
1152011524
EEC2D27F292CF60E0072132E /* LoginJetpackSetupHostingControllerTests.swift in Sources */,
1152111525
4535EE82281BE726004212B4 /* CouponCodeInputFormatterTests.swift in Sources */,
1152211526
DEF36DEC2898D64600178AC2 /* JetpackSetupWebViewModelTests.swift in Sources */,
Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
import XCTest
2+
@testable import WooCommerce
3+
@testable import Yosemite
4+
5+
/// Tests for `PriceInputViewModel`
6+
///
7+
final class PriceInputViewModelTests: XCTestCase {
8+
private let sampleSiteID: Int64 = 123
9+
private var storesManager: MockStoresManager!
10+
11+
override func setUp() {
12+
super.setUp()
13+
storesManager = MockStoresManager(sessionManager: .makeForTesting())
14+
}
15+
16+
override func tearDown() {
17+
storesManager = nil
18+
super.tearDown()
19+
}
20+
21+
func test_initial_viewModel_state() throws {
22+
// Given
23+
let listViewModel = ProductListViewModel(siteID: sampleSiteID, stores: storesManager)
24+
let sampleProduct1 = Product.fake().copy(productID: 1, regularPrice: "100")
25+
listViewModel.selectProduct(sampleProduct1)
26+
27+
let viewModel = PriceInputViewModel(productListViewModel: listViewModel)
28+
29+
// Then
30+
XCTAssertEqual(viewModel.applyButtonEnabled, false)
31+
XCTAssertNil(viewModel.inputValidationError)
32+
XCTAssertTrue(viewModel.footerText.isNotEmpty)
33+
}
34+
35+
func test_state_when_price_is_changed_from_empty_to_a_value() {
36+
// Given
37+
let listViewModel = ProductListViewModel(siteID: sampleSiteID, stores: storesManager)
38+
let sampleProduct1 = Product.fake().copy(productID: 1, regularPrice: "100")
39+
listViewModel.selectProduct(sampleProduct1)
40+
41+
let viewModel = PriceInputViewModel(productListViewModel: listViewModel)
42+
43+
// When
44+
viewModel.handlePriceChange("42")
45+
46+
// Then
47+
XCTAssertEqual(viewModel.applyButtonEnabled, true)
48+
XCTAssertNil(viewModel.inputValidationError)
49+
}
50+
51+
func test_state_when_price_is_changed_from_a_value_to_empty() {
52+
// Given
53+
let listViewModel = ProductListViewModel(siteID: sampleSiteID, stores: storesManager)
54+
let sampleProduct1 = Product.fake().copy(productID: 1, regularPrice: "100")
55+
listViewModel.selectProduct(sampleProduct1)
56+
57+
let viewModel = PriceInputViewModel(productListViewModel: listViewModel)
58+
59+
// When
60+
viewModel.handlePriceChange("")
61+
62+
// Then
63+
XCTAssertEqual(viewModel.applyButtonEnabled, false)
64+
XCTAssertNil(viewModel.inputValidationError)
65+
}
66+
67+
func test_state_when_selected_regular_price_is_less_than_sale_price() {
68+
// Given
69+
let listViewModel = ProductListViewModel(siteID: sampleSiteID, stores: storesManager)
70+
let sampleProduct1 = Product.fake().copy(productID: 1, dateOnSaleStart: Date(), dateOnSaleEnd: Date(), regularPrice: "100", salePrice: "42")
71+
listViewModel.selectProduct(sampleProduct1)
72+
73+
let viewModel = PriceInputViewModel(productListViewModel: listViewModel)
74+
75+
// When
76+
viewModel.handlePriceChange("24")
77+
viewModel.applyButtonTapped()
78+
79+
// Then
80+
XCTAssertEqual(viewModel.applyButtonEnabled, true)
81+
XCTAssertEqual(viewModel.inputValidationError, .salePriceHigherThanRegularPrice)
82+
}
83+
84+
func test_state_when_selected_valid_price_is_valid_and_action_is_dispatched() {
85+
// Given
86+
var callbackValue: String?
87+
let listViewModel = ProductListViewModel(siteID: sampleSiteID, stores: storesManager)
88+
let sampleProduct1 = Product.fake().copy(productID: 1, regularPrice: "100")
89+
listViewModel.selectProduct(sampleProduct1)
90+
91+
let viewModel = PriceInputViewModel(productListViewModel: listViewModel)
92+
viewModel.applyClosure = { result in
93+
callbackValue = result
94+
}
95+
96+
// When
97+
viewModel.handlePriceChange("42")
98+
viewModel.applyButtonTapped()
99+
100+
// Then
101+
XCTAssertEqual(viewModel.applyButtonEnabled, true)
102+
XCTAssertNil(viewModel.inputValidationError)
103+
XCTAssertEqual(callbackValue, "42")
104+
}
105+
}

0 commit comments

Comments
 (0)