paymentDOMock = $this->createMock(PaymentDataObjectInterface::class); $this->paymentMock = $this->createMock(Payment::class); $this->paymentDOMock->method('getPayment') ->willReturn($this->paymentMock); $this->handler = new PaymentReviewStatusHandler(new SubjectReader()); } public function testApprovesPayment() { $subject = [ 'payment' => $this->paymentDOMock ]; $response = [ 'transaction' => [ 'transactionStatus' => 'approvedOrSomething', ] ]; // Assert payment is handled correctly $this->paymentMock->expects($this->exactly(2)) ->method('setData') ->withConsecutive( ['is_transaction_denied', false], ['is_transaction_approved', true] ); $this->handler->handle($subject, $response); // Assertions are via mock expects above } /** * @param string $status * @dataProvider declinedTransactionStatusesProvider */ public function testDeniesPayment(string $status) { $subject = [ 'payment' => $this->paymentDOMock ]; $response = [ 'transaction' => [ 'transactionStatus' => $status, ] ]; // Assert payment is handled correctly $this->paymentMock->expects($this->exactly(2)) ->method('setData') ->withConsecutive( ['is_transaction_denied', true], ['is_transaction_approved', false] ); $this->handler->handle($subject, $response); } /** * @param string $status * @dataProvider pendingTransactionStatusesProvider */ public function testDoesNothingWhenPending(string $status) { $subject = [ 'payment' => $this->paymentDOMock ]; $response = [ 'transaction' => [ 'transactionStatus' => $status, ] ]; // Assert payment is handled correctly $this->paymentMock->expects($this->never()) ->method('setData'); $this->handler->handle($subject, $response); } public function pendingTransactionStatusesProvider() { return [ ['FDSPendingReview'], ['FDSAuthorizedPendingReview'] ]; } public function declinedTransactionStatusesProvider() { return [ ['void'], ['declined'] ]; } }