solidus_paypal_braintree 1.1.0 → 1.1.2

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 (74) hide show
  1. checksums.yaml +4 -4
  2. data/.circleci/config.yml +4 -0
  3. data/.gitignore +1 -0
  4. data/.rubocop.yml +1 -1
  5. data/CHANGELOG.md +70 -1
  6. data/Gemfile +9 -6
  7. data/app/models/solidus_paypal_braintree/gateway.rb +5 -3
  8. data/app/models/solidus_paypal_braintree/transaction.rb +2 -2
  9. data/app/models/solidus_paypal_braintree/transaction_import.rb +2 -2
  10. data/lib/solidus_paypal_braintree/engine.rb +5 -3
  11. data/lib/solidus_paypal_braintree/factories.rb +5 -5
  12. data/lib/solidus_paypal_braintree/version.rb +1 -1
  13. data/lib/views/frontend/solidus_paypal_braintree/payments/_payment.html.erb +3 -3
  14. data/solidus_paypal_braintree.gemspec +0 -1
  15. metadata +4 -122
  16. data/spec/controllers/solidus_paypal_braintree/checkouts_controller_spec.rb +0 -99
  17. data/spec/controllers/solidus_paypal_braintree/client_tokens_controller_spec.rb +0 -55
  18. data/spec/controllers/solidus_paypal_braintree/configurations_controller_spec.rb +0 -73
  19. data/spec/controllers/solidus_paypal_braintree/transactions_controller_spec.rb +0 -183
  20. data/spec/features/backend/configuration_spec.rb +0 -23
  21. data/spec/features/backend/new_payment_spec.rb +0 -137
  22. data/spec/features/frontend/braintree_credit_card_checkout_spec.rb +0 -191
  23. data/spec/features/frontend/paypal_checkout_spec.rb +0 -166
  24. data/spec/features/frontend/venmo_checkout_spec.rb +0 -189
  25. data/spec/fixtures/cassettes/admin/invalid_credit_card.yml +0 -63
  26. data/spec/fixtures/cassettes/admin/resubmit_credit_card.yml +0 -352
  27. data/spec/fixtures/cassettes/admin/valid_credit_card.yml +0 -412
  28. data/spec/fixtures/cassettes/braintree/create_profile.yml +0 -71
  29. data/spec/fixtures/cassettes/braintree/generate_token.yml +0 -63
  30. data/spec/fixtures/cassettes/braintree/token.yml +0 -63
  31. data/spec/fixtures/cassettes/checkout/invalid_credit_card.yml +0 -63
  32. data/spec/fixtures/cassettes/checkout/resubmit_credit_card.yml +0 -216
  33. data/spec/fixtures/cassettes/checkout/update.yml +0 -71
  34. data/spec/fixtures/cassettes/checkout/valid_credit_card.yml +0 -156
  35. data/spec/fixtures/cassettes/checkout/valid_venmo_transaction.yml +0 -599
  36. data/spec/fixtures/cassettes/gateway/authorize/credit_card/address.yml +0 -86
  37. data/spec/fixtures/cassettes/gateway/authorize/merchant_account/EUR.yml +0 -154
  38. data/spec/fixtures/cassettes/gateway/authorize/paypal/EUR.yml +0 -90
  39. data/spec/fixtures/cassettes/gateway/authorize/paypal/address.yml +0 -90
  40. data/spec/fixtures/cassettes/gateway/authorize.yml +0 -86
  41. data/spec/fixtures/cassettes/gateway/authorized_transaction.yml +0 -73
  42. data/spec/fixtures/cassettes/gateway/cancel/missing.yml +0 -63
  43. data/spec/fixtures/cassettes/gateway/cancel/refunds.yml +0 -272
  44. data/spec/fixtures/cassettes/gateway/cancel/void.yml +0 -201
  45. data/spec/fixtures/cassettes/gateway/capture.yml +0 -141
  46. data/spec/fixtures/cassettes/gateway/complete.yml +0 -157
  47. data/spec/fixtures/cassettes/gateway/credit.yml +0 -208
  48. data/spec/fixtures/cassettes/gateway/purchase.yml +0 -87
  49. data/spec/fixtures/cassettes/gateway/settled_transaction.yml +0 -140
  50. data/spec/fixtures/cassettes/gateway/void.yml +0 -137
  51. data/spec/fixtures/cassettes/source/card_type.yml +0 -267
  52. data/spec/fixtures/cassettes/source/last4.yml +0 -267
  53. data/spec/fixtures/cassettes/transaction/import/valid/capture.yml +0 -224
  54. data/spec/fixtures/cassettes/transaction/import/valid.yml +0 -71
  55. data/spec/fixtures/views/spree/orders/edit.html.erb +0 -50
  56. data/spec/helpers/solidus_paypal_braintree/braintree_admin_helper_spec.rb +0 -17
  57. data/spec/helpers/solidus_paypal_braintree/braintree_checkout_helper_spec.rb +0 -70
  58. data/spec/models/solidus_paypal_braintree/address_spec.rb +0 -71
  59. data/spec/models/solidus_paypal_braintree/avs_result_spec.rb +0 -317
  60. data/spec/models/solidus_paypal_braintree/gateway_spec.rb +0 -692
  61. data/spec/models/solidus_paypal_braintree/response_spec.rb +0 -280
  62. data/spec/models/solidus_paypal_braintree/source_spec.rb +0 -499
  63. data/spec/models/solidus_paypal_braintree/transaction_address_spec.rb +0 -235
  64. data/spec/models/solidus_paypal_braintree/transaction_import_spec.rb +0 -300
  65. data/spec/models/solidus_paypal_braintree/transaction_spec.rb +0 -85
  66. data/spec/models/spree/store_spec.rb +0 -14
  67. data/spec/requests/spree/api/orders_controller_spec.rb +0 -36
  68. data/spec/spec_helper.rb +0 -29
  69. data/spec/support/capybara.rb +0 -7
  70. data/spec/support/factories.rb +0 -2
  71. data/spec/support/gateway_helpers.rb +0 -29
  72. data/spec/support/order_ready_for_payment.rb +0 -37
  73. data/spec/support/vcr.rb +0 -42
  74. data/spec/support/views.rb +0 -1
