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,221 @@
1
+ require_relative '../../test_helper'
2
+
3
+ module PagarMe
4
+ class TransactionTest < Test::Unit::TestCase
5
+ def setup
6
+ super
7
+ ensure_positive_balance
8
+ end
9
+
10
+ should 'be able to charge' do
11
+ transaction = PagarMe::Transaction.new transaction_with_customer_with_card_params
12
+ assert_equal transaction.status, 'local'
13
+
14
+ transaction.charge
15
+ assert_transaction_successfully_paid transaction
16
+ end
17
+
18
+ should 'be able to set postback url' do
19
+ transaction = PagarMe::Transaction.create transaction_with_customer_with_card_with_postback_params
20
+ assert_transaction_successfully_processing transaction
21
+ end
22
+
23
+ should 'not be able to charge when refused card' do
24
+ transaction = PagarMe::Transaction.new transaction_with_customer_with_refused_card_params
25
+ assert_equal transaction.status, 'local'
26
+
27
+ transaction.charge
28
+ assert_transaction_refused_by_acquirer transaction
29
+ end
30
+
31
+ should 'be able to charge with a saved card' do
32
+ card = PagarMe::Card.create card_params
33
+ transaction = PagarMe::Transaction.charge customer_params(card: card, amount: 1000)
34
+ assert_transaction_successfully_paid transaction
35
+ end
36
+
37
+ should 'be able to charge with an unsaved card' do
38
+ card = PagarMe::Card.new card_params
39
+ transaction = PagarMe::Transaction.charge customer_params(card: card, amount: 1000)
40
+ assert_transaction_successfully_paid transaction
41
+ end
42
+
43
+ should 'be able to refund' do
44
+ transaction = PagarMe::Transaction.charge transaction_with_customer_with_card_params
45
+ assert_transaction_successfully_paid transaction
46
+
47
+ transaction.refund
48
+ assert_equal transaction.status, 'refunded'
49
+ end
50
+
51
+ should 'be able to create transaciton with boleto' do
52
+ transaction = PagarMe::Transaction.charge transaction_with_boleto_params
53
+ assert_transaction_with_bolelo_on_waiting_payment transaction
54
+ end
55
+
56
+ should 'be able to send and retrieve metadata' do
57
+ metadata = {
58
+ 'metadata' => {
59
+ 'event' => {
60
+ 'id' => 335,
61
+ 'name' => 'Evento foda'
62
+ }
63
+ }
64
+ }
65
+ transaction = PagarMe::Transaction.charge transaction_with_customer_with_card_params(metadata)
66
+ assert_equal transaction.metadata.to_hash, metadata['metadata']
67
+
68
+ found_transaction = PagarMe::Transaction.find_by_id transaction.id
69
+ assert_equal found_transaction.metadata.to_hash, metadata['metadata']
70
+ end
71
+
72
+ should 'be able to find a transaction' do
73
+ transaction = PagarMe::Transaction.charge transaction_with_customer_with_card_params
74
+ assert_transaction_successfully_paid transaction
75
+
76
+ other_transaction = PagarMe::Transaction.find_by_id transaction.id
77
+ assert_equal transaction.id, other_transaction.id
78
+ assert_equal transaction, other_transaction
79
+ end
80
+
81
+ should 'raise an error when nil or empty string as ID' do
82
+ assert_raises RequestError do
83
+ PagarMe::Transaction.find_by_id nil
84
+ end
85
+
86
+ assert_raises RequestError do
87
+ PagarMe::Transaction.find_by_id ''
88
+ end
89
+ end
90
+
91
+ should 'require parameters on the refund with boleto' do
92
+ transaction = PagarMe::Transaction.create transaction_with_boleto_params
93
+ assert_equal transaction.status, 'waiting_payment'
94
+
95
+ assert_raises(PagarMe::ValidationError){ transaction.refund }
96
+ assert_raises(PagarMe::ValidationError){ transaction.refund refund_bank_account_params }
97
+ assert_equal transaction.status, 'waiting_payment'
98
+
99
+ transaction.status = 'paid'
100
+ transaction.save
101
+ assert_equal transaction.status, 'paid'
102
+
103
+ assert_raises(PagarMe::ValidationError){ transaction.refund }
104
+ assert_equal transaction.status, 'paid'
105
+
106
+ transaction.refund refund_bank_account_params
107
+ assert_equal transaction.status, 'pending_refund'
108
+
109
+ found_transaction = PagarMe::Transaction.find_by_id transaction.id
110
+ assert_equal found_transaction.status, 'pending_refund'
111
+ end
112
+
113
+ should 'be able to create transaction with customer' do
114
+ transaction = PagarMe::Transaction.charge transaction_with_card_with_customer_params
115
+ assert_transaction_with_customer_successfully_paid transaction
116
+ end
117
+
118
+ should 'be able to refund transaction with customer' do
119
+ transaction = PagarMe::Transaction.charge transaction_with_card_with_customer_params
120
+ assert_transaction_with_customer_successfully_paid transaction
121
+
122
+ transaction.refund
123
+ assert_equal transaction.status, 'refunded'
124
+ end
125
+
126
+ should 'be able to capture a transaction and pass an amount' do
127
+ transaction = PagarMe::Transaction.charge transaction_with_customer_with_card_params(capture: false, amount: 2000)
128
+ assert_equal transaction.status, 'authorized'
129
+ assert_equal transaction.amount, 2000
130
+ assert_equal transaction.paid_amount, 0
131
+ assert_equal transaction.refunded_amount, 0
132
+
133
+ transaction.capture amount: 1000
134
+ assert_equal transaction.status, 'paid'
135
+ assert_equal transaction.amount, 2000
136
+ assert_equal transaction.paid_amount, 1000
137
+ assert_equal transaction.refunded_amount, 0
138
+ end
139
+
140
+ should 'validate transaction with invalid card_number' do
141
+ exception = assert_raises PagarMe::ValidationError do
142
+ PagarMe::Transaction.charge transaction_with_card_params(card_number: '123456')
143
+ end
144
+ assert exception.errors.any?{ |error| error.parameter_name == 'card_number' }
145
+ end
146
+
147
+ should 'validate transaction missing card_holder_name' do
148
+ exception = assert_raises PagarMe::ValidationError do
149
+ params = {
150
+ card_number: '4111111111111111',
151
+ amount: '1000'
152
+ }
153
+ PagarMe::Transaction.charge params
154
+ end
155
+ assert exception.errors.any?{ |error| error.parameter_name == 'card_holder_name' }
156
+ end
157
+
158
+ should 'validate transaction with invalid expiracy month' do
159
+ exception = assert_raises PagarMe::ValidationError do
160
+ params = {
161
+ card_number: '4111111111111111',
162
+ card_holder_name: 'Jose da Silva',
163
+ amount: '1000',
164
+ card_expiracy_month: 15
165
+ }
166
+ PagarMe::Transaction.charge params
167
+ end
168
+ assert exception.errors.any?{ |error| error.parameter_name == 'card_expiration_date' }
169
+ end
170
+
171
+ should 'validate transaction invalid expiracy year' do
172
+ exception = assert_raises PagarMe::ValidationError do
173
+ params = {
174
+ card_number: '4111111111111111',
175
+ card_holder_name: 'Jose da Silva',
176
+ amount: '1000',
177
+ card_expiration_month: 12,
178
+ card_expiration_year: -1,
179
+ }
180
+ PagarMe::Transaction.charge params
181
+ end
182
+ assert exception.errors.any?{ |error| error.parameter_name == 'card_expiration_date' }
183
+ end
184
+
185
+ should 'validate transaction missing cvv' do
186
+ exception = assert_raises PagarMe::ValidationError do
187
+ params = {
188
+ card_number: '4111111111111111',
189
+ card_holder_name: 'Jose da Silva',
190
+ amount: '1000',
191
+ card_expiration_month: 12,
192
+ card_expiration_year: 16,
193
+ }
194
+ PagarMe::Transaction.charge params
195
+ end
196
+ assert exception.errors.any?{ |error| error.parameter_name == 'card_cvv' }
197
+ end
198
+
199
+ should 'be able to split transaction' do
200
+ transaction = PagarMe::Transaction.charge transaction_with_customer_with_card_with_split_rules_params
201
+ assert_split_rules transaction.split_rules
202
+ end
203
+
204
+ should 'raise error when there is an invalid split rule' do
205
+ assert_raises PagarMe::ValidationError do
206
+ PagarMe::Transaction.charge transaction_with_card_with_invalid_split_rules_params
207
+ end
208
+ end
209
+
210
+ should 'calculate installments' do
211
+ amount = 10000
212
+ result = PagarMe::Transaction.calculate_installments amount: amount, interest_rate: 0
213
+
214
+ assert_equal result['installments'].size, 12
215
+ (1..12).each do |i|
216
+ installment = (amount.to_f/i).round
217
+ assert_equal result['installments'][i.to_s]['installment_amount'], installment
218
+ end
219
+ end
220
+ end
221
+ end
@@ -0,0 +1,23 @@
1
+ require_relative '../../test_helper'
2
+
3
+ module PagarMe
4
+ class TransferTest < Test::Unit::TestCase
5
+ def setup
6
+ super
7
+ ensure_positive_balance
8
+ end
9
+
10
+ should 'be able to create a transfer' do
11
+ transfer = PagarMe::Transfer.create transfer_params
12
+ assert_transfer transfer
13
+ end
14
+
15
+ should 'be able to find with id' do
16
+ transfer = PagarMe::Transfer.create transfer_params
17
+ assert_transfer transfer
18
+
19
+ found_transfer = PagarMe::Transfer.find_by_id transfer.id
20
+ assert_transfer found_transfer
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,15 @@
1
+ require_relative '../../test_helper'
2
+
3
+ module PagarMe
4
+ class ZipcodeTest < Test::Unit::TestCase
5
+ should 'be able find a zipcode' do
6
+ zipcode = PagarMe::Zipcode.find '12228-462'
7
+
8
+ assert_equal zipcode.city, 'São José dos Campos'
9
+ assert_equal zipcode.neighborhood, 'Campus do CTA'
10
+ assert_equal zipcode.state, 'SP'
11
+ assert_equal zipcode.street, 'Rua H8C'
12
+ assert_equal zipcode.zipcode, '12228462'
13
+ end
14
+ end
15
+ end
@@ -1,192 +1,69 @@
1
- require_relative '../lib/pagarme'
2
1
  require 'test/unit'
