From d5cb83fa83ee59a247b5e93e12a6235e2b76576e Mon Sep 17 00:00:00 2001 From: Gabriel Birke Date: Wed, 23 Nov 2022 10:17:56 +0100 Subject: [PATCH] Add paymentWasAlreadyBooked to FailureResponse Add a new static constructor and a boolean getter to check if the FailureResponse is caused by an already booked payment. This will help upstream code to check against this condition without using hard-coded string messages (that might change). Ticket: https://phabricator.wikimedia.org/T321346 --- .../BookPayment/BookPaymentUseCase.php | 2 +- src/UseCases/BookPayment/FailureResponse.php | 11 +++++++++ .../BookPayment/FailureResponseTest.php | 24 +++++++++++++++++++ 3 files changed, 36 insertions(+), 1 deletion(-) create mode 100644 tests/Unit/UseCases/BookPayment/FailureResponseTest.php diff --git a/src/UseCases/BookPayment/BookPaymentUseCase.php b/src/UseCases/BookPayment/BookPaymentUseCase.php index bdc370a5..d9915a5c 100644 --- a/src/UseCases/BookPayment/BookPaymentUseCase.php +++ b/src/UseCases/BookPayment/BookPaymentUseCase.php @@ -41,7 +41,7 @@ public function bookPayment( int $paymentId, array $transactionData ): SuccessRe } if ( $this->paymentWasAlreadyBooked( $payment, $transactionData ) ) { - return new FailureResponse( 'Payment is already completed' ); + return FailureResponse::newAlreadyCompletedResponse(); } $verificationResponse = $this->validateWithExternalService( $payment, $transactionData ); diff --git a/src/UseCases/BookPayment/FailureResponse.php b/src/UseCases/BookPayment/FailureResponse.php index af7dcbe2..f5b32367 100644 --- a/src/UseCases/BookPayment/FailureResponse.php +++ b/src/UseCases/BookPayment/FailureResponse.php @@ -5,8 +5,19 @@ namespace WMDE\Fundraising\PaymentContext\UseCases\BookPayment; class FailureResponse { + + private const ALREADY_COMPLETED = 'Payment is already completed'; + public function __construct( public readonly string $message ) { } + + public static function newAlreadyCompletedResponse(): self { + return new self( self::ALREADY_COMPLETED ); + } + + public function paymentWasAlreadyCompleted(): bool { + return $this->message === self::ALREADY_COMPLETED; + } } diff --git a/tests/Unit/UseCases/BookPayment/FailureResponseTest.php b/tests/Unit/UseCases/BookPayment/FailureResponseTest.php new file mode 100644 index 00000000..02eabacf --- /dev/null +++ b/tests/Unit/UseCases/BookPayment/FailureResponseTest.php @@ -0,0 +1,24 @@ +assertTrue( $response->paymentWasAlreadyCompleted() ); + } + + public function testWhenStringConstructor_isAlreadyCompletedReturnsFalse(): void { + $response = new FailureResponse( 'Could not book payment for ... reasons.' ); + + $this->assertFalse( $response->paymentWasAlreadyCompleted() ); + } +}