braintree 2.10.0 → 4.26.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (353) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +1 -1
  3. data/braintree.gemspec +24 -0
  4. data/lib/braintree/account_updater_daily_report.rb +20 -0
  5. data/lib/braintree/ach_mandate.rb +14 -0
  6. data/lib/braintree/add_on.rb +4 -0
  7. data/lib/braintree/add_on_gateway.rb +17 -0
  8. data/lib/braintree/address/country_names.rb +4 -1
  9. data/lib/braintree/address.rb +35 -43
  10. data/lib/braintree/address_gateway.rb +24 -11
  11. data/lib/braintree/advanced_search.rb +26 -11
  12. data/lib/braintree/apple_pay.rb +29 -0
  13. data/lib/braintree/apple_pay_card.rb +66 -0
  14. data/lib/braintree/apple_pay_gateway.rb +37 -0
  15. data/lib/braintree/apple_pay_options.rb +19 -0
  16. data/lib/braintree/authorization_adjustment.rb +23 -0
  17. data/lib/braintree/base_module.rb +11 -1
  18. data/lib/braintree/bin_data.rb +34 -0
  19. data/lib/braintree/client_token.rb +11 -0
  20. data/lib/braintree/client_token_gateway.rb +45 -0
  21. data/lib/braintree/configuration.rb +231 -39
  22. data/lib/braintree/connected_merchant_paypal_status_changed.rb +22 -0
  23. data/lib/braintree/connected_merchant_status_transitioned.rb +22 -0
  24. data/lib/braintree/credentials_parser.rb +44 -0
  25. data/lib/braintree/credit_card.rb +107 -132
  26. data/lib/braintree/credit_card_gateway.rb +90 -41
  27. data/lib/braintree/credit_card_verification.rb +90 -17
  28. data/lib/braintree/credit_card_verification_gateway.rb +87 -0
  29. data/lib/braintree/credit_card_verification_search.rb +20 -0
  30. data/lib/braintree/customer.rb +80 -118
  31. data/lib/braintree/customer_gateway.rb +66 -39
  32. data/lib/braintree/customer_search.rb +5 -2
  33. data/lib/braintree/customer_session_gateway.rb +194 -0
  34. data/lib/braintree/descriptor.rb +4 -2
  35. data/lib/braintree/digest.rb +16 -3
  36. data/lib/braintree/disbursement.rb +63 -0
  37. data/lib/braintree/discount.rb +4 -0
  38. data/lib/braintree/discount_gateway.rb +17 -0
  39. data/lib/braintree/dispute/evidence.rb +24 -0
  40. data/lib/braintree/dispute/paypal_message.rb +15 -0
  41. data/lib/braintree/dispute/status_history.rb +18 -0
  42. data/lib/braintree/dispute/transaction.rb +20 -0
  43. data/lib/braintree/dispute/transaction_details.rb +15 -0
  44. data/lib/braintree/dispute.rb +165 -0
  45. data/lib/braintree/dispute_gateway.rb +142 -0
  46. data/lib/braintree/dispute_search.rb +31 -0
  47. data/lib/braintree/document_upload.rb +37 -0
  48. data/lib/braintree/document_upload_gateway.rb +38 -0
  49. data/lib/braintree/enriched_customer_data.rb +21 -0
  50. data/lib/braintree/error_codes.rb +680 -15
  51. data/lib/braintree/error_result.rb +13 -6
  52. data/lib/braintree/errors.rb +5 -5
  53. data/lib/braintree/exceptions.rb +14 -20
  54. data/lib/braintree/exchange_rate.rb +13 -0
  55. data/lib/braintree/exchange_rate_quote.rb +24 -0
  56. data/lib/braintree/exchange_rate_quote_gateway.rb +35 -0
  57. data/lib/braintree/exchange_rate_quote_input.rb +21 -0
  58. data/lib/braintree/exchange_rate_quote_request.rb +18 -0
  59. data/lib/braintree/exchange_rate_quote_response.rb +18 -0
  60. data/lib/braintree/facilitated_details.rb +21 -0
  61. data/lib/braintree/facilitator_details.rb +20 -0
  62. data/lib/braintree/gateway.rb +104 -6
  63. data/lib/braintree/google_pay_card.rb +62 -0
  64. data/lib/braintree/granted_payment_instrument_update.rb +23 -0
  65. data/lib/braintree/graphql/enums/recommendations.rb +7 -0
  66. data/lib/braintree/graphql/enums/recommended_payment_option.rb +8 -0
  67. data/lib/braintree/graphql/inputs/create_customer_session_input.rb +35 -0
  68. data/lib/braintree/graphql/inputs/customer_recommendations_input.rb +41 -0
  69. data/lib/braintree/graphql/inputs/customer_session_input.rb +39 -0
  70. data/lib/braintree/graphql/inputs/phone_input.rb +32 -0
  71. data/lib/braintree/graphql/inputs/update_customer_session_input.rb +37 -0
  72. data/lib/braintree/graphql/types/customer_recommendations_payload.rb +32 -0
  73. data/lib/braintree/graphql/types/payment_options.rb +33 -0
  74. data/lib/braintree/graphql/unions/customer_recommendations.rb +34 -0
  75. data/lib/braintree/graphql_client.rb +50 -0
  76. data/lib/braintree/http.rb +119 -25
  77. data/lib/braintree/local_payment_completed/blik_alias.rb +23 -0
  78. data/lib/braintree/local_payment_completed.rb +28 -0
  79. data/lib/braintree/local_payment_expired.rb +21 -0
  80. data/lib/braintree/local_payment_funded.rb +22 -0
  81. data/lib/braintree/local_payment_reversed.rb +19 -0
  82. data/lib/braintree/merchant.rb +34 -0
  83. data/lib/braintree/merchant_account/address_details.rb +16 -0
  84. data/lib/braintree/merchant_account/business_details.rb +17 -0
  85. data/lib/braintree/merchant_account/funding_details.rb +18 -0
  86. data/lib/braintree/merchant_account/individual_details.rb +20 -0
  87. data/lib/braintree/merchant_account.rb +76 -0
  88. data/lib/braintree/merchant_account_gateway.rb +130 -0
  89. data/lib/braintree/merchant_gateway.rb +38 -0
  90. data/lib/braintree/meta_checkout_card.rb +90 -0
  91. data/lib/braintree/meta_checkout_token.rb +89 -0
  92. data/lib/braintree/modification.rb +16 -5
  93. data/lib/braintree/oauth_credentials.rb +22 -0
  94. data/lib/braintree/oauth_gateway.rb +73 -0
  95. data/lib/braintree/paginated_collection.rb +25 -0
  96. data/lib/braintree/paginated_result.rb +15 -0
  97. data/lib/braintree/payment_instrument_type.rb +18 -0
  98. data/lib/braintree/payment_method.rb +37 -0
  99. data/lib/braintree/payment_method_customer_data_updated_metadata.rb +24 -0
  100. data/lib/braintree/payment_method_gateway.rb +221 -0
  101. data/lib/braintree/payment_method_nonce.rb +49 -0
  102. data/lib/braintree/payment_method_nonce_details.rb +40 -0
  103. data/lib/braintree/payment_method_nonce_details_payer_info.rb +32 -0
  104. data/lib/braintree/payment_method_nonce_gateway.rb +38 -0
  105. data/lib/braintree/payment_method_parser.rb +29 -0
  106. data/lib/braintree/paypal_account.rb +60 -0
  107. data/lib/braintree/paypal_account_gateway.rb +73 -0
  108. data/lib/braintree/paypal_payment_resource.rb +22 -0
  109. data/lib/braintree/paypal_payment_resource_gateway.rb +36 -0
  110. data/lib/braintree/plan.rb +62 -0
  111. data/lib/braintree/plan_gateway.rb +117 -0
  112. data/lib/braintree/processor_response_types.rb +7 -0
  113. data/lib/braintree/resource_collection.rb +12 -5
  114. data/lib/braintree/revoked_payment_method_metadata.rb +22 -0
  115. data/lib/braintree/risk_data/liability_shift.rb +22 -0
  116. data/lib/braintree/risk_data.rb +29 -0
  117. data/lib/braintree/samsung_pay_card.rb +85 -0
  118. data/lib/braintree/sepa_direct_debit_account.rb +60 -0
  119. data/lib/braintree/sepa_direct_debit_account_gateway.rb +25 -0
  120. data/lib/braintree/sepa_direct_debit_account_nonce_details.rb +28 -0
  121. data/lib/braintree/settlement_batch_summary.rb +25 -0
  122. data/lib/braintree/settlement_batch_summary_gateway.rb +27 -0
  123. data/lib/braintree/sha256_digest.rb +13 -0
  124. data/lib/braintree/signature_service.rb +19 -0
  125. data/lib/braintree/subscription/status_details.rb +20 -0
  126. data/lib/braintree/subscription.rb +67 -47
  127. data/lib/braintree/subscription_gateway.rb +43 -16
  128. data/lib/braintree/subscription_search.rb +2 -2
  129. data/lib/braintree/successful_result.rb +30 -10
  130. data/lib/braintree/test/authentication_id.rb +21 -0
  131. data/lib/braintree/test/credit_card.rb +76 -0
  132. data/lib/braintree/test/merchant_account.rb +12 -0
  133. data/lib/braintree/test/nonce.rb +81 -0
  134. data/lib/braintree/test/transaction_amounts.rb +3 -5
  135. data/lib/braintree/test/venmo_sdk.rb +21 -0
  136. data/lib/braintree/test_transaction.rb +19 -0
  137. data/lib/braintree/testing_gateway.rb +43 -0
  138. data/lib/braintree/three_d_secure_info.rb +53 -0
  139. data/lib/braintree/transaction/address_details.rb +27 -5
  140. data/lib/braintree/transaction/apple_pay_details.rb +35 -0
  141. data/lib/braintree/transaction/credit_card_details.rb +55 -4
  142. data/lib/braintree/transaction/customer_details.rb +11 -3
  143. data/lib/braintree/transaction/disbursement_details.rb +28 -0
  144. data/lib/braintree/transaction/google_pay_details.rb +42 -0
  145. data/lib/braintree/transaction/installment/adjustment.rb +33 -0
  146. data/lib/braintree/transaction/installment.rb +28 -0
  147. data/lib/braintree/transaction/local_payment_details.rb +27 -0
  148. data/lib/braintree/transaction/meta_checkout_card_details.rb +55 -0
  149. data/lib/braintree/transaction/meta_checkout_token_details.rb +58 -0
  150. data/lib/braintree/transaction/package_details.rb +19 -0
  151. data/lib/braintree/transaction/payment_receipt/card_present_data.rb +36 -0
  152. data/lib/braintree/transaction/payment_receipt/merchant_address.rb +19 -0
  153. data/lib/braintree/transaction/payment_receipt.rb +31 -0
  154. data/lib/braintree/transaction/paypal_details.rb +40 -0
  155. data/lib/braintree/transaction/paypal_here_details.rb +23 -0
  156. data/lib/braintree/transaction/samsung_pay_card_details.rb +50 -0
  157. data/lib/braintree/transaction/sepa_direct_debit_account_details.rb +27 -0
  158. data/lib/braintree/transaction/status_details.rb +6 -2
  159. data/lib/braintree/transaction/subscription_details.rb +5 -2
  160. data/lib/braintree/transaction/us_bank_account_details.rb +22 -0
  161. data/lib/braintree/transaction/venmo_account_details.rb +17 -0
  162. data/lib/braintree/transaction/visa_checkout_card_details.rb +51 -0
  163. data/lib/braintree/transaction.rb +293 -150
  164. data/lib/braintree/transaction_gateway.rb +303 -59
  165. data/lib/braintree/transaction_line_item.rb +43 -0
  166. data/lib/braintree/transaction_line_item_gateway.rb +19 -0
  167. data/lib/braintree/transaction_review.rb +18 -0
  168. data/lib/braintree/transaction_search.rb +17 -9
  169. data/lib/braintree/unknown_payment_method.rb +26 -0
  170. data/lib/braintree/us_bank_account.rb +57 -0
  171. data/lib/braintree/us_bank_account_gateway.rb +17 -0
  172. data/lib/braintree/us_bank_account_verification.rb +89 -0
  173. data/lib/braintree/us_bank_account_verification_gateway.rb +51 -0
  174. data/lib/braintree/us_bank_account_verification_search.rb +19 -0
  175. data/lib/braintree/util.rb +91 -11
  176. data/lib/braintree/validation_error.rb +14 -5
  177. data/lib/braintree/validation_error_collection.rb +5 -5
  178. data/lib/braintree/venmo_account.rb +34 -0
  179. data/lib/braintree/venmo_profile_data.rb +25 -0
  180. data/lib/braintree/version.rb +2 -2
  181. data/lib/braintree/visa_checkout_card.rb +90 -0
  182. data/lib/braintree/webhook_notification.rb +146 -0
  183. data/lib/braintree/webhook_notification_gateway.rb +46 -0
  184. data/lib/braintree/webhook_testing.rb +7 -0
  185. data/lib/braintree/webhook_testing_gateway.rb +1239 -0
  186. data/lib/braintree/xml/generator.rb +18 -10
  187. data/lib/braintree/xml/libxml.rb +1 -1
  188. data/lib/braintree/xml/parser.rb +24 -36
  189. data/lib/braintree/xml/rexml.rb +6 -7
  190. data/lib/braintree/xml.rb +1 -2
  191. data/lib/braintree.rb +186 -52
  192. data/lib/ssl/api_braintreegateway_com.ca.crt +474 -0
  193. data/spec/fixtures/files/bt_logo.png +0 -0
  194. data/spec/fixtures/files/gif_extension_bt_logo.gif +0 -0
  195. data/spec/fixtures/files/malformed_pdf.pdf +1 -0
  196. data/spec/fixtures/files/too_long.pdf +0 -0
  197. data/spec/integration/braintree/add_on_spec.rb +46 -0
  198. data/spec/integration/braintree/address_spec.rb +101 -178
  199. data/spec/integration/braintree/advanced_search_spec.rb +100 -97
  200. data/spec/integration/braintree/apple_pay_spec.rb +63 -0
  201. data/spec/integration/braintree/braintree_gateway_spec.rb +72 -0
  202. data/spec/integration/braintree/client_api/client_token_spec.rb +407 -0
  203. data/spec/integration/braintree/client_api/spec_helper.rb +300 -0
  204. data/spec/integration/braintree/credit_card_spec.rb +885 -654
  205. data/spec/integration/braintree/credit_card_verification_search_spec.rb +193 -0
  206. data/spec/integration/braintree/credit_card_verification_spec.rb +473 -0
  207. data/spec/integration/braintree/customer_search_spec.rb +69 -21
  208. data/spec/integration/braintree/customer_session_spec.rb +143 -0
  209. data/spec/integration/braintree/customer_spec.rb +1437 -518
  210. data/spec/integration/braintree/disbursement_spec.rb +31 -0
  211. data/spec/integration/braintree/discount_spec.rb +34 -0
  212. data/spec/integration/braintree/dispute_search_spec.rb +165 -0
  213. data/spec/integration/braintree/dispute_spec.rb +333 -0
  214. data/spec/integration/braintree/document_upload_spec.rb +87 -0
  215. data/spec/integration/braintree/error_codes_spec.rb +3 -3
  216. data/spec/integration/braintree/exchange_rate_quote_spec.rb +97 -0
  217. data/spec/integration/braintree/graphql_client_spec.rb +72 -0
  218. data/spec/integration/braintree/http_spec.rb +106 -56
  219. data/spec/integration/braintree/merchant_account_spec.rb +603 -0
  220. data/spec/integration/braintree/merchant_spec.rb +227 -0
  221. data/spec/integration/braintree/oauth_spec.rb +225 -0
  222. data/spec/integration/braintree/package_tracking_spec.rb +130 -0
  223. data/spec/integration/braintree/payment_method_nonce_spec.rb +345 -0
  224. data/spec/integration/braintree/payment_method_spec.rb +2146 -0
  225. data/spec/integration/braintree/payment_method_us_bank_account_spec.rb +325 -0
  226. data/spec/integration/braintree/paypal_account_spec.rb +299 -0
  227. data/spec/integration/braintree/paypal_payment_resource_spec.rb +141 -0
  228. data/spec/integration/braintree/plan_spec.rb +136 -0
  229. data/spec/integration/braintree/samsung_pay_card_spec.rb +146 -0
  230. data/spec/integration/braintree/sepa_direct_debit_account_spec.rb +194 -0
  231. data/spec/integration/braintree/settlement_batch_summary_spec.rb +62 -0
  232. data/spec/integration/braintree/subscription_spec.rb +785 -431
  233. data/spec/integration/braintree/test/transaction_amounts_spec.rb +4 -4
  234. data/spec/integration/braintree/test_transaction_spec.rb +145 -0
  235. data/spec/integration/braintree/transaction_line_item_spec.rb +44 -0
  236. data/spec/integration/braintree/transaction_search_spec.rb +745 -156
  237. data/spec/integration/braintree/transaction_spec.rb +7452 -1288
  238. data/spec/integration/braintree/transaction_us_bank_account_spec.rb +196 -0
  239. data/spec/integration/braintree/us_bank_account_spec.rb +113 -0
  240. data/spec/integration/braintree/us_bank_account_verification_search_spec.rb +178 -0
  241. data/spec/integration/braintree/us_bank_account_verification_spec.rb +240 -0
  242. data/spec/integration/braintree/visa_checkout_card_spec.rb +110 -0
  243. data/spec/integration/spec_helper.rb +61 -5
  244. data/spec/oauth_test_helper.rb +17 -0
  245. data/spec/script/httpsd.rb +6 -6
  246. data/spec/spec.opts +4 -0
  247. data/spec/spec_helper.rb +77 -21
  248. data/spec/ssl/certificate.crt +17 -0
  249. data/spec/ssl/geotrust_global.crt +20 -0
  250. data/spec/ssl/privateKey.key +15 -0
  251. data/spec/unit/braintree/address_spec.rb +27 -16
  252. data/spec/unit/braintree/apple_pay_card_spec.rb +133 -0
  253. data/spec/unit/braintree/base_module_spec.rb +4 -4
  254. data/spec/unit/braintree/client_token_spec.rb +37 -0
  255. data/spec/unit/braintree/configuration_spec.rb +293 -43
  256. data/spec/unit/braintree/credentials_parser_spec.rb +81 -0
  257. data/spec/unit/braintree/credit_card_spec.rb +138 -47
  258. data/spec/unit/braintree/credit_card_verification_gateway_spec.rb +56 -0
  259. data/spec/unit/braintree/credit_card_verification_search_spec.rb +79 -0
  260. data/spec/unit/braintree/credit_card_verification_spec.rb +132 -6
  261. data/spec/unit/braintree/customer_session_gateway_spec.rb +120 -0
  262. data/spec/unit/braintree/customer_spec.rb +196 -40
  263. data/spec/unit/braintree/digest_spec.rb +16 -3
  264. data/spec/unit/braintree/disbursement_spec.rb +131 -0
  265. data/spec/unit/braintree/dispute_search_spec.rb +66 -0
  266. data/spec/unit/braintree/dispute_spec.rb +479 -0
  267. data/spec/unit/braintree/document_upload_spec.rb +35 -0
  268. data/spec/unit/braintree/enriched_customer_data_spec.rb +41 -0
  269. data/spec/unit/braintree/error_result_spec.rb +11 -11
  270. data/spec/unit/braintree/errors_spec.rb +17 -17
  271. data/spec/unit/braintree/exchange_rate_quote_input_spec.rb +42 -0
  272. data/spec/unit/braintree/exchange_rate_quote_request_spec.rb +82 -0
  273. data/spec/unit/braintree/exchange_rate_quote_response_spec.rb +52 -0
  274. data/spec/unit/braintree/exchange_rate_quote_spec.rb +42 -0
  275. data/spec/unit/braintree/exchange_rate_spec.rb +23 -0
  276. data/spec/unit/braintree/google_pay_card_spec.rb +8 -0
  277. data/spec/unit/braintree/graphql/create_customer_session_input_spec.rb +81 -0
  278. data/spec/unit/braintree/graphql/customer_recommendations_input_spec.rb +110 -0
  279. data/spec/unit/braintree/graphql/customer_session_input_spec.rb +81 -0
  280. data/spec/unit/braintree/graphql/phone_input_spec.rb +51 -0
  281. data/spec/unit/braintree/graphql/update_customer_session_input_spec.rb +93 -0
  282. data/spec/unit/braintree/graphql_client_spec.rb +37 -0
  283. data/spec/unit/braintree/http_spec.rb +164 -2
  284. data/spec/unit/braintree/local_payment_completed_spec.rb +90 -0
  285. data/spec/unit/braintree/local_payment_expired_spec.rb +24 -0
  286. data/spec/unit/braintree/local_payment_funded_spec.rb +34 -0
  287. data/spec/unit/braintree/merchant_account_spec.rb +33 -0
  288. data/spec/unit/braintree/meta_checkout_card_details_spec.rb +60 -0
  289. data/spec/unit/braintree/meta_checkout_card_spec.rb +62 -0
  290. data/spec/unit/braintree/meta_checkout_token_details_spec.rb +63 -0
  291. data/spec/unit/braintree/meta_checkout_token_spec.rb +65 -0
  292. data/spec/unit/braintree/modification_spec.rb +7 -0
  293. data/spec/unit/braintree/package_tracking_spec.rb +77 -0
  294. data/spec/unit/braintree/payment_method_customer_data_updated_metadata_spec.rb +45 -0
  295. data/spec/unit/braintree/payment_method_nonce_details_payer_info_spec.rb +31 -0
  296. data/spec/unit/braintree/payment_method_nonce_details_spec.rb +51 -0
  297. data/spec/unit/braintree/payment_method_nonce_spec.rb +43 -0
  298. data/spec/unit/braintree/payment_method_spec.rb +135 -0
  299. data/spec/unit/braintree/paypal_account_spec.rb +53 -0
  300. data/spec/unit/braintree/paypal_payment_resource_spec.rb +125 -0
  301. data/spec/unit/braintree/resource_collection_spec.rb +44 -3
  302. data/spec/unit/braintree/risk_data/liability_shift.rb +26 -0
  303. data/spec/unit/braintree/risk_data_spec.rb +55 -0
  304. data/spec/unit/braintree/sepa_debit_account_nonce_details_spec.rb +29 -0
  305. data/spec/unit/braintree/sepa_debit_account_spec.rb +86 -0
  306. data/spec/unit/braintree/sha256_digest_spec.rb +11 -0
  307. data/spec/unit/braintree/signature_service_spec.rb +23 -0
  308. data/spec/unit/braintree/subscription_search_spec.rb +25 -18
  309. data/spec/unit/braintree/subscription_spec.rb +34 -7
  310. data/spec/unit/braintree/successful_result_spec.rb +9 -9
  311. data/spec/unit/braintree/three_d_secure_info_spec.rb +69 -0
  312. data/spec/unit/braintree/transaction/apple_pay_details_spec.rb +8 -0
  313. data/spec/unit/braintree/transaction/credit_card_details_spec.rb +34 -6
  314. data/spec/unit/braintree/transaction/customer_details_spec.rb +3 -2
  315. data/spec/unit/braintree/transaction/deposit_details_spec.rb +18 -0
  316. data/spec/unit/braintree/transaction/google_pay_details_spec.rb +8 -0
  317. data/spec/unit/braintree/transaction/installment_spec.rb +25 -0
  318. data/spec/unit/braintree/transaction/local_payment_details_spec.rb +36 -0
  319. data/spec/unit/braintree/transaction/meta_checkout_card_details_spec.rb +8 -0
  320. data/spec/unit/braintree/transaction/meta_checkout_token_details_spec.rb +8 -0
  321. data/spec/unit/braintree/transaction/payment_receipt_spec.rb +73 -0
  322. data/spec/unit/braintree/transaction/paypal_details_spec.rb +68 -0
  323. data/spec/unit/braintree/transaction/sepa_direct_debit_account_details_spec.rb +33 -0
  324. data/spec/unit/braintree/transaction/visa_checkout_card_details_spec.rb +8 -0
  325. data/spec/unit/braintree/transaction_gateway_spec.rb +150 -0
  326. data/spec/unit/braintree/transaction_search_spec.rb +12 -12
  327. data/spec/unit/braintree/transaction_spec.rb +366 -52
  328. data/spec/unit/braintree/unknown_payment_method_spec.rb +33 -0
  329. data/spec/unit/braintree/us_bank_account_spec.rb +13 -0
  330. data/spec/unit/braintree/us_bank_account_verification_search_spec.rb +60 -0
  331. data/spec/unit/braintree/us_bank_account_verification_spec.rb +98 -0
  332. data/spec/unit/braintree/util_spec.rb +199 -39
  333. data/spec/unit/braintree/validation_error_collection_spec.rb +336 -133
  334. data/spec/unit/braintree/validation_error_spec.rb +4 -4
  335. data/spec/unit/braintree/venmo_profile_data_spec.rb +43 -0
  336. data/spec/unit/braintree/visa_checkout_card_spec.rb +8 -0
  337. data/spec/unit/braintree/webhook_notification_spec.rb +977 -0
  338. data/spec/unit/braintree/xml/libxml_spec.rb +5 -5
  339. data/spec/unit/braintree/xml/parser_spec.rb +39 -5
  340. data/spec/unit/braintree/xml/rexml_spec.rb +5 -5
  341. data/spec/unit/braintree/xml_spec.rb +39 -32
  342. data/spec/unit/braintree_spec.rb +3 -2
  343. data/spec/unit/credit_card_details_spec.rb +8 -0
  344. metadata +314 -73
  345. data/README.rdoc +0 -80
  346. data/lib/braintree/test/credit_card_numbers.rb +0 -52
  347. data/lib/braintree/transparent_redirect.rb +0 -51
  348. data/lib/braintree/transparent_redirect_gateway.rb +0 -105
  349. data/lib/ssl/sandbox_braintreegateway_com.ca.crt +0 -19
  350. data/lib/ssl/www_braintreegateway_com.ca.crt +0 -202
  351. data/spec/hacks/tcp_socket.rb +0 -18
  352. data/spec/integration/braintree/transparent_redirect_spec.rb +0 -236
  353. data/spec/unit/braintree/transparent_redirect_spec.rb +0 -160
