Skip to content

Commit 28f706f

Browse files
committed
Add test cases for POSSettingsLocalCatalogViewModel.
1 parent 1d11b0f commit 28f706f

File tree

6 files changed

+309
-6
lines changed

6 files changed

+309
-6
lines changed

WooCommerce/Classes/POS/Presentation/Settings/POSSettingsLocalCatalogViewModel.swift

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -69,10 +69,15 @@ private extension POSSettingsLocalCatalogViewModel {
6969
}
7070

7171
func loadSyncDates() async -> (full: String, incremental: String) {
72-
let syncDates = await catalogSettingsService.loadSyncDates(for: siteID)
73-
let full = formatSyncDate(syncDates.lastFullSyncDate)
74-
let incremental = formatSyncDate(syncDates.lastIncrementalSyncDate)
75-
return (full, incremental)
72+
do {
73+
let syncDates = try await catalogSettingsService.loadSyncDates(for: siteID)
74+
let full = formatSyncDate(syncDates.lastFullSyncDate)
75+
let incremental = formatSyncDate(syncDates.lastIncrementalSyncDate)
76+
return (full, incremental)
77+
} catch {
78+
DDLogError("⛔️ POSSettingsLocalCatalog: Error loading sync dates: \(error)")
79+
return (Localization.syncDateUnavailable, Localization.syncDateUnavailable)
80+
}
7681
}
7782

7883
func formatSyncDate(_ date: Date?) -> String {
@@ -101,5 +106,11 @@ private extension POSSettingsLocalCatalogViewModel {
101106
value: "Not synced",
102107
comment: "Text shown when no sync has been performed yet."
103108
)
109+
110+
static let syncDateUnavailable = NSLocalizedString(
111+
"posSettingsLocalCatalogViewModel.syncDateUnavailable",
112+
value: "Sync date unavailable",
113+
comment: "Text shown when sync date cannot be determined."
114+
)
104115
}
105116
}

