spree_braintree_vzero 3.5.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (169) hide show
  1. checksums.yaml +7 -0
  2. data/.codeclimate.yml +15 -0
  3. data/.gitignore +19 -0
  4. data/.rspec +1 -0
  5. data/.travis.yml +63 -0
  6. data/Appraisals +45 -0
  7. data/CONTRIBUTING.md +28 -0
  8. data/Gemfile +14 -0
  9. data/LICENSE +26 -0
  10. data/README.md +83 -0
  11. data/Rakefile +21 -0
  12. data/app/assets/images/credit_cards/icons/jcb.png +0 -0
  13. data/app/assets/javascripts/spree/backend/payments.js +19 -0
  14. data/app/assets/javascripts/spree/backend/spree_braintree_vzero.js +81 -0
  15. data/app/assets/javascripts/spree/frontend/spree_braintree_vzero.js +68 -0
  16. data/app/assets/stylesheets/spree/backend/spree_braintree_vzero.css +5 -0
  17. data/app/controllers/spree/admin/payments_controller_decorator.rb +43 -0
  18. data/app/controllers/spree/api/v1/braintree_client_token_controller.rb +31 -0
  19. data/app/controllers/spree/checkout_controller_decorator.rb +38 -0
  20. data/app/controllers/spree/orders_controller_decorator.rb +62 -0
  21. data/app/controllers/spree/user_sessions_controller_decorator.rb +15 -0
  22. data/app/helpers/spree/admin/decorated_navigation_helper.rb +10 -0
  23. data/app/helpers/spree/admin/payment_methods_helper.rb +101 -0
  24. data/app/helpers/spree/braintree_helper.rb +27 -0
  25. data/app/models/braintree/successful_result_decorator.rb +21 -0
  26. data/app/models/spree/address_decorator.rb +18 -0
  27. data/app/models/spree/braintree_checkout.rb +105 -0
  28. data/app/models/spree/gateway/braintree_vzero_base.rb +168 -0
  29. data/app/models/spree/gateway/braintree_vzero_base/address.rb +33 -0
  30. data/app/models/spree/gateway/braintree_vzero_base/braintree_user.rb +25 -0
  31. data/app/models/spree/gateway/braintree_vzero_base/purchase_data.rb +48 -0
  32. data/app/models/spree/gateway/braintree_vzero_base/transaction.rb +39 -0
  33. data/app/models/spree/gateway/braintree_vzero_base/utils.rb +108 -0
  34. data/app/models/spree/gateway/braintree_vzero_drop_in_ui.rb +24 -0
  35. data/app/models/spree/gateway/braintree_vzero_hosted_fields.rb +28 -0
  36. data/app/models/spree/gateway/braintree_vzero_paypal_express.rb +36 -0
  37. data/app/models/spree/order_decorator.rb +153 -0
  38. data/app/models/spree/payment_decorator.rb +10 -0
  39. data/app/models/spree/payment_processing_decorator.rb +61 -0
  40. data/app/models/spree/preferences/preferable_decorator.rb +54 -0
  41. data/app/overrides/spree/admin/orders/customer_details/_form.rb +8 -0
  42. data/app/overrides/spree/admin/payment_methods/_form.rb +10 -0
  43. data/app/overrides/spree/admin/shared/_order_summary.rb +23 -0
  44. data/app/overrides/spree/admin/shared/_refunds.rb +13 -0
  45. data/app/overrides/spree/checkout/_new_user.rb +6 -0
  46. data/app/overrides/spree/checkout/_payment.rb +20 -0
  47. data/app/overrides/spree/checkout/registration.rb +6 -0
  48. data/app/overrides/spree/orders/edit.rb +6 -0
  49. data/app/overrides/spree/shared/_order_details.rb +13 -0
  50. data/app/overrides/spree/shared/_payment.rb +28 -0
  51. data/app/views/spree/admin/payment_methods/_braintree_vzero_form.html.erb +83 -0
  52. data/app/views/spree/admin/payments/source_forms/_braintree_vzero_dropin_ui.html.erb +1 -0
  53. data/app/views/spree/admin/payments/source_forms/_braintree_vzero_hosted_fields.html.erb +1 -0
  54. data/app/views/spree/admin/payments/source_forms/_braintree_vzero_paypal_express.html.erb +1 -0
  55. data/app/views/spree/admin/payments/source_forms/braintree_vzero/_payments.html.erb +87 -0
  56. data/app/views/spree/admin/payments/source_views/_braintree_vzero_dropin_ui.html.erb +1 -0
  57. data/app/views/spree/admin/payments/source_views/_braintree_vzero_hosted_fields.html.erb +1 -0
  58. data/app/views/spree/admin/payments/source_views/_braintree_vzero_paypal_express.html.erb +1 -0
  59. data/app/views/spree/admin/payments/source_views/braintree_vzero/_payment.html.erb +17 -0
  60. data/app/views/spree/braintree_vzero/_paypal_checkout.html.erb +87 -0
  61. data/app/views/spree/checkout/payment/_braintree_vzero_dropin_ui.html.erb +4 -0
  62. data/app/views/spree/checkout/payment/_braintree_vzero_hosted_fields.html.erb +4 -0
  63. data/app/views/spree/checkout/payment/_braintree_vzero_paypal_express.html.erb +4 -0
  64. data/app/views/spree/checkout/payment/braintree_vzero/_buttons.html.erb +11 -0
  65. data/app/views/spree/checkout/payment/braintree_vzero/_dropin_on_error_callback.js.erb +3 -0
  66. data/app/views/spree/checkout/payment/braintree_vzero/_dropin_on_ready_callback.js.erb +1 -0
  67. data/app/views/spree/checkout/payment/braintree_vzero/_hosted_fields_on_field_event_callback.js.erb +12 -0
  68. data/app/views/spree/checkout/payment/braintree_vzero/_hosted_fields_styles.js.erb +29 -0
  69. data/app/views/spree/checkout/payment/braintree_vzero/_payment.html.erb +84 -0
  70. data/app/views/spree/checkout/payment/braintree_vzero/_three_d_secure.html.erb +218 -0
  71. data/app/views/spree/shared/braintree_vzero/_dropin.js.erb +70 -0
  72. data/app/views/spree/shared/braintree_vzero/_hosted.js.erb +66 -0
  73. data/app/views/spree/shared/braintree_vzero/_paypal.js.erb +39 -0
  74. data/bin/rails +7 -0
  75. data/config/initializers/extend_spree_permitted_checkout_attributes.rb +5 -0
  76. data/config/initializers/prepend_helpers.rb +1 -0
  77. data/config/locales/en.yml +79 -0
  78. data/config/routes.rb +7 -0
  79. data/db/migrate/20150904143013_create_spree_braintree_checkouts.rb +9 -0
  80. data/db/migrate/20151002094655_add_braintree_id_to_spree_addresses.rb +5 -0
  81. data/db/migrate/20151018123907_add_braintree_token_and_nonce_to_spree_payments.rb +6 -0
  82. data/db/migrate/20151027135109_add_paypal_email_to_spree_braintree_checkout.rb +5 -0
  83. data/db/migrate/20151028095515_add_advanced_fraud_data_to_spree_braintree_checkout.rb +5 -0
  84. data/db/migrate/20151202095956_add_risk_id_and_risk_decision_to_spree_braintree_checkouts.rb +6 -0
  85. data/db/migrate/20151211100203_add_braintree_last_digits_and_braintree_card_type_to_spree_braintree_checkouts.rb +6 -0
  86. data/db/migrate/20160112153422_add_admin_payment_to_spree_braintree_checkout.rb +5 -0
  87. data/gemfiles/spree_3_5.gemfile +12 -0
  88. data/gemfiles/spree_3_5_spree_auth_devise.gemfile +13 -0
  89. data/gemfiles/spree_3_7.gemfile +12 -0
  90. data/gemfiles/spree_3_7_spree_auth_devise.gemfile +13 -0
  91. data/gemfiles/spree_4_0.gemfile +11 -0
  92. data/gemfiles/spree_4_0_spree_auth_devise.gemfile +12 -0
  93. data/gemfiles/spree_master.gemfile +11 -0
  94. data/gemfiles/spree_master_spree_auth_devise.gemfile +12 -0
  95. data/lib/generators/spree_braintree_vzero/install/install_generator.rb +34 -0
  96. data/lib/spree_braintree_vzero.rb +6 -0
  97. data/lib/spree_braintree_vzero/engine.rb +28 -0
  98. data/lib/spree_braintree_vzero/factories.rb +10 -0
  99. data/lib/spree_braintree_vzero/railtie.rb +8 -0
  100. data/lib/spree_braintree_vzero/version.rb +17 -0
  101. data/lib/tasks/spree_braintree_vzero.rake +6 -0
  102. data/spec/controllers/spree/api/v1/braintree_client_token_controller_spec.rb +49 -0
  103. data/spec/controllers/spree/checkout_controller_spec.rb +85 -0
  104. data/spec/controllers/spree/orders_controller_spec.rb +97 -0
  105. data/spec/factories/braintree_checkout_factory.rb +7 -0
  106. data/spec/factories/braintree_gateway_factory.rb +35 -0
  107. data/spec/factories/payment_factory_decorator.rb +28 -0
  108. data/spec/features/spree/admin/log_entries_spec.rb +63 -0
  109. data/spec/models/gateway/braintree_vzero_base/address_spec.rb +28 -0
  110. data/spec/models/gateway/braintree_vzero_base/purchase_data_spec.rb +57 -0
  111. data/spec/models/gateway/braintree_vzero_base_spec.rb +346 -0
  112. data/spec/models/gateway/braintree_vzero_dropin_ui_spec.rb +35 -0
  113. data/spec/models/gateway/braintree_vzero_hosted_fields_spec.rb +35 -0
  114. data/spec/models/spree/order_spec.rb +186 -0
  115. data/spec/spec_helper.rb +100 -0
  116. data/spec/support/vcr.rb +10 -0
  117. data/spec/vcr/Log_entries/with_a_failed_log_entry/shows_a_failed_attempt.yml +91 -0
  118. data/spec/vcr/Log_entries/with_a_successful_log_entry/shows_a_successful_attempt.yml +113 -0
  119. data/spec/vcr/Spree_Api_V1_BraintreeClientTokenController/POST_create/guest_checkout/returns_proper_json_data_when_gateway_not_specified.yml +90 -0
  120. data/spec/vcr/Spree_Api_V1_BraintreeClientTokenController/POST_create/guest_checkout/returns_proper_json_data_when_gateway_specified.yml +90 -0
  121. data/spec/vcr/Spree_Api_V1_BraintreeClientTokenController/POST_create/user_checkout/returns_proper_json_data_when_gateway_not_specified.yml +191 -0
  122. data/spec/vcr/Spree_Api_V1_BraintreeClientTokenController/POST_create/user_checkout/returns_proper_json_data_when_gateway_specified.yml +191 -0
  123. data/spec/vcr/Spree_CheckoutController/_update/braintree_payment/advanced_fraud_data_in_source_should_be_updated.yml +71 -0
  124. data/spec/vcr/Spree_CheckoutController/_update/braintree_payment/when_token_credit_card_data_in_source_should_be_updated_from_Braintree_Vault.yml +139 -0
  125. data/spec/vcr/Spree_CheckoutController/_update/braintree_paypal_express_payment/amount_in_payment_should_be_updated.yml +280 -0
  126. data/spec/vcr/Spree_Gateway_BraintreeVzeroBase/valid_credentials/_capture/captures_authorized_amount/updates_Payment_state.yml +206 -0
  127. data/spec/vcr/Spree_Gateway_BraintreeVzeroBase/valid_credentials/_credit/with_refundable_state/should_be_a_success.yml +211 -0
  128. data/spec/vcr/Spree_Gateway_BraintreeVzeroBase/valid_credentials/_credit/with_unrefundable_state/should_not_be_a_success.yml +177 -0
  129. data/spec/vcr/Spree_Gateway_BraintreeVzeroBase/valid_credentials/_purchase/data_from_admin_panel/should_include_only_essential_data.yml +78 -0
  130. data/spec/vcr/Spree_Gateway_BraintreeVzeroBase/valid_credentials/_purchase/does_not_store_Transaction_in_Vault_by_default.yml +111 -0
  131. data/spec/vcr/Spree_Gateway_BraintreeVzeroBase/valid_credentials/_purchase/returns_false_with_invalid_nonce.yml +88 -0
  132. data/spec/vcr/Spree_Gateway_BraintreeVzeroBase/valid_credentials/_purchase/returns_false_with_invalid_token.yml +88 -0
  133. data/spec/vcr/Spree_Gateway_BraintreeVzeroBase/valid_credentials/_purchase/returns_success_with_valid_token.yml +113 -0
  134. data/spec/vcr/Spree_Gateway_BraintreeVzeroBase/valid_credentials/_purchase/returns_suceess_with_valid_nonce.yml +111 -0
  135. data/spec/vcr/Spree_Gateway_BraintreeVzeroBase/valid_credentials/_purchase/using_Vault/saves_Braintree_Address_id_to_Spree_Address_when_address_is_being_saved.yml +130 -0
  136. data/spec/vcr/Spree_Gateway_BraintreeVzeroBase/valid_credentials/_purchase/using_Vault/saves_unique_Braintree_Addresses_ids.yml +143 -0
  137. data/spec/vcr/Spree_Gateway_BraintreeVzeroBase/valid_credentials/_purchase/using_Vault/sends_empty_address_id_when_address_is_already_in_vault.yml +553 -0
  138. data/spec/vcr/Spree_Gateway_BraintreeVzeroBase/valid_credentials/_purchase/using_Vault/stores_Transaction.yml +181 -0
  139. data/spec/vcr/Spree_Gateway_BraintreeVzeroBase/valid_credentials/_purchase/with_3DSecure_option_turned_on/performs_3DSecure_check.yml +112 -0
  140. data/spec/vcr/Spree_Gateway_BraintreeVzeroBase/valid_credentials/_purchase/with_3DSecure_option_turned_on/returns_error.yml +112 -0
  141. data/spec/vcr/Spree_Gateway_BraintreeVzeroBase/valid_credentials/_purchase/with_advanced_fraud_tool_enabled/returns_fraud_data.yml +111 -0
  142. data/spec/vcr/Spree_Gateway_BraintreeVzeroBase/valid_credentials/_purchase/with_advanced_fraud_tool_enabled/returns_success.yml +111 -0
  143. data/spec/vcr/Spree_Gateway_BraintreeVzeroBase/valid_credentials/_settle/settles_authorized_amount/does_not_update_Order_payment_state.yml +204 -0
  144. data/spec/vcr/Spree_Gateway_BraintreeVzeroBase/valid_credentials/_settle/settles_authorized_amount/prepares_Checkout_for_status_updating.yml +204 -0
  145. data/spec/vcr/Spree_Gateway_BraintreeVzeroBase/valid_credentials/_settle/settles_authorized_amount/submits_Transaction_for_settlement.yml +377 -0
  146. data/spec/vcr/Spree_Gateway_BraintreeVzeroBase/valid_credentials/_settle/settles_authorized_amount/updates_Payment_state.yml +203 -0
  147. data/spec/vcr/Spree_Gateway_BraintreeVzeroBase/valid_credentials/_update_states/does_not_update_completed_Checkout_on_subsequent_runs.yml +202 -0
  148. data/spec/vcr/Spree_Gateway_BraintreeVzeroBase/valid_credentials/_update_states/updates_Order_payment_state_when_Checkout_is_updated.yml +202 -0
  149. data/spec/vcr/Spree_Gateway_BraintreeVzeroBase/valid_credentials/_update_states/updates_Payment_state_when_Checkout_is_updated.yml +202 -0
  150. data/spec/vcr/Spree_Gateway_BraintreeVzeroBase/valid_credentials/_update_states/updates_payment_State.yml +202 -0
  151. data/spec/vcr/Spree_Gateway_BraintreeVzeroBase/valid_credentials/_void/with_unvoidable_state/should_not_change_payment_source_state.yml +178 -0
  152. data/spec/vcr/Spree_Gateway_BraintreeVzeroBase/valid_credentials/_void/with_voidable_state/should_change_payment_source_state_to_voided.yml +199 -0
  153. data/spec/vcr/Spree_Gateway_BraintreeVzeroBase/valid_credentials/generates_token_for_User_registered_in_Braintree.yml +356 -0
  154. data/spec/vcr/Spree_Gateway_BraintreeVzeroBase/valid_credentials/generates_token_for_new_User.yml +189 -0
  155. data/spec/vcr/Spree_Gateway_BraintreeVzeroBase/valid_credentials/generates_token_without_User.yml +89 -0
  156. data/spec/vcr/Spree_Gateway_BraintreeVzeroBase/with_invalid_credentials/raises_Braintree_error.yml +62 -0
  157. data/spec/vcr/Spree_Gateway_BraintreeVzeroBase_Address/_create/creates_Braintree_Address.yml +84 -0
  158. data/spec/vcr/Spree_Gateway_BraintreeVzeroBase_Address/_create/deletes_Braintree_Address.yml +141 -0
  159. data/spec/vcr/Spree_Gateway_BraintreeVzeroBase_Address/_create/finds_Braintree_Address.yml +148 -0
  160. data/spec/vcr/Spree_Gateway_BraintreeVzeroBase_Address/_create/updates_Braintree_Address.yml +154 -0
  161. data/spec/vcr/Spree_Order/complete_with_braintree_vzero_standard_payment/with_auto_capture/should_complete_payment.yml +116 -0
  162. data/spec/vcr/Spree_Order/complete_with_braintree_vzero_standard_payment/with_auto_capture/should_update_payment_s_response_code.yml +111 -0
  163. data/spec/vcr/Spree_Order/complete_with_braintree_vzero_standard_payment/with_auto_capture/should_update_payment_s_source_state_and_transaction_id.yml +111 -0
  164. data/spec/vcr/Spree_Order/complete_with_braintree_vzero_standard_payment/without_auto_capture/should_pend_payment.yml +111 -0
  165. data/spec/vcr/Spree_Order/complete_with_braintree_vzero_standard_payment/without_auto_capture/should_update_payment_s_response_code.yml +111 -0
  166. data/spec/vcr/Spree_Order/complete_with_braintree_vzero_standard_payment/without_auto_capture/should_update_payment_s_source_state_and_transaction_id.yml +110 -0
  167. data/spree_braintree_vzero.gemspec +52 -0
  168. data/vendor/assets/javascripts/maskedinput/jquery.maskedinput.min.js +7 -0
  169. metadata +643 -0
