Skip to content

Commit 1c5c229

Browse files
committed
Add support for the conversion endpoint
Resolves #43
1 parent 2c79cba commit 1c5c229

File tree

5 files changed

+192
-2
lines changed

5 files changed

+192
-2
lines changed

src/Client.php

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,7 @@ public function __construct(CredentialsInterface $credentials, $options = array(
9898
'applications' => 'Nexmo\Application\Client',
9999
'numbers' => 'Nexmo\Numbers\Client',
100100
'calls' => 'Nexmo\Call\Collection',
101+
'conversion' => 'Nexmo\Conversion\Client',
101102
], $this));
102103
}
103104

@@ -254,6 +255,26 @@ public function post($url, array $params)
254255
return $this->send($request);
255256
}
256257

258+
/**
259+
* Takes a URL and a key=>value array to generate a POST PSR-7 request object
260+
*
261+
* @param string $url The URL to make a request to
262+
* @param array $params Key=>Value array of data to send
263+
* @return \Psr\Http\Message\ResponseInterface
264+
*/
265+
public function postUrlEncoded($url, array $params)
266+
{
267+
$request = new Request(
268+
$url,
269+
'POST',
270+
'php://temp',
271+
['content-type' => 'application/x-www-form-urlencoded']
272+
);
273+
274+
$request->getBody()->write(http_build_query($params));
275+
return $this->send($request);
276+
}
277+
257278
/**
258279
* Takes a URL and a key=>value array to generate a PUT PSR-7 request object
259280
*

src/Conversion/Client.php

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
<?php
2+
3+
namespace Nexmo\Conversion;
4+
5+
use Nexmo\Client\ClientAwareInterface;
6+
use Nexmo\Client\ClientAwareTrait;
7+
use Nexmo\Client\Exception;
8+
9+
10+
class Client implements ClientAwareInterface
11+
{
12+
use ClientAwareTrait;
13+
14+
public function sms($message_id, $delivered, $timestamp=null)
15+
{
16+
return $this->sendConversion('sms', $message_id, $delivered, $timestamp);
17+
}
18+
19+
public function voice($message_id, $delivered, $timestamp=null)
20+
{
21+
return $this->sendConversion('voice', $message_id, $delivered, $timestamp);
22+
}
23+
24+
protected function sendConversion($type, $message_id, $delivered, $timestamp=null)
25+
{
26+
$params = [
27+
'message-id' => $message_id,
28+
'delivered' => $delivered
29+
];
30+
31+
if ($timestamp) {
32+
$params['timestamp'] = $timestamp;
33+
}
34+
35+
$response = $this->client->postUrlEncoded(
36+
\Nexmo\Client::BASE_API . '/conversions/'.$type.'?'.http_build_query($params),
37+
[]
38+
);
39+
40+
if($response->getStatusCode() != '200'){
41+
throw $this->getException($response);
42+
}
43+
}
44+
45+
protected function getException(ResponseInterface $response)
46+
{
47+
$body = json_decode($response->getBody()->getContents(), true);
48+
$status = $response->getStatusCode();
49+
50+
if($status === 402) {
51+
$e = new Exception\Request("This endpoint may need activating on your account. Please email [email protected] for more information", $status);
52+
} elseif($status >= 400 AND $status < 500) {
53+
$e = new Exception\Request($body['error_title'], $status);
54+
} elseif($status >= 500 AND $status < 600) {
55+
$e = new Exception\Server($body['error_title'], $status);
56+
} else {
57+
$e = new Exception\Exception('Unexpected HTTP Status Code');
58+
}
59+
60+
return $e;
61+
}
62+
63+
}

test/Conversion/ClientTest.php

Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
<?php
2+
/**
3+
* Nexmo Client Library for PHP
4+
*
5+
* @copyright Copyright (c) 2016 Nexmo, Inc. (http://nexmo.com)
6+
* @license https://github.com/Nexmo/nexmo-php/blob/master/LICENSE.txt MIT License
7+
*/
8+
9+
namespace NexmoTest\Conversion;
10+
11+
use Nexmo\Conversion\Client;
12+
use Zend\Diactoros\Response;
13+
use NexmoTest\Psr7AssertionTrait;
14+
use Prophecy\Argument;
15+
use Psr\Http\Message\RequestInterface;
16+
17+
18+
class ClientTest extends \PHPUnit_Framework_TestCase
19+
{
20+
use Psr7AssertionTrait;
21+
22+
protected $nexmoClient;
23+
24+
/**
25+
* @var Client
26+
*/
27+
protected $accountClient;
28+
29+
public function setUp()
30+
{
31+
$this->nexmoClient = $this->getMockBuilder('Nexmo\Client')->disableOriginalConstructor()->setMethods(['send'])->getMock();
32+
$this->conversionClient = new Client();
33+
$this->conversionClient->setClient($this->nexmoClient);
34+
}
35+
36+
public function testSmsWithTimestamp()
37+
{
38+
$this->nexmoClient->method('send')->will($this->returnCallback(function (RequestInterface $request) {
39+
$this->assertEquals('/conversions/sms', $request->getUri()->getPath());
40+
$this->assertEquals('api.nexmo.com', $request->getUri()->getHost());
41+
$this->assertEquals('POST', $request->getMethod());
42+
$this->assertRequestQueryContains('message-id', 'ABC123', $request);
43+
$this->assertRequestQueryContains('delivered', '1', $request);
44+
$this->assertRequestQueryContains('timestamp', '123456', $request);
45+
return $this->getResponse();
46+
}));
47+
48+
$this->conversionClient->sms('ABC123', true, '123456');
49+
}
50+
51+
public function testSmsWithoutTimestamp()
52+
{
53+
$this->nexmoClient->method('send')->will($this->returnCallback(function (RequestInterface $request) {
54+
$this->assertEquals('/conversions/sms', $request->getUri()->getPath());
55+
$this->assertEquals('api.nexmo.com', $request->getUri()->getHost());
56+
$this->assertEquals('POST', $request->getMethod());
57+
$this->assertRequestQueryContains('message-id', 'ABC123', $request);
58+
$this->assertRequestQueryContains('delivered', '1', $request);
59+
$this->assertRequestQueryNotContains('timestamp', $request);
60+
return $this->getResponse();
61+
}));
62+
63+
$this->conversionClient->sms('ABC123', true);
64+
}
65+
66+
public function testVoiceWithTimestamp()
67+
{
68+
$this->nexmoClient->method('send')->will($this->returnCallback(function (RequestInterface $request) {
69+
$this->assertEquals('/conversions/voice', $request->getUri()->getPath());
70+
$this->assertEquals('api.nexmo.com', $request->getUri()->getHost());
71+
$this->assertEquals('POST', $request->getMethod());
72+
$this->assertRequestQueryContains('message-id', 'ABC123', $request);
73+
$this->assertRequestQueryContains('delivered', '1', $request);
74+
$this->assertRequestQueryContains('timestamp', '123456', $request);
75+
return $this->getResponse();
76+
}));
77+
78+
$this->conversionClient->voice('ABC123', true, '123456');
79+
}
80+
81+
public function testVoiceWithoutTimestamp()
82+
{
83+
$this->nexmoClient->method('send')->will($this->returnCallback(function (RequestInterface $request) {
84+
$this->assertEquals('/conversions/voice', $request->getUri()->getPath());
85+
$this->assertEquals('api.nexmo.com', $request->getUri()->getHost());
86+
$this->assertEquals('POST', $request->getMethod());
87+
$this->assertRequestQueryContains('message-id', 'ABC123', $request);
88+
$this->assertRequestQueryContains('delivered', '1', $request);
89+
$this->assertRequestQueryNotContains('timestamp', $request);
90+
return $this->getResponse();
91+
}));
92+
93+
$this->conversionClient->voice('ABC123', true);
94+
}
95+
96+
/**
97+
* Get the API response we'd expect for a call to the API.
98+
*
99+
* @param string $type
100+
* @return Response
101+
*/
102+
protected function getResponse($type = 'success', $status = 200)
103+
{
104+
return new Response(fopen('data://text/plain,','r'), $status);
105+
}
106+
}

test/Numbers/ClientTest.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -204,7 +204,7 @@ public function testSearchAvailablePassesThroughWhitelistedOptions()
204204

205205
// Anything else should be dropped
206206
foreach ($invalidOptions as $name => $value) {
207-
$this->assertRequestQueryNotContains($name, $value, $request);
207+
$this->assertRequestQueryNotContains($name, $request);
208208
}
209209
return true;
210210
}))->willReturn($this->getResponse('available-numbers'));

test/Psr7AssertionTrait.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ public static function assertRequestUrl($host, $path, $method, RequestInterface
4242
self::assertEquals($method, $request->getMethod());
4343
}
4444

45-
public static function assertRequestQueryNotContains($key, $value, RequestInterface $request)
45+
public static function assertRequestQueryNotContains($key, RequestInterface $request)
4646
{
4747
$query = $request->getUri()->getQuery();
4848
$params = [];

0 commit comments

Comments
 (0)