Skip to content

Commit eed8364

Browse files
authored
Merge pull request #8331 from woocommerce/td/decouple-chaching-from-unit-tests
Mock payment capture celebration UX in unit tests
2 parents 8601801 + 7f161a4 commit eed8364

File tree

9 files changed

+58
-24
lines changed

9 files changed

+58
-24
lines changed

WooCommerce/Classes/ViewModels/CardPresentPayments/LegacyPaymentCaptureOrchestrator.swift

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,16 +13,18 @@ final class LegacyPaymentCaptureOrchestrator {
1313
private let personNameComponentsFormatter = PersonNameComponentsFormatter()
1414
private let paymentReceiptEmailParameterDeterminer: ReceiptEmailParameterDeterminer
1515

16-
private let celebration = PaymentCaptureCelebration()
16+
private let celebration: PaymentCaptureCelebrationProtocol
1717

1818
private var walletSuppressionRequestToken: PKSuppressionRequestToken?
1919

2020
private let stores: StoresManager
2121

2222
init(stores: StoresManager = ServiceLocator.stores,
23-
paymentReceiptEmailParameterDeterminer: ReceiptEmailParameterDeterminer = PaymentReceiptEmailParameterDeterminer()) {
23+
paymentReceiptEmailParameterDeterminer: ReceiptEmailParameterDeterminer = PaymentReceiptEmailParameterDeterminer(),
24+
celebration: PaymentCaptureCelebrationProtocol) {
2425
self.stores = stores
2526
self.paymentReceiptEmailParameterDeterminer = paymentReceiptEmailParameterDeterminer
27+
self.celebration = celebration
2628
}
2729

2830
func collectPayment(for order: Order,

WooCommerce/Classes/ViewModels/CardPresentPayments/PaymentCaptureCelebration.swift

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,14 @@
11
import AudioToolbox
22
import UIKit
33

4+
/// Allows mocking payment capture celebration UX so that the cha-ching sounds aren't played in unit testing.
5+
protocol PaymentCaptureCelebrationProtocol {
6+
/// Called when a payment is captured successfully.
7+
func celebrate()
8+
}
9+
410
/// Plays a sound and provides haptic feedback when a payment capture has been completed successfully
5-
final class PaymentCaptureCelebration: NSObject {
11+
final class PaymentCaptureCelebration: NSObject, PaymentCaptureCelebrationProtocol {
612
private var soundID: SystemSoundID = 0
713

814
func celebrate() {

WooCommerce/Classes/ViewModels/CardPresentPayments/PaymentCaptureOrchestrator.swift

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,16 +22,18 @@ final class PaymentCaptureOrchestrator {
2222
private let personNameComponentsFormatter = PersonNameComponentsFormatter()
2323
private let paymentReceiptEmailParameterDeterminer: ReceiptEmailParameterDeterminer
2424

25-
private let celebration = PaymentCaptureCelebration()
25+
private let celebration: PaymentCaptureCelebrationProtocol
2626

2727
private var walletSuppressionRequestToken: PKSuppressionRequestToken?
2828

2929
private let stores: StoresManager
3030

3131
init(stores: StoresManager = ServiceLocator.stores,
32-
paymentReceiptEmailParameterDeterminer: ReceiptEmailParameterDeterminer = PaymentReceiptEmailParameterDeterminer()) {
32+
paymentReceiptEmailParameterDeterminer: ReceiptEmailParameterDeterminer = PaymentReceiptEmailParameterDeterminer(),
33+
celebration: PaymentCaptureCelebrationProtocol) {
3334
self.stores = stores
3435
self.paymentReceiptEmailParameterDeterminer = paymentReceiptEmailParameterDeterminer
36+
self.celebration = celebration
3537
}
3638

3739
func collectPayment(for order: Order,

WooCommerce/Classes/ViewRelated/Orders/Collect Payments/CollectOrderPaymentUseCase.swift

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,9 +88,12 @@ final class CollectOrderPaymentUseCase: NSObject, CollectOrderPaymentProtocol {
8888
///
8989
private let configuration: CardPresentPaymentsConfiguration
9090

91+
/// Celebration UX when the payment is captured successfully.
92+
private let paymentCaptureCelebration: PaymentCaptureCelebrationProtocol
93+
9194
/// IPP payments collector.
9295
///
93-
private lazy var paymentOrchestrator = PaymentCaptureOrchestrator(stores: stores)
96+
private lazy var paymentOrchestrator = PaymentCaptureOrchestrator(stores: stores, celebration: paymentCaptureCelebration)
9497

9598
/// Coordinates emailing a receipt after payment success.
9699
private var receiptEmailCoordinator: CardPresentPaymentReceiptEmailCoordinator?
@@ -106,6 +109,7 @@ final class CollectOrderPaymentUseCase: NSObject, CollectOrderPaymentProtocol {
106109
rootViewController: UIViewController,
107110
configuration: CardPresentPaymentsConfiguration,
108111
stores: StoresManager = ServiceLocator.stores,
112+
paymentCaptureCelebration: PaymentCaptureCelebrationProtocol = PaymentCaptureCelebration(),
109113
analytics: Analytics = ServiceLocator.analytics) {
110114
self.siteID = siteID
111115
self.order = order
@@ -116,6 +120,7 @@ final class CollectOrderPaymentUseCase: NSObject, CollectOrderPaymentProtocol {
116120
self.paymentAlerts = CardReaderPaymentAlertsProvider(transactionType: .collectPayment)
117121
self.configuration = configuration
118122
self.stores = stores
123+
self.paymentCaptureCelebration = paymentCaptureCelebration
119124
self.analytics = analytics
120125
}
121126

WooCommerce/Classes/ViewRelated/Orders/Collect Payments/LegacyCollectOrderPaymentUseCase.swift

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,9 +64,12 @@ final class LegacyCollectOrderPaymentUseCase: NSObject, CollectOrderPaymentProto
6464
///
6565
private let configuration: CardPresentPaymentsConfiguration
6666

67+
/// Celebration UX when the payment is captured successfully.
68+
private let paymentCaptureCelebration: PaymentCaptureCelebrationProtocol
69+
6770
/// IPP payments collector.
6871
///
69-
private lazy var paymentOrchestrator = LegacyPaymentCaptureOrchestrator(stores: stores)
72+
private lazy var paymentOrchestrator = LegacyPaymentCaptureOrchestrator(stores: stores, celebration: paymentCaptureCelebration)
7073

7174
/// Controller to connect a card reader.
7275
///
@@ -91,6 +94,7 @@ final class LegacyCollectOrderPaymentUseCase: NSObject, CollectOrderPaymentProto
9194
alerts: OrderDetailsPaymentAlertsProtocol,
9295
configuration: CardPresentPaymentsConfiguration,
9396
stores: StoresManager = ServiceLocator.stores,
97+
paymentCaptureCelebration: PaymentCaptureCelebrationProtocol = PaymentCaptureCelebration(),
9498
analytics: Analytics = ServiceLocator.analytics) {
9599
self.siteID = siteID
96100
self.order = order
@@ -100,6 +104,7 @@ final class LegacyCollectOrderPaymentUseCase: NSObject, CollectOrderPaymentProto
100104
self.alerts = alerts
101105
self.configuration = configuration
102106
self.stores = stores
107+
self.paymentCaptureCelebration = paymentCaptureCelebration
103108
self.analytics = analytics
104109
}
105110

WooCommerce/WooCommerce.xcodeproj/project.pbxproj

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -233,6 +233,7 @@
233233
02645D8827BA2E820065DC68 /* NSAttributedString+Attributes.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02645D8727BA2E820065DC68 /* NSAttributedString+Attributes.swift */; };
234234
02645D8A27BA2EDB0065DC68 /* NSAttributedString+AttributesTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02645D8927BA2EDB0065DC68 /* NSAttributedString+AttributesTests.swift */; };
235235
02645D8C27BA342D0065DC68 /* InboxNoteRowViewModelTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02645D8B27BA342D0065DC68 /* InboxNoteRowViewModelTests.swift */; };
236+
02660504293D8D24004084EA /* PaymentCaptureCelebration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02660503293D8D24004084EA /* PaymentCaptureCelebration.swift */; };
236237
02691780232600A6002AFC20 /* ProductsTabProductViewModelTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0269177F232600A6002AFC20 /* ProductsTabProductViewModelTests.swift */; };
237238
02691782232605B9002AFC20 /* PaginatedListViewControllerStateCoordinatorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02691781232605B9002AFC20 /* PaginatedListViewControllerStateCoordinatorTests.swift */; };
238239
0269576A23726304001BA0BF /* KeyboardFrameObserver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0269576923726304001BA0BF /* KeyboardFrameObserver.swift */; };
@@ -2255,6 +2256,7 @@
22552256
02645D8727BA2E820065DC68 /* NSAttributedString+Attributes.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NSAttributedString+Attributes.swift"; sourceTree = "<group>"; };
22562257
02645D8927BA2EDB0065DC68 /* NSAttributedString+AttributesTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NSAttributedString+AttributesTests.swift"; sourceTree = "<group>"; };
22572258
02645D8B27BA342D0065DC68 /* InboxNoteRowViewModelTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InboxNoteRowViewModelTests.swift; sourceTree = "<group>"; };
2259+
02660503293D8D24004084EA /* PaymentCaptureCelebration.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PaymentCaptureCelebration.swift; sourceTree = "<group>"; };
22582260
0269177F232600A6002AFC20 /* ProductsTabProductViewModelTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProductsTabProductViewModelTests.swift; sourceTree = "<group>"; };
22592261
02691781232605B9002AFC20 /* PaginatedListViewControllerStateCoordinatorTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PaginatedListViewControllerStateCoordinatorTests.swift; sourceTree = "<group>"; };
22602262
0269576923726304001BA0BF /* KeyboardFrameObserver.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KeyboardFrameObserver.swift; sourceTree = "<group>"; };
@@ -6597,6 +6599,7 @@
65976599
EE8DCA7F28BF964700F23B23 /* MockAuthentication.swift */,
65986600
AEB4DB98290AE8F300AE4340 /* MockCookieJar.swift */,
65996601
CC3DB1DB291188CA00425961 /* MockABTesting.swift */,
6602+
02660503293D8D24004084EA /* PaymentCaptureCelebration.swift */,
66006603
);
66016604
path = Mocks;
66026605
sourceTree = "<group>";
@@ -11096,6 +11099,7 @@
1109611099
D83F593D225B4B5000626E75 /* ManualTrackingViewControllerTests.swift in Sources */,
1109711100
CC53FB402759042600C4CA4F /* ProductSelectorViewModelTests.swift in Sources */,
1109811101
DE0A2EB1281BED38007A8015 /* ProductCategorySelectorViewModelTests.swift in Sources */,
11102+
02660504293D8D24004084EA /* PaymentCaptureCelebration.swift in Sources */,
1109911103
03AA16602719B83D005CCB7B /* ReceiptActionCoordinatorTests.swift in Sources */,
1110011104
020D0BFD2914E92800BB3DCE /* StorePickerCoordinatorTests.swift in Sources */,
1110111105
CEEC9B6621E7C5200055EEF0 /* AppRatingManagerTests.swift in Sources */,
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
@testable import WooCommerce
2+
3+
struct MockPaymentCaptureCelebration: PaymentCaptureCelebrationProtocol {
4+
func celebrate() {
5+
// no-op
6+
}
7+
}