WooCommerce/WooCommerce.xcodeproj/project.pbxproj

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -606,6 +606,9 @@
606606
02C34C752D50F4C3004BFB50 /* AddressMapPickerViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02C34C742D50F4C3004BFB50 /* AddressMapPickerViewModel.swift */; };
607607
02C3FACE282A93020095440A /* WooAnalyticsEvent+Dashboard.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02C3FACD282A93020095440A /* WooAnalyticsEvent+Dashboard.swift */; };
608608
02C3FDEA251091CE009569EE /* ProductFactoryTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02C3FDE9251091CE009569EE /* ProductFactoryTests.swift */; };
609+
02C470B62E7BDB7700F5F716 /* POSSettingsLocalCatalogViewModelTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02C470B52E7BDB7700F5F716 /* POSSettingsLocalCatalogViewModelTests.swift */; };
610+
02C470B82E7BDD9600F5F716 /* MockPOSCatalogSyncCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02C470B72E7BDD9400F5F716 /* MockPOSCatalogSyncCoordinator.swift */; };
611+
02C470BA2E7BDDD100F5F716 /* MockPOSCatalogSettingsService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02C470B92E7BDDCF00F5F716 /* MockPOSCatalogSettingsService.swift */; };
609612
02C7EE8A2B21B951008B7DF8 /* ProductWithQuantityStepperViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02C7EE892B21B951008B7DF8 /* ProductWithQuantityStepperViewModel.swift */; };
610613
02C7EE8C2B22B21D008B7DF8 /* CollapsibleProductRowCardViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02C7EE8B2B22B21D008B7DF8 /* CollapsibleProductRowCardViewModel.swift */; };
611614
02C7EE902B22EFB9008B7DF8 /* CollapsibleProductRowCardViewModelTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02C7EE8F2B22EFB9008B7DF8 /* CollapsibleProductRowCardViewModelTests.swift */; };
@@ -3821,6 +3824,9 @@
38213824
02C34C742D50F4C3004BFB50 /* AddressMapPickerViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AddressMapPickerViewModel.swift; sourceTree = "<group>"; };
38223825
02C3FACD282A93020095440A /* WooAnalyticsEvent+Dashboard.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "WooAnalyticsEvent+Dashboard.swift"; sourceTree = "<group>"; };
38233826
02C3FDE9251091CE009569EE /* ProductFactoryTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProductFactoryTests.swift; sourceTree = "<group>"; };
3827+
02C470B52E7BDB7700F5F716 /* POSSettingsLocalCatalogViewModelTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = POSSettingsLocalCatalogViewModelTests.swift; sourceTree = "<group>"; };
3828+
02C470B72E7BDD9400F5F716 /* MockPOSCatalogSyncCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockPOSCatalogSyncCoordinator.swift; sourceTree = "<group>"; };
3829+
02C470B92E7BDDCF00F5F716 /* MockPOSCatalogSettingsService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockPOSCatalogSettingsService.swift; sourceTree = "<group>"; };
38243830
02C7EE892B21B951008B7DF8 /* ProductWithQuantityStepperViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProductWithQuantityStepperViewModel.swift; sourceTree = "<group>"; };
38253831
02C7EE8B2B22B21D008B7DF8 /* CollapsibleProductRowCardViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CollapsibleProductRowCardViewModel.swift; sourceTree = "<group>"; };
38263832
02C7EE8F2B22EFB9008B7DF8 /* CollapsibleProductRowCardViewModelTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CollapsibleProductRowCardViewModelTests.swift; sourceTree = "<group>"; };
@@ -7396,6 +7402,7 @@
73967402
01AB2D112DDC7AD100AA67FD /* PointOfSaleItemListAnalyticsTrackerTests.swift */,
73977403
208628722D48E476003F45DC /* Payments Onboarding */,
73987404
026A502E2D2F8099002C42C2 /* Infinite Scroll */,
7405+
02C470B42E7BDB2D00F5F716 /* Settings */,
73997406
686A71B52DC9E5C10006E835 /* POSItemActionHandlerTests.swift */,
74007407
689F291B2DE45604004DF52B /* POSStockFormatterTests.swift */,
74017408
);
@@ -7793,6 +7800,14 @@
77937800
path = "Edit Shipping";
77947801
sourceTree = "<group>";
77957802
};
7803+
02C470B42E7BDB2D00F5F716 /* Settings */ = {
7804+
isa = PBXGroup;
7805+
children = (
7806+
02C470B52E7BDB7700F5F716 /* POSSettingsLocalCatalogViewModelTests.swift */,
7807+
);
7808+
path = Settings;
7809+
sourceTree = "<group>";
7810+
};
77967811
02C5CBD724A5D16A00860C64 /* Linked Products List Selector */ = {
77977812
isa = PBXGroup;
77987813
children = (
@@ -7839,6 +7854,8 @@
78397854
02CD3BFC2C35D01600E575C4 /* Mocks */ = {
78407855
isa = PBXGroup;
78417856
children = (
7857+
02C470B92E7BDDCF00F5F716 /* MockPOSCatalogSettingsService.swift */,
7858+
02C470B72E7BDD9400F5F716 /* MockPOSCatalogSyncCoordinator.swift */,
78427859
016582E12E787187001DBB6F /* MockOnboardingViewFactoryConfiguration.swift */,
78437860
01B7AFBF2E7080180004BE9D /* MockPOSOrderListController.swift */,
78447861
019460E12E70121A00FCB9AB /* MockPOSReceiptController.swift */,
@@ -17292,6 +17309,7 @@
1729217309
EE2EDFE12987A189004E702B /* MockABTestVariationProvider.swift in Sources */,
1729317310
0273707E24C0047800167204 /* SequenceHelpersTests.swift in Sources */,
1729417311
012ACB762E5C83EC00A49458 /* POSOrderListControllerTests.swift in Sources */,
17312+
02C470B62E7BDB7700F5F716 /* POSSettingsLocalCatalogViewModelTests.swift in Sources */,
1729517313
DE9A02A32A44441200193ABF /* RequirementsCheckerTests.swift in Sources */,
1729617314
D802547326551D0F001B2CC1 /* CardPresentModalTapCardTests.swift in Sources */,
1729717315
B55BC1F321A8790F0011A0C0 /* StringHTMLTests.swift in Sources */,
@@ -17621,6 +17639,7 @@
1762117639
DE36E09C2A89EEA400B98496 /* StoreNameSetupViewModelTests.swift in Sources */,
1762217640
57C2F6E624C27B3100131012 /* SwitchStoreNoticePresenterTests.swift in Sources */,
1762317641
020BE77123B4A4C6007FE54C /* AztecHorizontalRulerFormatBarCommandTests.swift in Sources */,
17642+
02C470BA2E7BDDD100F5F716 /* MockPOSCatalogSettingsService.swift in Sources */,
1762417643
B5C6CE612190D28E00515926 /* NSAttributedStringHelperTests.swift in Sources */,
1762517644
CC07860526736B6500BA9AC1 /* ErrorTopBannerFactoryTests.swift in Sources */,
1762617645
02490D1E284F3226002096EF /* ProductImagesSaverTests.swift in Sources */,
@@ -17798,6 +17817,7 @@
1779817817
2D09E0D52E65C9B9005C26F3 /* ApplicationPasswordsExperimentStateTests.swift in Sources */,
1779917818
D816DDBC22265DA300903E59 /* OrderTrackingTableViewCellTests.swift in Sources */,
1780017819
579CDF01274D811D00E8903D /* StoreStatsUsageTracksEventEmitterTests.swift in Sources */,
17820+
02C470B82E7BDD9600F5F716 /* MockPOSCatalogSyncCoordinator.swift in Sources */,
1780117821
CE4AFE482CD239B90013C52B /* WooShippingPostPurchaseViewModelTests.swift in Sources */,
1780217822
EE3272A429A88F750015F8D0 /* StoreOnboardingViewModelTests.swift in Sources */,
1780317823
262A2C2B2537A3330086C1BE /* MockRefunds.swift in Sources */,

WooCommerce/WooCommerceTests/POS/Controllers/PointOfSaleSettingsControllerTests.swift

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,9 @@ struct PointOfSaleSettingsControllerTests {
1818
cardPresentPaymentService: mockCardPresentPaymentService,
1919
pluginsService: mockPluginService,
2020
defaultSiteName: "Test Store",
21-
siteSettings: [])
21+
siteSettings: [],
22+
grdbManager: ServiceLocator.grdbManager,
23+
catalogSyncCoordinator: ServiceLocator.posCatalogSyncCoordinator)
2224

2325
// When
2426
let cardReader = sut.connectedCardReader
@@ -35,7 +37,9 @@ struct PointOfSaleSettingsControllerTests {
3537
cardPresentPaymentService: mockService,
3638
pluginsService: mockPluginService,
3739
defaultSiteName: "Test Store",
38-
siteSettings: [])
40+
siteSettings: [],
41+
grdbManager: ServiceLocator.grdbManager,
42+
catalogSyncCoordinator: ServiceLocator.posCatalogSyncCoordinator)
3943

4044
// Initially nil
4145
#expect(sut.connectedCardReader == nil)
@@ -76,4 +80,5 @@ final class MockPointOfSaleSettingsController: PointOfSaleSettingsControllerProt
7680
pluginsService: MockPluginsService(),
7781
defaultSiteName: "Sample Store",
7882
siteSettings: [])
83+
var localCatalogViewModel: POSSettingsLocalCatalogViewModel?
7984
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
@testable import Yosemite
2+
3+
final class MockPOSCatalogSettingsService: POSCatalogSettingsServiceProtocol {
4+
var catalogStatisticsResult: Result<POSCatalogStatistics, Error> = .success(POSCatalogStatistics(productCount: 0, variationCount: 0))
5+
var syncDatesResult: Result<POSSyncDates, Error> = .success(POSSyncDates(lastFullSyncDate: nil, lastIncrementalSyncDate: nil))
6+
var shouldDelayResponse = false
7+
8+
func loadCatalogStatistics(for siteID: Int64) async throws -> POSCatalogStatistics {
9+
if shouldDelayResponse {
10+
try await Task.sleep(for: .milliseconds(100))
11+
}
12+
13+
switch catalogStatisticsResult {
14+
case .success(let statistics):
15+
return statistics
16+
case .failure(let error):
17+
throw error
18+
}
19+
}
20+
21+
func loadSyncDates(for siteID: Int64) async throws -> POSSyncDates {
22+
if shouldDelayResponse {
23+
try await Task.sleep(for: .milliseconds(50))
24+
}
25+
26+
switch syncDatesResult {
27+
case .success(let dates):
28+
return dates
29+
case .failure(let error):
30+
throw error
31+
}
32+
}
33+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
import Foundation
2+
@testable import Yosemite
3+
4+
final class MockPOSCatalogSyncCoordinator: POSCatalogSyncCoordinatorProtocol {
5+
var performFullSyncInvocationCount = 0
6+
var performFullSyncSiteID: Int64?
7+
var performFullSyncResult: Result<Void, Error> = .success(())
8+
var shouldDelayResponse = false
9+
10+
func shouldPerformFullSync(for siteID: Int64, maxAge: TimeInterval) async -> Bool {
11+
true
12+
}
13+
14+
func performFullSync(for siteID: Int64) async throws {
15+
if shouldDelayResponse {
16+
try await Task.sleep(for: .milliseconds(100))
17+
}
18+
19+
performFullSyncInvocationCount += 1
20+
performFullSyncSiteID = siteID
21+
22+
switch performFullSyncResult {
23+
case .success:
24+
return
25+
case .failure(let error):
26+
throw error
27+
}
28+
}
29+
30+
func performIncrementalSyncIfApplicable(for siteID: Int64, forceSync: Bool) async throws {}
31+
}

0 commit comments

Comments
 (0)