@@ -0,0 +1,97 @@
1
+ require File.expand_path(File.dirname(__FILE__) + "/../../spec_helper")
2
+ require File.expand_path(File.dirname(__FILE__) + "/client_api/spec_helper")
3
+
4
+ describe Braintree::ExchangeRateQuoteGateway do
5
+ let(:gateway) do
6
+ Braintree::Gateway.new(
7
+ :environment => :development,
8
+ :merchant_id => "integration_merchant_id",
9
+ :public_key => "integration_public_key",
10
+ :private_key => "integration_private_key",
11
+ )
12
+ end
13
+
14
+ describe "generate" do
15
+ def quote_input_request
16
+ gateway.exchange_rate_quote.generate({quotes: [quote_input]})
17
+ end
18
+
19
+ let(:quote_input) do
20
+ {
21
+ :baseCurrency => "EUR",
22
+ :quoteCurrency => "GBP",
23
+ :baseAmount => "20.00",
24
+ :markup => "4.00"
25
+ }
26
+ end
27
+
28
+ it "generates exchange rate quotes" do
29
+ result = quote_input_request
30
+ quotes = result[:quotes]
31
+
32
+ expect(quotes[0][:id]).not_to be_nil
33
+ expect(quotes[0][:baseAmount]).not_to be_nil
34
+ expect(quotes[0][:quoteAmount]).not_to be_nil
35
+ expect(quotes[0][:exchangeRate]).not_to be_nil
36
+ expect(quotes[0][:expiresAt]).not_to be_nil
37
+ expect(quotes[0][:refreshesAt]).not_to be_nil
38
+
39
+ expect(quotes[1][:id]).not_to be_nil
40
+ expect(quotes[1][:baseAmount]).not_to be_nil
41
+ expect(quotes[1][:quoteAmount]).not_to be_nil
42
+ expect(quotes[1][:exchangeRate]).not_to be_nil
43
+ expect(quotes[1][:expiresAt]).not_to be_nil
44
+ expect(quotes[1][:refreshesAt]).not_to be_nil
45
+ end
46
+
47
+ context "when base currency input param is not passed" do
48
+ let(:quote_input) do
49
+ {
50
+ :quoteCurrency => "GBP",
51
+ :baseAmount => "20.00",
52
+ :markup => "4.00"
53
+ }
54
+ end
55
+ let(:error_message) { "baseCurrency" }
56
+
57
+ it "raises an UnexpectedError" do
58
+ expect do
59
+ quote_input_request
60
+ end.to raise_error(Braintree::UnexpectedError, /#{error_message}/)
61
+ end
62
+ end
63
+
64
+ context "when quote currency input param is not passed" do
65
+ let(:quote_input) do
66
+ {
67
+ :baseCurrency => "GBP",
68
+ :baseAmount => "20.00",
69
+ :markup => "4.00"
70
+ }
71
+ end
72
+ let(:error_message) { "quoteCurrency" }
73
+
74
+ it "raises an UnexpectedError" do
75
+ expect do
76
+ quote_input_request
77
+ end.to raise_error(Braintree::UnexpectedError, /#{error_message}/)
78
+ end
79
+ end
80
+
81
+ context "when base and quote currency input params are not passed" do
82
+ let(:quote_input) do
83
+ {
84
+ :baseAmount => "20.00",
85
+ :markup => "4.00"
86
+ }
87
+ end
88
+ let(:error_message) { "baseCurrency" }
89
+
90
+ it "raises an UnexpectedError" do
91
+ expect do
92
+ quote_input_request
93
+ end.to raise_error(Braintree::UnexpectedError, /#{error_message}/)
94
+ end
95
+ end
96
+ end
97
+ end
@@ -0,0 +1,72 @@
1
+ require File.expand_path(File.dirname(__FILE__) + "/../spec_helper")
2
+
3
+ describe Braintree::GraphQLClient do
4
+ before :each do
5
+ @config = Braintree::Configuration.instantiate
6
+ end
7
+
8
+ describe "initialize" do
9
+ it "assigns overriding graphql headers" do
10
+ expect(@config.graphql_client.instance_variable_get("@graphql_headers")).to be_kind_of(Hash)
11
+ end
12
+ end
13
+
14
+ describe "query" do
15
+ it "makes valid GraphQL queries when given a definition" do
16
+ definition = <<-GRAPHQL
17
+ query {
18
+ ping
19
+ }
20
+ GRAPHQL
21
+
22
+ response = Braintree::GraphQLClient.new(@config).query(definition)
23
+
24
+ expect(response[:data]).to eq({:ping=>"pong"})
25
+ end
26
+
27
+ it "makes valid GraphQL requests when given a definitiona and variable" do
28
+ definition = <<-GRAPHQL
29
+ mutation CreateClientToken($input: CreateClientTokenInput!) {
30
+ createClientToken(input: $input) {
31
+ clientToken
32
+ }
33
+ }
34
+ GRAPHQL
35
+
36
+ variables = {
37
+ input: {
38
+ clientToken: {
39
+ merchantAccountId: "ABC123"
40
+ }
41
+ }
42
+ }
43
+
44
+ response = Braintree::GraphQLClient.new(@config).query(definition, variables)
45
+
46
+ expect(response[:data][:createClientToken][:clientToken]).to be_a(String)
47
+ end
48
+
49
+ it "returns results parsable into validation errors" do
50
+ definition = <<-GRAPHQL
51
+ query TransactionLevelFeeReport($date: Date!, $merchantAccountId: ID) {
52
+ report {
53
+ transactionLevelFees(date: $date, merchantAccountId: $merchantAccountId) {
54
+ url
55
+ }
56
+ }
57
+ }
58
+ GRAPHQL
59
+
60
+ variables = {
61
+ date: "2018-01-01",
62
+ merchantAccountId: "some_merchant"
63
+ }
64
+
65
+ response = Braintree::GraphQLClient.new(@config).query(definition, variables)
66
+ errors = Braintree::ValidationErrorCollection.new(response)
67
+
68
+ expect(errors.size).to eq(1)
69
+ expect(errors.first.message).to eq("Invalid merchant account id: some_merchant")
70
+ end
71
+ end
72
+ end
@@ -7,7 +7,8 @@ describe Braintree::Http do
7
7
  original_key = Braintree::Configuration.public_key
8
8
  Braintree::Configuration.public_key = "invalid_public_key"
9
9
  expect do
10
- Braintree::Configuration.instantiate.http.get "/customers"
10
+ config = Braintree::Configuration.instantiate
11
+ config.http.get("#{config.base_merchant_path}/customers")
11
12
  end.to raise_error(Braintree::AuthenticationError)
12
13
  ensure
13
14
  Braintree::Configuration.public_key = original_key
@@ -16,7 +17,8 @@ describe Braintree::Http do
16
17
 
17
18
  it "raises an AuthorizationError if authorization fails" do
18
19
  expect do
19
- Braintree::Configuration.instantiate.http.get "/users"
20
+ config = Braintree::Configuration.instantiate
21
+ config.http.get("#{config.base_merchant_path}/home")
20
22
  end.to raise_error(Braintree::AuthorizationError)
21
23
  end
22
24
  end
@@ -32,7 +34,7 @@ describe Braintree::Http do
32
34
  Braintree::Configuration.logger.level = Logger::INFO
33
35
  Braintree::Customer.all
34
36
  utc_or_gmt = Time.now.utc.strftime("%Z")
35
- output.string.should include("[Braintree] [10/Oct/2009 13:55:36 #{utc_or_gmt}] POST /customers/advanced_search_ids 200")
37
+ expect(output.string).to include("[Braintree] [10/Oct/2009 13:55:36 #{utc_or_gmt}] POST /merchants/integration_merchant_id/customers/advanced_search_ids 200")
36
38
  end
37
39
  ensure
38
40
  Braintree::Configuration.logger = old_logger
@@ -52,72 +54,128 @@ describe Braintree::Http do
52
54
  :customer_id => customer.id,
53
55
  :cardholder_name => "Sam Jones",
54
56
  :number => Braintree::Test::CreditCardNumbers::Visa,
55
- :expiration_date => "05/2009"
57
+ :expiration_date => "05/2009",
56
58
  )
57
- result.success?.should == true
59
+ expect(result.success?).to eq(true)
58
60
  utc_or_gmt = Time.now.utc.strftime("%Z")
59
- output.string.should include("[Braintree] [10/Oct/2009 13:55:36 #{utc_or_gmt}] POST /payment_methods")
60
- output.string.should include("[Braintree] <cardholder-name>Sam Jones</cardholder-name>")
61
- output.string.should include("[Braintree] <number>401288******1881</number>")
62
- output.string.should include("[Braintree] [10/Oct/2009 13:55:36 #{utc_or_gmt}] 201 Created")
63
- output.string.should match(/\[Braintree\] <token>\w+<\/token>/)
61
+ expect(output.string).to include("[Braintree] [10/Oct/2009 13:55:36 #{utc_or_gmt}] POST /merchants/integration_merchant_id/payment_methods")
62
+ expect(output.string).to include("[Braintree] <cardholder-name>Sam Jones</cardholder-name>")
63
+ expect(output.string).to include("[Braintree] <number>401288******1881</number>")
64
+ expect(output.string).to include("[Braintree] [10/Oct/2009 13:55:36 #{utc_or_gmt}] 201 Created")
65
+ expect(output.string).to match(/\[Braintree\] <token>\w+<\/token>/)
64
66
  end
65
67
  ensure
66
68
  Braintree::Configuration.logger = old_logger
67
69
  end
68
70
  end
69
71
 
72
+ it "posts multipart for file uploads" do
73
+ config = Braintree::Configuration.instantiate
74
+ file = File.new("#{File.dirname(__FILE__)}/../../fixtures/files/bt_logo.png", "r")
75
+ response = config.http.post("#{config.base_merchant_path}/document_uploads", {"document_upload[kind]" => "evidence_document"}, file)
76
+ expect(response[:document_upload][:content_type]).to eq("image/png")
77
+ expect(response[:document_upload][:id]).not_to be_nil
78
+ end
79
+
70
80
  describe "user_agent" do
71
81
  after do
72
82
  Braintree::Configuration.custom_user_agent = nil
73
83
  end
74
84
 
75
85
  it "sets the User-Agent header using the default user agent" do
76
- response = Braintree::Configuration.instantiate.http.get "/test/headers"
77
- response[:headers][:HTTP_USER_AGENT].should == "Braintree Ruby Gem #{Braintree::Version::String}"
86
+ config = Braintree::Configuration.instantiate
87
+ response = config.http.get("#{config.base_merchant_path}/test/headers")
88
+ expect(response[:headers][:HTTP_USER_AGENT]).to eq("Braintree Ruby Gem #{Braintree::Version::String}")
78
89
  end
79
90
 
80
91
  it "sets the User-Agent header using a customer user agent" do
81
92
  Braintree::Configuration.custom_user_agent = "ActiveMerchant 1.2.3"
82
- response = Braintree::Configuration.instantiate.http.get "/test/headers"
83
- response[:headers][:HTTP_USER_AGENT].should == "Braintree Ruby Gem #{Braintree::Version::String} (ActiveMerchant 1.2.3)"
93
+ config = Braintree::Configuration.instantiate
94
+ response = config.http.get("#{config.base_merchant_path}/test/headers")
95
+ expect(response[:headers][:HTTP_USER_AGENT]).to eq("Braintree Ruby Gem #{Braintree::Version::String} (ActiveMerchant 1.2.3)")
84
96
  end
85
97
  end
86
98
 
87
- describe "ssl verification" do
88
- it "rejects when the certificate isn't verified by our certificate authority (self-signed)" do
89
- config = Braintree::Configuration.instantiate
90
- config.stub(:ssl?).and_return(true)
91
- config.stub(:port).and_return(8443)
99
+ describe "ssl_version" do
100
+ xit "causes failed requests to sandbox with incompatible SSL version" do
101
+ begin
102
+ original_env = Braintree::Configuration.environment
103
+ Braintree::Configuration.environment = :sandbox
104
+ Braintree::Configuration.ssl_version = :TLSv1
105
+ allow(Braintree::Configuration).to receive(:base_merchant_path).and_return("/")
92
106
 
93
- start_ssl_server do
94
107
  expect do
95
- config.http._http_do(Net::HTTP::Get, "/login")
96
- end.to raise_error(Braintree::SSLCertificateError, /Preverify: false, Error: self signed certificate/)
108
+ Braintree::Configuration.instantiate.http._http_do(Net::HTTP::Get, "/login")
109
+ end.to raise_error(Braintree::SSLCertificateError)
110
+ ensure
111
+ Braintree::Configuration.environment = original_env
112
+ Braintree::Configuration.ssl_version = nil
97
113
  end
98
114
  end
99
115
 
100
- it "rejets when the certificate is signed by a different (but valid) root CA" do
101
- # Random CA root file from a different certificate authority
102
- config = Braintree::Configuration.instantiate
103
- config.stub(:ca_file).and_return(
104
- File.expand_path(File.join(File.dirname(__FILE__), "..", "..", "ssl", "geotrust_global.crt"))
105
- )
106
- config.stub(:ssl?).and_return(true)
107
- config.stub(:port).and_return(8443)
116
+ it "results in successful requests to sandbox with up-to-date SSL version" do
117
+ begin
118
+ original_env = Braintree::Configuration.environment
119
+ Braintree::Configuration.environment = :sandbox
120
+ Braintree::Configuration.ssl_version = :TLSv1_2
121
+ allow(Braintree::Configuration).to receive(:base_merchant_path).and_return("/")
108
122
 
109
- start_ssl_server do
110
123
  expect do
111
- config.http._http_do(Net::HTTP::Get, "/login")
112
- end.to raise_error(Braintree::SSLCertificateError, /Preverify: false, Error: self signed certificate/)
124
+ Braintree::Configuration.instantiate.http._http_do(Net::HTTP::Get, "/login")
125
+ end.to_not raise_error
126
+ ensure
127
+ Braintree::Configuration.environment = original_env
128
+ Braintree::Configuration.ssl_version = nil
129
+ end
130
+ end
131
+ end
132
+
133
+ describe "ssl verification" do
134
+ it "rejects when the certificate isn't verified by our certificate authority (self-signed)" do
135
+ begin
136
+ original_env = Braintree::Configuration.environment
137
+ Braintree::Configuration.environment = :development
138
+ config = Braintree::Configuration.instantiate
139
+ allow(config).to receive(:ssl?).and_return(true)
140
+ allow(config).to receive(:port).and_return(SSL_TEST_PORT)
141
+
142
+ start_ssl_server do
143
+ expect do
144
+ config.http._http_do(Net::HTTP::Get, "/login")
145
+ end.to raise_error(Braintree::SSLCertificateError)
146
+ end
147
+ ensure
148
+ Braintree::Configuration.environment = original_env
113
149
  end
114
150
  end
115
151
 
116
- it "accepts the certificate on the QA server" do
152
+ it "rejects when the certificate is signed by a different (but valid) root CA" do
153
+ begin
154
+ original_env = Braintree::Configuration.environment
155
+ Braintree::Configuration.environment = :development
156
+ # Random CA root file from a different certificate authority
157
+ config = Braintree::Configuration.instantiate
158
+ allow(config).to receive(:ca_file).and_return(
159
+ File.expand_path(File.join(File.dirname(__FILE__), "..", "..", "ssl", "geotrust_global.crt")),
160
+ )
161
+ allow(config).to receive(:ssl?).and_return(true)
162
+ allow(config).to receive(:port).and_return(SSL_TEST_PORT)
163
+
164
+ start_ssl_server do
165
+ expect do
166
+ config.http._http_do(Net::HTTP::Get, "/login")
167
+ end.to raise_error(Braintree::SSLCertificateError)
168
+ end
169
+ ensure
170
+ Braintree::Configuration.environment = original_env
171
+ end
172
+ end
173
+
174
+ it "accepts the certificate on the qa server" do
117
175
  begin
118
176
  original_env = Braintree::Configuration.environment
119
177
  Braintree::Configuration.environment = :qa
120
- Braintree::Configuration.stub(:base_merchant_path).and_return("/")
178
+ allow(Braintree::Configuration).to receive(:base_merchant_path).and_return("/")
121
179
 
122
180
  expect do
123
181
  Braintree::Configuration.instantiate.http._http_do(Net::HTTP::Get, "/login")
@@ -131,7 +189,7 @@ describe Braintree::Http do
131
189
  begin
132
190
  original_env = Braintree::Configuration.environment
133
191
  Braintree::Configuration.environment = :sandbox
134
- Braintree::Configuration.stub(:base_merchant_path).and_return("/")
192
+ allow(Braintree::Configuration).to receive(:base_merchant_path).and_return("/")
135
193
 
136
194
  expect do
137
195
  Braintree::Configuration.instantiate.http._http_do(Net::HTTP::Get, "/login")
@@ -145,7 +203,7 @@ describe Braintree::Http do
145
203
  begin
146
204
  original_env = Braintree::Configuration.environment
147
205
  Braintree::Configuration.environment = :production
148
- Braintree::Configuration.stub(:base_merchant_path).and_return("/")
206
+ allow(Braintree::Configuration).to receive(:base_merchant_path).and_return("/")
149
207
 
150
208
  expect do
151
209
  Braintree::Configuration.instantiate.http._http_do(Net::HTTP::Get, "/login")
@@ -158,10 +216,10 @@ describe Braintree::Http do
158
216
  it "raises an appropriate error if certificate fails validation" do
159
217
  begin
160
218
  original_env = Braintree::Configuration.environment
161
- Braintree::Configuration.environment = :qa
219
+ Braintree::Configuration.environment = :sandbox
162
220
  config = Braintree::Configuration.instantiate
163
- config.stub(:base_merchant_path).and_return("/")
164
- config.stub(:ca_file).and_return("does_not_exist")
221
+ allow(config).to receive(:base_merchant_path).and_return("/")
222
+ allow(config).to receive(:ca_file).and_return("does_not_exist")
165
223
 
166
224
  expect do
167
225
  config.http._http_do(Net::HTTP::Get, "/login")
@@ -174,19 +232,15 @@ describe Braintree::Http do
174
232
  end
175
233
 
176
234
  describe "self._verify_ssl_certificate" do
177
- it "raises if preverify is false" do
235
+ it "is false if preverify is false" do
178
236
  context = OpenSSL::X509::StoreContext.new(OpenSSL::X509::Store.new)
179
- expect do
180
- Braintree::Configuration.instantiate.http._verify_ssl_certificate(false, context)
181
- end.to raise_error(Braintree::SSLCertificateError)
237
+ expect(Braintree::Configuration.instantiate.http._verify_ssl_certificate(false, context)).to eq(false)
182
238
  end
183
239
 
184
- it "raise if ssl_context doesn't have an error code of 0" do
240
+ it "returns false if ssl_context doesn't have an error code of 0" do
185
241
  context = OpenSSL::X509::StoreContext.new(OpenSSL::X509::Store.new)
186
242
  context.error = 19 # ca_file incorrect, self-signed
187
- expect do
188
- Braintree::Configuration.instantiate.http._verify_ssl_certificate(true, context)
189
- end.to raise_error(Braintree::SSLCertificateError)
243
+ expect(Braintree::Configuration.instantiate.http._verify_ssl_certificate(true, context)).to eq(false)
190
244
  end
191
245
 
192
246
  it "doesn't raise if there is no error" do
@@ -201,13 +255,10 @@ describe Braintree::Http do
201
255
  old_logger = Braintree::Configuration.logger
202
256
  output = StringIO.new
203
257
  Braintree::Configuration.logger = Logger.new(output)
204
- utc_or_gmt = Time.now.utc.strftime("%Z")
205
258
  context = OpenSSL::X509::StoreContext.new(OpenSSL::X509::Store.new)
206
259
  context.error = 19
207
- expect do
208
- Braintree::Configuration.instantiate.http._verify_ssl_certificate(false, context)
209
- end.to raise_error(Braintree::SSLCertificateError)
210
- output.string.should include("SSL Verification failed -- Preverify: false, Error: self signed certificate in certificate chain (19)")
260
+ expect(Braintree::Configuration.instantiate.http._verify_ssl_certificate(false, context)).to eq(false)
261
+ expect(output.string).to include("SSL Verification failed -- Preverify: false, Error: self signed certificate in certificate chain (19)")
211
262
  ensure
212
263
  Braintree::Configuration.logger = old_logger
213
264
  end
@@ -218,12 +269,11 @@ describe Braintree::Http do
218
269
  old_logger = Braintree::Configuration.logger
219
270
  output = StringIO.new
220
271
  Braintree::Configuration.logger = Logger.new(output)
221
- utc_or_gmt = Time.now.utc.strftime("%Z")
222
272
  context = OpenSSL::X509::StoreContext.new(OpenSSL::X509::Store.new)
223
273
  expect do
224
274
  Braintree::Configuration.instantiate.http._verify_ssl_certificate(true, context)
225
- end.to_not raise_error(Braintree::SSLCertificateError)
226
- output.string.should == ""
275
+ end.to_not raise_error
276
+ expect(output.string).to eq("")
227
277
  ensure
228
278
  Braintree::Configuration.logger = old_logger
229
279
  end