spree_affirm 0.2.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (40) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +15 -0
  3. data/Gemfile +19 -0
  4. data/LICENSE +29 -0
  5. data/README.md +51 -0
  6. data/Rakefile +15 -0
  7. data/Versionfile +5 -0
  8. data/app/assets/javascripts/spree/backend/spree_affirm.js +3 -0
  9. data/app/assets/javascripts/spree/frontend/spree_affirm.js +2 -0
  10. data/app/assets/stylesheets/spree/backend/spree_affirm.css +4 -0
  11. data/app/assets/stylesheets/spree/frontend/spree_affirm.css +4 -0
  12. data/app/controllers/spree/affirm_controller.rb +68 -0
  13. data/app/models/spree/affirm_checkout.rb +38 -0
  14. data/app/models/spree/gateway/affirm.rb +51 -0
  15. data/app/views/spree/admin/log_entries/_affirm.html.erb +4 -0
  16. data/app/views/spree/admin/log_entries/index.html.erb +28 -0
  17. data/app/views/spree/admin/payments/source_forms/_affirm.html.erb +19 -0
  18. data/app/views/spree/admin/payments/source_views/_affirm.html.erb +12 -0
  19. data/app/views/spree/checkout/payment/_affirm.html.erb +195 -0
  20. data/bin/rails +7 -0
  21. data/config/locales/en.yml +29 -0
  22. data/config/routes.rb +5 -0
  23. data/db/migrate/20140514194315_create_affirm_checkout.rb +10 -0
  24. data/lib/active_merchant/billing/affirm.rb +161 -0
  25. data/lib/generators/spree_affirm/install/install_generator.rb +21 -0
  26. data/lib/spree_affirm/engine.rb +27 -0
  27. data/lib/spree_affirm/factories/affirm_checkout_factory.rb +211 -0
  28. data/lib/spree_affirm/factories/affirm_payment_method_factory.rb +8 -0
  29. data/lib/spree_affirm/factories/payment_factory.rb +10 -0
  30. data/lib/spree_affirm/factories.rb +5 -0
  31. data/lib/spree_affirm/version.rb +3 -0
  32. data/lib/spree_affirm.rb +2 -0
  33. data/spec/controllers/affirm_controller_spec.rb +138 -0
  34. data/spec/lib/active_merchant/billing/affirm_spec.rb +294 -0
  35. data/spec/models/affirm_address_validator_spec.rb +13 -0
  36. data/spec/models/spree_affirm_checkout_spec.rb +328 -0
  37. data/spec/models/spree_gateway_affirm_spec.rb +134 -0
  38. data/spec/spec_helper.rb +98 -0
  39. data/spree_affirm.gemspec +30 -0
  40. metadata +190 -0
