Skip to content

Commit eda9e85

Browse files
committed
Add unit tests for StatsV4DataHelper
1 parent 8304cd8 commit eda9e85

File tree

2 files changed

+213
-0
lines changed

2 files changed

+213
-0
lines changed

WooCommerce/WooCommerce.xcodeproj/project.pbxproj

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1383,6 +1383,7 @@
13831383
C0CE1F84282AB1590019138E /* countries.json in Resources */ = {isa = PBXBuildFile; fileRef = C0CE1F83282AB1590019138E /* countries.json */; };
13841384
CC0324A3263AD9F40056C6B7 /* MockShippingLabelAccountSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = CC0324A2263AD9F40056C6B7 /* MockShippingLabelAccountSettings.swift */; };
13851385
CC04918D292BB74500F719D8 /* StatsV4DataHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = CC04918C292BB74500F719D8 /* StatsV4DataHelper.swift */; };
1386+
CC04918F292BD6AC00F719D8 /* StatsV4DataHelperTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = CC04918E292BD6AC00F719D8 /* StatsV4DataHelperTests.swift */; };
13861387
CC078531266E706300BA9AC1 /* ErrorTopBannerFactory.swift in Sources */ = {isa = PBXBuildFile; fileRef = CC078530266E706300BA9AC1 /* ErrorTopBannerFactory.swift */; };
13871388
CC07860526736B6500BA9AC1 /* ErrorTopBannerFactoryTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = CC07860426736B6500BA9AC1 /* ErrorTopBannerFactoryTests.swift */; };
13881389
CC13C0CB278E021300C0B5B5 /* ProductVariationSelectorViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = CC13C0CA278E021300C0B5B5 /* ProductVariationSelectorViewModel.swift */; };
@@ -3356,6 +3357,7 @@
33563357
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 = "<group>"; };
33573358
CC0324A2263AD9F40056C6B7 /* MockShippingLabelAccountSettings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockShippingLabelAccountSettings.swift; sourceTree = "<group>"; };
33583359
CC04918C292BB74500F719D8 /* StatsV4DataHelper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StatsV4DataHelper.swift; sourceTree = "<group>"; };
3360+
CC04918E292BD6AC00F719D8 /* StatsV4DataHelperTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StatsV4DataHelperTests.swift; sourceTree = "<group>"; };
33593361
CC078530266E706300BA9AC1 /* ErrorTopBannerFactory.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ErrorTopBannerFactory.swift; sourceTree = "<group>"; };
33603362
CC07860426736B6500BA9AC1 /* ErrorTopBannerFactoryTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ErrorTopBannerFactoryTests.swift; sourceTree = "<group>"; };
33613363
CC13C0CA278E021300C0B5B5 /* ProductVariationSelectorViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProductVariationSelectorViewModel.swift; sourceTree = "<group>"; };
@@ -4960,6 +4962,7 @@
49604962
0257285B230ACC7E00A288C4 /* StoreStatsV4ChartAxisHelperTests.swift */,
49614963
02AB40812784297C00929CF3 /* ProductTableViewCellViewModelTests.swift */,
49624964
028E1F712833E954001F8829 /* DashboardViewModelTests.swift */,
4965+
CC04918E292BD6AC00F719D8 /* StatsV4DataHelperTests.swift */,
49634966
);
49644967
path = Dashboard;
49654968
sourceTree = "<group>";
@@ -11217,6 +11220,7 @@
1121711220
02B2C831249C4C8D0040C83C /* TextFieldTextAlignmentTests.swift in Sources */,
1121811221
CC923A1D2847A8E0008EEEBE /* OrderStatusListViewModelTests.swift in Sources */,
1121911222
D85B833D2230DC9D002168F3 /* StringWooTests.swift in Sources */,
11223+
CC04918F292BD6AC00F719D8 /* StatsV4DataHelperTests.swift in Sources */,
1122011224
02BC5AA524D27F8900C43326 /* ProductVariationFormViewModel+UpdatesTests.swift in Sources */,
1122111225
D8736B5122EB69E300A14A29 /* OrderDetailsViewModelTests.swift in Sources */,
1122211226
02C0CD2E23B5E3AE00F880B1 /* DefaultImageServiceTests.swift in Sources */,
Lines changed: 209 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,209 @@
1+
import XCTest
2+
import Yosemite
3+
import WooFoundation
4+
@testable import WooCommerce
5+
6+
/// `StatsV4DataHelper` tests.
7+
///
8+
final class StatsV4DataHelperTests: XCTestCase {
9+
10+
private let currencyFormatter = CurrencyFormatter(currencySettings: CurrencySettings()) // Default is US
11+
private let currencyCode = CurrencySettings().currencyCode
12+
13+
// MARK: Revenue Stats
14+
15+
func test_createTotalRevenueText_does_not_return_decimal_points_for_integer_value() {
16+
// Given
17+
let orderStats = OrderStatsV4.fake().copy(totals: .fake().copy(grossRevenue: 62))
18+
19+
// When
20+
let totalRevenue = StatsV4DataHelper.createTotalRevenueText(orderStatsData: (orderStats, []),
21+
selectedIntervalIndex: nil,
22+
currencyFormatter: currencyFormatter,
23+
currencyCode: currencyCode.rawValue)
24+
25+
// Then
26+
XCTAssertEqual(totalRevenue, "$62")
27+
}
28+
29+
func test_createTotalRevenueText_returns_decimal_points_from_currency_settings_for_noninteger_value() {
30+
// Given
31+
let orderStats = OrderStatsV4.fake().copy(totals: .fake().copy(grossRevenue: 62.856))
32+
33+
// When
34+
let totalRevenue = StatsV4DataHelper.createTotalRevenueText(orderStatsData: (orderStats, []),
35+
selectedIntervalIndex: nil,
36+
currencyFormatter: currencyFormatter,
37+
currencyCode: currencyCode.rawValue)
38+
39+
// Then
40+
XCTAssertEqual(totalRevenue, "$62.86")
41+
}
42+
43+
func test_createTotalRevenueText_returns_expected_text_for_selected_interval() {
44+
// Given
45+
let orderStats = OrderStatsV4.fake().copy(totals: .fake().copy(grossRevenue: 62.7),
46+
intervals: [.fake().copy(dateStart: "2019-07-09 01:00:00",
47+
dateEnd: "2019-07-09 01:59:59",
48+
subtotals: .fake().copy(grossRevenue: 25)),
49+
.fake().copy(dateStart: "2019-07-09 00:00:00",
50+
dateEnd: "2019-07-09 00:59:59",
51+
subtotals: .fake().copy(grossRevenue: 31))
52+
])
53+
54+
// When
55+
let totalRevenue = StatsV4DataHelper.createTotalRevenueText(orderStatsData: (orderStats, orderStats.intervals),
56+
selectedIntervalIndex: 0,
57+
currencyFormatter: currencyFormatter,
58+
currencyCode: currencyCode.rawValue)
59+
60+
// Then
61+
XCTAssertEqual(totalRevenue, "$25")
62+
}
63+
64+
// MARK: Orders Stats
65+
66+
func test_createOrderCountText_returns_expected_order_count() {
67+
// Given
68+
let orderStats = OrderStatsV4.fake().copy(totals: .fake().copy(totalOrders: 3))
69+
70+
// When
71+
let orderCount = StatsV4DataHelper.createOrderCountText(orderStatsData: (orderStats, []), selectedIntervalIndex: 0)
72+
73+
// Then
74+
XCTAssertEqual(orderCount, "3")
75+
}
76+
77+
func test_createOrderCountText_returns_expected_text_for_selected_interval() {
78+
// Given
79+
let orderStats = OrderStatsV4.fake().copy(totals: .fake().copy(totalOrders: 3),
80+
intervals: [.fake().copy(dateStart: "2019-07-09 01:00:00",
81+
dateEnd: "2019-07-09 01:59:59",
82+
subtotals: .fake().copy(totalOrders: 1, grossRevenue: 25)),
83+
.fake().copy(dateStart: "2019-07-09 00:00:00",
84+
dateEnd: "2019-07-09 00:59:59",
85+
subtotals: .fake().copy(totalOrders: 2, grossRevenue: 31))
86+
])
87+
88+
// When
89+
let orderCount = StatsV4DataHelper.createOrderCountText(orderStatsData: (orderStats, orderStats.intervals), selectedIntervalIndex: 0)
90+
91+
// Then
92+
XCTAssertEqual(orderCount, "1")
93+
}
94+
95+
func test_createAverageOrderValueText_does_not_return_decimal_points_for_integer_value() {
96+
// Given
97+
let orderStats = OrderStatsV4.fake().copy(totals: .fake().copy(averageOrderValue: 62))
98+
99+
// When
100+
let averageOrderValue = StatsV4DataHelper.createAverageOrderValueText(orderStatsData: (orderStats, []),
101+
currencyFormatter: currencyFormatter,
102+
currencyCode: currencyCode.rawValue)
103+
104+
// Then
105+
XCTAssertEqual(averageOrderValue, "$62")
106+
}
107+
108+
func test_createAverageOrderValueText_returns_decimal_points_from_currency_settings_for_noninteger_value() {
109+
// Given
110+
let orderStats = OrderStatsV4.fake().copy(totals: .fake().copy(averageOrderValue: 62.856))
111+
112+
// When
113+
let averageOrderValue = StatsV4DataHelper.createAverageOrderValueText(orderStatsData: (orderStats, []),
114+
currencyFormatter: currencyFormatter,
115+
currencyCode: currencyCode.rawValue)
116+
117+
// Then
118+
XCTAssertEqual(averageOrderValue, "$62.86")
119+
}
120+
121+
// MARK: Views and Visitors Stats
122+
123+
// This test reflects the current method for computing total visitor count.
124+
// It needs to be updated once this issue is fixed: https://github.com/woocommerce/woocommerce-ios/issues/8173
125+
func test_createVisitorCountText_returns_expected_visitor_stats() {
126+
// Given
127+
let siteVisitStats = Yosemite.SiteVisitStats.fake().copy(items: [.fake().copy(period: "1", visitors: 17),
128+
.fake().copy(period: "0", visitors: 5)])
129+
130+
// When
131+
let visitorCount = StatsV4DataHelper.createVisitorCountText(siteStats: siteVisitStats, selectedIntervalIndex: nil)
132+
133+
// Then
134+
XCTAssertEqual(visitorCount, "22")
135+
}
136+
137+
func test_createVisitorCountText_returns_expected_text_for_selected_interval() {
138+
// Given
139+
let siteVisitStats = Yosemite.SiteVisitStats.fake().copy(items: [.fake().copy(period: "1", visitors: 17),
140+
.fake().copy(period: "0", visitors: 5)])
141+
let selectedIntervalIndex = 1 // Corresponds to the second in intervals sorted by period, which is the first interval in `siteVisitStats`.
142+
143+
144+
// When
145+
let visitorCount = StatsV4DataHelper.createVisitorCountText(siteStats: siteVisitStats, selectedIntervalIndex: selectedIntervalIndex)
146+
147+
// Then
148+
XCTAssertEqual(visitorCount, "17")
149+
}
150+
151+
// MARK: Conversion Stats
152+
153+
func test_createConversionRateText_returns_placeholder_when_visitor_count_is_zero() {
154+
// Given
155+
let siteVisitStats = Yosemite.SiteVisitStats.fake().copy(items: [.fake().copy(visitors: 0)])
156+
let orderStats = OrderStatsV4.fake().copy(totals: .fake().copy(totalOrders: 3))
157+
158+
// When
159+
let conversionRate = StatsV4DataHelper.createConversionRateText(orderStatsData: (orderStats, []),
160+
siteStats: siteVisitStats,
161+
selectedIntervalIndex: nil)
162+
163+
// Then
164+
XCTAssertEqual(conversionRate, "0%")
165+
}
166+
167+
func test_createConversionRateText_returns_one_decimal_point_when_percentage_value_has_two_decimal_points() {
168+
// Given
169+
let siteVisitStats = Yosemite.SiteVisitStats.fake().copy(items: [.fake().copy(visitors: 10000)])
170+
let orderStats = OrderStatsV4.fake().copy(totals: .fake().copy(totalOrders: 3557))
171+
172+
// When
173+
let conversionRate = StatsV4DataHelper.createConversionRateText(orderStatsData: (orderStats, []),
174+
siteStats: siteVisitStats,
175+
selectedIntervalIndex: nil)
176+
177+
// Then
178+
XCTAssertEqual(conversionRate, "35.6%") // order count: 3557, visitor count: 10000 => 0.3557 (35.57%)
179+
}
180+
181+
func test_createConversionRateText_returns_no_decimal_point_when_percentage_value_is_integer() {
182+
// Given
183+
let siteVisitStats = Yosemite.SiteVisitStats.fake().copy(items: [.fake().copy(visitors: 10)])
184+
let orderStats = OrderStatsV4.fake().copy(totals: .fake().copy(totalOrders: 3))
185+
186+
// When
187+
let conversionRate = StatsV4DataHelper.createConversionRateText(orderStatsData: (orderStats, []),
188+
siteStats: siteVisitStats,
189+
selectedIntervalIndex: nil)
190+
191+
// Then
192+
XCTAssertEqual(conversionRate, "30%") // order count: 3, visitor count: 10 => 0.3 (30%)
193+
}
194+
195+
func test_createConversionRateText_returns_expected_text_for_selected_interval() {
196+
// Given
197+
let siteVisitStats = Yosemite.SiteVisitStats.fake().copy(items: [.fake().copy(visitors: 10)])
198+
let orderStats = OrderStatsV4.fake().copy(totals: .fake().copy(totalOrders: 2),
199+
intervals: [.fake().copy(subtotals: .fake().copy(totalOrders: 1))])
200+
201+
// When
202+
let conversionRate = StatsV4DataHelper.createConversionRateText(orderStatsData: (orderStats, orderStats.intervals),
203+
siteStats: siteVisitStats,
204+
selectedIntervalIndex: 0)
205+
206+
// Then
207+
XCTAssertEqual(conversionRate, "10%")
208+
}
209+
}

0 commit comments

Comments
 (0)