Skip to content

Commit 3275559

Browse files
committed
move CardPresentPaymentServiceScreenshotMock
1 parent 3dd788f commit 3275559

File tree

2 files changed

+75
-79
lines changed

2 files changed

+75
-79
lines changed

WooCommerce/Classes/POS/Adaptors/Card Present Payments/CardPresentPaymentService.swift

Lines changed: 0 additions & 79 deletions
Original file line numberDiff line numberDiff line change
@@ -267,82 +267,3 @@ enum CardPresentPaymentServiceError: Error {
267267
case incompleteAddressConnectionError
268268
case couldNotCancelPayment
269269
}
270-
271-
import Hardware // [!] Temporarily here. Import needed for `CardReaderInput` for now.
272-
273-
/// Mock CardPresentPaymentService for screenshot tests.
274-
/// Simulates a connected card reader and emits payment events in the correct sequence.
275-
final class CardPresentPaymentServiceScreenshotMock: CardPresentPaymentFacade {
276-
let paymentEventPublisher: AnyPublisher<CardPresentPaymentEvent, Never>
277-
let readerConnectionStatusPublisher: AnyPublisher<CardPresentPaymentReaderConnectionStatus, Never>
278-
let cardReaderUpdateStatePublisher: AnyPublisher<CardReaderSoftwareUpdateState, Never>
279-
280-
private let paymentEventSubject = PassthroughSubject<CardPresentPaymentEvent, Never>()
281-
282-
init() {
283-
// Set up payment event publisher
284-
paymentEventPublisher = paymentEventSubject
285-
.receive(on: DispatchQueue.main)
286-
.eraseToAnyPublisher()
287-
288-
// Always return a connected card reader for screenshots
289-
let mockReader = CardPresentPaymentCardReader(
290-
name: "Simulated POS E",
291-
batteryLevel: 0.5,
292-
softwareVersion: "1.00.03.34-SZZZ_Generic_v45-300001"
293-
)
294-
readerConnectionStatusPublisher = Just(.connected(mockReader))
295-
.receive(on: DispatchQueue.main)
296-
.eraseToAnyPublisher()
297-
298-
// No updates needed for screenshots
299-
cardReaderUpdateStatePublisher = Just(.none)
300-
.receive(on: DispatchQueue.main)
301-
.eraseToAnyPublisher()
302-
}
303-
304-
func connectReader(using connectionMethod: CardReaderConnectionMethod) async throws -> CardPresentPaymentReaderConnectionResult {
305-
// Return connected reader immediately
306-
let mockReader = CardPresentPaymentCardReader(
307-
name: "Simulated POS E",
308-
batteryLevel: 0.5,
309-
softwareVersion: "1.00.03.34-SZZZ_Generic_v45-300001"
310-
)
311-
return .connected(mockReader)
312-
}
313-
314-
func disconnectReader() async {
315-
// No-op for screenshots
316-
}
317-
318-
func updateCardReaderSoftware() async throws {
319-
// No-op for screenshots
320-
}
321-
322-
func collectPayment(for order: Order, using connectionMethod: CardReaderConnectionMethod, channel: PaymentChannel) async throws -> CardPresentPaymentResult {
323-
324-
// 1. Validating order
325-
paymentEventSubject.send(.show(eventDetails: .validatingOrder(cancelPayment: {})))
326-
try await Task.sleep(nanoseconds: 100_000_000) // 0.1 seconds
327-
328-
// 2. Preparing reader
329-
paymentEventSubject.send(.show(eventDetails: .preparingForPayment(cancelPayment: {})))
330-
try await Task.sleep(nanoseconds: 100_000_000) // 0.1 seconds
331-
332-
// 3. Ready to accept card
333-
let inputMethods: CardReaderInput = [.tap, .swipe, .insert]
334-
paymentEventSubject.send(.show(eventDetails: .tapSwipeOrInsertCard(inputMethods: inputMethods, cancelPayment: {})))
335-
336-
try await Task.sleep(nanoseconds: 3_000_000_000) // 3 seconds, give it some time for the screenshot
337-
338-
return .success(CardPresentPaymentTransaction())
339-
}
340-
341-
func cancelPayment() {
342-
// No-op for screenshots
343-
}
344-
345-
func cancelPayment() async throws {
346-
// No-op for screenshots
347-
}
348-
}

