pagarme 2.0.2 → 2.1.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 (69) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/.travis.yml +3 -2
  4. data/README.md +285 -4
  5. data/Rakefile +16 -19
  6. data/lib/pagarme.rb +17 -32
  7. data/lib/pagarme/core_ext.rb +9 -0
  8. data/lib/pagarme/errors.rb +39 -25
  9. data/lib/pagarme/model.rb +40 -45
  10. data/lib/pagarme/nested_model.rb +56 -0
  11. data/lib/pagarme/object.rb +133 -92
  12. data/lib/pagarme/request.rb +96 -46
  13. data/lib/pagarme/resources/address.rb +4 -0
  14. data/lib/pagarme/resources/antifraud_analysis.rb +4 -0
  15. data/lib/pagarme/resources/balance.rb +24 -0
  16. data/lib/pagarme/resources/balance_operation.rb +37 -0
  17. data/lib/pagarme/resources/bank_account.rb +4 -0
  18. data/lib/pagarme/resources/bulk_anticipation.rb +65 -0
  19. data/lib/pagarme/resources/card.rb +4 -0
  20. data/lib/pagarme/resources/company.rb +28 -0
  21. data/lib/pagarme/{customer.rb → resources/customer.rb} +0 -0
  22. data/lib/pagarme/resources/payable.rb +11 -0
  23. data/lib/pagarme/resources/phone.rb +4 -0
  24. data/lib/pagarme/{plan.rb → resources/plan.rb} +0 -2
  25. data/lib/pagarme/resources/postal_code.rb +15 -0
  26. data/lib/pagarme/resources/postback.rb +15 -0
  27. data/lib/pagarme/resources/recipient.rb +32 -0
  28. data/lib/pagarme/resources/split_rule.rb +4 -0
  29. data/lib/pagarme/resources/subscription.rb +43 -0
  30. data/lib/pagarme/resources/transaction.rb +41 -0
  31. data/lib/pagarme/{transfer.rb → resources/transfer.rb} +0 -3
  32. data/lib/pagarme/{phone.rb → resources/user.rb} +1 -1
  33. data/lib/pagarme/transaction_common.rb +39 -42
  34. data/lib/pagarme/version.rb +3 -0
  35. data/pagarme.gemspec +16 -13
  36. data/test/assertions.rb +195 -0
  37. data/test/fixtures.rb +222 -0
  38. data/test/pagarme/error_test.rb +13 -0
  39. data/test/pagarme/object_test.rb +19 -0
  40. data/test/pagarme/pagarme_test.rb +10 -0
  41. data/test/pagarme/resources/balance_test.rb +46 -0
  42. data/test/pagarme/resources/bank_account_test.rb +35 -0
  43. data/test/pagarme/resources/bulk_anticipation_test.rb +72 -0
  44. data/test/pagarme/resources/card_test.rb +22 -0
  45. data/test/pagarme/resources/payable_test.rb +30 -0
  46. data/test/pagarme/resources/plan_test.rb +57 -0
  47. data/test/pagarme/resources/postback_test.rb +18 -0
  48. data/test/pagarme/resources/recipient_test.rb +41 -0
  49. data/test/pagarme/resources/subscription_test.rb +100 -0
  50. data/test/pagarme/resources/transaction_test.rb +221 -0
  51. data/test/pagarme/resources/transfer_test.rb +23 -0
  52. data/test/pagarme/resources/zipcode_test.rb +15 -0
  53. data/test/test_helper.rb +52 -175
  54. metadata +102 -30
  55. data/lib/pagarme/address.rb +0 -4
  56. data/lib/pagarme/bank_account.rb +0 -9
  57. data/lib/pagarme/card.rb +0 -7
  58. data/lib/pagarme/subscription.rb +0 -43
  59. data/lib/pagarme/transaction.rb +0 -33
  60. data/lib/pagarme/util.rb +0 -78
  61. data/pagarme.rb +0 -12
  62. data/test/pagarme/bank_account.rb +0 -46
  63. data/test/pagarme/card.rb +0 -26
  64. data/test/pagarme/object.rb +0 -29
  65. data/test/pagarme/pagarme.rb +0 -10
  66. data/test/pagarme/plan.rb +0 -70
  67. data/test/pagarme/subscription.rb +0 -123
  68. data/test/pagarme/transaction.rb +0 -215
  69. data/test/pagarme/transfer.rb +0 -42