@@ -0,0 +1,134 @@
1
+ require 'spec_helper'
2
+
3
+ describe Spree::Gateway::Affirm do
4
+ let(:affirm_payment) { FactoryGirl.create(:affirm_payment) }
5
+ let(:affirm_checkout) { FactoryGirl.create(:affirm_checkout) }
6
+
7
+ describe '#provider_class' do
8
+ it "returns the Affirm ActiveMerchant class" do
9
+ expect(affirm_payment.payment_method.provider_class).to be(ActiveMerchant::Billing::Affirm)
10
+ end
11
+ end
12
+
13
+ describe '#payment_source_class' do
14
+ it "returns the affirm_checkout class" do
15
+ expect(affirm_payment.payment_method.payment_source_class).to be(Spree::AffirmCheckout)
16
+ end
17
+ end
18
+
19
+ describe '#source_required?' do
20
+ it "returns true" do
21
+ expect(affirm_payment.payment_method.source_required?).to be(true)
22
+ end
23
+ end
24
+
25
+ describe '#method_type?' do
26
+ it 'returns "affirm"' do
27
+ expect(affirm_payment.payment_method.method_type).to eq("affirm")
28
+ end
29
+ end
30
+
31
+ describe '#actions?' do
32
+ it "retuns capture, void and credit" do
33
+ expect(affirm_payment.payment_method.actions).to eq(['capture', 'void', 'credit'])
34
+ end
35
+ end
36
+
37
+ describe '#supports?' do
38
+ it "returns true if the source is an AffirmCheckout" do
39
+ expect(affirm_payment.payment_method.supports?(affirm_checkout)).to be(true)
40
+ end
41
+
42
+ it "returns false when the source is not an affirm" do
43
+ expect(affirm_payment.payment_method.supports?(6)).to be(false)
44
+ expect(affirm_payment.payment_method.supports?(affirm_payment)).to be(false)
45
+ expect(affirm_payment.payment_method.supports?(Spree::Order.new)).to be(false)
46
+ end
47
+ end
48
+
49
+
50
+ describe "#cancel" do
51
+ context "when there is no payment with the given charge_ari" do
52
+ it "returns nil" do
53
+ expect(affirm_payment.payment_method.cancel("xxxx-xxxx")).to be(nil)
54
+ end
55
+ end
56
+
57
+ context "when the payment is in a completed state" do
58
+ before(:each) do
59
+ affirm_payment.stub(:completed?).and_return true
60
+ affirm_payment.state = "completed"
61
+ affirm_payment.save
62
+ end
63
+
64
+ context "when credit_allowed amount is > 0" do
65
+ it "calls credit! on the payment with the credit_allowed amount" do
66
+ Spree::Payment.stub_chain(:valid, :where, :first).and_return(affirm_payment)
67
+ affirm_payment.stub(:can_credit?).and_return(true)
68
+ expect(affirm_payment).to receive(:credit!).and_return false
69
+ affirm_payment.payment_method.cancel affirm_payment.response_code
70
+ end
71
+
72
+ it "creates an adjustment for the -credit_allowed amount" do
73
+ Spree::Payment.stub_chain(:valid, :where, :first).and_return(affirm_payment)
74
+ affirm_payment.stub(:can_credit?).and_return(true)
75
+ expect(affirm_payment).to receive(:credit!).and_return false
76
+ _payment_amount = affirm_payment.credit_allowed
77
+ affirm_payment.payment_method.cancel affirm_payment.response_code
78
+ end
79
+ end
80
+
81
+ context "when credit_allowed amount is 0" do
82
+ it "does not credit the payment" do
83
+ Spree::Payment.stub_chain(:valid, :where, :first).and_return(affirm_payment)
84
+ affirm_payment.stub(:can_credit?).and_return(false)
85
+ expect(affirm_payment).not_to receive(:credit!)
86
+ affirm_payment.payment_method.cancel affirm_payment.response_code
87
+ end
88
+ end
89
+ end
90
+
91
+ context "when the payment is in a failed state" do
92
+ before do
93
+ affirm_payment.state = "failed"
94
+ affirm_payment.save
95
+ end
96
+
97
+ it "does nothing" do
98
+ expect(affirm_payment).not_to receive(:credit!)
99
+ expect(affirm_payment).not_to receive(:void_transaction!)
100
+ affirm_payment.payment_method.cancel affirm_payment.response_code
101
+ end
102
+ end
103
+
104
+ context "when the payment is in an invalid state" do
105
+ before do
106
+ affirm_payment.state = "invalid"
107
+ affirm_payment.save
108
+ end
109
+
110
+ it "does nothing" do
111
+ expect(affirm_payment).not_to receive(:credit!)
112
+ expect(affirm_payment).not_to receive(:void_transaction!)
113
+ affirm_payment.payment_method.cancel affirm_payment.response_code
114
+ end
115
+ end
116
+
117
+
118
+ context "when the payment is in a pending state" do
119
+ before do
120
+ affirm_payment.stub(:pending?).and_return true
121
+ affirm_payment.state = "pending"
122
+ affirm_payment.save
123
+ end
124
+
125
+ it "voids the transaction" do
126
+ Spree::Payment.stub_chain(:valid, :where, :first).and_return(affirm_payment)
127
+ expect(affirm_payment).not_to receive(:credit!)
128
+ expect(affirm_payment).to receive(:void_transaction!).and_return false
129
+ affirm_payment.payment_method.cancel affirm_payment.response_code
130
+ end
131
+ end
132
+
133
+ end
134
+ end
@@ -0,0 +1,98 @@
1
+ # Run Coverage report
2
+ require 'simplecov'
3
+ require 'minitest'
4
+ require 'simplecov-rcov'
5
+
6
+ SimpleCov.formatter = SimpleCov::Formatter::RcovFormatter
7
+ SimpleCov.start do
8
+ add_filter 'spec'
9
+ add_filter 'lib/spree_affirm/factories'
10
+ add_filter 'bundled'
11
+ add_group 'Controllers', 'app/controllers'
12
+ add_group 'Helpers', 'app/helpers'
13
+ add_group 'Mailers', 'app/mailers'
14
+ add_group 'Models', 'app/models'
15
+ add_group 'Views', 'app/views'
16
+ add_group 'Libraries', 'lib'
17
+ end
18
+
19
+ # Configure Rails Environment
20
+ ENV['RAILS_ENV'] = 'test'
21
+
22
+ require File.expand_path('../dummy/config/environment.rb', __FILE__)
23
+
24
+ require 'rspec/rails'
25
+ require 'database_cleaner'
26
+ require 'ffaker'
27
+
28
+ # Requires supporting ruby files with custom matchers and macros, etc,
29
+ # in spec/support/ and its subdirectories.
30
+ Dir[File.join(File.dirname(__FILE__), 'support/**/*.rb')].each { |f| require f }
31
+
32
+ # Requires factories defined in spree_core
33
+ require 'spree/testing_support/authorization_helpers'
34
+ require 'spree/testing_support/factories'
35
+ require 'spree/testing_support/preferences'
36
+ require 'spree/testing_support/controller_requests'
37
+ require 'spree/testing_support/flash'
38
+ require 'spree/testing_support/url_helpers'
39
+ require 'spree/testing_support/order_walkthrough'
40
+ require 'spree/testing_support/caching'
41
+ require "spree/testing_support/i18n"
42
+
43
+
44
+ # Requires factories defined in lib/spree_affirm/factories.rb
45
+ require 'spree_affirm/factories'
46
+
47
+ RSpec.configure do |config|
48
+ config.include FactoryGirl::Syntax::Methods
49
+
50
+ # == URL Helpers
51
+ #
52
+ # Allows access to Spree's routes in specs:
53
+ #
54
+ # visit spree.admin_path
55
+ # current_path.should eql(spree.products_path)
56
+ config.include Spree::TestingSupport::UrlHelpers
57
+ config.include Spree::TestingSupport::Preferences
58
+ config.include Spree::TestingSupport::ControllerRequests
59
+ config.include Spree::TestingSupport::Flash
60
+
61
+
62
+ # == Mock Framework
63
+ #
64
+ # If you prefer to use mocha, flexmock or RR, uncomment the appropriate line:
65
+ #
66
+ # config.mock_with :mocha
67
+ # config.mock_with :flexmock
68
+ # config.mock_with :rr
69
+ config.mock_with :rspec
70
+ config.color = true
71
+
72
+ # Remove this line if you're not using ActiveRecord or ActiveRecord fixtures
73
+ config.fixture_path = "#{::Rails.root}/spec/fixtures"
74
+
75
+ # Capybara javascript drivers require transactional fixtures set to false, and we use DatabaseCleaner
76
+ # to cleanup after each test instead. Without transactional fixtures set to false the records created
77
+ # to setup a test will be unavailable to the browser, which runs under a separate server instance.
78
+ config.use_transactional_fixtures = false
79
+
80
+ # Ensure Suite is set to use transactions for speed.
81
+ config.before :suite do
82
+ DatabaseCleaner.strategy = :transaction
83
+ DatabaseCleaner.clean_with :truncation
84
+ end
85
+
86
+ # Before each spec check if it is a Javascript test and switch between using database transactions or not where necessary.
87
+ config.before :each do
88
+ DatabaseCleaner.strategy = example.metadata[:js] ? :truncation : :transaction
89
+ DatabaseCleaner.start
90
+ end
91
+
92
+ # After each spec clean the database.
93
+ config.after :each do
94
+ DatabaseCleaner.clean
95
+ end
96
+
97
+ config.fail_fast = ENV['FAIL_FAST'] || false
98
+ end
@@ -0,0 +1,30 @@
1
+ # encoding: UTF-8
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "spree_affirm/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.platform = Gem::Platform::RUBY
7
+ s.name = 'spree_affirm'
8
+ s.version = SpreeAffirm::VERSION
9
+ s.summary = 'Affirm Spree Payment Gateway'
10
+ s.description = 'Affirm payment Gateway for Spree'
11
+ s.required_ruby_version = '>= 1.9.3'
12
+
13
+ s.author = 'Affirm'
14
+ s.email = 'mts@affirm.com'
15
+ s.homepage = 'http://www.affirm.com'
16
+
17
+ s.files = `git ls-files`.split("\n")
18
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
19
+ s.require_path = 'lib'
20
+ s.requirements << 'none'
21
+
22
+ s.add_dependency 'spree_core', '~> 2.2', '>= 2.2.0'
23
+
24
+ s.add_development_dependency 'factory_girl', '~> 4.2'
25
+ s.add_development_dependency 'ffaker', '~> 1.16'
26
+ s.add_development_dependency 'rspec-rails', '~> 2.13'
27
+ s.add_development_dependency 'simplecov', '~> 0.9'
28
+ s.add_development_dependency 'simplecov-rcov', '~> 0.2'
29
+ s.add_development_dependency 'sqlite3', '~> 1.3'
30
+ end
metadata ADDED
@@ -0,0 +1,190 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: spree_affirm
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.2.3
5
+ platform: ruby
6
+ authors:
7
+ - Affirm
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2020-04-08 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: spree_core
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '2.2'
20
+ - - ">="
21
+ - !ruby/object:Gem::Version
22
+ version: 2.2.0
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - "~>"
28
+ - !ruby/object:Gem::Version
29
+ version: '2.2'
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: 2.2.0
33
+ - !ruby/object:Gem::Dependency
34
+ name: factory_girl
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: '4.2'
40
+ type: :development
41
+ prerelease: false
42
+ version_requirements: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - "~>"
45
+ - !ruby/object:Gem::Version
46
+ version: '4.2'
47
+ - !ruby/object:Gem::Dependency
48
+ name: ffaker
49
+ requirement: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - "~>"
52
+ - !ruby/object:Gem::Version
53
+ version: '1.16'
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - "~>"
59
+ - !ruby/object:Gem::Version
60
+ version: '1.16'
61
+ - !ruby/object:Gem::Dependency
62
+ name: rspec-rails
63
+ requirement: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - "~>"
66
+ - !ruby/object:Gem::Version
67
+ version: '2.13'
68
+ type: :development
69
+ prerelease: false
70
+ version_requirements: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - "~>"
73
+ - !ruby/object:Gem::Version
74
+ version: '2.13'
75
+ - !ruby/object:Gem::Dependency
76
+ name: simplecov
77
+ requirement: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - "~>"
80
+ - !ruby/object:Gem::Version
81
+ version: '0.9'
82
+ type: :development
83
+ prerelease: false
84
+ version_requirements: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - "~>"
87
+ - !ruby/object:Gem::Version
88
+ version: '0.9'
89
+ - !ruby/object:Gem::Dependency
90
+ name: simplecov-rcov
91
+ requirement: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - "~>"
94
+ - !ruby/object:Gem::Version
95
+ version: '0.2'
96
+ type: :development
97
+ prerelease: false
98
+ version_requirements: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - "~>"
101
+ - !ruby/object:Gem::Version
102
+ version: '0.2'
103
+ - !ruby/object:Gem::Dependency
104
+ name: sqlite3
105
+ requirement: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - "~>"
108
+ - !ruby/object:Gem::Version
109
+ version: '1.3'
110
+ type: :development
111
+ prerelease: false
112
+ version_requirements: !ruby/object:Gem::Requirement
113
+ requirements:
114
+ - - "~>"
115
+ - !ruby/object:Gem::Version
116
+ version: '1.3'
117
+ description: Affirm payment Gateway for Spree
118
+ email: mts@affirm.com
119
+ executables: []
120
+ extensions: []
121
+ extra_rdoc_files: []
122
+ files:
123
+ - ".gitignore"
124
+ - Gemfile
125
+ - LICENSE
126
+ - README.md
127
+ - Rakefile
128
+ - Versionfile
129
+ - app/assets/javascripts/spree/backend/spree_affirm.js
130
+ - app/assets/javascripts/spree/frontend/spree_affirm.js
131
+ - app/assets/stylesheets/spree/backend/spree_affirm.css
132
+ - app/assets/stylesheets/spree/frontend/spree_affirm.css
133
+ - app/controllers/spree/affirm_controller.rb
134
+ - app/models/spree/affirm_checkout.rb
135
+ - app/models/spree/gateway/affirm.rb
136
+ - app/views/spree/admin/log_entries/_affirm.html.erb
137
+ - app/views/spree/admin/log_entries/index.html.erb
138
+ - app/views/spree/admin/payments/source_forms/_affirm.html.erb
139
+ - app/views/spree/admin/payments/source_views/_affirm.html.erb
140
+ - app/views/spree/checkout/payment/_affirm.html.erb
141
+ - bin/rails
142
+ - config/locales/en.yml
143
+ - config/routes.rb
144
+ - db/migrate/20140514194315_create_affirm_checkout.rb
145
+ - lib/active_merchant/billing/affirm.rb
146
+ - lib/generators/spree_affirm/install/install_generator.rb
147
+ - lib/spree_affirm.rb
148
+ - lib/spree_affirm/engine.rb
149
+ - lib/spree_affirm/factories.rb
150
+ - lib/spree_affirm/factories/affirm_checkout_factory.rb
151
+ - lib/spree_affirm/factories/affirm_payment_method_factory.rb
152
+ - lib/spree_affirm/factories/payment_factory.rb
153
+ - lib/spree_affirm/version.rb
154
+ - spec/controllers/affirm_controller_spec.rb
155
+ - spec/lib/active_merchant/billing/affirm_spec.rb
156
+ - spec/models/affirm_address_validator_spec.rb
157
+ - spec/models/spree_affirm_checkout_spec.rb
158
+ - spec/models/spree_gateway_affirm_spec.rb
159
+ - spec/spec_helper.rb
160
+ - spree_affirm.gemspec
161
+ homepage: http://www.affirm.com
162
+ licenses: []
163
+ metadata: {}
164
+ post_install_message:
165
+ rdoc_options: []
166
+ require_paths:
167
+ - lib
168
+ required_ruby_version: !ruby/object:Gem::Requirement
169
+ requirements:
170
+ - - ">="
171
+ - !ruby/object:Gem::Version
172
+ version: 1.9.3
173
+ required_rubygems_version: !ruby/object:Gem::Requirement
174
+ requirements:
175
+ - - ">="
176
+ - !ruby/object:Gem::Version
177
+ version: '0'
178
+ requirements:
179
+ - none
180
+ rubygems_version: 3.1.2
181
+ signing_key:
182
+ specification_version: 4
183
+ summary: Affirm Spree Payment Gateway
184
+ test_files:
185
+ - spec/controllers/affirm_controller_spec.rb
186
+ - spec/lib/active_merchant/billing/affirm_spec.rb
187
+ - spec/models/affirm_address_validator_spec.rb
188
+ - spec/models/spree_affirm_checkout_spec.rb
189
+ - spec/models/spree_gateway_affirm_spec.rb
190
+ - spec/spec_helper.rb