Skip to content
Snippets Groups Projects
Commit dd68fdc0 authored by Sascha Grossenbacher's avatar Sascha Grossenbacher
Browse files

Issue #3197663 by Berdir: Correctly handle transmitted and unknown payment statuses

parent 2b3757fa
No related branches found
No related tags found
No related merge requests found
......@@ -170,7 +170,17 @@ class DatatransBase extends PaymentGatewayBase implements SupportsRefundsInterfa
]);
}
$payment->setState($transaction_data['status'] == 'settled' ? 'completed' : 'authorization');
// Only support certain stati, ignore others and do not create a payment.
if (\in_array($transaction_data['status'], ['settled', 'transmitted'])) {
$payment->setState('completed');
}
elseif (\in_array($transaction_data['status'], ['authorized'])) {
$payment->setState('authorization');
}
else {
return FALSE;
}
$payment->setRemoteState($transaction_data['status']);
if (!$payment->getAuthorizedTime()) {
$payment->setAuthorizedTime($this->time->getRequestTime());
......
......@@ -74,7 +74,7 @@ class DatatransGatewayTest extends DatatransKernelTestBase {
* @covers ::onReturn
* @covers ::processPayment
*/
public function testOnReturnComplete() {
public function testOnReturnSettled() {
$http_client = $this->prophesize(ClientInterface::class);
$expected_options = [
......@@ -113,6 +113,49 @@ class DatatransGatewayTest extends DatatransKernelTestBase {
$this->assertEquals(\Drupal::time()->getRequestTime(), $payment->getCompletedTime());
}
/**
* @covers ::onReturn
* @covers ::processPayment
*/
public function testOnReturnTransmitted() {
$http_client = $this->prophesize(ClientInterface::class);
$expected_options = [
'allow_redirects' => FALSE,
'auth' => ['', 'secret'],
'json' => [],
'headers' => ['Content-Type' => 'application/json'],
];
$transaction_data = $this->getTransactionData('transmitted');
$response = new Response(200, [], Json::encode($transaction_data));
$http_client->request('GET', 'https://api.sandbox.datatrans.com/v1/transactions/123', $expected_options)->willReturn($response);
$this->container->set('http_client', $http_client->reveal());
$datatrans = $this->getDatatransGateway();
// Create the request and call onReturn().
$request = Request::create('', 'GET', ['datatransTrxId' => 123]);
$datatrans->onReturn($this->order, $request);
// Process a second time, ensure that no duplicate is created.
$datatrans->onReturn($this->order, $request);
$payments = $this->entityTypeManager->getStorage('commerce_payment')->loadMultiple(NULL);
$this->assertCount(1, $payments);
/** @var \Drupal\commerce_payment\Entity\PaymentInterface $payment */
$payment = reset($payments);
$this->assertEquals('completed', $payment->getState()->value);
$this->assertEquals(123, $payment->getRemoteId());
$this->assertEquals($this->order->getTotalPrice(), $payment->getAmount());
$this->assertEquals('datatrans_id', $payment->getPaymentGatewayId());
$this->assertEquals(\Drupal::time()->getRequestTime(), $payment->getAuthorizedTime());
$this->assertEquals(\Drupal::time()->getRequestTime(), $payment->getCompletedTime());
}
/**
* @covers ::onReturn
* @covers ::processPayment
......@@ -152,6 +195,36 @@ class DatatransGatewayTest extends DatatransKernelTestBase {
$this->assertNull($payment->getCompletedTime());
}
/**
* @covers ::onReturn
* @covers ::processPayment
*/
public function testOnReturnUnknownState() {
$http_client = $this->prophesize(ClientInterface::class);
$expected_options = [
'allow_redirects' => FALSE,
'auth' => ['', 'secret'],
'json' => [],
'headers' => ['Content-Type' => 'application/json'],
];
$response = new Response(200, [], Json::encode($this->getTransactionData('challenge_ongoing')));
$http_client->request('GET', 'https://api.sandbox.datatrans.com/v1/transactions/123', $expected_options)->willReturn($response);
$this->container->set('http_client', $http_client->reveal());
// Initialize the datatrans gateway.
$datatrans = $this->getDatatransGateway();
// Create the request and call onReturn().
$request = Request::create('', 'GET', ['datatransTrxId' => 123]);
$datatrans->onReturn($this->order, $request);
// No payment was created.
$payments = $this->entityTypeManager->getStorage('commerce_payment')->loadMultiple(NULL);
$this->assertCount(0, $payments);
}
/**
* @covers ::refundPayment
*/
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment