spree_affirm 0.2.3 → 0.2.19
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 +5 -5
- metadata +26 -75
- data/.gitignore +0 -15
- data/Gemfile +0 -19
- data/LICENSE +0 -29
- data/README.md +0 -51
- data/Rakefile +0 -15
- data/Versionfile +0 -5
- data/app/assets/javascripts/spree/backend/spree_affirm.js +0 -3
- data/app/assets/javascripts/spree/frontend/spree_affirm.js +0 -2
- data/app/assets/stylesheets/spree/backend/spree_affirm.css +0 -4
- data/app/assets/stylesheets/spree/frontend/spree_affirm.css +0 -4
- data/app/controllers/spree/affirm_controller.rb +0 -68
- data/app/models/spree/affirm_checkout.rb +0 -38
- data/app/models/spree/gateway/affirm.rb +0 -51
- data/app/views/spree/admin/log_entries/_affirm.html.erb +0 -4
- data/app/views/spree/admin/log_entries/index.html.erb +0 -28
- data/app/views/spree/admin/payments/source_forms/_affirm.html.erb +0 -19
- data/app/views/spree/admin/payments/source_views/_affirm.html.erb +0 -12
- data/app/views/spree/checkout/payment/_affirm.html.erb +0 -195
- data/bin/rails +0 -7
- data/config/locales/en.yml +0 -29
- data/config/routes.rb +0 -5
- data/db/migrate/20140514194315_create_affirm_checkout.rb +0 -10
- data/lib/active_merchant/billing/affirm.rb +0 -161
- data/lib/generators/spree_affirm/install/install_generator.rb +0 -21
- data/lib/spree_affirm.rb +0 -2
- data/lib/spree_affirm/engine.rb +0 -27
- data/lib/spree_affirm/factories.rb +0 -5
- data/lib/spree_affirm/factories/affirm_checkout_factory.rb +0 -211
- data/lib/spree_affirm/factories/affirm_payment_method_factory.rb +0 -8
- data/lib/spree_affirm/factories/payment_factory.rb +0 -10
- data/lib/spree_affirm/version.rb +0 -3
- data/spec/controllers/affirm_controller_spec.rb +0 -138
- data/spec/lib/active_merchant/billing/affirm_spec.rb +0 -294
- data/spec/models/affirm_address_validator_spec.rb +0 -13
- data/spec/models/spree_affirm_checkout_spec.rb +0 -328
- data/spec/models/spree_gateway_affirm_spec.rb +0 -134
- data/spec/spec_helper.rb +0 -98
- data/spree_affirm.gemspec +0 -30
@@ -1,21 +0,0 @@
|
|
1
|
-
module SpreeAffirm
|
2
|
-
module Generators
|
3
|
-
class InstallGenerator < Rails::Generators::Base
|
4
|
-
|
5
|
-
class_option :auto_run_migrations, :type => :boolean, :default => false
|
6
|
-
|
7
|
-
def add_migrations
|
8
|
-
run 'bundle exec rake railties:install:migrations FROM=spree_affirm'
|
9
|
-
end
|
10
|
-
|
11
|
-
def run_migrations
|
12
|
-
run_migrations = options[:auto_run_migrations] || ['', 'y', 'Y'].include?(ask 'Would you like to run the migrations now? [Y/n]')
|
13
|
-
if run_migrations
|
14
|
-
run 'bundle exec rake db:migrate'
|
15
|
-
else
|
16
|
-
puts 'Skipping rake db:migrate, don\'t forget to run it!'
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
data/lib/spree_affirm.rb
DELETED
data/lib/spree_affirm/engine.rb
DELETED
@@ -1,27 +0,0 @@
|
|
1
|
-
module SpreeAffirm
|
2
|
-
class Engine < Rails::Engine
|
3
|
-
require 'spree/core'
|
4
|
-
isolate_namespace Spree
|
5
|
-
engine_name 'spree_affirm'
|
6
|
-
|
7
|
-
|
8
|
-
# use rspec for tests
|
9
|
-
config.generators do |g|
|
10
|
-
g.test_framework :rspec
|
11
|
-
end
|
12
|
-
|
13
|
-
config.autoload_paths += %W(#{config.root}/lib)
|
14
|
-
|
15
|
-
def self.activate
|
16
|
-
Dir.glob(File.join(File.dirname(__FILE__), '../../app/**/*_decorator*.rb')) do |c|
|
17
|
-
Rails.configuration.cache_classes ? require(c) : load(c)
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
config.to_prepare &method(:activate).to_proc
|
22
|
-
|
23
|
-
initializer "spree.spree_affirm.payment_methods", :after => "spree.register.payment_methods" do |app|
|
24
|
-
app.config.spree.payment_methods << Spree::Gateway::Affirm
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|
@@ -1,211 +0,0 @@
|
|
1
|
-
def BASE_CHECKOUT_DETAILS
|
2
|
-
{
|
3
|
-
"merchant"=> {
|
4
|
-
"public_api_key"=> "PPPPPPPPPPPPPPP",
|
5
|
-
"user_cancel_url"=> "http=>//google.com/cancel",
|
6
|
-
"user_confirmation_url"=> "http=>//google.com/confirm",
|
7
|
-
"name"=> "Test Merchant"
|
8
|
-
},
|
9
|
-
"tax_amount"=> 0,
|
10
|
-
"billing"=> {
|
11
|
-
"address"=> {
|
12
|
-
"city"=> "San Francisco",
|
13
|
-
"street1"=> "12345 Main",
|
14
|
-
"street2"=> "300",
|
15
|
-
"region1_code"=> "AL",
|
16
|
-
"postal_code"=> "55555",
|
17
|
-
"country_code"=> "USA",
|
18
|
-
"for_billing"=> true,
|
19
|
-
"validation_source"=> 3
|
20
|
-
},
|
21
|
-
"email"=> "test@affirm.com",
|
22
|
-
"name"=> {
|
23
|
-
"for_billing"=> true,
|
24
|
-
"last"=> "Doe",
|
25
|
-
"first"=> "John"
|
26
|
-
}
|
27
|
-
},
|
28
|
-
"items"=> {
|
29
|
-
"xxx-xx-xxx-x"=> {
|
30
|
-
"sku"=> "xxx-xx-xxx-x",
|
31
|
-
"item_url"=> "http=>//google.com/products/the-blue-hat",
|
32
|
-
"display_name"=> "The Blue Hat",
|
33
|
-
"unit_price"=> 85000,
|
34
|
-
"qty"=> 1,
|
35
|
-
"item_type"=> "physical",
|
36
|
-
"item_image_url"=> "http=>//google.com/products/6/large/the-blue-hat"
|
37
|
-
}
|
38
|
-
},
|
39
|
-
"shipping"=> {
|
40
|
-
"name"=> {
|
41
|
-
"last"=> "Doe",
|
42
|
-
"first"=> "John"
|
43
|
-
},
|
44
|
-
"address"=> {
|
45
|
-
"city"=> "San Francisco",
|
46
|
-
"street1"=> "12345 Main Street",
|
47
|
-
"street2"=> "300",
|
48
|
-
"region1_code"=> "AL",
|
49
|
-
"postal_code"=> "94110",
|
50
|
-
"country_code"=> "USA",
|
51
|
-
"validation_source"=> 3
|
52
|
-
}
|
53
|
-
},
|
54
|
-
"checkout_id"=> "S123123-456",
|
55
|
-
"currency"=> "USD",
|
56
|
-
"meta"=> {
|
57
|
-
"release"=> "true",
|
58
|
-
"user_timezone"=> "America/Los_Angeles",
|
59
|
-
"__affirm_tracking_uuid"=> "97570a41-cd07-4f52-8869-46c6d2588407"
|
60
|
-
},
|
61
|
-
"discount_code"=> "",
|
62
|
-
"misc_fee_amount"=> 0,
|
63
|
-
"shipping_type"=> "Free National UPS",
|
64
|
-
"config"=> {
|
65
|
-
"required_billing_fields"=> [
|
66
|
-
"name",
|
67
|
-
"address",
|
68
|
-
"email"
|
69
|
-
]
|
70
|
-
},
|
71
|
-
"api_version"=> "v2",
|
72
|
-
"shipping_amount"=> 0
|
73
|
-
}
|
74
|
-
end
|
75
|
-
|
76
|
-
FactoryGirl.define do
|
77
|
-
factory :affirm_checkout, class: Spree::AffirmCheckout do
|
78
|
-
token "12345678910"
|
79
|
-
association(:payment_method, factory: :affirm_payment_method)
|
80
|
-
association(:order, factory: :order_with_line_items)
|
81
|
-
|
82
|
-
|
83
|
-
transient do
|
84
|
-
stub_details true
|
85
|
-
shipping_address_mismatch false
|
86
|
-
billing_address_mismatch false
|
87
|
-
alternate_billing_address_format false
|
88
|
-
billing_address_full_name false
|
89
|
-
billing_email_mismatch false
|
90
|
-
extra_line_item false
|
91
|
-
missing_line_item false
|
92
|
-
quantity_mismatch false
|
93
|
-
price_mismatch false
|
94
|
-
full_name_case_mismatch false
|
95
|
-
end
|
96
|
-
|
97
|
-
after(:build) do |checkout, evaluator|
|
98
|
-
|
99
|
-
_details = BASE_CHECKOUT_DETAILS()
|
100
|
-
|
101
|
-
# case mismatch
|
102
|
-
unless evaluator.full_name_case_mismatch
|
103
|
-
_details['billing']['name'] = {
|
104
|
-
"full" => checkout.order.bill_address.firstname.upcase + " " +
|
105
|
-
checkout.order.bill_address.lastname.upcase
|
106
|
-
}
|
107
|
-
end
|
108
|
-
|
109
|
-
# shipping address
|
110
|
-
unless evaluator.shipping_address_mismatch
|
111
|
-
_details['shipping'] = {
|
112
|
-
"name" => {
|
113
|
-
"first" => checkout.order.ship_address.firstname,
|
114
|
-
"last" => checkout.order.ship_address.lastname
|
115
|
-
},
|
116
|
-
"address"=> {
|
117
|
-
"city"=> checkout.order.ship_address.city,
|
118
|
-
"street1"=> checkout.order.ship_address.address1,
|
119
|
-
"street2"=> checkout.order.ship_address.address2,
|
120
|
-
"region1_code"=> checkout.order.ship_address.state.abbr,
|
121
|
-
"postal_code"=> checkout.order.ship_address.zipcode,
|
122
|
-
"country_code"=> checkout.order.ship_address.country.iso3
|
123
|
-
}
|
124
|
-
}
|
125
|
-
end
|
126
|
-
|
127
|
-
# billing address
|
128
|
-
unless evaluator.billing_address_mismatch
|
129
|
-
_details["billing"] = {
|
130
|
-
"email" => "joe@schmoe.com",
|
131
|
-
"name" => {
|
132
|
-
"first" => checkout.order.bill_address.firstname,
|
133
|
-
"last" => checkout.order.bill_address.lastname
|
134
|
-
},
|
135
|
-
"address"=> {
|
136
|
-
"city"=> checkout.order.bill_address.city,
|
137
|
-
"street1"=> checkout.order.bill_address.address1,
|
138
|
-
"street2"=> checkout.order.bill_address.address2,
|
139
|
-
"region1_code"=> checkout.order.bill_address.state.abbr,
|
140
|
-
"postal_code"=> checkout.order.bill_address.zipcode,
|
141
|
-
"country_code"=> checkout.order.bill_address.country.iso3
|
142
|
-
}
|
143
|
-
}
|
144
|
-
end
|
145
|
-
|
146
|
-
# use alternate format for billing address
|
147
|
-
if evaluator.alternate_billing_address_format
|
148
|
-
_details['billing']["address"] = {
|
149
|
-
"city" => _details['billing']["address"]["city"],
|
150
|
-
"line1"=> _details['billing']["address"]["street1"],
|
151
|
-
"line2"=> _details['billing']["address"]["street2"],
|
152
|
-
"state"=> _details['billing']["address"]["postal_code"],
|
153
|
-
"zipcode"=> _details['billing']["address"]["region1_code"],
|
154
|
-
"country"=> _details['billing']["address"]["country_code"]
|
155
|
-
}
|
156
|
-
end
|
157
|
-
|
158
|
-
# use name.full instead of first/last
|
159
|
-
if evaluator.billing_address_full_name
|
160
|
-
_details['billing']['name'] = {
|
161
|
-
'full' => "#{_details['billing']['name']['first']} #{_details['billing']['name']['last']}"
|
162
|
-
}
|
163
|
-
end
|
164
|
-
|
165
|
-
|
166
|
-
# billing email
|
167
|
-
unless evaluator.billing_email_mismatch
|
168
|
-
_details["billing"]["email"] = checkout.order.email
|
169
|
-
end
|
170
|
-
|
171
|
-
# setup items in cart
|
172
|
-
_details['items'] = {}
|
173
|
-
checkout.order.line_items.each do |item|
|
174
|
-
_details['items'][item.variant.sku] = {
|
175
|
-
"qty" => item.quantity.to_s,
|
176
|
-
"unit_price" => (item.price*100).to_s,
|
177
|
-
"display_name" => item.product.name
|
178
|
-
}
|
179
|
-
end
|
180
|
-
|
181
|
-
if evaluator.extra_line_item
|
182
|
-
_details['items']['extra-1-2-3'] = {
|
183
|
-
"qty" => "1",
|
184
|
-
"unit_price" => "12300",
|
185
|
-
"display_name" => "Really cool hat"
|
186
|
-
}
|
187
|
-
end
|
188
|
-
|
189
|
-
if evaluator.missing_line_item
|
190
|
-
_details['items'].delete _details['items'].keys.last
|
191
|
-
end
|
192
|
-
|
193
|
-
if evaluator.quantity_mismatch
|
194
|
-
_last_item = _details['items'][_details['items'].keys.last]
|
195
|
-
_details['items'][_details['items'].keys.last]['qty'] = (_last_item['qty'].to_i + 1).to_s
|
196
|
-
end
|
197
|
-
|
198
|
-
if evaluator.price_mismatch
|
199
|
-
_last_item = _details['items'][_details['items'].keys.last]
|
200
|
-
_details['items'][_details['items'].keys.last]['unit_price'] = 456456
|
201
|
-
end
|
202
|
-
|
203
|
-
if evaluator.stub_details
|
204
|
-
checkout.stub(details: _details)
|
205
|
-
end
|
206
|
-
end
|
207
|
-
|
208
|
-
end
|
209
|
-
end
|
210
|
-
|
211
|
-
|
@@ -1,10 +0,0 @@
|
|
1
|
-
FactoryGirl.define do
|
2
|
-
factory :affirm_payment, class: Spree::Payment do
|
3
|
-
amount 45.75
|
4
|
-
association(:payment_method, factory: :affirm_payment_method)
|
5
|
-
association(:source, factory: :affirm_checkout)
|
6
|
-
order
|
7
|
-
state 'checkout'
|
8
|
-
response_code '12345'
|
9
|
-
end
|
10
|
-
end
|
data/lib/spree_affirm/version.rb
DELETED
@@ -1,138 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe Spree::AffirmController do
|
4
|
-
let(:user) { FactoryGirl.create(:user) }
|
5
|
-
let(:checkout) { FactoryGirl.build(:affirm_checkout) }
|
6
|
-
let(:bad_billing_checkout) { FactoryGirl.build(:affirm_checkout, billing_address_mismatch: true) }
|
7
|
-
let(:bad_shipping_checkout) { FactoryGirl.build(:affirm_checkout, shipping_address_mismatch: true) }
|
8
|
-
let(:bad_email_checkout) { FactoryGirl.build(:affirm_checkout, billing_email_mismatch: true) }
|
9
|
-
|
10
|
-
|
11
|
-
describe "POST confirm" do
|
12
|
-
|
13
|
-
def post_request(token, payment_id)
|
14
|
-
post :confirm, checkout_token: token, payment_method_id: payment_id, use_route: 'spree'
|
15
|
-
end
|
16
|
-
|
17
|
-
before do
|
18
|
-
controller.stub authenticate_spree_user!: true
|
19
|
-
controller.stub spree_current_user: user
|
20
|
-
end
|
21
|
-
|
22
|
-
context "when the checkout matches the order" do
|
23
|
-
before do
|
24
|
-
Spree::AffirmCheckout.stub new: checkout
|
25
|
-
controller.stub current_order: checkout.order
|
26
|
-
end
|
27
|
-
|
28
|
-
context "when no checkout_token is provided" do
|
29
|
-
it "redirects to the current order state" do
|
30
|
-
post_request(nil, nil)
|
31
|
-
expect(response).to redirect_to(controller.checkout_state_path(checkout.order.state))
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
|
-
context "when the order is complete" do
|
36
|
-
before do
|
37
|
-
checkout.order.state = 'complete'
|
38
|
-
end
|
39
|
-
it "redirects to the current order state" do
|
40
|
-
post_request '123456789', checkout.payment_method.id
|
41
|
-
expect(response).to redirect_to(controller.order_path(checkout.order))
|
42
|
-
end
|
43
|
-
end
|
44
|
-
|
45
|
-
context "when the order state is payment" do
|
46
|
-
before do
|
47
|
-
checkout.order.state = 'payment'
|
48
|
-
end
|
49
|
-
|
50
|
-
it "creates a new payment" do
|
51
|
-
post_request "123423423", checkout.payment_method.id
|
52
|
-
|
53
|
-
expect(checkout.order.payments.first.source).to eq(checkout)
|
54
|
-
end
|
55
|
-
|
56
|
-
# it "transitions to complete if confirmation is not required" do
|
57
|
-
# checkout.order.stub confirmation_required?: false
|
58
|
-
# post_request "123423423", checkout.payment_method.id
|
59
|
-
|
60
|
-
# expect(checkout.order.state).to eq("complete")
|
61
|
-
# end
|
62
|
-
|
63
|
-
it "transitions to confirm if confirmation is required" do
|
64
|
-
checkout.order.stub confirmation_required?: true
|
65
|
-
post_request "123423423", checkout.payment_method.id
|
66
|
-
|
67
|
-
expect(checkout.order.reload.state).to eq("confirm")
|
68
|
-
end
|
69
|
-
end
|
70
|
-
|
71
|
-
end
|
72
|
-
|
73
|
-
context "when the billing_address does not match the order" do
|
74
|
-
before do
|
75
|
-
Spree::AffirmCheckout.stub new: bad_billing_checkout
|
76
|
-
state = FactoryGirl.create(:state, abbr: bad_billing_checkout.details['billing']['address']['region1_code'])
|
77
|
-
Spree::State.stub find_by_abbr: state, find_by_name: state
|
78
|
-
controller.stub current_order: bad_billing_checkout.order
|
79
|
-
end
|
80
|
-
|
81
|
-
it "creates a new address record for the order" do
|
82
|
-
_old_billing_address = bad_billing_checkout.order.bill_address
|
83
|
-
post_request '12345789', bad_billing_checkout.payment_method.id
|
84
|
-
|
85
|
-
expect(bad_billing_checkout.order.bill_address).not_to be(_old_billing_address)
|
86
|
-
expect(bad_billing_checkout.valid?).to be(true)
|
87
|
-
end
|
88
|
-
end
|
89
|
-
|
90
|
-
|
91
|
-
context "when the shipping_address does not match the order" do
|
92
|
-
before do
|
93
|
-
Spree::AffirmCheckout.stub new: bad_shipping_checkout
|
94
|
-
state = FactoryGirl.create(:state, abbr: bad_shipping_checkout.details['shipping']['address']['region1_code'])
|
95
|
-
Spree::State.stub find_by_abbr: state, find_by_name: state
|
96
|
-
controller.stub current_order: bad_shipping_checkout.order
|
97
|
-
end
|
98
|
-
|
99
|
-
it "creates a new address record for the order" do
|
100
|
-
_old_shipping_address = bad_shipping_checkout.order.ship_address
|
101
|
-
post_request '12345789', bad_shipping_checkout.payment_method.id
|
102
|
-
|
103
|
-
expect(bad_shipping_checkout.order.ship_address).not_to be(_old_shipping_address)
|
104
|
-
expect(bad_shipping_checkout.valid?).to be(true)
|
105
|
-
end
|
106
|
-
end
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
context "when the billing_email does not match the order" do
|
111
|
-
before do
|
112
|
-
Spree::AffirmCheckout.stub new: bad_email_checkout
|
113
|
-
controller.stub current_order: bad_email_checkout.order
|
114
|
-
end
|
115
|
-
|
116
|
-
it "updates the billing_email on the order" do
|
117
|
-
_old_email = bad_email_checkout.order.email
|
118
|
-
post_request '12345789', bad_email_checkout.payment_method.id
|
119
|
-
|
120
|
-
expect(bad_email_checkout.order.email).not_to be(_old_email)
|
121
|
-
expect(bad_email_checkout.valid?).to be(true)
|
122
|
-
end
|
123
|
-
end
|
124
|
-
|
125
|
-
|
126
|
-
context "there is no current order" do
|
127
|
-
before(:each) do
|
128
|
-
controller.stub current_order: nil
|
129
|
-
end
|
130
|
-
|
131
|
-
it "raises an ActiveRecord::RecordNotFound error" do
|
132
|
-
expect do
|
133
|
-
post_request nil, nil
|
134
|
-
end.to raise_error(ActiveRecord::RecordNotFound)
|
135
|
-
end
|
136
|
-
end
|
137
|
-
end
|
138
|
-
end
|
@@ -1,294 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
|
4
|
-
describe ActiveMerchant::Billing::Affirm do
|
5
|
-
let(:affirm_payment) { FactoryGirl.create(:affirm_payment) }
|
6
|
-
let(:charge_id) { "1234-5678-9012" }
|
7
|
-
|
8
|
-
|
9
|
-
def expect_request(method, url_regexp, data, successful_response=true, response={})
|
10
|
-
affirm_payment.payment_method.provider.should_receive(:ssl_request) { |_method, _url, _data, _headers|
|
11
|
-
|
12
|
-
# check method type
|
13
|
-
_method.should be(method)
|
14
|
-
|
15
|
-
# test path
|
16
|
-
_url.should match(url_regexp) unless url_regexp.nil?
|
17
|
-
|
18
|
-
# test data
|
19
|
-
_data.should eq(data.to_json) unless data.nil?
|
20
|
-
|
21
|
-
# create response
|
22
|
-
_response = (response || {}).reverse_merge({
|
23
|
-
id: charge_id,
|
24
|
-
pending: true,
|
25
|
-
amount: 8000
|
26
|
-
})
|
27
|
-
|
28
|
-
_response[:status_code] = 400 unless successful_response
|
29
|
-
|
30
|
-
_response.to_json
|
31
|
-
}.at_least(1).times
|
32
|
-
end
|
33
|
-
|
34
|
-
|
35
|
-
def expect_request_and_return_success(method, url_regexp, data, response=nil )
|
36
|
-
expect_request(method, url_regexp, data, true, response)
|
37
|
-
end
|
38
|
-
|
39
|
-
|
40
|
-
def expect_request_and_return_failure(method, url_regexp, data, response=nil )
|
41
|
-
expect_request(method, url_regexp, data, false, response)
|
42
|
-
end
|
43
|
-
|
44
|
-
|
45
|
-
def expect_post_and_return_success(url_regexp=nil, data=nil, response=nil )
|
46
|
-
expect_request_and_return_success(:post, url_regexp, data, response)
|
47
|
-
end
|
48
|
-
|
49
|
-
|
50
|
-
def expect_post_and_return_failure(url_regexp=nil, data=nil, response=nil )
|
51
|
-
expect_request_and_return_failure(:post, url_regexp, data, response)
|
52
|
-
end
|
53
|
-
|
54
|
-
|
55
|
-
def expect_get_and_return_success(url_regexp=nil, data=nil, response=nil )
|
56
|
-
expect_request_and_return_success(:get, url_regexp, data, response)
|
57
|
-
end
|
58
|
-
|
59
|
-
|
60
|
-
def expect_get_and_return_failure(url_regexp=nil, data=nil, response=nil )
|
61
|
-
expect_request_and_return_failure(:get, url_regexp, data, response)
|
62
|
-
end
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
describe "#authorize" do
|
67
|
-
it "sends a POST to /api/v2/charges/ with the checkout_token" do
|
68
|
-
expect_post_and_return_success(/\/api\/v2\/charges/, {checkout_token: affirm_payment.source.token}, {amount: 8000})
|
69
|
-
affirm_payment.payment_method.provider.authorize(8000, affirm_payment.source)
|
70
|
-
end
|
71
|
-
|
72
|
-
|
73
|
-
context "when the POST response is not successful" do
|
74
|
-
it "returns the result from the POST" do
|
75
|
-
expect_post_and_return_failure nil, nil, {message: "Whoops!"}
|
76
|
-
result = affirm_payment.payment_method.provider.authorize(8000, affirm_payment.source)
|
77
|
-
expect(result.success?).to be(false)
|
78
|
-
expect(result.message).to eq("Whoops!")
|
79
|
-
end
|
80
|
-
end
|
81
|
-
|
82
|
-
|
83
|
-
context "when the POST respone is successful" do
|
84
|
-
context "when the auth amount does not match the given amount" do
|
85
|
-
it "returns an error response for that error" do
|
86
|
-
expect_post_and_return_success(/\/api\/v2\/charges/, {checkout_token: affirm_payment.source.token}, {amount: 9000})
|
87
|
-
result = affirm_payment.payment_method.provider.authorize(1999, affirm_payment.source)
|
88
|
-
expect(result.success?).to be(false)
|
89
|
-
expect(result.message).to eq("Auth amount does not match charge amount")
|
90
|
-
end
|
91
|
-
end
|
92
|
-
|
93
|
-
|
94
|
-
context "when the charge is not pending in the response" do
|
95
|
-
it "returns an error response for that error" do
|
96
|
-
expect_post_and_return_success(/\/api\/v2\/charges/, {checkout_token: affirm_payment.source.token}, {amount: 9000, pending: false})
|
97
|
-
result = affirm_payment.payment_method.provider.authorize(9000, affirm_payment.source)
|
98
|
-
expect(result.success?).to be(false)
|
99
|
-
expect(result.message).to eq("There was an error authorizing this Charge")
|
100
|
-
end
|
101
|
-
end
|
102
|
-
|
103
|
-
|
104
|
-
it "returns the result from the POST" do
|
105
|
-
expect_post_and_return_success(/\/api\/v2\/charges/, {checkout_token: affirm_payment.source.token}, {amount: 9000})
|
106
|
-
result = affirm_payment.payment_method.provider.authorize(9000, affirm_payment.source)
|
107
|
-
expect(result.success?).to be(true)
|
108
|
-
expect(result.params['amount']).to eq(9000)
|
109
|
-
end
|
110
|
-
end
|
111
|
-
end
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
describe "#purchase" do
|
116
|
-
it "authorizes the charge" do
|
117
|
-
expect_post_and_return_failure(/\/api\/v2\/charges/, {checkout_token: affirm_payment.source.token})
|
118
|
-
affirm_payment.payment_method.provider.purchase(8000, affirm_payment.source)
|
119
|
-
end
|
120
|
-
|
121
|
-
|
122
|
-
context "when the authorize response is not successful" do
|
123
|
-
it "returns the response of the auth response" do
|
124
|
-
expect_post_and_return_failure(/\/api\/v2\/charges/, {checkout_token: affirm_payment.source.token})
|
125
|
-
purchase_result = affirm_payment.payment_method.provider.purchase(8000, affirm_payment.source)
|
126
|
-
auth_result = affirm_payment.payment_method.provider.authorize(8000, affirm_payment.source)
|
127
|
-
|
128
|
-
[:success?, :params, :message].each do |method|
|
129
|
-
expect(purchase_result.send(method)).to eq(auth_result.send(method))
|
130
|
-
end
|
131
|
-
end
|
132
|
-
|
133
|
-
|
134
|
-
it "does not attempt to capture the charge" do
|
135
|
-
expect_post_and_return_failure(/\/api\/v2\/charges/, {checkout_token: affirm_payment.source.token})
|
136
|
-
affirm_payment.payment_method.provider.should_not_receive(:capture)
|
137
|
-
affirm_payment.payment_method.provider.purchase(8000, affirm_payment.source)
|
138
|
-
end
|
139
|
-
end
|
140
|
-
|
141
|
-
|
142
|
-
context "when the authorize response is successful" do
|
143
|
-
it "captures the charge" do
|
144
|
-
expect_post_and_return_success(/\/api\/v2\/charges/, {checkout_token: affirm_payment.source.token})
|
145
|
-
affirm_payment.payment_method.provider.should_receive(:capture)
|
146
|
-
affirm_payment.payment_method.provider.purchase(8000, affirm_payment.source)
|
147
|
-
end
|
148
|
-
end
|
149
|
-
end
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
describe "#capture" do
|
155
|
-
it "calls a POST to charges/[charge_ari]/capture" do
|
156
|
-
expect_post_and_return_success(/\/api\/v2\/charges\/#{charge_id}\/capture/, {amount: "8000"})
|
157
|
-
affirm_payment.payment_method.provider.capture(8000, charge_id)
|
158
|
-
end
|
159
|
-
|
160
|
-
context "when the capture response is not successful" do
|
161
|
-
it "returns the response" do
|
162
|
-
expect_post_and_return_failure(/\/api\/v2\/charges\/#{charge_id}\/capture/, {amount: "8000"},
|
163
|
-
message: "buuuuuusted"
|
164
|
-
)
|
165
|
-
result = affirm_payment.payment_method.provider.capture(8000, charge_id)
|
166
|
-
expect(result.success?).to be(false)
|
167
|
-
expect(result.message).to eq("buuuuuusted")
|
168
|
-
end
|
169
|
-
end
|
170
|
-
|
171
|
-
|
172
|
-
context "when the capture response is successful" do
|
173
|
-
it "returns the response" do
|
174
|
-
expect_post_and_return_success(/\/api\/v2\/charges\/#{charge_id}\/capture/, {amount: "8000"},
|
175
|
-
amount: 8000
|
176
|
-
)
|
177
|
-
result = affirm_payment.payment_method.provider.capture(8000, charge_id)
|
178
|
-
expect(result.success?).to be(true)
|
179
|
-
expect(result.params['amount']).to eq(8000)
|
180
|
-
end
|
181
|
-
|
182
|
-
|
183
|
-
context "when the captured amount does not equal the requested amount" do
|
184
|
-
it "returns a failed response" do
|
185
|
-
expect_post_and_return_success(/\/api\/v2\/charges\/#{charge_id}\/capture/, {amount: "8000"},
|
186
|
-
amount: 299
|
187
|
-
)
|
188
|
-
result = affirm_payment.payment_method.provider.capture(8000, charge_id)
|
189
|
-
expect(result.success?).to be(false)
|
190
|
-
expect(result.message).to eq("Capture amount does not match charge amount")
|
191
|
-
end
|
192
|
-
end
|
193
|
-
end
|
194
|
-
end
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
describe "#void" do
|
199
|
-
it "calls POST on /charges/[charge_ari]/void" do
|
200
|
-
expect_post_and_return_success(/\/api\/v2\/charges\/#{charge_id}\/void/)
|
201
|
-
affirm_payment.payment_method.provider.void(charge_id)
|
202
|
-
end
|
203
|
-
|
204
|
-
|
205
|
-
it "returns the response from the POST request" do
|
206
|
-
expect_post_and_return_success(/\/api\/v2\/charges\/#{charge_id}\/void/)
|
207
|
-
result = affirm_payment.payment_method.provider.void(charge_id)
|
208
|
-
expect(result.success?).to be(true)
|
209
|
-
expect(result.message).to eq("Transaction approved")
|
210
|
-
end
|
211
|
-
end
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
describe "#refund" do
|
216
|
-
it "calls POST on /charges/[charge_ari]/refund" do
|
217
|
-
expect_post_and_return_success(/\/api\/v2\/charges\/#{charge_id}\/refund/, {amount: "8000"})
|
218
|
-
affirm_payment.payment_method.provider.refund(8000, charge_id)
|
219
|
-
end
|
220
|
-
|
221
|
-
|
222
|
-
it "returns the response from the POST request" do
|
223
|
-
expect_post_and_return_success(/\/api\/v2\/charges\/#{charge_id}\/refund/, {amount: "8000"})
|
224
|
-
result = affirm_payment.payment_method.provider.refund(8000, charge_id)
|
225
|
-
expect(result.success?).to be(true)
|
226
|
-
expect(result.message).to eq("Transaction approved")
|
227
|
-
end
|
228
|
-
end
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
describe "#credit" do
|
233
|
-
context "when the requested amount is non zero" do
|
234
|
-
it "calls refund with the requested amount" do
|
235
|
-
affirm_payment.payment_method.provider.should_receive(:refund).with(8000, charge_id, {})
|
236
|
-
affirm_payment.payment_method.provider.credit(8000, charge_id)
|
237
|
-
end
|
238
|
-
end
|
239
|
-
|
240
|
-
context "when the requested amount is zero" do
|
241
|
-
it "returns a valid response and does not call refund()" do
|
242
|
-
affirm_payment.payment_method.provider.should_not_receive(:refund)
|
243
|
-
result = affirm_payment.payment_method.provider.credit(0, charge_id)
|
244
|
-
expect(result.success?).to be(true)
|
245
|
-
end
|
246
|
-
end
|
247
|
-
end
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
describe "#get_checkout" do
|
252
|
-
it "makes a GET request to /checkout/[checkout_token]" do
|
253
|
-
expect_get_and_return_success(/\/api\/v2\/checkout\/#{affirm_payment.source.token}/)
|
254
|
-
affirm_payment.payment_method.provider.get_checkout(affirm_payment.source.token)
|
255
|
-
end
|
256
|
-
end
|
257
|
-
|
258
|
-
|
259
|
-
describe "#commit" do
|
260
|
-
context "when a ResponseError is returned" do
|
261
|
-
it "returns an invalid response error" do
|
262
|
-
http_response = double()
|
263
|
-
http_response.stub(:code).and_return('400')
|
264
|
-
http_response.stub(:body).and_return("{}")
|
265
|
-
affirm_payment.payment_method.provider.should_receive(:ssl_request).and_raise ActiveMerchant::ResponseError.new(http_response)
|
266
|
-
result = affirm_payment.payment_method.provider.commit(:post, "test")
|
267
|
-
expect(result.success?).to be(false)
|
268
|
-
end
|
269
|
-
|
270
|
-
context "when the error response has malformed json" do
|
271
|
-
it "returns an invalid response error" do
|
272
|
-
http_response = double()
|
273
|
-
http_response.stub(:code).and_return('400')
|
274
|
-
http_response.stub(:body).and_return("{///xdf2fas!!+")
|
275
|
-
affirm_payment.payment_method.provider.should_receive(:parse).and_raise JSON::ParserError
|
276
|
-
affirm_payment.payment_method.provider.should_receive(:ssl_request).and_raise ActiveMerchant::ResponseError.new(http_response)
|
277
|
-
result = affirm_payment.payment_method.provider.commit(:post, "test")
|
278
|
-
expect(result.success?).to be(false)
|
279
|
-
expect(result.params['error']['message']).to match(/The raw response returned by the API was/)
|
280
|
-
end
|
281
|
-
end
|
282
|
-
end
|
283
|
-
|
284
|
-
|
285
|
-
context "when malformed JSON is returned" do
|
286
|
-
it "returns an invalid response error" do
|
287
|
-
affirm_payment.payment_method.provider.should_receive(:ssl_request).and_raise JSON::ParserError
|
288
|
-
result = affirm_payment.payment_method.provider.commit(:post, "test")
|
289
|
-
expect(result.success?).to be(false)
|
290
|
-
expect(result.params['error']['message']).to match(/The raw response returned by the API was/)
|
291
|
-
end
|
292
|
-
end
|
293
|
-
end
|
294
|
-
end
|