Skip to content

Commit 1c9aac6

Browse files
committed
initial happy-path PointOfSaleCouponsControllerTests
1 parent 0d53ccc commit 1c9aac6

File tree

2 files changed

+75
-2
lines changed

2 files changed

+75
-2
lines changed

WooCommerce/WooCommerce.xcodeproj/project.pbxproj

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1561,6 +1561,7 @@
15611561
680BA59A2A4C377900F5559D /* UpgradeViewState.swift in Sources */ = {isa = PBXBuildFile; fileRef = 680BA5992A4C377900F5559D /* UpgradeViewState.swift */; };
15621562
680E36B52BD8B9B900E8BCEA /* OrderSubscriptionTableViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 680E36B42BD8B9B900E8BCEA /* OrderSubscriptionTableViewCell.xib */; };
15631563
680E36B72BD8C49F00E8BCEA /* OrderSubscriptionTableViewCellViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 680E36B62BD8C49F00E8BCEA /* OrderSubscriptionTableViewCellViewModel.swift */; };
1564+
6818E7C12D93C76700677C16 /* PointOfSaleCouponsControllerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6818E7C02D93C76200677C16 /* PointOfSaleCouponsControllerTests.swift */; };
15641565
681BB5FC2D676047008AF8BB /* POSSpacing.swift in Sources */ = {isa = PBXBuildFile; fileRef = 681BB5FB2D676043008AF8BB /* POSSpacing.swift */; };
15651566
681BB5FE2D676061008AF8BB /* POSPadding.swift in Sources */ = {isa = PBXBuildFile; fileRef = 681BB5FD2D676060008AF8BB /* POSPadding.swift */; };
15661567
682210ED2909666600814E14 /* CustomerSearchUICommandTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 682210EC2909666600814E14 /* CustomerSearchUICommandTests.swift */; };
@@ -1607,8 +1608,8 @@
16071608
68A905012ACCFC13004C71D3 /* CollapsibleProductCard.swift in Sources */ = {isa = PBXBuildFile; fileRef = 68A905002ACCFC13004C71D3 /* CollapsibleProductCard.swift */; };
16081609
68AC9D292ACE598B0042F784 /* ProductImageThumbnail.swift in Sources */ = {isa = PBXBuildFile; fileRef = 68AC9D282ACE598B0042F784 /* ProductImageThumbnail.swift */; };
16091610
68AF3C3B2D01481C006F1ED2 /* POSReceiptEligibilityBanner.swift in Sources */ = {isa = PBXBuildFile; fileRef = 68AF3C3A2D01481A006F1ED2 /* POSReceiptEligibilityBanner.swift */; };
1610-
68B681162D9257810098D5CD /* PointOfSaleCouponsController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 68B681152D92577F0098D5CD /* PointOfSaleCouponsController.swift */; };
16111611
68B3BA262D9147480000B2F2 /* AISettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 68B3BA252D9147440000B2F2 /* AISettingsView.swift */; };
1612+
68B681162D9257810098D5CD /* PointOfSaleCouponsController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 68B681152D92577F0098D5CD /* PointOfSaleCouponsController.swift */; };
16121613
68B6F22B2ADE7ED500D171FC /* TooltipView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 68B6F22A2ADE7ED500D171FC /* TooltipView.swift */; };
16131614
68C31B712A8617C500AE5C5A /* NewNoteViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 68C31B702A8617C500AE5C5A /* NewNoteViewModel.swift */; };
16141615
68C53CBE2C1FE59B00C6D80B /* ItemListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 68C53CBD2C1FE59B00C6D80B /* ItemListView.swift */; };
@@ -4741,6 +4742,7 @@
47414742
680BA5992A4C377900F5559D /* UpgradeViewState.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UpgradeViewState.swift; sourceTree = "<group>"; };
47424743
680E36B42BD8B9B900E8BCEA /* OrderSubscriptionTableViewCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = OrderSubscriptionTableViewCell.xib; sourceTree = "<group>"; };
47434744
680E36B62BD8C49F00E8BCEA /* OrderSubscriptionTableViewCellViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OrderSubscriptionTableViewCellViewModel.swift; sourceTree = "<group>"; };
4745+
6818E7C02D93C76200677C16 /* PointOfSaleCouponsControllerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PointOfSaleCouponsControllerTests.swift; sourceTree = "<group>"; };
47444746
681BB5FB2D676043008AF8BB /* POSSpacing.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = POSSpacing.swift; sourceTree = "<group>"; };
47454747
681BB5FD2D676060008AF8BB /* POSPadding.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = POSPadding.swift; sourceTree = "<group>"; };
47464748
682210EC2909666600814E14 /* CustomerSearchUICommandTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CustomerSearchUICommandTests.swift; sourceTree = "<group>"; };
@@ -4787,8 +4789,8 @@
47874789
68A905002ACCFC13004C71D3 /* CollapsibleProductCard.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CollapsibleProductCard.swift; sourceTree = "<group>"; };
47884790
68AC9D282ACE598B0042F784 /* ProductImageThumbnail.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProductImageThumbnail.swift; sourceTree = "<group>"; };
47894791
68AF3C3A2D01481A006F1ED2 /* POSReceiptEligibilityBanner.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = POSReceiptEligibilityBanner.swift; sourceTree = "<group>"; };
4790-
68B681152D92577F0098D5CD /* PointOfSaleCouponsController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PointOfSaleCouponsController.swift; sourceTree = "<group>"; };
47914792
68B3BA252D9147440000B2F2 /* AISettingsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AISettingsView.swift; sourceTree = "<group>"; };
4793+
68B681152D92577F0098D5CD /* PointOfSaleCouponsController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PointOfSaleCouponsController.swift; sourceTree = "<group>"; };
47924794
68B6F22A2ADE7ED500D171FC /* TooltipView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TooltipView.swift; sourceTree = "<group>"; };
47934795
68C31B702A8617C500AE5C5A /* NewNoteViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NewNoteViewModel.swift; sourceTree = "<group>"; };
47944796
68C53CBD2C1FE59B00C6D80B /* ItemListView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ItemListView.swift; sourceTree = "<group>"; };
@@ -8215,6 +8217,7 @@
82158217
200BA15C2CF0A9D90006DC5B /* Controllers */ = {
82168218
isa = PBXGroup;
82178219
children = (
8220+
6818E7C02D93C76200677C16 /* PointOfSaleCouponsControllerTests.swift */,
82188221
20DB185C2CF5E7560018D3E1 /* PointOfSaleOrderControllerTests.swift */,
82198222
200BA15D2CF0A9EB0006DC5B /* PointOfSaleItemsControllerTests.swift */,
82208223
);
@@ -17372,6 +17375,7 @@
1737217375
B95A45EC2A77D7A60073A91F /* CustomerSelectorViewModelTests.swift in Sources */,
1737317376
3178C1FD26409360000D771A /* BluetoothCardReaderSettingsConnectedViewModelTests.swift in Sources */,
1737417377
02FE89C7231FAA4100E85EF8 /* MainTabBarControllerTests.swift in Sources */,
17378+
6818E7C12D93C76700677C16 /* PointOfSaleCouponsControllerTests.swift in Sources */,
1737517379
B63AAF4B254AD2C6000B28A2 /* URL+SurveyViewControllerTests.swift in Sources */,
1737617380
D802548C26552F41001B2CC1 /* CardPresentModalProcessingTests.swift in Sources */,
1737717381
02952B5127808B08008E9BA3 /* StoreStatsPeriodViewModelTests.swift in Sources */,
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
@testable import WooCommerce
2+
import Testing
3+
import Foundation
4+
5+
import protocol Yosemite.PointOfSaleItemServiceProtocol
6+
import enum Yosemite.POSItem
7+
import struct Yosemite.POSCoupon
8+
import struct Yosemite.PagedItems
9+
import struct Yosemite.POSVariableParentProduct
10+
11+
final class MockPointOfSaleCouponService: PointOfSaleItemServiceProtocol{
12+
var shouldReturnZeroItems = false
13+
14+
func providePointOfSaleItems(pageNumber: Int) async throws -> PagedItems<POSItem> {
15+
if shouldReturnZeroItems {
16+
return .init(items: [], hasMorePages: false)
17+
} else {
18+
return .init(items: Self.makeInitialCoupons(),
19+
hasMorePages: false)
20+
}
21+
}
22+
23+
func providePointOfSaleVariationItems(for parentProduct: POSVariableParentProduct, pageNumber: Int) async throws -> PagedItems<POSItem> {
24+
return .init(items: [], hasMorePages: false)
25+
}
26+
27+
static func makeInitialCoupons() -> [POSItem] {
28+
let coupon1 = POSItem.coupon(POSCoupon(id: UUID(uuidString: ("DC55E3B9-9D83-4C07-82A7-4C300A50E84A")) ?? UUID(), code: "VALID1"))
29+
let coupon2 = POSItem.coupon(POSCoupon(id: UUID(uuidString: ("DC55E3B9-9D83-4C07-82A7-4C300A50E84B")) ?? UUID(), code: "VALID2"))
30+
let coupon3 = POSItem.coupon(POSCoupon(id: UUID(uuidString: ("DC55E3B9-9D83-4C07-82A7-4C300A50E84C")) ?? UUID(), code: "VALID3"))
31+
return [coupon1, coupon2, coupon3]
32+
}
33+
}
34+
35+
struct PointOfSaleCouponsControllerTests {
36+
@available(iOS 17.0, *)
37+
@Test func loadItems_when_empty_coupons_then_results_in_empty_loaded_state() async throws {
38+
// Given
39+
let couponProvider = MockPointOfSaleCouponService()
40+
couponProvider.shouldReturnZeroItems = true
41+
let sut = PointOfSaleCouponsController(itemProvider: couponProvider)
42+
43+
let expectedItemStackState = ItemsStackState(root: .loaded([], hasMoreItems: false), itemStates: [:])
44+
let expectedViewState = ItemsViewState(containerState: .content, itemsStack: expectedItemStackState)
45+
46+
// When
47+
await sut.loadItems(base: .root)
48+
49+
// Then
50+
#expect(sut.itemsViewState == expectedViewState)
51+
}
52+
53+
@available(iOS 17.0, *)
54+
@Test func loadItems_when_some_coupons_then_results_in_coupons_loaded_state() async throws {
55+
// Given
56+
let couponProvider = MockPointOfSaleCouponService()
57+
let expectedCoupons = MockPointOfSaleCouponService.makeInitialCoupons()
58+
let sut = PointOfSaleCouponsController(itemProvider: couponProvider)
59+
60+
let expectedItemStackState = ItemsStackState(root: .loaded(expectedCoupons, hasMoreItems: false), itemStates: [:])
61+
let expectedViewState = ItemsViewState(containerState: .content, itemsStack: expectedItemStackState)
62+
63+
// When
64+
await sut.loadItems(base: .root)
65+
66+
// Then
67+
#expect(sut.itemsViewState == expectedViewState)
68+
}
69+
}

0 commit comments

Comments
 (0)