solidus_paypal_braintree 1.1.0 → 1.1.1

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 (71) hide show
  1. checksums.yaml +4 -4
  2. data/.circleci/config.yml +4 -0
  3. data/.gitignore +1 -0
  4. data/CHANGELOG.md +70 -1
  5. data/Gemfile +2 -5
  6. data/app/models/solidus_paypal_braintree/gateway.rb +2 -0
  7. data/app/models/solidus_paypal_braintree/transaction.rb +2 -2
  8. data/app/models/solidus_paypal_braintree/transaction_import.rb +2 -2
  9. data/lib/solidus_paypal_braintree/engine.rb +5 -3
  10. data/lib/solidus_paypal_braintree/version.rb +1 -1
  11. data/solidus_paypal_braintree.gemspec +0 -1
  12. metadata +7 -125
  13. data/spec/controllers/solidus_paypal_braintree/checkouts_controller_spec.rb +0 -99
  14. data/spec/controllers/solidus_paypal_braintree/client_tokens_controller_spec.rb +0 -55
  15. data/spec/controllers/solidus_paypal_braintree/configurations_controller_spec.rb +0 -73
  16. data/spec/controllers/solidus_paypal_braintree/transactions_controller_spec.rb +0 -183
  17. data/spec/features/backend/configuration_spec.rb +0 -23
  18. data/spec/features/backend/new_payment_spec.rb +0 -137
  19. data/spec/features/frontend/braintree_credit_card_checkout_spec.rb +0 -191
  20. data/spec/features/frontend/paypal_checkout_spec.rb +0 -166
  21. data/spec/features/frontend/venmo_checkout_spec.rb +0 -189
  22. data/spec/fixtures/cassettes/admin/invalid_credit_card.yml +0 -63
  23. data/spec/fixtures/cassettes/admin/resubmit_credit_card.yml +0 -352
  24. data/spec/fixtures/cassettes/admin/valid_credit_card.yml +0 -412
  25. data/spec/fixtures/cassettes/braintree/create_profile.yml +0 -71
  26. data/spec/fixtures/cassettes/braintree/generate_token.yml +0 -63
  27. data/spec/fixtures/cassettes/braintree/token.yml +0 -63
  28. data/spec/fixtures/cassettes/checkout/invalid_credit_card.yml +0 -63
  29. data/spec/fixtures/cassettes/checkout/resubmit_credit_card.yml +0 -216
  30. data/spec/fixtures/cassettes/checkout/update.yml +0 -71
  31. data/spec/fixtures/cassettes/checkout/valid_credit_card.yml +0 -156
  32. data/spec/fixtures/cassettes/checkout/valid_venmo_transaction.yml +0 -599
  33. data/spec/fixtures/cassettes/gateway/authorize/credit_card/address.yml +0 -86
  34. data/spec/fixtures/cassettes/gateway/authorize/merchant_account/EUR.yml +0 -154
  35. data/spec/fixtures/cassettes/gateway/authorize/paypal/EUR.yml +0 -90
  36. data/spec/fixtures/cassettes/gateway/authorize/paypal/address.yml +0 -90
  37. data/spec/fixtures/cassettes/gateway/authorize.yml +0 -86
  38. data/spec/fixtures/cassettes/gateway/authorized_transaction.yml +0 -73
  39. data/spec/fixtures/cassettes/gateway/cancel/missing.yml +0 -63
  40. data/spec/fixtures/cassettes/gateway/cancel/refunds.yml +0 -272
  41. data/spec/fixtures/cassettes/gateway/cancel/void.yml +0 -201
  42. data/spec/fixtures/cassettes/gateway/capture.yml +0 -141
  43. data/spec/fixtures/cassettes/gateway/complete.yml +0 -157
  44. data/spec/fixtures/cassettes/gateway/credit.yml +0 -208
  45. data/spec/fixtures/cassettes/gateway/purchase.yml +0 -87
  46. data/spec/fixtures/cassettes/gateway/settled_transaction.yml +0 -140
  47. data/spec/fixtures/cassettes/gateway/void.yml +0 -137
  48. data/spec/fixtures/cassettes/source/card_type.yml +0 -267
  49. data/spec/fixtures/cassettes/source/last4.yml +0 -267
  50. data/spec/fixtures/cassettes/transaction/import/valid/capture.yml +0 -224
  51. data/spec/fixtures/cassettes/transaction/import/valid.yml +0 -71
  52. data/spec/fixtures/views/spree/orders/edit.html.erb +0 -50
  53. data/spec/helpers/solidus_paypal_braintree/braintree_admin_helper_spec.rb +0 -17
  54. data/spec/helpers/solidus_paypal_braintree/braintree_checkout_helper_spec.rb +0 -70
  55. data/spec/models/solidus_paypal_braintree/address_spec.rb +0 -71
  56. data/spec/models/solidus_paypal_braintree/avs_result_spec.rb +0 -317
  57. data/spec/models/solidus_paypal_braintree/gateway_spec.rb +0 -692
  58. data/spec/models/solidus_paypal_braintree/response_spec.rb +0 -280
  59. data/spec/models/solidus_paypal_braintree/source_spec.rb +0 -499
  60. data/spec/models/solidus_paypal_braintree/transaction_address_spec.rb +0 -235
  61. data/spec/models/solidus_paypal_braintree/transaction_import_spec.rb +0 -300
  62. data/spec/models/solidus_paypal_braintree/transaction_spec.rb +0 -85
  63. data/spec/models/spree/store_spec.rb +0 -14
  64. data/spec/requests/spree/api/orders_controller_spec.rb +0 -36
  65. data/spec/spec_helper.rb +0 -29
  66. data/spec/support/capybara.rb +0 -7
  67. data/spec/support/factories.rb +0 -2
  68. data/spec/support/gateway_helpers.rb +0 -29
  69. data/spec/support/order_ready_for_payment.rb +0 -37
  70. data/spec/support/vcr.rb +0 -42
  71. data/spec/support/views.rb +0 -1
