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,35 @@
1
+ require 'spec_helper'
2
+
3
+ describe Spree::Gateway::BraintreeVzeroDropInUi, :vcr do
4
+ subject { create(:vzero_dropin_ui_gateway) }
5
+
6
+ describe 'after_save' do
7
+ let(:hosted_fields_gateway) { create(:vzero_hosted_fields_gateway) }
8
+
9
+ it 'activation should disable Hosted Fields Gateways' do
10
+ subject.update_column(:active, false)
11
+ expect(hosted_fields_gateway.active?).to be true
12
+ subject.update(active: true)
13
+ expect(hosted_fields_gateway.reload.active?).to be false
14
+ end
15
+
16
+ it 'deactivation should not disable Hosted Fields Gateways' do
17
+ subject
18
+ expect(hosted_fields_gateway.active?).to be true
19
+ subject.update(active: false)
20
+ expect(hosted_fields_gateway.reload.active?).to be true
21
+ end
22
+
23
+ it 'creation of activated should disable Hosted Fields Gateways' do
24
+ expect(hosted_fields_gateway.active?).to be true
25
+ subject
26
+ expect(hosted_fields_gateway.reload.active?).to be false
27
+ end
28
+
29
+ it 'creation of deactivated should not disable Hosted Fields Gateways' do
30
+ expect(hosted_fields_gateway.active?).to be true
31
+ create(:vzero_dropin_ui_gateway, active: false)
32
+ expect(hosted_fields_gateway.reload.active?).to be true
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,35 @@
1
+ require 'spec_helper'
2
+
3
+ describe Spree::Gateway::BraintreeVzeroHostedFields, :vcr do
4
+ subject { create(:vzero_hosted_fields_gateway) }
5
+
6
+ describe 'after_save' do
7
+ let(:dropin_ui_gateway) { create(:vzero_dropin_ui_gateway) }
8
+
9
+ it 'activation should disable DropIn UI Gateways' do
10
+ subject.update_column(:active, false)
11
+ expect(dropin_ui_gateway.active?).to be true
12
+ subject.update(active: true)
13
+ expect(dropin_ui_gateway.reload.active?).to be false
14
+ end
15
+
16
+ it 'deactivation should not disable DropIn UI Gateways' do
17
+ subject
18
+ expect(dropin_ui_gateway.active?).to be true
19
+ subject.update(active: false)
20
+ expect(dropin_ui_gateway.reload.active?).to be true
21
+ end
22
+
23
+ it 'creation of activated should disable DropIn UI Gateways' do
24
+ expect(dropin_ui_gateway.active?).to be true
25
+ subject
26
+ expect(dropin_ui_gateway.reload.active?).to be false
27
+ end
28
+
29
+ it 'creation of deactivated should not disable DropIn UI Gateways' do
30
+ expect(dropin_ui_gateway.active?).to be true
31
+ create(:vzero_dropin_ui_gateway, active: false)
32
+ expect(dropin_ui_gateway.reload.active?).to be true
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,186 @@
1
+ require 'spec_helper'
2
+
3
+ describe Spree::Order, :vcr do
4
+ let(:gateway) { create(:vzero_gateway, auto_capture: true) }
5
+ let(:payment) { create(:braintree_vzero_payment, payment_method: gateway) }
6
+ let(:payment_source) { payment.payment_source }
7
+ let(:order) { OrderWalkthrough.up_to(:payment) }
8
+ let(:add_payment_to_order!) { order.payments << payment }
9
+
10
+ describe 'complete with braintree vzero standard payment' do
11
+ let!(:complete_order!) do
12
+ add_payment_to_order!
13
+ 2.times { order.next! }
14
+ end
15
+
16
+ context 'with auto_capture' do
17
+ it 'should complete payment' do
18
+ expect(payment.reload.state).to eq 'completed'
19
+ end
20
+
21
+ it "should update payment's response_code" do
22
+ expect(payment.reload.response_code).not_to be_blank
23
+ end
24
+
25
+ it "should update payment's source state and transaction_id" do
26
+ expect(payment.reload.source.state).to eq 'submitted_for_settlement'
27
+ expect(payment.reload.source.transaction_id).not_to be_blank
28
+ end
29
+ end
30
+
31
+ context 'without auto_capture' do
32
+ let(:gateway) { create(:vzero_gateway, auto_capture: false) }
33
+
34
+ it 'should pend payment' do
35
+ expect(payment.reload.state).to eq 'pending'
36
+ end
37
+
38
+ it "should update payment's response_code" do
39
+ expect(payment.reload.response_code).not_to be_blank
40
+ end
41
+
42
+ it "should update payment's source state and transaction_id" do
43
+ expect(payment.reload.source.state).to eq 'authorized'
44
+ expect(payment.reload.source.transaction_id).not_to be_blank
45
+ end
46
+ end
47
+ end
48
+
49
+ describe 'checkout steps' do
50
+ it 'should not include confirmation step by default' do
51
+ expect(order.checkout_steps).not_to include 'confirm'
52
+ end
53
+
54
+ it 'should include payment step by default' do
55
+ expect(order.checkout_steps).to include 'payment'
56
+ end
57
+
58
+ context 'with braintree dropin payment' do
59
+ before { add_payment_to_order! }
60
+
61
+ it 'should include confirmation step' do
62
+ order.update(state: 'payment')
63
+ expect(order.confirmation_required?).to be true
64
+ end
65
+
66
+ it 'should include payment step' do
67
+ expect(order.checkout_steps).to include 'payment'
68
+ end
69
+ end
70
+
71
+ context 'with braintree paypal express payment' do
72
+ let(:order) { OrderWalkthrough.up_to(:delivery) }
73
+ let(:gateway) { create(:vzero_paypal_gateway, auto_capture: true) }
74
+ before { add_payment_to_order! }
75
+
76
+ it 'should not include confirmation step when payed by paypal express from cart' do
77
+ order.update(state: 'delivery')
78
+ expect(order.confirmation_required?).to be false
79
+ end
80
+
81
+ it 'should include confirmation step when payed by paypal express from payment step' do
82
+ order.update(state: 'payment')
83
+ expect(order.confirmation_required?).to be true
84
+ end
85
+
86
+ it 'should not include payment step' do
87
+ expect(order.checkout_steps).not_to include 'payment'
88
+ end
89
+ end
90
+ end
91
+
92
+ describe 'addresses managment' do
93
+ let(:country) { create(:country, name: 'Poland', iso: 'PL') }
94
+ let(:state) { create(:state, name: 'Mazowieckie', abbr: 'MZ', country: country) }
95
+
96
+ context 'paypal addresses' do
97
+ let(:type) { 'ship_address' }
98
+ let(:attr) { address_hash.except(:full_name, :country, :state).keys.map(&:to_s) }
99
+ let(:address_hash) do
100
+ {
101
+ zipcode: '02-796',
102
+ city: 'Warsaw',
103
+ address1: 'gder 1/7',
104
+ address2: '13b',
105
+ phone: '408-391-8922',
106
+ full_name: 'Test ree ree Acd',
107
+ country: 'PL',
108
+ state: 'MZ'
109
+ }.with_indifferent_access
110
+ end
111
+
112
+ let(:prepare_data) do
113
+ order
114
+ state
115
+ end
116
+
117
+ let(:save_paypal_address!) do
118
+ prepare_data
119
+ expect(order.ship_address.attributes.slice(*attr)).not_to match address_hash.slice(*attr)
120
+ order.save_paypal_address(type, address_hash.dup)
121
+ end
122
+
123
+ shared_examples 'comparable' do
124
+ it 'should save basic address data without changes' do
125
+ expect(order.reload.ship_address.attributes.slice(*attr)).to match address_hash.slice(*attr)
126
+ end
127
+
128
+ it 'should find and set proper country' do
129
+ expect(order.reload.ship_address.country.iso).to eq address_hash[:country]
130
+ end
131
+
132
+ it 'should split name in proper way' do
133
+ name_array = address_hash[:full_name].split(' ')
134
+ last = name_array.slice!(-1)
135
+ first = name_array.join(' ')
136
+ expect(order.reload.ship_address.firstname).to eq first
137
+ expect(order.reload.ship_address.lastname).to eq last
138
+ end
139
+ end
140
+
141
+ context 'with state as abbreviation' do
142
+ before do
143
+ save_paypal_address!
144
+ end
145
+
146
+ include_examples 'comparable'
147
+
148
+ it 'should find and set proper state' do
149
+ expect(order.reload.ship_address.state.abbr).to eq address_hash[:state]
150
+ end
151
+ end
152
+
153
+ context 'with state as name' do
154
+ before do
155
+ address_hash[:state] = 'MAZOWIECKIE'
156
+ save_paypal_address!
157
+ end
158
+
159
+ include_examples 'comparable'
160
+
161
+ it 'should find and set proper state' do
162
+ expect(order.reload.ship_address.state.name).to eq address_hash[:state].capitalize
163
+ end
164
+ end
165
+
166
+ it 'should not include fields with text "undefined"' do
167
+ address_hash[:address2] = 'undefined'
168
+ save_paypal_address!
169
+ expect(order.reload.ship_address.address2).to eq nil
170
+ end
171
+
172
+ context 'billing address from shipping_address' do
173
+ it 'should be set when empty' do
174
+ order.update_column(:bill_address_id, nil)
175
+ order.set_billing_address
176
+ expect(order.reload.bill_address.attributes.slice(*attr)).to match order.ship_address.attributes.slice(*attr)
177
+ end
178
+
179
+ it 'should not be set when exists' do
180
+ order.set_billing_address
181
+ expect(order.reload.bill_address.attributes.slice(*attr)).not_to match address_hash.slice(*attr)
182
+ end
183
+ end
184
+ end
185
+ end
186
+ end
@@ -0,0 +1,100 @@
1
+ # Run Coverage report
2
+ require 'simplecov'
3
+ SimpleCov.start do
4
+ add_filter 'spec/dummy'
5
+ add_group 'Controllers', 'app/controllers'
6
+ add_group 'Helpers', 'app/helpers'
7
+ add_group 'Mailers', 'app/mailers'
8
+ add_group 'Models', 'app/models'
9
+ add_group 'Views', 'app/views'
10
+ add_group 'Libraries', 'lib'
11
+ end
12
+
13
+ # CodeClimate coverage
14
+ require "simplecov"
15
+ SimpleCov.start
16
+
17
+ # Configure Rails Environment
18
+ ENV['RAILS_ENV'] = 'test'
19
+
20
+ require File.expand_path('../dummy/config/environment.rb', __FILE__)
21
+
22
+ require 'rspec/rails'
23
+ require 'database_cleaner'
24
+ require 'ffaker'
25
+
26
+ # Requires supporting ruby files with custom matchers and macros, etc,
27
+ # in spec/support/ and its subdirectories.
28
+ Dir[File.join(File.dirname(__FILE__), 'support/**/*.rb')].each { |f| require f }
29
+
30
+ # Requires factories and other useful helpers defined in spree_core.
31
+ require 'spree/testing_support/authorization_helpers'
32
+ require 'spree/testing_support/capybara_ext'
33
+ require 'spree/testing_support/controller_requests'
34
+ require 'spree/testing_support/factories'
35
+ require 'spree/testing_support/url_helpers'
36
+ require 'spree/testing_support/order_walkthrough'
37
+
38
+ # Requires factories defined in lib/spree_braintree_vzero/factories.rb
39
+ require 'spree_braintree_vzero/factories'
40
+
41
+ require 'pry'
42
+
43
+ RSpec.configure do |config|
44
+ config.include FactoryBot::Syntax::Methods
45
+
46
+ # Infer an example group's spec type from the file location.
47
+ config.infer_spec_type_from_file_location!
48
+
49
+ # == URL Helpers
50
+ #
51
+ # Allows access to Spree's routes in specs:
52
+ #
53
+ # visit spree.admin_path
54
+ # current_path.should eql(spree.products_path)
55
+ config.include Spree::TestingSupport::UrlHelpers
56
+
57
+ # == Requests support
58
+ #
59
+ # Adds convenient methods to request Spree's controllers
60
+ # spree_get :index
61
+ config.include Spree::TestingSupport::ControllerRequests, type: :controller
62
+
63
+ # == Mock Framework
64
+ #
65
+ # If you prefer to use mocha, flexmock or RR, uncomment the appropriate line:
66
+ #
67
+ # config.mock_with :mocha
68
+ # config.mock_with :flexmock
69
+ # config.mock_with :rr
70
+ config.mock_with :rspec
71
+ config.color = true
72
+
73
+ # Remove this line if you're not using ActiveRecord or ActiveRecord fixtures
74
+ config.fixture_path = "#{::Rails.root}/spec/fixtures"
75
+
76
+ # Capybara javascript drivers require transactional fixtures set to false, and we use DatabaseCleaner
77
+ # to cleanup after each test instead. Without transactional fixtures set to false the records created
78
+ # to setup a test will be unavailable to the browser, which runs under a separate server instance.
79
+ config.use_transactional_fixtures = false
80
+
81
+ # Ensure Suite is set to use transactions for speed.
82
+ config.before :suite do
83
+ DatabaseCleaner.strategy = :transaction
84
+ DatabaseCleaner.clean_with :truncation
85
+ end
86
+
87
+ # Before each spec check if it is a Javascript test and switch between using database transactions or not where necessary.
88
+ config.before :each do
89
+ DatabaseCleaner.strategy = RSpec.current_example.metadata[:js] ? :truncation : :transaction
90
+ DatabaseCleaner.start
91
+ end
92
+
93
+ # After each spec clean the database.
94
+ config.after :each do
95
+ DatabaseCleaner.clean
96
+ end
97
+
98
+ config.fail_fast = ENV['FAIL_FAST'] || false
99
+ config.order = 'random'
100
+ end
@@ -0,0 +1,10 @@
1
+ require 'vcr'
2
+
3
+ VCR.configure do |config|
4
+ config.cassette_library_dir = 'spec/vcr'
5
+ config.hook_into :webmock
6
+ config.ignore_localhost = true
7
+ config.configure_rspec_metadata!
8
+ config.default_cassette_options = { match_requests_on: [:method, :host], record: :new_episodes }
9
+ config.ignore_hosts 'codeclimate.com'
10
+ end
@@ -0,0 +1,91 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: post
5
+ uri: https://5ffsvj9qxt38xptf:50ea069d312d35fbf779a66b6c86b897@api.sandbox.braintreegateway.com/merchants/zt9ssvxzppgzdjmn/transactions
6
+ body:
7
+ encoding: UTF-8
8
+ string: |
9
+ <?xml version="1.0" encoding="UTF-8"?>
10
+ <transaction>
11
+ <channel>SpreeCommerceInc_Cart_Braintree</channel>
12
+ <customer>
13
+ </customer>
14
+ <payment-method-nonce>fake-invalid-nonce</payment-method-nonce>
15
+ <amount>29.99</amount>
16
+ <order-id>R774803962</order-id>
17
+ <descriptor>
18
+ <name></name>
19
+ </descriptor>
20
+ <options>
21
+ <submit-for-settlement type="boolean">false</submit-for-settlement>
22
+ <add-billing-address-to-payment-method type="boolean">false</add-billing-address-to-payment-method>
23
+ <three-d-secure>
24
+ <required nil="true"/>
25
+ </three-d-secure>
26
+ <store-in-vault type="boolean">false</store-in-vault>
27
+ </options>
28
+ <type>sale</type>
29
+ </transaction>
30
+ headers:
31
+ Accept-Encoding:
32
+ - gzip
33
+ Accept:
34
+ - application/xml
35
+ User-Agent:
36
+ - Braintree Ruby Gem 2.73.0
37
+ X-Apiversion:
38
+ - '4'
39
+ Content-Type:
40
+ - application/xml
41
+ response:
42
+ status:
43
+ code: 422
44
+ message: Unprocessable Entity
45
+ headers:
46
+ Date:
47
+ - Sun, 09 Apr 2017 10:52:22 GMT
48
+ Content-Type:
49
+ - application/xml; charset=utf-8
50
+ Transfer-Encoding:
51
+ - chunked
52
+ X-Frame-Options:
53
+ - SAMEORIGIN
54
+ - SAMEORIGIN
55
+ X-Xss-Protection:
56
+ - 1; mode=block
57
+ X-Content-Type-Options:
58
+ - nosniff
59
+ X-Authentication:
60
+ - basic_auth
61
+ X-User:
62
+ - vzw4dwqpkk82wnfg
63
+ Vary:
64
+ - Accept-Encoding
65
+ Content-Encoding:
66
+ - gzip
67
+ Cache-Control:
68
+ - no-cache
69
+ X-Request-Id:
70
+ - 680372b6-1653-4628-ba65-446bbcb07235
71
+ X-Runtime:
72
+ - '0.157729'
73
+ Strict-Transport-Security:
74
+ - max-age=31536000; includeSubDomains
75
+ body:
76
+ encoding: ASCII-8BIT
77
+ string: !binary |-
78
+ H4sIAGYS6lgAA6RUTW/bMAy991cYvituu/XDgKICLTBg1209B4zNNkIlSqPk
79
+ rPn3kx1/xK07DOhN5CMpvkdK8u7VmmyPHLSjdX6xOs8zpMrVmp7X+eOvb+I2
80
+ v1NnErwWyOxYMAbvKKA6yzLZuUJ7HI0sHjyuc2CGQ170UGSgAFVMlxw9y+ED
81
+ NqCTnTypKVTlxdX1lSy68ykIMbLeNhH7euFgt87kysPBIsWNxbhz9YYcVSiL
82
+ MXpWw2II8IzqkV7I/aHMcYavXjPW2VKZlSyGjKntYtZ3bw4CFW9kOIWlBwYb
83
+ /qFXtQMiNOqnZ8QHZy1yhd+p2jwAx809g6aYkCROHzgmNiG6FJ2RNus8coPD
84
+ XLprO2biyEx0zNQTvKDQtAeje5csFgOHKmBdQ1FdlquyTPIerQF0XCMLXasf
85
+ Nzdfb8+/lNeXshidQ1SNoWLt4+nUJYHFxbaL9+HS+VavcJIemq3VUTyltQ0Y
86
+ o8GWQWJnQiK0DE7JUNdiq41JL0Gkc9r7IKITcx2GYv8XPBWPuzQqUaebq4bn
87
+ a8j4u+mWboF3t0QfpMo0ZW7HJvbQmInm3DsK+EYt2b4bFcCklO740cpOe/qZ
88
+ B5MUW/hR/gIAAP//AwBjnbFpjgQAAA==
89
+ http_version:
90
+ recorded_at: Sun, 09 Apr 2017 10:52:22 GMT
91
+ recorded_with: VCR 3.0.3