3
2
  require 'shoulda'
3
+ require 'webmock'
4
+ require 'pry'
5
+ require 'vcr'
4
6
 
5
- def test_transaction(params = {})
6
- return PagarMe::Transaction.new({
7
- :card_number => "4901720080344448",
8
- :card_holder_name => "Jose da Silva",
9
- :card_expiration_month => "10",
10
- :card_expiration_year => "15",
11
- :card_cvv => "314",
12
- :amount => 1000
13
- }.merge(params))
14
- end
15
-
16
- def test_transfer(params = {})
17
- return PagarMe::Transfer.new({
18
- amount: 1000,
19
- }.merge(params))
20
- end
21
-
22
- def test_card(params = {})
23
- return PagarMe::Card.new({
24
- :card_number => '4111111111111111',
25
- :card_holder_name => 'Jose da Silva',
26
- :card_expiration_month => '10',
27
- :card_expiration_year => '15',
28
- :card_cvv => '314'
29
- }.merge(params))
30
- end
31
-
32
- def test_subscription_without_plan(params = {})
33
- return PagarMe::Subscription.new({
34
- :payment_method => 'credit_card',
35
- :card_number => "4901720080344448",
36
- :card_holder_name => "Jose da Silva",
37
- :card_expiration_month => "10",
38
- :card_expiration_year => "15",
39
- :card_cvv => "314",
40
- :postback_url => "http://test.com/postback",
41
- :customer => {
42
- :email => 'customer@pagar.me'
43
- }
44
- }.merge(params))
45
- end
46
-
47
- def test_plan(params = {})
48
- return PagarMe::Plan.new({
49
- :name => "Plano gold",
50
- :trial_days => 5,
51
- :days => 30,
52
- :amount => 3000,
53
- }.merge(params))
54
- end
55
-
56
- def test_bank_account(params = {})
57
- return PagarMe::BankAccount.new({
58
- :bank_code => '237',
59
- :agencia => '1935',
60
- :agencia_dv => '9',
61
- :conta => '23398',
62
- :conta_dv => '9',
63
- :legal_name => 'foo bar loem',
64
- :document_number => '00000000000000'
65
- }.merge(params))
7
+ require_relative '../lib/pagarme'
8
+ require_relative 'assertions'
9
+ require_relative 'fixtures'
10
+
11
+ VCR.configure do |config|
12
+ config.cassette_library_dir = 'test/vcr_cassettes'
13
+ config.default_cassette_options[:match_requests_on] = [:method, :uri, :host, :path, :query, :body, :headers]
14
+ config.default_cassette_options[:record] = :new_episodes
15
+ config.hook_into :webmock
66
16
  end
