PageRenderTime 61ms CodeModel.GetById 17ms RepoModel.GetById 0ms app.codeStats 0ms

/tests/BaseClient_Test.php

http://github.com/recurly/recurly-client-php
PHP | 241 lines | 205 code | 35 blank | 1 comment | 0 complexity | a73f399a707ca070a5eb6e6ef7f9b422 MD5 | raw file
Possible License(s): MIT, LGPL-2.1
  1. <?php
  2. use Recurly\Page;
  3. use Recurly\Resources\TestResource;
  4. use Recurly\BaseClient;
  5. use Recurly\Utils;
  6. use Recurly\Logger;
  7. use Psr\Log\LogLevel;
  8. final class BaseClientTest extends RecurlyTestCase
  9. {
  10. protected function setUp(): void
  11. {
  12. parent::setUp();
  13. // Using LogLevel::EMERGENCY to minimize output when running tests
  14. $logger = new Logger('Recurly', LogLevel::EMERGENCY);
  15. $this->client = new MockClient($logger);
  16. }
  17. public function tearDown(): void
  18. {
  19. $this->client->clearScenarios();
  20. }
  21. public function testDebugLoggerWarning(): void
  22. {
  23. $msg = "The Recurly logger should not be initialized";
  24. $msg .= "\nbeyond the level INFO. It is currently configured to emit";
  25. $msg .= "\nheaders and request \/ response bodies. This has the potential to leak";
  26. $msg .= "\nPII and other sensitive information and should never be used in production.";
  27. $this->expectOutputRegex('/SECURITY WARNING: ' . $msg . '/');
  28. $logger = new Logger('Recurly', LogLevel::DEBUG);
  29. $client = new MockClient($logger);
  30. }
  31. public function testDefaultLogger(): void
  32. {
  33. $client = new MockClient(NULL);
  34. $reflector = new ReflectionProperty('Recurly\BaseClient', '_logger');
  35. $reflector->setAccessible(true);
  36. $logger = $reflector->getValue($client);
  37. $this->expectOutputRegex("/Recurly.warning: warning-log/");
  38. $logger->warning('warning-log');
  39. }
  40. public function testParameterValidation(): void
  41. {
  42. $this->expectException(\Recurly\RecurlyError::class);
  43. $resource = $this->client->getResource("");
  44. }
  45. public function testGetResource200(): void
  46. {
  47. $url = "https://v3.recurly.com/resources/iexist";
  48. $result = '{"id": "iexist", "object": "test_resource"}';
  49. $this->client->addScenario("GET", $url, NULL, $result, "200 OK");
  50. $resource = $this->client->getResource("iexist");
  51. $this->assertEquals($resource->getId(), "iexist");
  52. }
  53. public function testGetResource404(): void
  54. {
  55. $url = "https://v3.recurly.com/resources/idontexist";
  56. $result = "{\"error\":{\"type\":\"not_found\",\"message\":\"Couldn't find Resource with id = idontexist\",\"params\":[{\"param\":\"resource_id\"}]}}";
  57. $this->client->addScenario("GET", $url, NULL, $result, "404 Not Found");
  58. $this->expectException(\Recurly\Errors\NotFound::class);
  59. $this->client->getResource("idontexist");
  60. }
  61. public function testCreateResource201(): void
  62. {
  63. $url = "https://v3.recurly.com/resources/";
  64. $result = '{"id": "created", "object": "test_resource", "name": "valid"}';
  65. $body = [ "name" => "valid" ];
  66. $this->client->addScenario("POST", $url, json_encode($body), $result, "201 Created");
  67. $resource = $this->client->createResource([ "name" => "valid" ]);
  68. $this->assertEquals($resource->getId(), "created");
  69. }
  70. public function testCreateResource422(): void
  71. {
  72. $url = "https://v3.recurly.com/resources/";
  73. $result = "{\"error\":{\"type\":\"validation\",\"message\":\"Name is invalid\",\"params\":[{\"param\":\"name\",\"message\":\"is invalid\"}]}}";
  74. $body = [ "name" => "invalid" ];
  75. $this->client->addScenario("POST", $url, json_encode($body), $result, "422 Unprocessable Entity");
  76. $this->expectException(\Recurly\Errors\Validation::class);
  77. $resource = $this->client->createResource([ "name" => "invalid" ]);
  78. }
  79. public function testDeleteResource204(): void
  80. {
  81. $url = "https://v3.recurly.com/resources/iexist";
  82. $result = "";
  83. $this->client->addScenario("DELETE", $url, NULL, $result, "204 No Content");
  84. $empty = $this->client->deleteResource("iexist");
  85. $this->assertInstanceOf(\Recurly\EmptyResource::class, $empty);
  86. }
  87. public function testUpdateResource200(): void
  88. {
  89. $url = "https://v3.recurly.com/resources/iexist";
  90. $result = '{"id": "iexist", "object": "test_resource", "name": "newname"}';
  91. $body = [ "name" => "newname" ];
  92. $this->client->addScenario("PUT", $url, json_encode($body), $result, "200 OK");
  93. $resource = $this->client->updateResource("iexist", $body);
  94. $this->assertEquals($resource->getName(), "newname");
  95. }
  96. public function testListResources200(): void
  97. {
  98. $url = "https://v3.recurly.com/resources";
  99. $result = '{ "object": "list", "has_more": false, "next": null, "data": [{"id": "iexist", "object": "test_resource", "name": "newname"}]}';
  100. $this->client->addScenario("GET", $url, NULL, $result, "200 OK");
  101. $resources = $this->client->listResources();
  102. $count = 0;
  103. foreach($resources as $resource) {
  104. $count = $count + 1;
  105. $this->assertEquals($resource->getId(), "iexist");
  106. }
  107. $this->assertEquals($count, 1);
  108. }
  109. public function testListResourcesWithParams200(): void
  110. {
  111. $url = "https://v3.recurly.com/resources?limit=1";
  112. $result = '{ "object": "list", "has_more": false, "next": null, "data": [{"id": "iexist", "object": "test_resource", "name": "newname"}]}';
  113. $this->client->addScenario("GET", $url, NULL, $result, "200 OK");
  114. $resources = $this->client->listResources([ 'params' => [ 'limit' => 1 ] ]);
  115. $count = 0;
  116. foreach($resources as $resource) {
  117. $count = $count + 1;
  118. $this->assertEquals($resource->getId(), "iexist");
  119. }
  120. $this->assertEquals($count, 1);
  121. }
  122. public function testFormatsDateTimeBodyParameters(): void
  123. {
  124. $dateTime = new DateTime("2020-01-01 00:00:00");
  125. $url = "https://v3.recurly.com/resources/";
  126. $result = '{"id": "created", "object": "test_resource", "name": "valid"}';
  127. $body = [ "date_time" => $dateTime->format(\DateTime::ISO8601) ];
  128. $this->client->addScenario("POST", $url, json_encode($body), $result, "201 Created");
  129. $resource = $this->client->createResource([ "date_time" => $dateTime ]);
  130. $this->assertEquals($resource->getId(), "created");
  131. }
  132. public function testFormatsNestedDateTimeBodyParameters(): void
  133. {
  134. $dateTime = new DateTime("2020-01-01 00:00:00");
  135. $url = "https://v3.recurly.com/resources/";
  136. $result = '{"id": "created", "object": "test_resource", "name": "valid"}';
  137. $body = [
  138. "nested" => [
  139. "date_time" => $dateTime->format(\DateTime::ISO8601)
  140. ]
  141. ];
  142. $this->client->addScenario("POST", $url, json_encode($body), $result, "201 Created");
  143. $resource = $this->client->createResource([ "nested" => [ "date_time" => $dateTime ] ]);
  144. $this->assertEquals($resource->getId(), "created");
  145. }
  146. public function testFormatsDateTimeQueryParameters(): void
  147. {
  148. $beginTime = new DateTime("2020-01-01 00:00:00");
  149. $url = "https://v3.recurly.com/resources?begin_time=" . urlencode($beginTime->format(\DateTime::ISO8601));
  150. $result = '{ "object": "list", "has_more": false, "next": null, "data": [{"id": "iexist", "object": "test_resource", "name": "newname"}]}';
  151. $this->client->addScenario("GET", $url, NULL, $result, "200 OK");
  152. $resources = $this->client->listResources([ 'params' => [ 'begin_time' => $beginTime ] ]);
  153. $count = 0;
  154. foreach($resources as $resource) {
  155. $count = $count + 1;
  156. $this->assertEquals($resource->getId(), "iexist");
  157. }
  158. $this->assertEquals($count, 1);
  159. }
  160. public function testValidOptions(): void
  161. {
  162. $url = "https://v3.recurly.com/resources/iexist?param-1=Param+1";
  163. $result = '{"id": "iexist", "object": "test_resource"}';
  164. $headers = [
  165. 'Accept-Language' => 'fr'
  166. ];
  167. $this->client->addScenario("GET", $url, NULL, $result, "200 OK", [], $headers);
  168. $options = [
  169. 'params' => [
  170. 'param-1' => 'Param 1'
  171. ],
  172. 'headers' => $headers
  173. ];
  174. $resource = $this->client->getResource("iexist", $options);
  175. $this->assertEquals($resource->getId(), "iexist");
  176. }
  177. public function testInvalidOptions(): void
  178. {
  179. $url = "https://v3.recurly.com/resources/iexist?param-1=Param+1";
  180. $result = '{"id": "iexist", "object": "test_resource"}';
  181. $this->client->addScenario("GET", $url, NULL, $result, "200 OK");
  182. $options = [
  183. 'param-1' => 'Param 1'
  184. ];
  185. $this->expectException(\Recurly\RecurlyError::class);
  186. $resource = $this->client->getResource("iexist", $options);
  187. }
  188. public function testBooleanParams(): void
  189. {
  190. $url = "https://v3.recurly.com/resources/booleans?param-1=true&param-2=false";
  191. $result = '{"id": "booleans", "object": "test_resource"}';
  192. $headers = [
  193. 'Accept-Language' => 'fr'
  194. ];
  195. $this->client->addScenario("GET", $url, NULL, $result, "200 OK", [], $headers);
  196. $options = [
  197. 'params' => [
  198. 'param-1' => true,
  199. 'param-2' => false,
  200. ],
  201. 'headers' => $headers
  202. ];
  203. $resource = $this->client->getResource("booleans", $options);
  204. $this->assertEquals($resource->getId(), "booleans");
  205. }
  206. }