WooCommerce/WooCommerceTests/ViewModels/CardPresentPayments/LegacyCollectOrderPaymentUseCaseTests.swift

Lines changed: 18 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -24,14 +24,15 @@ final class LegacyCollectOrderPaymentUseCaseTests: XCTestCase {
2424

2525
alerts = MockOrderDetailsPaymentAlerts()
2626
useCase = LegacyCollectOrderPaymentUseCase(siteID: defaultSiteID,
27-
order: .fake().copy(siteID: defaultSiteID, orderID: defaultOrderID, total: "1.5"),
28-
formattedAmount: "1.5",
29-
paymentGatewayAccount: .fake().copy(gatewayID: Mocks.paymentGatewayAccount),
30-
rootViewController: .init(),
31-
alerts: alerts,
32-
configuration: Mocks.configuration,
33-
stores: stores,
34-
analytics: analytics)
27+
order: .fake().copy(siteID: defaultSiteID, orderID: defaultOrderID, total: "1.5"),
28+
formattedAmount: "1.5",
29+
paymentGatewayAccount: .fake().copy(gatewayID: Mocks.paymentGatewayAccount),
30+
rootViewController: .init(),
31+
alerts: alerts,
32+
configuration: Mocks.configuration,
33+
stores: stores,
34+
paymentCaptureCelebration: MockPaymentCaptureCelebration(),
35+
analytics: analytics)
3536
}
3637