@@ -1,183 +0,0 @@
1
- require 'spec_helper'
2
-
3
- RSpec.describe SolidusPaypalBraintree::TransactionsController, type: :controller do
4
- routes { SolidusPaypalBraintree::Engine.routes }
5
-
6
- let!(:country) { create :country }
7
- let(:line_item) { create :line_item, price: 50 }
8
- let(:order) do
9
- Spree::Order.create!(
10
- line_items: [line_item],
11
- email: 'test@example.com',
12
- bill_address: create(:address, country: country),
13
- ship_address: create(:address, country: country),
14
- user: create(:user)
15
- )
16
- end
17
-
18
- let(:payment_method) { create_gateway }
19
-
20
- before do
21
- allow(controller).to receive(:spree_current_user) { order.user }
22
- allow(controller).to receive(:current_order) { order }
23
- create :shipping_method, cost: 5
24
- create :state, abbr: "WA", country: country
25
- end
26
-
27
- cassette_options = {
28
- cassette_name: "transactions_controller/create",
29
- match_requests_on: [:braintree_uri]
30
- }
31
- describe "POST create", vcr: cassette_options do
32
- subject(:post_create) { post :create, params: params }
33
-
34
- let!(:country) { create :country, iso: 'US' }
35
-
36
- let(:params) do
37
- {
38
- transaction: {
39
- nonce: "fake-valid-nonce",
40
- payment_type: SolidusPaypalBraintree::Source::PAYPAL,
41
- phone: "1112223333",
42
- email: "batman@example.com",
43
- address_attributes: {
44
- name: "Wade Wilson",
45
- address_line_1: "123 Fake Street",
46
- city: "Seattle",
47
- zip: "98101",
48
- state_code: "WA",
49
- country_code: "US"
50
- }
51
- },
52
- payment_method_id: payment_method.id
53
- }
54
- end
55
-
56
- before do
57
- create :state, abbr: "WA", country: country
58
- end
59
-
60
- context "when import has invalid address" do
61
- before { params[:transaction][:address_attributes][:city] = nil }
62
-
63
- it "raises a validation error" do
64
- expect { post_create }.to raise_error(
65
- SolidusPaypalBraintree::TransactionsController::InvalidImportError,
66
- "Import invalid: " \
67
- "Address is invalid, " \
68
- "Address city can't be blank"
69
- )
70
- end
71
- end
72
-
73
- context "when the transaction is valid", vcr: {
74
- cassette_name: 'transaction/import/valid',
75
- match_requests_on: [:braintree_uri]
76
- } do
77
- it "imports the payment" do
78
- expect { post_create }.to change { order.payments.count }.by(1)
79
- expect(order.payments.first.amount).to eq 55
80
- end
81
-
82
- context "when no end state is provided" do
83
- it "advances the order to confirm" do
84
- post_create
85
- expect(order).to be_confirm
86
- end
87
- end
88
-
89
- context "when end state provided is delivery" do
90
- let(:params) { super().merge(state: 'delivery') }
91
-
92
- it "advances the order to delivery" do
93
- post_create
94
- expect(order).to be_delivery
95
- end
96
- end
97
-
98
- context "with provided address" do
99
- it "creates a new address" do
100
- # Creating the order also creates 3 addresses, we want to make sure
101
- # the transaction import only creates 1 new one
102
- order
103
- expect { post_create }.to change { Spree::Address.count }.by(1)
104
- expect(Spree::Address.last.address1).to eq "123 Fake Street"
105
- end
106
- end
107
-
108
- context "without country ISO" do
109
- before do
110
- params[:transaction][:address_attributes][:country_code] = ""
111
- params[:transaction][:address_attributes][:country_name] = "United States"
112
- end
113
-
114
- it "creates a new address, looking up the ISO by country name" do
115
- order
116
- expect { post_create }.to change { Spree::Address.count }.by(1)
117
- expect(Spree::Address.last.country.iso).to eq "US"
118
- end
119
- end
120
-
121
- context "without transaction address" do
122
- before { params[:transaction].delete(:address_attributes) }
123
-
124
- it "does not create a new address" do
125
- order
126
- expect { post_create }.not_to(change { Spree::Address.count })
127
- end
128
- end
129
-
130
- context "when format is HTML" do
131
- context "when import! leaves the order in confirm" do
132
- it "redirects the user to the confirm page" do
133
- expect(post_create).to redirect_to spree.checkout_state_path("confirm")
134
- end
135
- end
136
-
137
- context "when import! completes the order" do
138
- before { allow(order).to receive(:complete?).and_return(true) }
139
-
140
- it "displays the order to the user" do
141
- expect(post_create).to redirect_to spree.order_path(order)
142
- end
143
- end
144
- end
145
-
146
- context "when format is JSON" do
147
- before { params[:format] = :json }
148
-
149
- it "has a successful response" do
150
- post_create
151
- expect(response).to be_successful
152
- end
153
- end
154
- end
155
-
156
- context "when the transaction is invalid" do
157
- before { params[:transaction][:email] = nil }
158
-
159
- context "when format is HTML" do
160
- it "raises an error including the validation messages" do
161
- expect { post_create }.to raise_error(
162
- SolidusPaypalBraintree::TransactionsController::InvalidImportError,
163
- "Import invalid: Email can't be blank"
164
- )
165
- end
166
- end
167
-
168
- context "when format is JSON" do
169
- before { params[:format] = :json }
170
-
171
- it "has a failed status" do
172
- post_create
173
- expect(response.status).to eq 422
174
- end
175
-
176
- it "returns the errors as JSON" do
177
- post_create
178
- expect(JSON.parse(response.body)["errors"]["email"]).to eq ["can't be blank"]
179
- end
180
- end
181
- end
182
- end
183
- end
@@ -1,23 +0,0 @@
1
- require 'spec_helper'
2
-
3
- RSpec.describe "viewing the configuration interface" do
4
- stub_authorization!
5
-
6
- # Regression to ensure this page still renders on old versions of solidus
7
- it "doesn't raise any errors due to unavailable route helpers" do
8
- visit "/solidus_paypal_braintree/configurations/list"
9
- expect(page).to have_content("Braintree Configurations")
10
- end
11
-
12
- # Regression to ensure this page renders on Solidus 2.4
13
- it "doesn't raise any errors due to unavailable preference field partial" do
14
- Rails.application.config.spree.payment_methods << SolidusPaypalBraintree::Gateway
15
- Spree::PaymentMethod.create!(
16
- type: 'SolidusPaypalBraintree::Gateway',
17
- name: 'Braintree Payments'
18
- )
19
- visit '/admin/payment_methods'
20
- page.find('a[title="Edit"]').click
21
- expect(page).to have_field 'Name', with: 'Braintree Payments'
22
- end
23
- end
@@ -1,137 +0,0 @@
1
- require 'spec_helper'
2
- require 'spree/testing_support/order_walkthrough'
3
-
4
- shared_context "with backend checkout setup" do
5
- let(:braintree) { new_gateway(active: true) }
6
- let!(:gateway) { create :payment_method }
7
- let(:order) { create(:completed_order_with_totals, number: 'R9999999') }
8
- let(:pending_case_insensitive) { /pending/i }
9
- let(:expiration) { "02/#{Date.current.year.next}" }
10
-
11
- before do
12
- braintree.save!
13
- create(:store, payment_methods: [gateway, braintree]).tap do |store|
14
- store.braintree_configuration.update!(credit_card: true)
15
- end
16
-
17
- allow_any_instance_of(SolidusPaypalBraintree::Source).to receive(:nonce).and_return("fake-valid-nonce")
18
-
19
- # Order and payment numbers must be identical between runs to re-use the VCR
20
- # cassette
21
- allow_any_instance_of(Spree::Payment).to receive(:number).and_return("123ABC")
22
- end
23
-
24
- around do |example|
25
- Capybara.using_wait_time(20) { example.run }
26
- end
27
- end
28
-
29
- describe 'creating a new payment', type: :feature, js: true do
30
- stub_authorization!
31
-
32
- context "with valid credit card data", vcr: {
33
- cassette_name: 'admin/valid_credit_card',
34
- match_requests_on: [:braintree_uri]
35
- } do
36
- include_context "with backend checkout setup"
37
-
38
- it "checks out successfully" do
39
- visit "/admin/orders/#{order.number}/payments/new"
40
- choose('Braintree')
41
- expect(page).to have_selector("#payment_method_#{braintree.id}", visible: :visible)
42
- expect(page).to have_selector("iframe#braintree-hosted-field-number")
43
-
44
- within_frame("braintree-hosted-field-number") do
45
- fill_in("credit-card-number", with: "4111111111111111")
46
- end
47
- within_frame("braintree-hosted-field-expirationDate") do
48
- fill_in("expiration", with: expiration)
49
- end
50
- within_frame("braintree-hosted-field-cvv") do
51
- fill_in("cvv", with: "123")
52
- end
53
-
54
- click_button("Update")
55
-
56
- within('table#payments') do
57
- expect(page).to have_content('Braintree')
58
- expect(page).to have_content(pending_case_insensitive)
59
- end
60
-
61
- click_icon(:capture)
62
-
63
- expect(page).not_to have_content('Cannot perform requested operation')
64
- expect(page).to have_content('Payment Updated')
65
- end
66
- end
67
-
68
- context "with invalid credit card data" do
69
- include_context "with backend checkout setup"
70
-
71
- # Attempt to submit an invalid form once
72
- before do
73
- visit "/admin/orders/#{order.number}/payments/new"
74
- choose('Braintree')
75
-
76
- within_frame("braintree-hosted-field-number") do
77
- fill_in("credit-card-number", with: "1111111111111111")
78
- end
79
- within_frame("braintree-hosted-field-expirationDate") do
80
- fill_in("expiration", with: expiration)
81
- end
82
- within_frame("braintree-hosted-field-cvv") do
83
- fill_in("cvv", with: "123")
84
- end
85
-
86
- click_button "Update"
87
- end
88
-
89
- it "displays a meaningful error message" do
90
- expect(page).to have_text(
91
- "BraintreeError: Some payment input fields are invalid. Cannot tokenize invalid card fields."
92
- )
93
- end
94
-
95
- # Same error should be produced when submitting an empty form again
96
- context "when user tries to resubmit another invalid form", vcr: {
97
- cassette_name: "admin/invalid_credit_card",
98
- match_requests_on: [:braintree_uri]
99
- } do
100
- it "displays a meaningful error message" do
101
- click_button "Update"
102
- expect(page).to have_text(
103
- "BraintreeError: Some payment input fields are invalid. Cannot tokenize invalid card fields."
104
- )
105
- end
106
- end
107
-
108
- # User should be able to checkout after submit fails once
109
- context "when user enters valid data", vcr: {
110
- cassette_name: "admin/resubmit_credit_card",
111
- match_requests_on: [:braintree_uri]
112
- } do
113
- it "creates the payment successfully" do
114
- within_frame("braintree-hosted-field-number") do
115
- fill_in("credit-card-number", with: "4111111111111111")
116
- end
117
- within_frame("braintree-hosted-field-expirationDate") do
118
- fill_in("expiration", with: expiration)
119
- end
120
- within_frame("braintree-hosted-field-cvv") do
121
- fill_in("cvv", with: "123")
122
- end
123
- click_button("Update")
124
-
125
- within('table#payments') do
126
- expect(page).to have_content('Braintree')
127
- expect(page).to have_content(pending_case_insensitive)
128
- end
129
-
130
- click_icon(:capture)
131
-
132
- expect(page).not_to have_content('Cannot perform requested operation')
133
- expect(page).to have_content('Payment Updated')
134
- end
135
- end
136
- end
137
- end
@@ -1,191 +0,0 @@
1
- require 'spec_helper'
2
- require 'spree/testing_support/order_walkthrough'
3
-
4
- shared_context "with frontend checkout setup" do
5
- let(:braintree) { new_gateway(active: true) }
6
- let!(:gateway) { create :payment_method }
7
- let(:three_d_secure_enabled) { false }
8
- let(:venmo_enabled) { false }
9
- let(:card_number) { "4111111111111111" }
10
- let(:card_expiration) { "01/#{Time.now.utc.year + 2}" }
11
-
12
- before do
13
- braintree.save!
14
-
15
- create(:store, payment_methods: [gateway, braintree]).tap do |store|
16
- store.braintree_configuration.update!(
17
- credit_card: true,
18
- three_d_secure: three_d_secure_enabled,
19
- venmo: venmo_enabled
20
- )
21
-
22
- braintree.update(
23
- preferred_credit_card_fields_style: { input: { 'font-size': '30px' } },
24
- preferred_placeholder_text: { number: "Enter Your Card Number" }
25
- )
26
- end
27
-
28
- order = if Spree.solidus_gem_version >= Gem::Version.new('2.6.0')
29
- Spree::TestingSupport::OrderWalkthrough.up_to(:delivery)
30
- else
31
- OrderWalkthrough.up_to(:delivery)
32
- end
33
-
34
- user = create(:user)
35
- order.user = user
36
- order.number = "R9999999"
37
- order.recalculate
38
-
39
- allow_any_instance_of(Spree::CheckoutController).to receive_messages(current_order: order)
40
- allow_any_instance_of(Spree::CheckoutController).to receive_messages(try_spree_current_user: user)
41
- allow_any_instance_of(Spree::Payment).to receive(:number).and_return("123ABC")
42
- allow_any_instance_of(SolidusPaypalBraintree::Source).to receive(:nonce).and_return("fake-valid-nonce")
43
-
44
- visit spree.checkout_state_path(:delivery)
45
- click_button "Save and Continue"
46
- choose("Braintree")
47
- end
48
-
49
- around do |example|
50
- Capybara.using_wait_time(20) { example.run }
51
- end
52
- end
53
-
54
- describe 'entering credit card details', type: :feature, js: true do
55
- context 'when page loads' do
56
- include_context "with frontend checkout setup"
57
-
58
- it "selectors display correctly" do
59
- expect(page).to have_selector("#payment_method_#{braintree.id}", visible: :visible)
60
- expect(page).to have_selector("iframe#braintree-hosted-field-number")
61
- expect(page).to have_selector("iframe[type='number']")
62
- end
63
-
64
- it "credit card field style variable is set" do
65
- within_frame("braintree-hosted-field-number") do
66
- expect(find("#credit-card-number").style("font-size")).to eq({ "font-size" => "30px" })
67
- end
68
- end
69
-
70
- it "sets the placeholder text correctly" do
71
- within_frame("braintree-hosted-field-number") do
72
- expect(find("#credit-card-number")['placeholder']).to eq("Enter Your Card Number")
73
- end
74
- end
75
- end
76
-
77
- context "with valid credit card data", vcr: {
78
- cassette_name: 'checkout/valid_credit_card',
79
- match_requests_on: [:braintree_uri]
80
- } do
81
- include_context "with frontend checkout setup"
82
- # To ensure Venmo inputs do not conflict with checkout
83
- let(:venmo_enabled) { true }
84
-
85
- before do
86
- within_frame("braintree-hosted-field-number") do
87
- fill_in("credit-card-number", with: card_number)
88
- end
89
- within_frame("braintree-hosted-field-expirationDate") do
90
- fill_in("expiration", with: card_expiration)
91
- end
92
- within_frame("braintree-hosted-field-cvv") do
93
- fill_in("cvv", with: "123")
94
- end
95
-
96
- click_button("Save and Continue")
97
- end
98
-
99
- it "checks out successfully" do
100
- within("#order_details") do
101
- expect(page).to have_content("CONFIRM")
102
- end
103
- click_button("Place Order")
104
- expect(page).to have_content("Your order has been processed successfully")
105
- end
106
-
107
- context 'with 3D secure enabled' do
108
- let(:three_d_secure_enabled) { true }
109
- let(:card_number) { "4000000000000002" }
110
-
111
- it 'checks out successfully' do
112
- authenticate_3ds
113
-
114
- within("#order_details") do
115
- expect(page).to have_content("CONFIRM")
116
- end
117
-
118
- click_button("Place Order")
119
- expect(page).to have_content("Your order has been processed successfully")
120
- end
121
-
122
- context 'with 3ds authentication error' do
123
- let(:card_number) { "4000000000000028" }
124
-
125
- it 'shows a 3ds authentication error' do
126
- authenticate_3ds
127
- expect(page).to have_content(
128
- "3D Secure authentication failed. Please try again using a different payment method."
129
- )
130
- end
131
- end
132
- end
133
- end
134
-
135
- context "with invalid credit card data" do
136
- include_context "with frontend checkout setup"
137
-
138
- # Attempt to submit an empty form once
139
- before do
140
- click_button "Save and Continue"
141
- end
142
-
143
- it "displays an alert with a meaningful error message" do
144
- expect(page).to have_text I18n.t("solidus_paypal_braintree.errors.empty_fields")
145
- expect(page).to have_selector("input[type='submit']:enabled")
146
- end
147
-
148
- # Same error should be produced when submitting an empty form again
149
- context "when user tries to resubmit an empty form", vcr: { cassette_name: "checkout/invalid_credit_card" } do
150
- it "displays an alert with a meaningful error message" do
151
- expect(page).to have_selector("input[type='submit']:enabled")
152
-
153
- click_button "Save and Continue"
154
- expect(page).to have_text I18n.t("solidus_paypal_braintree.errors.empty_fields")
155
- end
156
- end
157
-
158
- # User should be able to checkout after submit fails once
159
- context "when user enters valid data", vcr: {
160
- cassette_name: "checkout/resubmit_credit_card",
161
- match_requests_on: [:braintree_uri]
162
- } do
163
- it "allows them to resubmit and complete the purchase" do
164
- within_frame("braintree-hosted-field-number") do
165
- fill_in("credit-card-number", with: "4111111111111111")
166
- end
167
- within_frame("braintree-hosted-field-expirationDate") do
168
- fill_in("expiration", with: card_expiration)
169
- end
170
- within_frame("braintree-hosted-field-cvv") do
171
- fill_in("cvv", with: "123")
172
- end
173
- click_button("Save and Continue")
174
- within("#order_details") do
175
- expect(page).to have_content("CONFIRM")
176
- end
177
- click_button("Place Order")
178
- expect(page).to have_content("Your order has been processed successfully")
179
- end
180
- end
181
- end
182
-
183
- def authenticate_3ds
184
- within_frame("Cardinal-CCA-IFrame") do
185
- within_frame("authWindow") do
186
- fill_in("password", with: "1234")
187
- click_button("Submit")
188
- end
189
- end
190
- end
191
- end
@@ -1,166 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe "Checkout", type: :feature, js: true do
4
- Capybara.default_max_wait_time = 60
5
-
6
- # let!(:store) do
7
- # create(:store, payment_methods: [payment_method]).tap do |s|
8
- # s.braintree_configuration.update!(braintree_preferences)
9
- # end
10
- # end
11
- let(:braintree_preferences) { { paypal: true }.merge(paypal_options) }
12
- let(:paypal_options) { {} }
13
-
14
- let!(:country) { create(:country, states_required: true) }
15
- # let!(:state) { create(:state, country: country, abbr: "CA", name: "California") }
16
- # let!(:shipping_method) { create(:shipping_method) }
17
- # let!(:stock_location) { create(:stock_location) }
18
- let!(:mug) { create(:product, name: "RoR Mug") }
19
- let!(:payment_method) { create_gateway }
20
- # let!(:zone) { create(:zone) }
21
-
22
- before do
23
- create(:store, payment_methods: [payment_method]).tap do |s|
24
- s.braintree_configuration.update!(braintree_preferences)
25
- end
26
- create(:state, country: country, abbr: "CA", name: "California")
27
- create(:shipping_method)
28
- create(:stock_location)
29
- create(:zone)
30
- end
31
-
32
- context "when going through express checkout using paypal cart button" do
33
- before do
34
- payment_method
35
- add_mug_to_cart
36
- end
37
-
38
- it "checks out successfully", skip: "Broken. To be revisited" do
39
- pend_if_paypal_slow do
40
- expect_any_instance_of(Spree::Order).to receive(:restart_checkout_flow)
41
- move_through_paypal_popup
42
- expect(page).to have_content("Shipments")
43
- click_on "Place Order"
44
- expect(page).to have_content("Your order has been processed successfully")
45
- end
46
- end
47
-
48
- context 'when using custom paypal button style' do
49
- let(:paypal_options) { { preferred_paypal_button_color: 'blue' } }
50
-
51
- it 'displays required PayPal button style' do
52
- within_frame find('#paypal-button iframe') do
53
- expect(page).to have_selector('.paypal-button-color-blue')
54
- end
55
- end
56
- end
57
- end
58
-
59
- context "when going through regular checkout using paypal payment method" do
60
- before do
61
- payment_method
62
- add_mug_to_cart
63
- click_button("Checkout")
64
- fill_in("order_email", with: "paypal_buyer@paypaltest.com")
65
- click_button("Continue")
66
- fill_in_address
67
- click_button("Save and Continue")
68
- click_button("Save and Continue")
69
- end
70
-
71
- it "formats the address variable correctly" do
72
- expect(page.evaluate_script("address['recipientName']")).to eq "Ryan Bigg"
73
- end
74
-
75
- it "checks out successfully", skip: "Broken. To be revisited" do
76
- pend_if_paypal_slow do
77
- expect_any_instance_of(Spree::Order).not_to receive(:restart_checkout_flow)
78
- move_through_paypal_popup
79
-
80
- expect(page).to have_content("Shipments")
81
- click_on "Place Order"
82
- expect(page).to have_content("Your order has been processed successfully")
83
- end
84
- end
85
- end
86
-
87
- # Selenium does not clear cookies properly between test runs, even when
88
- # using Capybara.reset_sessions!, see:
89
- # https://github.com/jnicklas/capybara/issues/535
90
- #
91
- # This causes Paypal to remain logged in and not prompt for an email on the
92
- # second test run and causes the test to fail. Adding conditional logic for
93
- # this greatly increases the test time, so it is left out since CI runs
94
- # these with poltergeist.
95
- def move_through_paypal_popup
96
- expect(page).to have_css('#paypal-button .paypal-button')
97
-
98
- sleep 2 # the PayPal button is not immediately ready
99
-
100
- popup = page.window_opened_by do
101
- within_frame find('#paypal-button iframe') do
102
- find('div.paypal-button').click
103
- end
104
- end
105
- page.switch_to_window(popup)
106
-
107
- # We don't control this popup window.
108
- # So javascript errors are not our errors.
109
- begin
110
- expect(page).not_to have_selector('body.loading')
111
- fill_in("login_email", with: "stembolt_buyer@stembolttest.com")
112
- click_on "Next"
113
- fill_in("login_password", with: "test1234")
114
-
115
- expect(page).not_to have_selector('body.loading')
116
- click_button("btnLogin")
117
-
118
- expect(page).not_to have_selector('body.loading')
119
- click_button("Continue")
120
- click_button("Agree & Continue")
121
- rescue Selenium::WebDriver::Error::JavascriptError => e
122
- pending "PayPal had javascript errors in their popup window."
123
- raise e
124
- rescue Capybara::ElementNotFound => e
125
- pending "PayPal delivered unkown HTML in their popup window."
126
- raise e
127
- rescue Selenium::WebDriver::Error::NoSuchWindowError => e
128
- pending "PayPal popup not available."
129
- raise e
130
- end
131
-
132
- page.switch_to_window(page.windows.first)
133
- end
134
-
135
- def fill_in_address
136
- address = "order_bill_address_attributes"
137
- if page.has_css?("##{address}_firstname", wait: 0)
138
- fill_in "#{address}_firstname", with: "Ryan"
139
- fill_in "#{address}_lastname", with: "Bigg"
140
- else
141
- fill_in "#{address}_name", with: "Ryan Bigg"
142
- end
143
- fill_in "#{address}_address1", with: "143 Swan Street"
144
- fill_in "#{address}_city", with: "San Jose"
145
- select "United States of America", from: "#{address}_country_id"
146
- select "California", from: "#{address}_state_id"
147
- fill_in "#{address}_zipcode", with: "95131"
148
- fill_in "#{address}_phone", with: "(555) 555-0111"
149
- end
150
-
151
- def add_mug_to_cart
152
- visit spree.root_path
153
- click_link mug.name
154
- click_button "add-to-cart-button"
155
- end
156
-
157
- def pend_if_paypal_slow
158
- yield
159
- rescue RSpec::Expectations::ExpectationNotMetError => e
160
- pending "PayPal did not answer in #{Capybara.default_max_wait_time} seconds."
161
- raise e
162
- rescue Selenium::WebDriver::Error::JavascriptError => e
163
- pending "PayPal delivered wrong payload because of errors in their popup window."
164
- raise e
165
- end
166
- end