solidus_mercado_pago 1.0.0

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 (41) hide show
  1. checksums.yaml +7 -0
  2. data/app/assets/javascripts/spree/backend/solidus_mercado_pago.js +0 -0
  3. data/app/assets/javascripts/spree/frontend/solidus_mercado_pago.js +25 -0
  4. data/app/assets/stylesheets/spree/backend/solidus_mercado_pago.css +1 -0
  5. data/app/assets/stylesheets/spree/frontend/solidus_mercado_pago.css +1 -0
  6. data/app/controllers/spree/mercado_pago_controller.rb +68 -0
  7. data/app/models/mercado_pago/client.rb +62 -0
  8. data/app/models/mercado_pago/client/api.rb +44 -0
  9. data/app/models/mercado_pago/client/authentication.rb +36 -0
  10. data/app/models/mercado_pago/client/preferences.rb +20 -0
  11. data/app/models/mercado_pago/notification.rb +8 -0
  12. data/app/models/mercado_pago/order_preferences_builder.rb +65 -0
  13. data/app/models/spree/payment_method/mercado_pago.rb +46 -0
  14. data/app/services/mercado_pago/handle_received_notification.rb +18 -0
  15. data/app/services/mercado_pago/process_notification.rb +56 -0
  16. data/app/views/spree/admin/payments/source_forms/_mercadopago.html.erb +1 -0
  17. data/app/views/spree/admin/payments/source_views/_mercadopago.html.erb +1 -0
  18. data/app/views/spree/checkout/mercado_pago_error.html.erb +0 -0
  19. data/app/views/spree/checkout/payment/_mercadopago.html.erb +15 -0
  20. data/config/locales/en.yml +4 -0
  21. data/config/locales/es.yml +4 -0
  22. data/config/locales/pt-BR.yml +4 -0
  23. data/config/routes.rb +6 -0
  24. data/db/migrate/20141201204026_create_solidus_mercado_pago_notifications.rb +9 -0
  25. data/lib/generators/solidus_mercado_pago/install/install_generator.rb +46 -0
  26. data/lib/solidus_mercado_pago.rb +3 -0
  27. data/lib/solidus_mercado_pago/engine.rb +35 -0
  28. data/lib/solidus_mercado_pago/version.rb +3 -0
  29. data/lib/tasks/mercado_user.rake +5 -0
  30. data/spec/controllers/spree/mercado_pago_controller_spec.rb +30 -0
  31. data/spec/fixtures/authenticated.json +7 -0
  32. data/spec/fixtures/preferences_created.json +41 -0
  33. data/spec/lib/generators/solidus_mercado_pago/install/install_generator_spec.rb +33 -0
  34. data/spec/lib/solidus_mercado_pago/version_spec.rb +5 -0
  35. data/spec/models/mercado_pago/client_spec.rb +130 -0
  36. data/spec/models/mercado_pago/notification_spec.rb +17 -0
  37. data/spec/models/mercado_pago/order_preferences_builder_spec.rb +58 -0
  38. data/spec/models/spree/payment_method/mercado_pago_spec.rb +34 -0
  39. data/spec/services/mercado_pago/process_notification_spec.rb +82 -0
  40. data/spec/spec_helper.rb +133 -0
  41. metadata +200 -0