@@ -0,0 +1,3 @@
1
+ module PagarMe
2
+ VERSION = '2.1.0'
3
+ end
@@ -1,26 +1,29 @@
1
- # coding: utf-8
2
1
  lib = File.expand_path('../lib', __FILE__)
3
2
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
+ require 'pagarme/version'
4
4
 
5
5
  Gem::Specification.new do |spec|
6
- spec.name = "pagarme"
7
- spec.version = "2.0.2"
8
- spec.authors = ["Pedro Franceschi", "Henrique Dubugras"]
9
- spec.email = ["pedrohfranceschi@gmail.com", "henrique@pagar.me"]
6
+ spec.name = 'pagarme'
7
+ spec.version = PagarMe::VERSION
8
+ spec.authors = ['Pedro Franceschi', 'Henrique Dubugras']
9
+ spec.email = ['pedrohfranceschi@gmail.com', 'henrique@pagar.me']
10
10
  spec.description = %q{Pagar.me's ruby gem}
11
11
  spec.summary = %q{Allows integration with Pagar.me}
12
- spec.homepage = "http://pagar.me/"
12
+ spec.homepage = 'http://pagar.me/'
13
13
 
14
14
  spec.files = `git ls-files`.split($/)
15
15
  spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
16
16
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
17
- spec.require_paths = ["lib"]
17
+ spec.require_paths = ['lib']
18
18
 
19
- spec.add_development_dependency "bundler", "~> 1.3"
20
- spec.add_development_dependency "rake"
21
- spec.add_development_dependency('shoulda', '~> 3.4.0')
22
- spec.add_development_dependency('test-unit')
19
+ spec.add_development_dependency 'bundler', '~> 1.3'
20
+ spec.add_development_dependency 'rake'
21
+ spec.add_development_dependency 'shoulda', '~> 3.4.0'
22
+ spec.add_development_dependency 'test-unit'
23
+ spec.add_development_dependency 'webmock'
24
+ spec.add_development_dependency 'vcr'
25
+ spec.add_development_dependency 'pry'
23
26
 
24
- spec.add_dependency "rest-client"
25
- spec.add_dependency "multi_json"
27
+ spec.add_dependency 'rest-client'
28
+ spec.add_dependency 'multi_json'
26
29
  end
@@ -0,0 +1,195 @@
1
+ module Assertions
2
+ def assert_customer_response(customer)
3
+ assert customer.id
4
+ assert_equal customer.name, 'Jose da Silva'
5
+ assert_equal customer.document_number, '84931126235'
6
+ assert_equal customer.email, 'pagarmetestruby@mailinator.com'
7
+ assert_equal customer.gender, 'M'
8
+ assert_equal Date.parse(customer.born_at), Date.parse('1970-10-11')
9
+ end
10
+
11
+ def assert_subscription_successfully_paid(subscription, amount = 2000, installments = 1)
12
+ assert subscription.id
13
+ assert !subscription.plan
14
+ assert subscription.current_transaction.kind_of?(PagarMe::Transaction)
15
+ assert subscription.current_transaction.id
16
+ assert subscription.current_transaction.date_created
17
+ assert !subscription.current_transaction.refuse_reason
18
+ assert !subscription.current_transaction.boleto_url
19
+ assert !subscription.current_transaction.boleto_barcode
20
+ assert_equal subscription.status, 'paid'
21
+ assert_equal subscription.current_transaction.amount, amount
22
+ assert_equal subscription.current_transaction.payment_method, 'credit_card'
23
+ assert_equal subscription.current_transaction.status, 'paid'
24
+ assert_equal subscription.current_transaction.card_brand, 'visa'
25
+ end
26
+
27
+ def assert_transaction_successfully(transaction)
28
+ assert transaction.id
29
+ assert transaction.date_created
30
+ assert transaction.card.id
31
+ assert !transaction.refuse_reason
32
+ assert_equal transaction.amount, 1000
33
+ assert_equal transaction.installments.to_i, 1
34
+ assert_equal transaction.card_holder_name, 'Jose da Silva'
35
+ assert_equal transaction.payment_method, 'credit_card'
36
+ assert_equal transaction.card_brand, 'visa'
37
+ assert_equal transaction.card.first_digits, '490172'
38
+ assert_equal transaction.card.last_digits, '4448'
39
+ end
40
+
41
+ def assert_transaction_successfully_paid(transaction)
42
+ assert !transaction.postback_url
43
+ assert_equal transaction.status, 'paid'
44
+ assert_transaction_successfully transaction
45
+ end
46
+
47
+ def assert_transaction_successfully_processing(transaction)
48
+ assert_equal transaction.postback_url, 'http://test.com/postback'
49
+ assert_equal transaction.status, 'processing'
50
+ assert_transaction_successfully transaction
51
+ end
52
+
53
+ def assert_transaction_with_customer_successfully_paid(transaction)
54
+ assert_transaction_successfully_paid transaction
55
+
56
+ assert_equal transaction.customer.class, PagarMe::Customer
57
+ assert_customer_response transaction.customer
58
+
59
+ assert_equal transaction.phone.class, PagarMe::Phone
60
+ assert_equal transaction.phone.ddd, '21'
61
+ assert_equal transaction.phone.number, '922334455'
62
+
63
+ assert_equal transaction.address.class, PagarMe::Address
64
+ assert_equal transaction.address.street, 'Av. Brigadeiro Faria Lima'
65
+ assert_equal transaction.address.neighborhood, 'Itaim bibi'
66
+ assert_equal transaction.address.zipcode, '01452000'
67
+ assert_equal transaction.address.street_number, '2941'
68
+ end
69
+
70
+ def assert_transaction_refused_by_acquirer(transaction)
71
+ assert transaction.id
72
+ assert transaction.date_created
73
+ assert transaction.card.id
74
+ assert_equal transaction.refuse_reason, 'acquirer'
75
+ assert_equal transaction.amount, 1000
76
+ assert_equal transaction.installments.to_i, 1
77
+ assert_equal transaction.card_holder_name, 'Jose da Silva'
78
+ assert_equal transaction.payment_method, 'credit_card'
79
+ assert_equal transaction.status, 'refused'
80
+ assert_equal transaction.card_brand, 'visa'
81
+ assert_equal transaction.card.first_digits, '490172'
82
+ assert_equal transaction.card.last_digits, '4448'
83
+ end
84
+
85
+ def assert_transaction_with_bolelo_on_waiting_payment(transaction)
86
+ assert transaction.date_created
87
+ assert transaction.boleto_barcode
88
+ assert transaction.boleto_expiration_date
89
+ assert transaction.boleto_url
90
+ assert_nil transaction.card
91
+ assert_nil transaction.card_holder_name
92
+ assert_equal transaction.payment_method, 'boleto'
93
+ assert_equal transaction.status, 'waiting_payment'
94
+ assert_equal transaction.amount.to_s, '1000'
95
+ end
96
+
97
+ def assert_split_rules(split_rules)
98
+ assert_equal split_rules.size, 4
99
+ rules = split_rules.sort_by &:percentage
100
+
101
+ assert_equal rules[0].recipient_id, Fixtures.persistent_recipient_ids[0]
102
+ assert_equal rules[1].recipient_id, Fixtures.persistent_recipient_ids[1]
103
+ assert_equal rules[2].recipient_id, Fixtures.persistent_recipient_ids[2]
104
+ assert_equal rules[3].recipient_id, Fixtures.persistent_recipient_ids[3]
105
+
106
+ assert_equal rules[0].percentage, 10
107
+ assert_equal rules[1].percentage, 20
108
+ assert_equal rules[2].percentage, 30
109
+ assert_equal rules[3].percentage, 40
110
+ end
111
+
112
+ def assert_plan_created(plan)
113
+ assert plan.id
114
+ assert_equal plan.name, 'Plano gold'
115
+ assert_equal plan.trial_days, 5
116
+ assert_equal plan.days, 30
117
+ assert_equal plan.amount, 3000
118
+ end
119
+
120
+ def assert_subscription_created(subscription, plan)
121
+ assert subscription.id
122
+ assert_equal subscription.status, 'trialing'
123
+ assert_equal subscription.plan.id, plan.id
124
+ end
125
+
126
+ def assert_no_trial_subscription_created(subscription, plan)
127
+ assert subscription.id
128
+ assert_equal subscription.status, 'paid'
129
+ assert_equal subscription.plan.id, plan.id
130
+ end
131
+
132
+ def assert_transaction_errors(params = {})
133
+ PagarMe::Transaction.create transaction_with_card_params(params)
134
+ rescue PagarMe::ValidationError
135
+ assert_no_match /\s*\,\s*\Z/, $!.message
136
+ end
137
+
138
+ def assert_has_error_param(exception, parameter_name)
139
+ assert exception.errors.any?{ |error| error.parameter_name == parameter_name }
140
+ end
141
+
142
+ def assert_transfer(transfer)
143
+ assert transfer.id
144
+ assert transfer.fee
145
+ assert_equal transfer.class, PagarMe::Transfer
146
+ assert %w(doc credito_em_conta ted).include?(transfer.type)
147
+ end
148
+
149
+ def assert_empty_balance(balance)
150
+ assert_equal balance.available.amount, 0
151
+ assert_equal balance.waiting_funds.amount, 0
152
+ assert_equal balance.transferred.amount, 0
153
+ end
154
+
155
+ def assert_available_balance(balance)
156
+ assert(balance.available.amount > 0)
157
+ assert_equal balance.waiting_funds.amount, 0
158
+ assert_equal balance.transferred.amount, 0
159
+ end
160
+
161
+ def assert_transfered_balance(balance)
162
+ assert(balance.transferred.amount > 0)
163
+ assert_equal balance.available.amount, 0
164
+ assert_equal balance.waiting_funds.amount, 0
165
+ end
166
+
167
+ def assert_increased_available_amount(previous_balance, balance)
168
+ assert(previous_balance.available.amount < balance.available.amount)
169
+ assert_equal previous_balance.waiting_funds.amount, balance.waiting_funds.amount
170
+ assert_equal previous_balance.transferred.amount, balance.transferred.amount
171
+ end
172
+
173
+ def assert_anticipation_limits(limits)
174
+ assert limits.maximum.amount
175
+ assert limits.minimum.amount
176
+ end
177
+
178
+ def assert_anticipation(anticipation)
179
+ assert_statusless_anticipation anticipation
180
+ assert_equal anticipation.status, 'pending'
181
+ end
182
+
183
+ def assert_canceled_anticipation(anticipation)
184
+ assert_statusless_anticipation anticipation
185
+ assert_equal anticipation.status, 'canceled'
186
+ end
187
+
188
+ def assert_statusless_anticipation(anticipation)
189
+ assert anticipation.amount > 0
190
+ assert anticipation.fee
191
+ assert anticipation.anticipation_fee
192
+ assert_equal anticipation.object, 'bulk_anticipation'
193
+ end
194
+
195
+ end
@@ -0,0 +1,222 @@
1
+ class Fixtures
2
+ def transaction
3
+ { amount: 1000 }
4
+ end
5
+
6
+ def boleto
7
+ { payment_method: 'boleto' }
8
+ end
9
+
10
+ def transfer
11
+ { amount: 1000 }
12
+ end
13
+
14
+ def card
15
+ {
16
+ card_number: '4901720080344448',
17
+ card_holder_name: 'Jose da Silva',
18
+ card_expiration_month: '10',
19
+ card_expiration_year: valid_expiration_year,
20
+ card_cvv: '314'
21
+ }
22
+ end
23
+
24
+ def split_rule(recipient_id, percentage)
25
+ { recipient_id: recipient_id, percentage: percentage }
26
+ end
27
+
28
+ def split_rules
29
+ {
30
+ split_rules: [
31
+ split_rule(persistent_recipient_ids[0], 10),
32
+ split_rule(persistent_recipient_ids[1], 20),
33
+ split_rule(persistent_recipient_ids[2], 30),
34
+ split_rule(persistent_recipient_ids[3], 40)
35
+ ]
36
+ }
37
+ end
38
+
39
+ def invalid_split_rules
40
+ {
41
+ split_rules: [
42
+ { percentage: 10 },
43
+ split_rule(persistent_recipient_ids[1], 20),
44
+ split_rule(persistent_recipient_ids[2], 30),
45
+ split_rule(persistent_recipient_ids[3], 40)
46
+ ]
47
+ }
48
+ end
49
+
50
+ def refused_card
51
+ # In test environment CVV's that starts with digit 6 are refused by acquirer
52
+ card.merge card_cvv: '600'
53
+ end
54
+
55
+ def plan
56
+ {
57
+ days: 30,
58
+ name: 'Plano gold',
59
+ amount: 3000,
60
+ trial_days: 5
61
+ }
62
+ end
63
+
64
+ def other_plan
65
+ {
66
+ name: 'Plano Silver',
67
+ days: 30,
68
+ amount: 3000
69
+ }
70
+ end
71
+
72
+ def no_trial_plan
73
+ {
74
+ name: 'Plano Sem Trial',
75
+ days: 30,
76
+ amount: 3000,
77
+ trial_days: 0
78
+ }
79
+ end
80
+
81
+ def bank_account
82
+ {
83
+ bank_code: '237',
84
+ agencia: '1935',
85
+ agencia_dv: '9',
86
+ conta: '23398',
87
+ conta_dv: '9',
88
+ legal_name: 'foo bar loem',
89
+ document_number: '00000000000000'
90
+ }
91
+ end
92
+
93
+ def nested_bank_account
94
+ { bank_account: bank_account }
95
+ end
96
+
97
+ def refund_bank_account
98
+ {
99
+ bank_account: {
100
+ bank_code: '399',
101
+ agencia: '1234',
102
+ conta: '1234567',
103
+ conta_dv: '1',
104
+ legal_name: 'Jose da Silva',
105
+ document_number: '68782915423'
106
+ }
107
+ }
108
+ end
109
+
110
+ def recipient
111
+ {
112
+ transfer_day: 3,
113
+ transfer_enabled: true,
114
+ transfer_interval: 'daily'
115
+ }
116
+ end
117
+
118
+ def postback
119
+ { postback_url: 'http://test.com/postback' }
120
+ end
121
+
122
+ def postback_response
123
+ {
124
+ id: 194330,
125
+ event: 'transaction_status_changed',
126
+ fingerprint: 'f8eb5ce941d70473ea691959ea4bfdeb79d48e2c',
127
+ desired_status: 'paid',
128
+ current_status: 'paid',
129
+ object: 'transaction',
130
+ old_status: 'processing'
131
+ }
132
+ end
133
+
134
+ def subscription
135
+ card.merge customer: { email: 'customer@pagar.me' }
136
+ end
137
+
138
+ def customer
139
+ {
140
+ customer: {
141
+ name: 'Jose da Silva',
142
+ document_number: '84931126235',
143
+ email: 'pagarmetestruby@mailinator.com',
144
+ gender: 'M',
145
+ born_at: '1970-10-11',
146
+ phone: { ddd: '21', number: '922334455' },
147
+ address: {
148
+ street: 'Av. Brigadeiro Faria Lima',
149
+ neighborhood: 'Itaim bibi',
150
+ zipcode: '01452000',
151
+ street_number: '2941'
152
+ }
153
+ }
154
+ }
155
+ end
156
+
157
+ def invalid_expiration_year
158
+ { card_expiration_year: _invalid_expiration_year }
159
+ end
160
+
161
+ def anticipations_limits
162
+ {
163
+ timeframe: :end,
164
+ payment_date: (Date.today + 7)
165
+ }
166
+ end
167
+
168
+ def respond_to?(method_name)
169
+ return true if super(method_name)
170
+ method_name.to_s.split(/_with_/).all?{ |m| super(m) }
171
+ end
172
+
173
+ def valid_expiration_year
174
+ ( Time.now.year+1 ).to_s[2..-1]
175
+ end
176
+
177
+ def persistent_recipient_ids
178
+ VCR.use_cassette('fixtures/persistent_recipients') do
179
+ 4.times.map do
180
+ PagarMe::Recipient.create(recipient_with_nested_bank_account).id
181
+ end
182
+ end
183
+ end
184
+
185
+ def self.persistent_recipient_ids
186
+ new.persistent_recipient_ids
187
+ end
188
+
189
+ protected
190
+
191
+ def _invalid_expiration_year
192
+ ( Time.now.year-1 ).to_s[2..-1]
193
+ end
194
+
195
+ def method_missing(name, *args, &block)
196
+ if respond_to?(name)
197
+ name.to_s.split(/_with_/).map{ |m| public_send m }.inject Hash.new, &:merge
198
+ else
199
+ super name, *args, &block
200
+ end
201
+ end
202
+
203
+ module Helpers
204
+ protected
205
+ def fixtures
206
+ @fixtures ||= Fixtures.new
207
+ end
208
+
209
+ def method_missing(name, *args, &block)
210
+ match = name.to_s.match /\_params\Z/
211
+ if match && fixtures.respond_to?(match.pre_match) && args.count < 2
212
+ if args.empty?
213
+ fixtures.public_send match.pre_match
214
+ else
215
+ fixtures.public_send(match.pre_match).merge args.first
216
+ end
217
+ else
218
+ super name, *args, &block
219
+ end
220
+ end
221
+ end
222
+ end