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.
- checksums.yaml +4 -4
- data/.circleci/config.yml +4 -0
- data/.gitignore +1 -0
- data/CHANGELOG.md +70 -1
- data/Gemfile +2 -5
- data/app/models/solidus_paypal_braintree/gateway.rb +2 -0
- data/app/models/solidus_paypal_braintree/transaction.rb +2 -2
- data/app/models/solidus_paypal_braintree/transaction_import.rb +2 -2
- data/lib/solidus_paypal_braintree/engine.rb +5 -3
- data/lib/solidus_paypal_braintree/version.rb +1 -1
- data/solidus_paypal_braintree.gemspec +0 -1
- metadata +7 -125
- data/spec/controllers/solidus_paypal_braintree/checkouts_controller_spec.rb +0 -99
- data/spec/controllers/solidus_paypal_braintree/client_tokens_controller_spec.rb +0 -55
- data/spec/controllers/solidus_paypal_braintree/configurations_controller_spec.rb +0 -73
- data/spec/controllers/solidus_paypal_braintree/transactions_controller_spec.rb +0 -183
- data/spec/features/backend/configuration_spec.rb +0 -23
- data/spec/features/backend/new_payment_spec.rb +0 -137
- data/spec/features/frontend/braintree_credit_card_checkout_spec.rb +0 -191
- data/spec/features/frontend/paypal_checkout_spec.rb +0 -166
- data/spec/features/frontend/venmo_checkout_spec.rb +0 -189
- data/spec/fixtures/cassettes/admin/invalid_credit_card.yml +0 -63
- data/spec/fixtures/cassettes/admin/resubmit_credit_card.yml +0 -352
- data/spec/fixtures/cassettes/admin/valid_credit_card.yml +0 -412
- data/spec/fixtures/cassettes/braintree/create_profile.yml +0 -71
- data/spec/fixtures/cassettes/braintree/generate_token.yml +0 -63
- data/spec/fixtures/cassettes/braintree/token.yml +0 -63
- data/spec/fixtures/cassettes/checkout/invalid_credit_card.yml +0 -63
- data/spec/fixtures/cassettes/checkout/resubmit_credit_card.yml +0 -216
- data/spec/fixtures/cassettes/checkout/update.yml +0 -71
- data/spec/fixtures/cassettes/checkout/valid_credit_card.yml +0 -156
- data/spec/fixtures/cassettes/checkout/valid_venmo_transaction.yml +0 -599
- data/spec/fixtures/cassettes/gateway/authorize/credit_card/address.yml +0 -86
- data/spec/fixtures/cassettes/gateway/authorize/merchant_account/EUR.yml +0 -154
- data/spec/fixtures/cassettes/gateway/authorize/paypal/EUR.yml +0 -90
- data/spec/fixtures/cassettes/gateway/authorize/paypal/address.yml +0 -90
- data/spec/fixtures/cassettes/gateway/authorize.yml +0 -86
- data/spec/fixtures/cassettes/gateway/authorized_transaction.yml +0 -73
- data/spec/fixtures/cassettes/gateway/cancel/missing.yml +0 -63
- data/spec/fixtures/cassettes/gateway/cancel/refunds.yml +0 -272
- data/spec/fixtures/cassettes/gateway/cancel/void.yml +0 -201
- data/spec/fixtures/cassettes/gateway/capture.yml +0 -141
- data/spec/fixtures/cassettes/gateway/complete.yml +0 -157
- data/spec/fixtures/cassettes/gateway/credit.yml +0 -208
- data/spec/fixtures/cassettes/gateway/purchase.yml +0 -87
- data/spec/fixtures/cassettes/gateway/settled_transaction.yml +0 -140
- data/spec/fixtures/cassettes/gateway/void.yml +0 -137
- data/spec/fixtures/cassettes/source/card_type.yml +0 -267
- data/spec/fixtures/cassettes/source/last4.yml +0 -267
- data/spec/fixtures/cassettes/transaction/import/valid/capture.yml +0 -224
- data/spec/fixtures/cassettes/transaction/import/valid.yml +0 -71
- data/spec/fixtures/views/spree/orders/edit.html.erb +0 -50
- data/spec/helpers/solidus_paypal_braintree/braintree_admin_helper_spec.rb +0 -17
- data/spec/helpers/solidus_paypal_braintree/braintree_checkout_helper_spec.rb +0 -70
- data/spec/models/solidus_paypal_braintree/address_spec.rb +0 -71
- data/spec/models/solidus_paypal_braintree/avs_result_spec.rb +0 -317
- data/spec/models/solidus_paypal_braintree/gateway_spec.rb +0 -692
- data/spec/models/solidus_paypal_braintree/response_spec.rb +0 -280
- data/spec/models/solidus_paypal_braintree/source_spec.rb +0 -499
- data/spec/models/solidus_paypal_braintree/transaction_address_spec.rb +0 -235
- data/spec/models/solidus_paypal_braintree/transaction_import_spec.rb +0 -300
- data/spec/models/solidus_paypal_braintree/transaction_spec.rb +0 -85
- data/spec/models/spree/store_spec.rb +0 -14
- data/spec/requests/spree/api/orders_controller_spec.rb +0 -36
- data/spec/spec_helper.rb +0 -29
- data/spec/support/capybara.rb +0 -7
- data/spec/support/factories.rb +0 -2
- data/spec/support/gateway_helpers.rb +0 -29
- data/spec/support/order_ready_for_payment.rb +0 -37
- data/spec/support/vcr.rb +0 -42
- 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
|