pagarme 2.0.2 → 2.1.0

Sign up to get free protection for your applications and to get access to all the features.
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