67
17
 
68
- def test_subscription(params = {})
69
- return PagarMe::Subscription.new({
70
- :payment_method => 'credit_card',
71
- :card_number => "4901720080344448",
72
- :card_holder_name => "Jose da Silva",
73
- :card_expiration_month => "10",
74
- :card_expiration_year => "15",
75
- :card_cvv => "314",
76
- :postback_url => "http://test.com/postback",
77
- :customer => {
78
- email: 'customer@pagar.me'
79
- }
80
- }.merge(params))
81
- end
18
+ class Test::Unit::TestCase
19
+ FIXED_API_KEY = 'ak_test_Q2D2qDYGJSyeR1KbI4sLzGACEr73MF'
82
20
 
83
- def test_transaction_with_customer(params = {})
84
- return PagarMe::Transaction.new({
85
- :amount => 1000,
86
- :card_number => '4901720080344448',
87
- :card_holder_name => "Jose da Silva",
88
- :card_expiration_month => "11",
89
- :card_expiration_year => "19",
90
- :card_cvv => "356",
91
- :customer => {
92
- :name => "Jose da Silva",
93
- :document_number => "36433809847",
94
- :email => "henrique+test@pagar.me",
95
- :address => {
96
- :street => 'Av. Brigadeiro Faria Lima',
97
- :neighborhood => 'Itaim bibi',
98
- :zipcode => '01452000',
99
- :street_number => "2941",
100
- },
101
- :phone => {
102
- :ddd => "12",
103
- :number => '981433533',
104
- },
105
- :sex => 'M',
106
- :born_at => '1970-10-11'
107
- }
108
- }.merge(params))
109
- end
21
+ include Fixtures::Helpers
22
+ include Assertions
110
23
 
