OAuthTest.php 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323
  1. <?php
  2. namespace Test\Integration;
  3. require_once dirname(__DIR__) . '/Setup.php';
  4. use Test;
  5. use Test\Setup;
  6. use Braintree;
  7. class OAuthTest extends Setup
  8. {
  9. public function testCreateTokenFromCode()
  10. {
  11. $gateway = new Braintree\Gateway([
  12. 'clientId' => 'client_id$development$integration_client_id',
  13. 'clientSecret' => 'client_secret$development$integration_client_secret'
  14. ]);
  15. $code = Test\Braintree\OAuthTestHelper::createGrant($gateway, [
  16. 'merchant_public_id' => 'integration_merchant_id',
  17. 'scope' => 'read_write'
  18. ]);
  19. $result = $gateway->oauth()->createTokenFromCode([
  20. 'code' => $code,
  21. 'scope' => 'read_write',
  22. ]);
  23. $this->assertEquals(true, $result->success);
  24. $credentials = $result->credentials;
  25. $this->assertNotNull($credentials->accessToken);
  26. $this->assertNotNull($credentials->refreshToken);
  27. $this->assertEquals('bearer', $credentials->tokenType);
  28. $this->assertNotNull($credentials->expiresAt);
  29. }
  30. /**
  31. * @expectedException Braintree\Exception\Configuration
  32. * @expectedExceptionMessage clientSecret needs to be passed to Braintree\Gateway.
  33. */
  34. public function testAssertsHasCredentials()
  35. {
  36. $gateway = new Braintree\Gateway([
  37. 'clientId' => 'client_id$development$integration_client_id'
  38. ]);
  39. $gateway->oauth()->createTokenFromCode([
  40. 'code' => 'integration_oauth_auth_code_' . rand(0,299)
  41. ]);
  42. }
  43. public function testCreateTokenFromCodeWithMixedCredentials()
  44. {
  45. $gateway = new Braintree\Gateway([
  46. 'clientId' => 'client_id$development$integration_client_id',
  47. 'clientSecret' => 'client_secret$development$integration_client_secret',
  48. 'accessToken' => 'access_token$development$integration_merchant_id$f9ac33b3dd',
  49. ]);
  50. $code = Test\Braintree\OAuthTestHelper::createGrant($gateway, [
  51. 'merchant_public_id' => 'integration_merchant_id',
  52. 'scope' => 'read_write'
  53. ]);
  54. $result = $gateway->oauth()->createTokenFromCode([
  55. 'code' => $code,
  56. 'scope' => 'read_write',
  57. ]);
  58. $this->assertEquals(true, $result->success);
  59. $credentials = $result->credentials;
  60. $this->assertNotNull($credentials->accessToken);
  61. $this->assertNotNull($credentials->refreshToken);
  62. $this->assertEquals('bearer', $credentials->tokenType);
  63. $this->assertNotNull($credentials->expiresAt);
  64. }
  65. public function testCreateTokenFromCode_JsonAPI()
  66. {
  67. $gateway = new Braintree\Gateway([
  68. 'clientId' => 'client_id$development$integration_client_id',
  69. 'clientSecret' => 'client_secret$development$integration_client_secret'
  70. ]);
  71. $code = Test\Braintree\OAuthTestHelper::createGrant($gateway, [
  72. 'merchant_public_id' => 'integration_merchant_id',
  73. 'scope' => 'read_write'
  74. ]);
  75. $result = $gateway->oauth()->createTokenFromCode([
  76. 'code' => $code,
  77. 'scope' => 'read_write',
  78. ]);
  79. $this->assertEquals(true, $result->success);
  80. $this->assertNotNull($result->accessToken);
  81. $this->assertNotNull($result->refreshToken);
  82. $this->assertEquals('bearer', $result->tokenType);
  83. $this->assertNotNull($result->expiresAt);
  84. }
  85. public function testRevokeAccessToken()
  86. {
  87. $gateway = new Braintree\Gateway([
  88. 'clientId' => 'client_id$development$integration_client_id',
  89. 'clientSecret' => 'client_secret$development$integration_client_secret',
  90. ]);
  91. $code = Test\Braintree\OAuthTestHelper::createGrant($gateway, [
  92. 'merchant_public_id' => 'integration_merchant_id',
  93. 'scope' => 'read_write'
  94. ]);
  95. $result = $gateway->oauth()->createTokenFromCode([
  96. 'code' => $code,
  97. 'scope' => 'read_write',
  98. ]);
  99. $revokeAccessTokenResult = $gateway->oauth()->revokeAccessToken($result->accessToken);
  100. $this->assertTrue($revokeAccessTokenResult->success);
  101. $this->assertTrue($revokeAccessTokenResult->result->success);
  102. $gateway = new Braintree\Gateway(['accessToken' => $result->accessToken]);
  103. $this->setExpectedException('Braintree\Exception\Authentication');
  104. $gateway->customer()->create();
  105. }
  106. public function testCreateTokenFromCode_ValidationErrorTest()
  107. {
  108. $gateway = new Braintree\Gateway([
  109. 'clientId' => 'client_id$development$integration_client_id',
  110. 'clientSecret' => 'client_secret$development$integration_client_secret'
  111. ]);
  112. $result = $gateway->oauth()->createTokenFromCode([
  113. 'code' => 'bad_code',
  114. 'scope' => 'read_write',
  115. ]);
  116. $this->assertEquals(false, $result->success);
  117. $errors = $result->errors->forKey('credentials')->onAttribute('code');
  118. $this->assertEquals(Braintree\Error\Codes::OAUTH_INVALID_GRANT, $errors[0]->code);
  119. $this->assertEquals(1, preg_match('/Invalid grant: code not found/', $result->message));
  120. }
  121. public function testCreateTokenFromCode_OldError()
  122. {
  123. $gateway = new Braintree\Gateway([
  124. 'clientId' => 'client_id$development$integration_client_id',
  125. 'clientSecret' => 'client_secret$development$integration_client_secret'
  126. ]);
  127. $result = $gateway->oauth()->createTokenFromCode([
  128. 'code' => 'bad_code',
  129. 'scope' => 'read_write',
  130. ]);
  131. $this->assertEquals(false, $result->success);
  132. $this->assertEquals('invalid_grant', $result->error);
  133. $this->assertEquals('code not found', $result->errorDescription);
  134. }
  135. public function testCreateTokenFromRefreshToken()
  136. {
  137. $gateway = new Braintree\Gateway([
  138. 'clientId' => 'client_id$development$integration_client_id',
  139. 'clientSecret' => 'client_secret$development$integration_client_secret'
  140. ]);
  141. $code = Test\Braintree\OAuthTestHelper::createGrant($gateway, [
  142. 'merchant_public_id' => 'integration_merchant_id',
  143. 'scope' => 'read_write'
  144. ]);
  145. $refreshToken = $gateway->oauth()->createTokenFromCode([
  146. 'code' => $code,
  147. 'scope' => 'read_write',
  148. ])->credentials->refreshToken;
  149. $result = $gateway->oauth()->createTokenFromRefreshToken([
  150. 'refreshToken' => $refreshToken,
  151. 'scope' => 'read_write',
  152. ]);
  153. $this->assertEquals(true, $result->success);
  154. $credentials = $result->credentials;
  155. $this->assertNotNull($credentials->accessToken);
  156. $this->assertNotNull($credentials->refreshToken);
  157. $this->assertEquals('bearer', $credentials->tokenType);
  158. $this->assertNotNull($credentials->expiresAt);
  159. }
  160. public function testBuildConnectUrl()
  161. {
  162. $gateway = new Braintree\Gateway([
  163. 'clientId' => 'client_id$development$integration_client_id',
  164. 'clientSecret' => 'client_secret$development$integration_client_secret'
  165. ]);
  166. $url = $gateway->oauth()->connectUrl([
  167. 'merchantId' => 'integration_merchant_id',
  168. 'redirectUri' => 'http://bar.example.com',
  169. 'scope' => 'read_write',
  170. 'state' => 'baz_state',
  171. 'landingPage' => 'login',
  172. 'loginOnly' => 'true',
  173. 'user' => [
  174. 'country' => 'USA',
  175. 'email' => 'foo@example.com',
  176. 'firstName' => 'Bob',
  177. 'lastName' => 'Jones',
  178. 'phone' => '555-555-5555',
  179. 'dobYear' => '1970',
  180. 'dobMonth' => '01',
  181. 'dobDay' => '01',
  182. 'streetAddress' => '222 W Merchandise Mart',
  183. 'locality' => 'Chicago',
  184. 'region' => 'IL',
  185. 'postalCode' => '60606',
  186. ],
  187. 'business' => [
  188. 'name' => '14 Ladders',
  189. 'registeredAs' => '14.0 Ladders',
  190. 'industry' => 'Ladders',
  191. 'description' => 'We sell the best ladders',
  192. 'streetAddress' => '111 N Canal',
  193. 'locality' => 'Chicago',
  194. 'region' => 'IL',
  195. 'postalCode' => '60606',
  196. 'country' => 'USA',
  197. 'annualVolumeAmount' => '1000000',
  198. 'averageTransactionAmount' => '100',
  199. 'maximumTransactionAmount' => '10000',
  200. 'shipPhysicalGoods' => true,
  201. 'fulfillmentCompletedIn' => 7,
  202. 'currency' => 'USD',
  203. 'website' => 'http://example.com',
  204. ],
  205. 'paymentMethods' => ['credit_card'],
  206. ]);
  207. $components = parse_url($url);
  208. $queryString = $components['query'];
  209. parse_str($queryString, $query);
  210. $this->assertEquals('localhost', $components['host']);
  211. $this->assertEquals('/oauth/connect', $components['path']);
  212. $this->assertEquals('integration_merchant_id', $query['merchant_id']);
  213. $this->assertEquals('client_id$development$integration_client_id', $query['client_id']);
  214. $this->assertEquals('http://bar.example.com', $query['redirect_uri']);
  215. $this->assertEquals('read_write', $query['scope']);
  216. $this->assertEquals('baz_state', $query['state']);
  217. $this->assertEquals('login', $query['landing_page']);
  218. $this->assertEquals('true', $query['login_only']);
  219. $this->assertEquals('USA', $query['user']['country']);
  220. $this->assertEquals('foo@example.com', $query['user']['email']);
  221. $this->assertEquals('Bob', $query['user']['first_name']);
  222. $this->assertEquals('Jones', $query['user']['last_name']);
  223. $this->assertEquals('555-555-5555', $query['user']['phone']);
  224. $this->assertEquals('1970', $query['user']['dob_year']);
  225. $this->assertEquals('01', $query['user']['dob_month']);
  226. $this->assertEquals('01', $query['user']['dob_day']);
  227. $this->assertEquals('222 W Merchandise Mart', $query['user']['street_address']);
  228. $this->assertEquals('Chicago', $query['user']['locality']);
  229. $this->assertEquals('IL', $query['user']['region']);
  230. $this->assertEquals('60606', $query['user']['postal_code']);
  231. $this->assertEquals('14 Ladders', $query['business']['name']);
  232. $this->assertEquals('14.0 Ladders', $query['business']['registered_as']);
  233. $this->assertEquals('Ladders', $query['business']['industry']);
  234. $this->assertEquals('We sell the best ladders', $query['business']['description']);
  235. $this->assertEquals('111 N Canal', $query['business']['street_address']);
  236. $this->assertEquals('Chicago', $query['business']['locality']);
  237. $this->assertEquals('IL', $query['business']['region']);
  238. $this->assertEquals('60606', $query['business']['postal_code']);
  239. $this->assertEquals('USA', $query['business']['country']);
  240. $this->assertEquals('1000000', $query['business']['annual_volume_amount']);
  241. $this->assertEquals('100', $query['business']['average_transaction_amount']);
  242. $this->assertEquals('10000', $query['business']['maximum_transaction_amount']);
  243. $this->assertEquals(true, $query['business']['ship_physical_goods']);
  244. $this->assertEquals(7, $query['business']['fulfillment_completed_in']);
  245. $this->assertEquals('USD', $query['business']['currency']);
  246. $this->assertEquals('http://example.com', $query['business']['website']);
  247. $this->assertCount(1, $query['payment_methods']);
  248. $this->assertEquals('credit_card', $query['payment_methods'][0]);
  249. }
  250. public function testBuildConnectUrlWithoutOptionalParams()
  251. {
  252. $gateway = new Braintree\Gateway([
  253. 'clientId' => 'client_id$development$integration_client_id',
  254. 'clientSecret' => 'client_secret$development$integration_client_secret'
  255. ]);
  256. $url = $gateway->oauth()->connectUrl();
  257. $queryString = parse_url($url)['query'];
  258. parse_str($queryString, $query);
  259. $this->assertEquals('client_id$development$integration_client_id', $query['client_id']);
  260. $this->assertArrayNotHasKey('merchant_id', $query);
  261. $this->assertArrayNotHasKey('redirect_uri', $query);
  262. $this->assertArrayNotHasKey('scope', $query);
  263. }
  264. public function testBuildConnectUrlWithPaymentMethods()
  265. {
  266. $gateway = new Braintree\Gateway([
  267. 'clientId' => 'client_id$development$integration_client_id',
  268. 'clientSecret' => 'client_secret$development$integration_client_secret'
  269. ]);
  270. $url = $gateway->oauth()->connectUrl([
  271. 'paymentMethods' => ['credit_card', 'paypal']
  272. ]);
  273. $queryString = parse_url($url)['query'];
  274. parse_str($queryString, $query);
  275. $this->assertEquals(['credit_card', 'paypal'], $query['payment_methods']);
  276. }
  277. public function testComputeSignature()
  278. {
  279. $gateway = new Braintree\Gateway([
  280. 'clientId' => 'client_id$development$integration_client_id',
  281. 'clientSecret' => 'client_secret$development$integration_client_secret'
  282. ]);
  283. $urlToSign = 'http://localhost:3000/oauth/connect?business%5Bname%5D=We+Like+Spaces&client_id=client_id%24development%24integration_client_id';
  284. $signature = $gateway->oauth()->computeSignature($urlToSign);
  285. $this->assertEquals("a36bcf10dd982e2e47e0d6a2cb930aea47ade73f954b7d59c58dae6167894d41", $signature);
  286. }
  287. }