@@ -1,73 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe SolidusPaypalBraintree::ConfigurationsController, type: :controller do
4
- routes { SolidusPaypalBraintree::Engine.routes }
5
-
6
- let!(:store_1) { create :store }
7
- let!(:store_2) { create :store }
8
-
9
- stub_authorization!
10
-
11
- describe "GET #list" do
12
- subject { get :list }
13
-
14
- it "assigns all store's configurations as @configurations" do
15
- subject
16
- expect(assigns(:configurations)).
17
- to eq [store_1.braintree_configuration, store_2.braintree_configuration]
18
- end
19
-
20
- it "renders the correct view" do
21
- expect(subject).to render_template :list
22
- end
23
- end
24
-
25
- describe "POST #update" do
26
- subject { post :update, params: configurations_params }
27
-
28
- let(:paypal_button_color) { 'blue' }
29
- let(:configurations_params) do
30
- {
31
- configurations: {
32
- configuration_fields: {
33
- store_1.braintree_configuration.id.to_s => { paypal: true, apple_pay: true },
34
- store_2.braintree_configuration.id.to_s => {
35
- paypal: true,
36
- apple_pay: false,
37
- preferred_paypal_button_color: paypal_button_color
38
- }
39
- }
40
- }
41
- }
42
- end
43
-
44
- context "with valid parameters" do
45
- it "updates the configuration" do
46
- expect { subject }.to change { store_1.braintree_configuration.reload.paypal }.
47
- from(false).to(true)
48
- end
49
-
50
- it "displays a success message to the user" do
51
- subject
52
- expect(flash[:success]).to eq "Successfully updated Braintree configurations."
53
- end
54
-
55
- it "displays all configurations" do
56
- expect(subject).to redirect_to action: :list
57
- end
58
- end
59
-
60
- context "with invalid parameters" do
61
- let(:paypal_button_color) { 'invalid-color' }
62
-
63
- it "displays an error message to the user" do
64
- subject
65
- expect(flash[:error]).to eq "An error occurred while updating Braintree configurations."
66
- end
67
-
68
- it "returns the user to the edit page" do
69
- expect(subject).to redirect_to action: :list
70
- end
71
- end
72
- end
73
- end
@@ -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