111
- def test_subscription_with_customer(params = {})
112
- return PagarMe::Subscription.new({
113
- :amount => 1000,
114
- :card_number => '4901720080344448',
115
- :card_holder_name => "Jose da silva",
116
- :card_expiration_month => "11",
117
- :card_expiration_year => "19",
118
- :card_cvv => "356",
119
- :customer => {
120
- :name => "Jose da Silva",
121
- :document_number => "36433809847",
122
- :email => "henrique@pagar.me",
123
- :address => {
124
- :street => 'Av. Brigadeiro Faria Lima',
125
- :neighborhood => 'Itaim bibi',
126
- :zipcode => '01452000',
127
- :street_number => "1000",
128
- } ,
129
- :phone => {
130
- :ddd => "12",
131
- :number => '981444444',
132
- } ,
133
- :sex => 'M',
134
- :born_at => '1970-10-11'
135
- }
136
- }.merge(params))
137
- end
24
+ def setup
25
+ PagarMe.api_key = temporary_api_key
26
+ end
138
27
 
28
+ def teardown
29
+ PagarMe.api_key = nil
30
+ end
139
31
 
140
- def test_customer_response(customer)
141
- assert customer.id
142
- assert customer.document_type == 'cpf'
143
- assert customer.name == 'Jose da Silva'
144
- assert customer.born_at
145
- assert customer.id
146
- end
32
+ protected
33
+ def ensure_positive_balance
34
+ VCR.use_cassette 'TestCase/ensure_positive_balance' do
35
+ transaction = PagarMe::Transaction.charge transaction_with_boleto_params(amount: 100_000_00)
36
+ transaction.status = :paid
37
+ transaction.save
38
+ end
39
+ end
147
40
 