@@ -0,0 +1,34 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe Spree::PaymentMethod::MercadoPago do
4
+ describe 'Methods' do
5
+ subject(:payment_method) { described_class.new }
6
+
7
+ it { expect(payment_method).to be_a(Spree::PaymentMethod) }
8
+ it { expect(payment_method.payment_profiles_supported?).to eq false }
9
+ it { expect(payment_method.provider_class).to eq MercadoPago::Client }
10
+ it 'provider'
11
+ it { expect(payment_method.source_required?).to eq false }
12
+ it { expect(payment_method.auto_capture?).to eq false }
13
+
14
+ describe 'sandbox' do
15
+ it 'true' do
16
+ Rails.application.secrets.mercadopago = { sandbox: true }
17
+ expect(payment_method.preferred_sandbox).to eq true
18
+ end
19
+ it 'false' do
20
+ Rails.application.secrets.mercadopago = { sandbox: false }
21
+ expect(payment_method.preferred_sandbox).to eq false
22
+ end
23
+ end
24
+
25
+ it 'can_void?'
26
+
27
+ it { expect(payment_method.actions).to eq %w[void] }
28
+
29
+ it 'void call ActiveMerchant::Billing::Response.new' do
30
+ expect(ActiveMerchant::Billing::Response).to receive(:new).with(true, '', {}, {})
31
+ payment_method.void
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,82 @@
1
+ require 'spec_helper'
2
+
3
+ module MercadoPago
4
+ describe ProcessNotification do
5
+ let(:order) { FactoryBot.create(:completed_order_with_pending_payment) }
6
+ let(:payment) { order.payments.first }
7
+
8
+ let(:operation_id) { 'op123' }
9
+ let(:notification) { Notification.new(topic: 'payment', operation_id: operation_id) }
10
+ let(:operation_info) do
11
+ {
12
+ 'collection' => {
13
+ 'external_reference' => order.payments.first.number,
14
+ 'status' => 'approved'
15
+ }
16
+ }
17
+ end
18
+
19
+ describe 'with valid operation_info' do
20
+ # The first payment method of this kind will be picked by the process task
21
+ before do
22
+ fake_client = double('fake_client')
23
+ fake_payment_method = double('fake_payment_method', provider: fake_client)
24
+ allow(Spree::PaymentMethod::MercadoPago).to receive(:first).and_return(fake_payment_method)
25
+ allow(fake_client).to receive(:get_operation_info).with(operation_id)
26
+ .and_return(operation_info)
27
+ # TODO: check this test
28
+ # payment.pend!
29
+ expect(payment.state).to eq('pending')
30
+ end
31
+
32
+ describe '#process!' do
33
+ it 'completes payment for approved payment' do
34
+ ProcessNotification.new(notification).process!
35
+ payment.reload
36
+ expect(payment.state).to eq('completed')
37
+ end
38
+
39
+ it 'fails payment for rejected payment' do
40
+ operation_info['collection']['status'] = 'rejected'
41
+ ProcessNotification.new(notification).process!
42
+ payment.reload
43
+ expect(payment.state).to eq('failed')
44
+ end
45
+
46
+ it 'voids payment for rejected payment' do
47
+ operation_info['collection']['status'] = 'cancelled'
48
+ ProcessNotification.new(notification).process!
49
+ payment.reload
50
+ expect(payment.state).to eq('void')
51
+ end
52
+
53
+ it 'pends payment for pending payment' do
54
+ operation_info['collection']['status'] = 'pending'
55
+ ProcessNotification.new(notification).process!
56
+ payment.reload
57
+ expect(payment.state).to eq('pending')
58
+ end
59
+ end
60
+ end
61
+
62
+ describe 'with invalid operation_info' do
63
+ # The first payment method of this kind will be picked by the process task
64
+ before do
65
+ fake_client = double('fake_client')
66
+ fake_payment_method = double('fake_payment_method', provider: fake_client)
67
+ allow(Spree::PaymentMethod::MercadoPago).to receive(:first).and_return(fake_payment_method)
68
+ allow(fake_client).to receive(:get_operation_info).with(operation_id)
69
+ .and_return(nil)
70
+ # TODO: check this test
71
+ # payment.pend!
72
+ expect(payment.state).to eq('pending')
73
+ end
74
+
75
+ describe '#process!' do
76
+ it 'does not crash' do
77
+ ProcessNotification.new(notification).process!
78
+ end
79
+ end
80
+ end
81
+ end
82
+ end
@@ -0,0 +1,133 @@
1
+ require 'simplecov'
2
+ RSpec.configure do |config|
3
+ # Run Coverage report
4
+ if config.files_to_run.one?
5
+ config.default_formatter = 'doc'
6
+ else
7
+ SimpleCov.start 'rails' do
8
+ add_group 'Controllers', 'app/controllers'
9
+ add_group 'Helpers', 'app/helpers'
10
+ add_group 'Mailers', 'app/mailers'
11
+ add_group 'Models', 'app/models'
12
+ add_group 'Views', 'app/views'
13
+ add_group 'Libraries', 'lib'
14
+
15
+ add_filter '.bundle'
16
+ add_filter 'lib/solidus_mercado_pago/version.rb'
17
+ end
18
+ end
19
+ end
20
+
21
+ # This file is copied to ~/spec when you run 'ruby script/generate rspec'
22
+ # from the project root directory.
23
+ ENV['RAILS_ENV'] ||= 'test'
24
+
25
+ begin
26
+ require File.expand_path('../dummy/config/environment', __FILE__)
27
+ rescue LoadError
28
+ puts 'Could not load dummy application. Please ensure you have run `bundle exec rake test_app`'
29
+ exit
30
+ end
31
+
32
+ require 'rspec/rails'
33
+ require 'ffaker'
34
+
35
+ # Requires supporting files with custom matchers and macros, etc,
36
+ # in ./support/ and its subdirectories.
37
+ Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each { |f| require f }
38
+
39
+ require 'database_cleaner'
40
+
41
+ # Requires factories and other useful helpers defined in spree_core.
42
+ require 'solidus_support/extension/feature_helper'
43
+
44
+ require 'spree/testing_support/i18n' if ENV['CHECK_TRANSLATIONS']
45
+
46
+ require 'spree/testing_support/authorization_helpers'
47
+ require 'spree/testing_support/capybara_ext'
48
+ require 'spree/testing_support/factories'
49
+ require 'spree/testing_support/preferences'
50
+ require 'spree/testing_support/controller_requests'
51
+ require 'spree/testing_support/flash'
52
+ require 'spree/testing_support/url_helpers'
53
+ require 'spree/testing_support/order_walkthrough'
54
+ require 'spree/testing_support/caching'
55
+ # require 'spree/testing_support/shoulda_matcher_configuration'
56
+ # require 'spree/testing_support/microdata'
57
+
58
+ require 'paperclip/matchers'
59
+
60
+ require 'capybara-screenshot/rspec'
61
+ Capybara.save_path = ENV['CIRCLE_ARTIFACTS'] if ENV['CIRCLE_ARTIFACTS']
62
+
63
+ if ENV['WEBDRIVER'] == 'accessible'
64
+ require 'capybara/accessible'
65
+ Capybara.javascript_driver = :accessible
66
+ else
67
+ require 'capybara/poltergeist'
68
+ Capybara.javascript_driver = :poltergeist
69
+ end
70
+
71
+ RSpec.configure do |config|
72
+ config.color = true
73
+ config.fail_fast = ENV['FAIL_FAST'] || false
74
+ config.fixture_path = File.join(__dir__, 'fixtures')
75
+ config.infer_spec_type_from_file_location!
76
+ config.mock_with :rspec
77
+ config.raise_errors_for_deprecations!
78
+
79
+ # If you're not using ActiveRecord, or you'd prefer not to run each of your
80
+ # examples within a transaction, comment the following line or assign false
81
+ # instead of true.
82
+ config.use_transactional_fixtures = false
83
+
84
+ if ENV['WEBDRIVER'] == 'accessible'
85
+ config.around(:each, inaccessible: true) do |example|
86
+ Capybara::Accessible.skip_audit { example.run }
87
+ end
88
+ end
89
+
90
+ # Ensure DB is clean, so that transaction isolated specs see
91
+ # pristine state.
92
+ config.before(:suite) do
93
+ DatabaseCleaner.strategy = :truncation
94
+ DatabaseCleaner.clean
95
+ end
96
+
97
+ config.before do
98
+ WebMock.disable!
99
+ DatabaseCleaner.strategy = if RSpec.current_example.metadata[:js]
100
+ :truncation
101
+ else
102
+ :transaction
103
+ end
104
+ # TODO: Find out why open_transactions ever gets below 0
105
+ # See issue #3428
106
+ if ApplicationRecord.connection.open_transactions < 0
107
+ ApplicationRecord.connection.increment_open_transactions
108
+ end
109
+ DatabaseCleaner.start
110
+ reset_spree_preferences
111
+ end
112
+
113
+ config.after do
114
+ DatabaseCleaner.clean
115
+ end
116
+
117
+ config.after(:each, type: :feature) do |example|
118
+ missing_translations = page.body.scan(/translation missing: #{I18n.locale}\.(.*?)[\s<\"&]/)
119
+ if missing_translations.any?
120
+ puts "Found missing translations: #{missing_translations.inspect}"
121
+ puts "In spec: #{example.location}"
122
+ end
123
+ end
124
+
125
+ config.include FactoryBot::Syntax::Methods
126
+
127
+ config.include Spree::TestingSupport::Preferences
128
+ config.include Spree::TestingSupport::UrlHelpers
129
+ config.include Spree::TestingSupport::ControllerRequests, type: :controller
130
+ config.include Spree::TestingSupport::Flash
131
+
132
+ config.include Paperclip::Shoulda::Matchers
133
+ end
metadata ADDED
@@ -0,0 +1,200 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: solidus_mercado_pago
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Ngelx
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2018-01-04 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rest-client
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '2.0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '2.0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: solidus_core
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '2.4'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '2.4'
41
+ - !ruby/object:Gem::Dependency
42
+ name: solidus_support
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: bootstrap-sass
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: 3.3.5.1
62
+ - - "<"
63
+ - !ruby/object:Gem::Version
64
+ version: '3.4'
65
+ type: :runtime
66
+ prerelease: false
67
+ version_requirements: !ruby/object:Gem::Requirement
68
+ requirements:
69
+ - - ">="
70
+ - !ruby/object:Gem::Version
71
+ version: 3.3.5.1
72
+ - - "<"
73
+ - !ruby/object:Gem::Version
74
+ version: '3.4'
75
+ - !ruby/object:Gem::Dependency
76
+ name: canonical-rails
77
+ requirement: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - "~>"
80
+ - !ruby/object:Gem::Version
81
+ version: 0.2.0
82
+ type: :runtime
83
+ prerelease: false
84
+ version_requirements: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - "~>"
87
+ - !ruby/object:Gem::Version
88
+ version: 0.2.0
89
+ - !ruby/object:Gem::Dependency
90
+ name: jquery-rails
91
+ requirement: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - "~>"
94
+ - !ruby/object:Gem::Version
95
+ version: '4.1'
96
+ type: :runtime
97
+ prerelease: false
98
+ version_requirements: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - "~>"
101
+ - !ruby/object:Gem::Version
102
+ version: '4.1'
103
+ - !ruby/object:Gem::Dependency
104
+ name: capybara-accessible
105
+ requirement: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - "~>"
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
110
+ type: :development
111
+ prerelease: false
112
+ version_requirements: !ruby/object:Gem::Requirement
113
+ requirements:
114
+ - - "~>"
115
+ - !ruby/object:Gem::Version
116
+ version: '0'
117
+ - !ruby/object:Gem::Dependency
118
+ name: generator_spec
119
+ requirement: !ruby/object:Gem::Requirement
120
+ requirements:
121
+ - - "~>"
122
+ - !ruby/object:Gem::Version
123
+ version: '0'
124
+ type: :development
125
+ prerelease: false
126
+ version_requirements: !ruby/object:Gem::Requirement
127
+ requirements:
128
+ - - "~>"
129
+ - !ruby/object:Gem::Version
130
+ version: '0'
131
+ description: Integrates Mercado Pago with Solidus
132
+ email: ngel@protonmail.com
133
+ executables: []
134
+ extensions: []
135
+ extra_rdoc_files: []
136
+ files:
137
+ - app/assets/javascripts/spree/backend/solidus_mercado_pago.js
138
+ - app/assets/javascripts/spree/frontend/solidus_mercado_pago.js
139
+ - app/assets/stylesheets/spree/backend/solidus_mercado_pago.css
140
+ - app/assets/stylesheets/spree/frontend/solidus_mercado_pago.css
141
+ - app/controllers/spree/mercado_pago_controller.rb
142
+ - app/models/mercado_pago/client.rb
143
+ - app/models/mercado_pago/client/api.rb
144
+ - app/models/mercado_pago/client/authentication.rb
145
+ - app/models/mercado_pago/client/preferences.rb
146
+ - app/models/mercado_pago/notification.rb
147
+ - app/models/mercado_pago/order_preferences_builder.rb
148
+ - app/models/spree/payment_method/mercado_pago.rb
149
+ - app/services/mercado_pago/handle_received_notification.rb
150
+ - app/services/mercado_pago/process_notification.rb
151
+ - app/views/spree/admin/payments/source_forms/_mercadopago.html.erb
152
+ - app/views/spree/admin/payments/source_views/_mercadopago.html.erb
153
+ - app/views/spree/checkout/mercado_pago_error.html.erb
154
+ - app/views/spree/checkout/payment/_mercadopago.html.erb
155
+ - config/locales/en.yml
156
+ - config/locales/es.yml
157
+ - config/locales/pt-BR.yml
158
+ - config/routes.rb
159
+ - db/migrate/20141201204026_create_solidus_mercado_pago_notifications.rb
160
+ - lib/generators/solidus_mercado_pago/install/install_generator.rb
161
+ - lib/solidus_mercado_pago.rb
162
+ - lib/solidus_mercado_pago/engine.rb
163
+ - lib/solidus_mercado_pago/version.rb
164
+ - lib/tasks/mercado_user.rake
165
+ - spec/controllers/spree/mercado_pago_controller_spec.rb
166
+ - spec/fixtures/authenticated.json
167
+ - spec/fixtures/preferences_created.json
168
+ - spec/lib/generators/solidus_mercado_pago/install/install_generator_spec.rb
169
+ - spec/lib/solidus_mercado_pago/version_spec.rb
170
+ - spec/models/mercado_pago/client_spec.rb
171
+ - spec/models/mercado_pago/notification_spec.rb
172
+ - spec/models/mercado_pago/order_preferences_builder_spec.rb
173
+ - spec/models/spree/payment_method/mercado_pago_spec.rb
174
+ - spec/services/mercado_pago/process_notification_spec.rb
175
+ - spec/spec_helper.rb
176
+ homepage: https://github.com/angelx/solidus_mercado_pago
177
+ licenses:
178
+ - MIT
179
+ metadata: {}
180
+ post_install_message:
181
+ rdoc_options: []
182
+ require_paths:
183
+ - lib
184
+ required_ruby_version: !ruby/object:Gem::Requirement
185
+ requirements:
186
+ - - ">="
187
+ - !ruby/object:Gem::Version
188
+ version: '0'
189
+ required_rubygems_version: !ruby/object:Gem::Requirement
190
+ requirements:
191
+ - - ">="
192
+ - !ruby/object:Gem::Version
193
+ version: '0'
194
+ requirements: []
195
+ rubyforge_project:
196
+ rubygems_version: 2.6.11
197
+ signing_key:
198
+ specification_version: 4
199
+ summary: Solidus plugin to integrate Mercado Pago
200
+ test_files: []