@@ -0,0 +1,7 @@
1
+ Spree::Core::Engine.routes.draw do
2
+ namespace :api, defaults: { format: 'json' } do
3
+ namespace :v1 do
4
+ resource :braintree_client_token, only: :create, controller: 'braintree_client_token'
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,9 @@
1
+ class CreateSpreeBraintreeCheckouts < SpreeExtension::Migration[4.2]
2
+ def change
3
+ create_table :spree_braintree_checkouts do |t|
4
+ t.string :transaction_id, index: true
5
+ t.string :state, index: true
6
+ t.timestamps null: false
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,5 @@
1
+ class AddBraintreeIdToSpreeAddresses < SpreeExtension::Migration[4.2]
2
+ def change
3
+ add_column :spree_addresses, :braintree_id, :string
4
+ end
5
+ end
@@ -0,0 +1,6 @@
1
+ class AddBraintreeTokenAndNonceToSpreePayments < SpreeExtension::Migration[4.2]
2
+ def change
3
+ add_column :spree_payments, :braintree_token, :string
4
+ add_column :spree_payments, :braintree_nonce, :string
5
+ end
6
+ end
@@ -0,0 +1,5 @@
1
+ class AddPaypalEmailToSpreeBraintreeCheckout < SpreeExtension::Migration[4.2]
2
+ def change
3
+ add_column :spree_braintree_checkouts, :paypal_email, :string
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ class AddAdvancedFraudDataToSpreeBraintreeCheckout < SpreeExtension::Migration[4.2]
2
+ def change
3
+ add_column :spree_braintree_checkouts, :advanced_fraud_data, :string
4
+ end
5
+ end
@@ -0,0 +1,6 @@
1
+ class AddRiskIdAndRiskDecisionToSpreeBraintreeCheckouts < SpreeExtension::Migration[4.2]
2
+ def change
3
+ add_column :spree_braintree_checkouts, :risk_id, :string
4
+ add_column :spree_braintree_checkouts, :risk_decision, :string
5
+ end
6
+ end
@@ -0,0 +1,6 @@
1
+ class AddBraintreeLastDigitsAndBraintreeCardTypeToSpreeBraintreeCheckouts < SpreeExtension::Migration[4.2]
2
+ def change
3
+ add_column :spree_braintree_checkouts, :braintree_last_digits, :string, limit: 4
4
+ add_column :spree_braintree_checkouts, :braintree_card_type, :string
5
+ end
6
+ end
@@ -0,0 +1,5 @@
1
+ class AddAdminPaymentToSpreeBraintreeCheckout < SpreeExtension::Migration[4.2]
2
+ def change
3
+ add_column :spree_braintree_checkouts, :admin_payment, :bool
4
+ end
5
+ end
@@ -0,0 +1,12 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "spree", "~> 3.5.0"
6
+ gem "pg"
7
+ gem "mysql2"
8
+ gem "webmock", ">= 2.3.1"
9
+ gem "rails-controller-testing"
10
+ gem 'sprockets', '~> 3.7'
11
+
12
+ gemspec path: "../"
@@ -0,0 +1,13 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "spree", "~> 3.5.0"
6
+ gem "pg"
7
+ gem "mysql2"
8
+ gem "webmock", ">= 2.3.1"
9
+ gem "rails-controller-testing"
10
+ gem "spree_auth_devise", "~> 3.3.0"
11
+ gem 'sprockets', '~> 3.7'
12
+
13
+ gemspec path: "../"
@@ -0,0 +1,12 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem 'sassc-rails'
6
+ gem "spree", "~> 3.7.1"
7
+ gem "pg"
8
+ gem "mysql2"
9
+ gem "webmock", ">= 2.3.1"
10
+ gem "rails-controller-testing"
11
+
12
+ gemspec path: "../"
@@ -0,0 +1,13 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem 'sassc-rails'
6
+ gem "spree", "~> 3.7.1"
7
+ gem "pg"
8
+ gem "mysql2"
9
+ gem "webmock", ">= 2.3.1"
10
+ gem "rails-controller-testing"
11
+ gem "spree_auth_devise", "~> 3.5.2"
12
+
13
+ gemspec path: "../"
@@ -0,0 +1,11 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "spree", "~> 4.0.0"
6
+ gem "pg"
7
+ gem "mysql2"
8
+ gem "webmock", ">= 2.3.1"
9
+ gem "rails-controller-testing"
10
+
11
+ gemspec path: "../"
@@ -0,0 +1,12 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "spree", "~> 4.0.0"
6
+ gem "pg"
7
+ gem "mysql2"
8
+ gem "webmock", ">= 2.3.1"
9
+ gem "rails-controller-testing"
10
+ gem "spree_auth_devise", "~> 4.0.0"
11
+
12
+ gemspec path: "../"
@@ -0,0 +1,11 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "spree", github: "spree/spree", branch: "master"
6
+ gem "pg"
7
+ gem "mysql2"
8
+ gem "webmock", ">= 2.3.1"
9
+ gem "rails-controller-testing"
10
+
11
+ gemspec path: "../"
@@ -0,0 +1,12 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "spree", github: "spree/spree", branch: "master"
6
+ gem "pg"
7
+ gem "mysql2"
8
+ gem "webmock", ">= 2.3.1"
9
+ gem "rails-controller-testing"
10
+ gem "spree_auth_devise", github: "spree/spree_auth_devise", branch: "master"
11
+
12
+ gemspec path: "../"
@@ -0,0 +1,34 @@
1
+ module SpreeBraintreeVzero
2
+ module Generators
3
+ class InstallGenerator < Rails::Generators::Base
4
+ class_option :auto_run_migrations, type: :boolean, default: false
5
+
6
+ def add_javascripts
7
+ append_file 'vendor/assets/javascripts/spree/frontend/all.js', "//= require spree/frontend/spree_braintree_vzero\n"
8
+ append_file 'vendor/assets/javascripts/spree/backend/all.js', "//= require spree/backend/spree_braintree_vzero\n"
9
+ end
10
+
11
+ def add_schedule
12
+ create_file 'config/schedule.rb' unless File.exist?('config/schedule.rb')
13
+ append_file 'config/schedule.rb' do
14
+ "\nevery '0 4,10,16,22 * * * *' do
15
+ rake 'spree_braintree_vzero:update_states'
16
+ end"
17
+ end
18
+ end
19
+
20
+ def add_migrations
21
+ run 'bundle exec rake railties:install:migrations FROM=spree_braintree_vzero'
22
+ end
23
+
24
+ def run_migrations
25
+ run_migrations = options[:auto_run_migrations] || ['', 'y', 'Y'].include?(ask('Would you like to run the migrations now? [Y/n]'))
26
+ if run_migrations
27
+ run 'bundle exec rake db:migrate'
28
+ else
29
+ puts 'Skipping rake db:migrate, don\'t forget to run it!'
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,6 @@
1
+ require 'spree_core'
2
+ require 'spree_braintree_vzero/engine'
3
+ require 'spree_braintree_vzero/version'
4
+ require 'spree_extension'
5
+
6
+ require 'spree_braintree_vzero/railtie' if defined?(Rails)
@@ -0,0 +1,28 @@
1
+ module SpreeBraintreeVzero
2
+ class Engine < Rails::Engine
3
+ require 'spree/core'
4
+ isolate_namespace Spree
5
+ engine_name 'spree_braintree_vzero'
6
+
7
+ # use rspec for tests
8
+ config.generators do |g|
9
+ g.test_framework :rspec
10
+ end
11
+
12
+ def self.activate
13
+ Dir.glob(File.join(File.dirname(__FILE__), '../../app/**/*_decorator*.rb')) do |c|
14
+ Rails.configuration.cache_classes ? require(c) : load(c)
15
+ end
16
+ end
17
+
18
+ config.to_prepare &method(:activate).to_proc
19
+
20
+ initializer 'spree.braintree_vzero.payment_methods', after: 'spree.register.payment_methods' do |app|
21
+ app.config.spree.payment_methods += [
22
+ Spree::Gateway::BraintreeVzeroDropInUi,
23
+ Spree::Gateway::BraintreeVzeroPaypalExpress,
24
+ Spree::Gateway::BraintreeVzeroHostedFields
25
+ ]
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,10 @@
1
+ FactoryBot.define do
2
+ # Define your Spree extensions Factories within this file to enable applications, and other extensions to use and override them.
3
+ #
4
+ # Example adding this to your spec_helper will load these Factories for use:
5
+ # require 'spree_braintree_vzero/factories'
6
+
7
+ Dir[Dir.pwd + '/spec/factories/**/*'].each do |factory|
8
+ require File.expand_path(factory)
9
+ end
10
+ end
@@ -0,0 +1,8 @@
1
+ require 'rails/railtie'
2
+ module SpreeBraintreeVzero
3
+ class Railtie < Rails::Railtie
4
+ rake_tasks do
5
+ load 'tasks/spree_braintree_vzero.rake'
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,17 @@
1
+ module SpreeBraintreeVzero
2
+ module_function
3
+
4
+ # Returns the version of the currently loaded SpreeBraintreeVzero as a
5
+ # <tt>Gem::Version</tt>.
6
+ def version
7
+ Gem::Version.new VERSION::STRING
8
+ end
9
+
10
+ module VERSION
11
+ MAJOR = 3
12
+ MINOR = 5
13
+ TINY = 1
14
+
15
+ STRING = [MAJOR, MINOR, TINY].compact.join('.')
16
+ end
17
+ end
@@ -0,0 +1,6 @@
1
+ namespace :spree_braintree_vzero do
2
+ desc 'Updates states for BraintreeCheckouts and associated Orders with Payments'
3
+ task update_states: :environment do
4
+ puts Spree::BraintreeCheckout.update_states
5
+ end
6
+ end
@@ -0,0 +1,49 @@
1
+ require 'spec_helper'
2
+
3
+ describe Spree::Api::V1::BraintreeClientTokenController, :vcr, type: :controller do
4
+ let!(:gateway) { create(:vzero_gateway, auto_capture: true) }
5
+ let(:order) { create(:order) }
6
+
7
+ describe 'POST #create' do
8
+ context 'guest checkout' do
9
+ it 'returns proper json data when gateway not specified' do
10
+ post :create, params: { order_number: order.number }
11
+ expect(response).to have_http_status 200
12
+ expect(json_response['client_token']).not_to be nil
13
+ expect(json_response['payment_method_id']).not_to be nil
14
+ end
15
+
16
+ it 'returns proper json data when gateway specified' do
17
+ post :create, params: { payment_method_id: gateway.id, order_number: order.number }
18
+ expect(response).to have_http_status 200
19
+ expect(json_response['client_token']).not_to be nil
20
+ expect(json_response['payment_method_id']).to eq gateway.id
21
+ end
22
+ end
23
+
24
+ context 'user checkout' do
25
+ let!(:user) { create(:user) }
26
+ before { user.generate_spree_api_key! }
27
+
28
+ it 'returns proper json data when gateway not specified' do
29
+ post :create, params: { order_number: order.number, token: user.spree_api_key }
30
+ expect(response).to have_http_status 200
31
+ expect(json_response['client_token']).not_to be nil
32
+ expect(json_response['payment_method_id']).not_to be nil
33
+ end
34
+
35
+ it 'returns proper json data when gateway specified' do
36
+ post :create, params: { payment_method_id: gateway.id, token: user.spree_api_key, order_number: order.number }
37
+ expect(response).to have_http_status 200
38
+ expect(json_response['client_token']).not_to be nil
39
+ expect(json_response['payment_method_id']).to eq gateway.id
40
+ end
41
+ end
42
+ end
43
+
44
+ private
45
+
46
+ def json_response
47
+ JSON.parse(response.body)
48
+ end
49
+ end
@@ -0,0 +1,85 @@
1
+ require 'spec_helper'
2
+
3
+ describe Spree::CheckoutController, :vcr, type: :controller do
4
+ let(:user) { create(:user) }
5
+ let(:order) { OrderWalkthrough.up_to(:payment) }
6
+
7
+ before do
8
+ allow(controller).to receive_messages try_spree_current_user: user
9
+ allow(controller).to receive_messages spree_current_user: user
10
+ allow(controller).to receive_messages current_order: order
11
+ end
12
+
13
+ context '#update' do
14
+ context 'braintree payment' do
15
+ let(:braintree_payment_method) { create(:vzero_gateway) }
16
+ let(:params) do
17
+ {
18
+ order: {
19
+ payments_attributes: [{
20
+ 'payment_method_id' => braintree_payment_method.id,
21
+ 'braintree_token' => 'k5jkr6',
22
+ 'braintree_nonce' => '4cdec532-b616-41cc-babf-c1d5cfbbe6c2',
23
+ 'amount' => 23
24
+ }],
25
+ coupon_code: ''
26
+ },
27
+ device_data: '{\"device_session_id\":\"ce3a962b468a0c912b6cf53f72f154e3\",\"fraud_merchant_id\":\"600000\",\"correlation_id\":\"d61971aadd35b3da938a99902a299be6\"}',
28
+ state: 'payment'
29
+ }
30
+ end
31
+
32
+ before do
33
+ allow(order).to receive_messages state: 'payment'
34
+ allow(controller).to receive_messages check_authorization: true
35
+ end
36
+
37
+ it 'advanced_fraud_data in source should be updated' do
38
+ expect(order.payments).to be_empty
39
+ put :update, params: params
40
+ expect(order.reload.payments.last.source.advanced_fraud_data).to eq params[:device_data]
41
+ end
42
+
43
+ it 'when nonce, credit card data in source should be updated from params' do
44
+ params[:order][:payments_attributes].first.delete('braintree_token')
45
+ params[:braintree_last_two] = '12'
46
+ put :update, params: params
47
+ expect(order.reload.payments.last.source.braintree_last_digits).to eq params[:braintree_last_two]
48
+ end
49
+
50
+ it 'when token, credit card data in source should be updated from Braintree Vault' do
51
+ token = params[:order][:payments_attributes].first['braintree_token']
52
+ vaulted_payment_method = braintree_payment_method.vaulted_payment_method(token)
53
+ put :update, params: params
54
+ expect(order.reload.payments.last.source.braintree_last_digits).to eq vaulted_payment_method.last_4
55
+ end
56
+
57
+ context 'when user tries to steal other user card' do
58
+ let(:other_user) { create(:user) }
59
+ let!(:card) { create(:credit_card, number: '123456', user: other_user) }
60
+
61
+ it 'does not create payment' do
62
+ params[:order].merge!(existing_card: card.id)
63
+
64
+ expect(order.payments).to be_empty
65
+ put :update, params: params
66
+ expect(order.reload.payments).to be_empty
67
+ end
68
+ end
69
+ end
70
+
71
+ context 'braintree paypal express payment' do
72
+ before do
73
+ order.payments << create(:braintree_vzero_paypal_payment)
74
+ order.update(state: 'confirm')
75
+ allow(controller).to receive_messages check_authorization: true
76
+ end
77
+
78
+ it 'amount in payment should be updated' do
79
+ expect(order.reload.payments.sum(:amount)).to eq 0
80
+ put :update, params: { state: 'confirm' }
81
+ expect(order.reload.payments.last.amount).to eq order.order_total_after_store_credit
82
+ end
83
+ end
84
+ end
85
+ end
@@ -0,0 +1,97 @@
1
+ require 'spec_helper'
2
+
3
+ describe Spree::OrdersController, type: :controller do
4
+ let(:user) { create(:user) }
5
+ let!(:country) { create(:country, iso: 'US') }
6
+ let!(:state) { create(:state, country: country) }
7
+
8
+ context '#update' do
9
+ let(:order) { OrderWalkthrough.up_to(:payment) }
10
+
11
+ before do
12
+ allow(controller).to receive_messages(try_spree_current_user: user)
13
+ allow(controller).to receive :check_authorization
14
+ allow(controller).to receive_messages current_order: order
15
+ end
16
+
17
+ context 'standard checkout for order with braintree paypal express payment' do
18
+ before { order.payments << create(:braintree_vzero_paypal_payment) }
19
+
20
+ it 'it should invalidate paypal express payment' do
21
+ expect(order.reload.payments.valid.count).to eq 1
22
+ put :update, params: { order_id: order.id }
23
+ expect(order.reload.payments.valid.count).to eq 0
24
+ end
25
+ end
26
+
27
+ context 'paypal express checkout' do
28
+ let(:payment_method) { create(:vzero_paypal_gateway) }
29
+ let(:params) do
30
+ {
31
+ order_id: order.id,
32
+ order: {
33
+ line_items_attributes: {
34
+ '0' => {
35
+ quantity: '1',
36
+ id: '127'
37
+ }
38
+ },
39
+ ship_address: {
40
+ zipcode: '95131',
41
+ full_name: 'undefined',
42
+ firstname: 'Spree',
43
+ lastname: 'Buyer',
44
+ address1: '1 Main St',
45
+ address2: 'undefined',
46
+ city: 'San Jose',
47
+ country: 'US',
48
+ state: Spree::State.first.abbr
49
+ },
50
+ email: 'spree_buyer@spreetest.com'
51
+ },
52
+ paypal: {
53
+ payment_method_id: payment_method.id.to_s,
54
+ payment_method_nonce: '2f7126df-ceee-40a6-a7b4-ab1b799810f3'
55
+ },
56
+ device_data: '{\"device_session_id\":\"4523fd012467562ec455926850f7ce11\",\"fraud_merchant_id\":\"600000\"}',
57
+ checkout: 'true'
58
+ }
59
+ end
60
+
61
+ it 'it should save address both as billing and shipping (even when phone number is not passed)' do
62
+ put :update, params: params
63
+ data = params.slice(:order)[:order].slice(:ship_address)[:ship_address]
64
+ [order.ship_address, order.bill_address].each do |address|
65
+ expect(address.zipcode).to eq data[:zipcode]
66
+ expect(address.firstname).to eq data[:firstname]
67
+ expect(address.lastname).to eq data[:lastname]
68
+ expect(address.address1).to eq data[:address1]
69
+ expect(address.address2).to be_blank
70
+ expect(address.city).to eq data[:city]
71
+ expect(address.country.iso).to eq data[:country]
72
+ expect(address.state.abbr).to eq data[:state]
73
+ expect(address.phone).to be_blank
74
+ end
75
+ end
76
+
77
+ it 'it should redirect to address page when address is invalid' do
78
+ put :update, params: params
79
+
80
+ [order.ship_address, order.bill_address].each do |address|
81
+ expect(address).to be_invalid
82
+ end
83
+ expect(response).to redirect_to checkout_state_path(:address, paypal_email: params[:order][:email])
84
+ end
85
+
86
+ it 'it should redirect to address page when address is valid' do
87
+ params[:order][:ship_address][:phone] = '123456789'
88
+ put :update, params: params
89
+
90
+ [order.ship_address, order.bill_address].each do |address|
91
+ expect(address).to be_valid
92
+ end
93
+ expect(response).to redirect_to checkout_state_path(:address, paypal_email: params[:order][:email])
94
+ end
95
+ end
96
+ end
97
+ end