WooCommerce/Classes/POS/TabBar/POSTabCoordinator.swift

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import Foundation
22
import UIKit
33
import SwiftUI
44
import Yosemite
5+
import Combine
56
import class WooFoundation.CurrencySettings
67
import WooFoundationCore
78
import protocol Storage.GRDBManagerProtocol
@@ -497,3 +498,77 @@ private final class PointOfSaleItemServiceScreenshotMock: Yosemite.PointOfSaleIt
497498
]
498499
}
499500
}
501+
502+
final class CardPresentPaymentServiceScreenshotMock: CardPresentPaymentFacade {
503+
let paymentEventPublisher: AnyPublisher<CardPresentPaymentEvent, Never>
504+
let readerConnectionStatusPublisher: AnyPublisher<CardPresentPaymentReaderConnectionStatus, Never>
505+
let cardReaderUpdateStatePublisher: AnyPublisher<CardReaderSoftwareUpdateState, Never>
506+
507+
private let paymentEventSubject = PassthroughSubject<CardPresentPaymentEvent, Never>()
508+
509+
init() {
510+
paymentEventPublisher = paymentEventSubject
511+
.receive(on: DispatchQueue.main)
512+
.eraseToAnyPublisher()
513+
514+
// Always return a connected card reader for screenshots
515+
let mockReader = CardPresentPaymentCardReader(
516+
name: "Simulated POS E",
517+
batteryLevel: 0.5,
518+
softwareVersion: "1.00.03.34-SZZZ_Generic_v45-300001"
519+
)
520+
readerConnectionStatusPublisher = Just(.connected(mockReader))
521+
.receive(on: DispatchQueue.main)
522+
.eraseToAnyPublisher()
523+
524+
// No updates needed for screenshots
525+
cardReaderUpdateStatePublisher = Just(.none)
526+
.receive(on: DispatchQueue.main)
527+
.eraseToAnyPublisher()
528+
}
529+
530+
func connectReader(using connectionMethod: CardReaderConnectionMethod) async throws -> CardPresentPaymentReaderConnectionResult {
531+
// Return connected reader immediately
532+
let mockReader = CardPresentPaymentCardReader(
533+
name: "Simulated POS E",
534+
batteryLevel: 0.5,
535+
softwareVersion: "1.00.03.34-SZZZ_Generic_v45-300001"
536+
)
537+
return .connected(mockReader)
538+
}
539+
540+
func disconnectReader() async {
541+
// No-op for screenshots
542+
}
543+
544+
func updateCardReaderSoftware() async throws {
545+
// No-op for screenshots
546+
}
547+
548+
func collectPayment(for order: Order, using connectionMethod: CardReaderConnectionMethod, channel: PaymentChannel) async throws -> CardPresentPaymentResult {
549+
550+
// 1. Validating order
551+
paymentEventSubject.send(.show(eventDetails: .validatingOrder(cancelPayment: {})))
552+
try await Task.sleep(nanoseconds: 100_000_000) // 0.1 seconds
553+
554+
// 2. Preparing reader
555+
paymentEventSubject.send(.show(eventDetails: .preparingForPayment(cancelPayment: {})))
556+
try await Task.sleep(nanoseconds: 100_000_000) // 0.1 seconds
557+
558+
// 3. Ready to accept card
559+
let inputMethods: Yosemite.CardReaderInput = [.tap, .swipe, .insert]
560+
paymentEventSubject.send(.show(eventDetails: .tapSwipeOrInsertCard(inputMethods: inputMethods, cancelPayment: {})))
561+
562+
try await Task.sleep(nanoseconds: 3_000_000_000) // 3 seconds, give it some time for the screenshot
563+
564+
return .success(CardPresentPaymentTransaction())
565+
}
566+
567+
func cancelPayment() {
568+
// No-op for screenshots
569+
}
570+
571+
func cancelPayment() async throws {
572+
// No-op for screenshots
573+
}
574+
}

0 commit comments

Comments
 (0)