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,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