148
- def test_subscription_transaction_response(transaction, amount = nil, installments = nil)
149
- amount ||= 2000
150
- installments ||= 1
151
- assert transaction.id
152
- assert !transaction.refuse_reason
153
- assert transaction.date_created
154
- assert transaction.amount == amount
155
- assert transaction.installments.to_i == installments
156
- # assert transaction.card_brand == 'visa'
157
- assert transaction.payment_method == 'credit_card'
158
- assert transaction.status == 'paid'
159
- assert !transaction.boleto_url
160
- assert !transaction.boleto_barcode
161
- end
41
+ def ensure_waiting_funds
42
+ VCR.use_cassette 'TestCase/ensure_waiting_funds' do
43
+ PagarMe::Transaction.create transaction_with_customer_with_card_params(amount: 10_000_00, installments: 12)
44
+ end
45
+ end
162
46
 
163
- def test_transaction_response(transaction)
164
- assert transaction.id
165
- assert transaction.card_holder_name
166
- assert !transaction.refuse_reason
167
- assert transaction.date_created
168
- assert transaction.amount == 1000
169
- assert transaction.installments.to_i == 1
170
- assert transaction.card_holder_name == 'Jose da Silva'
171
- # assert transaction.card_brand == 'visa'
172
- assert transaction.payment_method == 'credit_card'
173
- assert transaction.status == 'paid'
174
- end
47
+ def fixed_api_key
48
+ PagarMe.api_key = FIXED_API_KEY
49
+ yield
50
+ PagarMe.api_key = temporary_api_key
51
+ end
175
52
 
176
- def test_plan_response(plan)
177
- assert plan.id
178
- assert plan.name == 'Plano gold'
179
- assert plan.trial_days == 5
180
- assert plan.days == 30
181
- assert plan.amount = 3000
182
- end
53
+ def temporary_api_key
54
+ return FIXED_API_KEY
183
55
 
184
- class Test::Unit::TestCase
185
- def setup
186
- PagarMe.api_key="ak_test_Rw4JR98FmYST2ngEHtMvVf5QJW7Eoo"
56
+ # TODO: Unfortunately, it's right now impossible to create
57
+ # temporary companies properly pre-configured to run all tests
58
+ VCR.use_cassette 'TestCase/tmp_company_api_key' do
59
+ PagarMe.api_key = FIXED_API_KEY
60
+ Company.temporary.api_key.test
61
+ end
187
62
  end
188
63
 
189
- def teardown
190
- PagarMe.api_key=nil
64
+ # Monkey Patch that adds VCR everywhere
65
+ def self.should(description, &block)
66
+ cassette_name = "#{ self.name.split('::').last }/should_#{ description.gsub /\s+/, '_' }"
67
+ super(description){ VCR.use_cassette(cassette_name){ self.instance_exec &block } }
191
68
  end
192
69
  end