Skip to content

Commit 3dee441

Browse files
authored
Merge pull request #65 from MyOnlineStore/void
Implement void method for order API
2 parents cec171d + b0de21b commit 3dee441

File tree

6 files changed

+168
-1
lines changed

6 files changed

+168
-1
lines changed

README.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,12 @@ $response = $gateway->createShipment(
177177
)->send();
178178
```
179179

180+
4. As long as the order is `created`, `authorized` or `shipping`, it may be cancelled (voided)
181+
182+
```php
183+
$response = $gateway->void(["transactionReference" => "ord_xxx"])->send();
184+
```
185+
180186
## Support
181187

182188
If you are having general issues with Omnipay, we suggest posting on

src/Gateway.php

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
use Omnipay\Common\AbstractGateway;
66
use Omnipay\Common\Message\RequestInterface;
7+
use Omnipay\Mollie\Message\Request\CancelOrderRequest;
78
use Omnipay\Mollie\Message\Request\CompleteOrderRequest;
89
use Omnipay\Mollie\Message\Request\CompletePurchaseRequest;
910
use Omnipay\Mollie\Message\Request\CreateCustomerMandateRequest;
@@ -31,7 +32,6 @@
3132
* @method RequestInterface authorize(array $options = array())
3233
* @method RequestInterface completeAuthorize(array $options = array())
3334
* @method RequestInterface capture(array $options = array())
34-
* @method RequestInterface void(array $options = array())
3535
* @method RequestInterface createCard(array $options = array())
3636
* @method RequestInterface updateCard(array $options = array())
3737
* @method RequestInterface deleteCard(array $options = array())
@@ -293,4 +293,13 @@ public function revokeCustomerMandate(array $parameters = [])
293293
{
294294
return $this->createRequest(RevokeCustomerMandateRequest::class, $parameters);
295295
}
296+
297+
/**
298+
* @param array $parameters
299+
* @return CancelOrderRequest
300+
*/
301+
public function void(array $parameters = [])
302+
{
303+
return $this->createRequest(CancelOrderRequest::class, $parameters);
304+
}
296305
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
<?php
2+
3+
namespace Omnipay\Mollie\Message\Request;
4+
5+
use Omnipay\Mollie\Message\Response\CancelOrderResponse;
6+
7+
/**
8+
* Cancel an order with the Mollie API.
9+
*
10+
* @see https://docs.mollie.com/reference/v2/orders-api/cancel-order
11+
* @method CancelOrderResponse send()
12+
*/
13+
final class CancelOrderRequest extends AbstractMollieRequest
14+
{
15+
/**
16+
* @inheritdoc
17+
*/
18+
public function getData()
19+
{
20+
$this->validate('apiKey', 'transactionReference');
21+
22+
return [];
23+
}
24+
25+
/**
26+
* @inheritdoc
27+
*/
28+
public function sendData($data)
29+
{
30+
return $this->response = new CancelOrderResponse(
31+
$this,
32+
$this->sendRequest(self::DELETE, '/orders/'.$this->getTransactionReference(), $data)
33+
);
34+
}
35+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
<?php
2+
3+
namespace Omnipay\Mollie\Message\Response;
4+
5+
/**
6+
* @see https://docs.mollie.com/reference/v2/orders-api/cancel-order
7+
*/
8+
final class CancelOrderResponse extends FetchOrderResponse
9+
{
10+
/**
11+
* @return bool
12+
*/
13+
public function isSuccessful()
14+
{
15+
if (!isset($this->data['status'])) {
16+
return false;
17+
}
18+
19+
return 'canceled' === $this->data['status'];
20+
}
21+
}

tests/GatewayTest.php

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
use Omnipay\Common\Exception\InvalidRequestException;
66
use Omnipay\Mollie\Gateway;
7+
use Omnipay\Mollie\Message\Request\CancelOrderRequest;
78
use Omnipay\Mollie\Message\Request\CompletePurchaseRequest;
89
use Omnipay\Mollie\Message\Request\CreateCustomerMandateRequest;
910
use Omnipay\Mollie\Message\Request\CreateCustomerRequest;
@@ -212,4 +213,9 @@ public function testCreateCustomerMandate()
212213

213214
$this->assertInstanceOf(CreateCustomerMandateRequest::class, $request);
214215
}
216+
217+
public function testVoid()
218+
{
219+
$this->assertInstanceOf(CancelOrderRequest::class, $this->gateway->void());
220+
}
215221
}
Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
<?php
2+
3+
namespace Omnipay\Mollie\Test\Message;
4+
5+
use Omnipay\Common\Http\ClientInterface;
6+
use Omnipay\Mollie\Message\Request\CancelOrderRequest;
7+
use Omnipay\Mollie\Message\Response\CancelOrderResponse;
8+
use Omnipay\Tests\TestCase;
9+
use Psr\Http\Message\ResponseInterface;
10+
11+
final class CancelOrderRequestTest extends TestCase
12+
{
13+
/**
14+
* @var ClientInterface|\PHPUnit_Framework_MockObject_MockObject
15+
*/
16+
private $httpClient;
17+
18+
/**
19+
* @var CancelOrderRequest
20+
*/
21+
private $request;
22+
23+
public function setUp()
24+
{
25+
$this->httpClient = $this->createMock(ClientInterface::class);
26+
$this->request = new CancelOrderRequest($this->httpClient, $this->getHttpRequest());
27+
}
28+
29+
public function insufficientDataProvider()
30+
{
31+
return [
32+
[['apiKey' => 'mykey']],
33+
[['transactionReference' => 'myref']],
34+
];
35+
}
36+
37+
public function responseDataProvider()
38+
{
39+
return [
40+
[['id' => 'ord_kEn1PlbGa'], false],
41+
[['status' => 'paid', 'id' => 'ord_kEn1PlbGa'], false],
42+
[['status' => 'canceled', 'id' => 'ord_kEn1PlbGa'], true],
43+
];
44+
}
45+
46+
/**
47+
* @dataProvider insufficientDataProvider
48+
*
49+
* @expectedException \Omnipay\Common\Exception\InvalidRequestException
50+
*
51+
* @param array $input
52+
*/
53+
public function testGetDataWillValidateRequiredData(array $input)
54+
{
55+
$this->request->initialize($input);
56+
$this->request->getData();
57+
}
58+
59+
public function testGetDataWillReturnEmptyArray()
60+
{
61+
$this->request->initialize(['apiKey' => 'mykey', 'transactionReference' => 'myref']);
62+
self::assertEquals([], $this->request->getData());
63+
}
64+
65+
/**
66+
* @dataProvider responseDataProvider
67+
*/
68+
public function testSendData(array $responseData, $success)
69+
{
70+
$response = $this->createMock(ResponseInterface::class);
71+
$response->expects(self::once())
72+
->method('getBody')
73+
->willReturn(\json_encode($responseData));
74+
75+
$this->httpClient->expects(self::once())
76+
->method('request')
77+
->with(
78+
'DELETE',
79+
'https://api.mollie.com/v2/orders/ord_kEn1PlbGa',
80+
['Authorization' => 'Bearer mykey']
81+
)->willReturn($response);
82+
83+
$this->request->initialize(['apiKey' => 'mykey', 'transactionReference' => 'ord_kEn1PlbGa']);
84+
$voidResponse = $this->request->sendData([]);
85+
86+
$this->assertInstanceOf(CancelOrderResponse::class, $voidResponse);
87+
$this->assertEquals($success, $voidResponse->isSuccessful());
88+
$this->assertSame('ord_kEn1PlbGa', $voidResponse->getTransactionReference());
89+
}
90+
}

0 commit comments

Comments
 (0)