3738
override func tearDown() {
@@ -155,14 +156,15 @@ final class LegacyCollectOrderPaymentUseCaseTests: XCTestCase {
155156
func test_collectPayment_with_below_minimum_amount_results_in_failure_and_tracks_collectPaymentFailed_event() throws {
156157
// Given
157158
let useCase = LegacyCollectOrderPaymentUseCase(siteID: 122,
158-
order: .fake().copy(total: "0.49"),
159-
formattedAmount: "0.49",
160-
paymentGatewayAccount: .fake().copy(gatewayID: Mocks.paymentGatewayAccount),
161-
rootViewController: .init(),
162-
alerts: alerts,
163-
configuration: Mocks.configuration,
164-
stores: stores,
165-
analytics: analytics)
159+
order: .fake().copy(total: "0.49"),
160+
formattedAmount: "0.49",
161+
paymentGatewayAccount: .fake().copy(gatewayID: Mocks.paymentGatewayAccount),
162+
rootViewController: .init(),
163+
alerts: alerts,
164+
configuration: Mocks.configuration,
165+
stores: stores,
166+
paymentCaptureCelebration: MockPaymentCaptureCelebration(),
167+
analytics: analytics)
166168

167169
// When
168170
// Mocks card reader connection success since the minimum amount is only checked after reader connection success.

WooCommerce/WooCommerceTests/ViewModels/CardPresentPayments/LegacyPaymentCaptureOrchestratorTests.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,8 @@ final class LegacyPaymentCaptureOrchestratorTests: XCTestCase {
1212
super.setUp()
1313
stores = MockStoresManager(sessionManager: SessionManager.makeForTesting())
1414
sut = LegacyPaymentCaptureOrchestrator(stores: stores,
15-
paymentReceiptEmailParameterDeterminer: MockReceiptEmailParameterDeterminer())
15+
paymentReceiptEmailParameterDeterminer: MockReceiptEmailParameterDeterminer(),
16+
celebration: MockPaymentCaptureCelebration())
1617
}
1718

1819
override func tearDown() {

0 commit comments

Comments
 (0)