catarse_pagarme 2.13.0 → 2.14.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.
@@ -1,12 +1,13 @@
1
1
  module CatarsePagarme
2
2
  class Configuration
3
- attr_accessor :api_key, :slip_tax, :credit_card_tax, :interest_rate, :host, :subdomain, :protocol,
3
+ attr_accessor :api_key, :konduto_api_key, :slip_tax, :credit_card_tax, :interest_rate, :host, :subdomain, :protocol,
4
4
  :max_installments, :minimum_value_for_installment, :credit_card_cents_fee, :pagarme_tax, :stone_tax,
5
5
  :stone_installment_tax, :cielo_tax, :cielo_installment_diners_tax, :cielo_installment_not_diners_tax,
6
6
  :cielo_installment_amex_tax, :cielo_installment_not_amex_tax, :ecr_key, :slip_week_day_interval, :antifraud_tax, :use_simility
7
7
 
8
8
  def initialize
9
9
  self.api_key = ''
10
+ self.konduto_api_key = ''
10
11
  self.ecr_key = ''
11
12
  self.slip_tax = 0
12
13
  self.credit_card_tax = 0
@@ -1,3 +1,3 @@
1
1
  module CatarsePagarme
2
- VERSION = "2.13.0"
2
+ VERSION = "2.14.0"
3
3
  end
@@ -39,6 +39,10 @@ class Payment < ActiveRecord::Base
39
39
  true
40
40
  end
41
41
 
42
+ def pending?
43
+ state == 'pending'
44
+ end
45
+
42
46
  def refunded?
43
47
  true
44
48
  end
@@ -10,4 +10,8 @@ class PaymentEngines
10
10
  def self.find_payment filter
11
11
  Payment.where(filter).first
12
12
  end
13
+
14
+ def self.was_credit_card_used_before?(card_id)
15
+ Payment.where(state: 'paid').where("gateway_data -> 'card' ->> 'id' = ?", card_id).exists?
16
+ end
13
17
  end
@@ -1,5 +1,6 @@
1
1
  CatarsePagarme.configure do |config|
2
2
  config.api_key = 'foo'
3
+ config.konduto_api_key = 'bar'
3
4
  config.slip_tax = 0
4
5
  config.credit_card_tax = 0
5
6
  config.interest_rate = 0
@@ -0,0 +1,366 @@
1
+ require 'spec_helper'
2
+
3
+ describe CatarsePagarme::AntifraudOrderWrapper do
4
+ let(:attributes) { double }
5
+ let(:transaction) { double }
6
+
7
+ subject { described_class.new(attributes, transaction) }
8
+
9
+ describe '#send' do
10
+ let(:order) { double }
11
+ let(:client) { double }
12
+ let(:response) { double }
13
+ let(:analyze) { true }
14
+
15
+ before do
16
+ allow(subject).to receive(:build_order).with(analyze: analyze).and_return(order)
17
+ allow(subject).to receive(:client).and_return(client)
18
+ allow(client).to receive(:analyze).with(order).and_return(response)
19
+ end
20
+
21
+ it 'sends to antifraud' do
22
+ expect(subject.send(analyze: analyze)).to eq response
23
+ end
24
+ end
25
+
26
+ describe '#client' do
27
+ context 'when @client is present' do
28
+ it 'returns client' do
29
+ client = double
30
+ subject.instance_variable_set('@client', client)
31
+
32
+ expect(subject.__send__(:client)).to eq client
33
+ end
34
+ end
35
+
36
+ context 'when @client isn`t present' do
37
+ let(:client) { double }
38
+
39
+ before do
40
+ allow(CatarsePagarme).to receive_message_chain('configuration.konduto_api_key').and_return('some-key')
41
+ allow(KondutoRuby).to receive(:new).with('some-key').and_return(client)
42
+ end
43
+
44
+ it 'initialize a new client' do
45
+ subject.instance_variable_set('@client', nil)
46
+
47
+ expect(subject.__send__(:client)).to eq client
48
+ end
49
+ end
50
+ end
51
+
52
+ describe '#build_order' do
53
+ let(:order_attributes) { { total_amount: 10 } }
54
+ let(:customer) { KondutoCustomer.new }
55
+ let(:payment) { [KondutoPayment.new] }
56
+ let(:billing) { KondutoAddress.new }
57
+ let(:shipping) { KondutoAddress.new }
58
+ let(:shopping_cart) { [KondutoItem.new] }
59
+ let(:seller) { KondutoSeller.new }
60
+
61
+ before do
62
+ allow(subject).to receive(:order_attributes).and_return(order_attributes)
63
+ allow(subject).to receive(:build_customer).and_return(customer)
64
+ allow(subject).to receive(:build_payment).and_return(payment)
65
+ allow(subject).to receive(:build_billing_address).and_return(billing)
66
+ allow(subject).to receive(:build_shipping_address).and_return(shipping)
67
+ allow(subject).to receive(:build_shopping_cart).and_return(shopping_cart)
68
+ allow(subject).to receive(:build_seller).and_return(seller)
69
+ end
70
+
71
+ it 'builds an order' do
72
+ order = subject.__send__(:build_order, analyze: false)
73
+ expect(order.total_amount).to eq order_attributes[:total_amount]
74
+ expect(order.analyze).to eq false
75
+ expect(order.customer).to eq customer
76
+ expect(order.payment).to eq payment
77
+ expect(order.billing).to eq billing
78
+ expect(order.shipping).to eq shipping
79
+ expect(order.shopping_cart).to eq shopping_cart
80
+ expect(order.seller).to eq seller
81
+ end
82
+ end
83
+
84
+ describe '#build_customer' do
85
+ let(:customer_attributes) { { name: 'John Appleseed' } }
86
+
87
+ before { allow(subject).to receive(:customer_attributes).and_return(customer_attributes) }
88
+
89
+ it 'builds a customer' do
90
+ customer = subject.__send__(:build_customer)
91
+ expect(customer.name).to eq customer_attributes[:name]
92
+ end
93
+ end
94
+
95
+ describe '#build_payment' do
96
+ let(:payment_attributes) { { bin: '012345' } }
97
+
98
+ before { allow(subject).to receive(:payment_attributes).and_return(payment_attributes) }
99
+
100
+ it 'builds a payment' do
101
+ payment = subject.__send__(:build_payment)
102
+ expect(payment.first.bin).to eq payment_attributes[:bin]
103
+ end
104
+ end
105
+
106
+ describe '#build_billing_address' do
107
+ let(:billing_address_attributes) { { address1: 'R. Tree' } }
108
+
109
+ before { allow(subject).to receive(:billing_address_attributes).and_return(billing_address_attributes) }
110
+
111
+ it 'builds an address' do
112
+ address = subject.__send__(:build_billing_address)
113
+ expect(address.address1).to eq billing_address_attributes[:address1]
114
+ end
115
+ end
116
+
117
+ describe '#build_shipping_address' do
118
+ let(:shipping_address_attributes) { { address1: 'R. Tree' } }
119
+
120
+ before { allow(subject).to receive(:shipping_address_attributes).and_return(shipping_address_attributes) }
121
+
122
+ it 'builds an address' do
123
+ address = subject.__send__(:build_shipping_address)
124
+ expect(address.address1).to eq shipping_address_attributes[:address1]
125
+ end
126
+ end
127
+
128
+ describe '#build_shopping_cart' do
129
+ let(:item_attributes) { { sku: '0102' } }
130
+
131
+ before { allow(subject).to receive(:item_attributes).and_return(item_attributes) }
132
+
133
+ it 'builds an item' do
134
+ item = subject.__send__(:build_shopping_cart)
135
+ expect(item.first.sku).to eq item_attributes[:sku]
136
+ end
137
+ end
138
+
139
+ describe '#build_seller' do
140
+ let(:seller_attributes) { { name: 'Catarse' } }
141
+
142
+ before { allow(subject).to receive(:seller_attributes).and_return(seller_attributes) }
143
+
144
+ it 'builds a seller' do
145
+ seller = subject.__send__(:build_seller)
146
+ expect(seller.name).to eq seller_attributes[:name]
147
+ end
148
+ end
149
+
150
+ describe '#customer_attributes' do
151
+ let(:attributes) do
152
+ {
153
+ customer: {
154
+ document_number: '1234',
155
+ name: 'John Appleseed',
156
+ email: 'john@example.com',
157
+ phone: { ddi: '85', ddd: '85', number: '85858585' }
158
+ },
159
+ antifraud_metadata: {
160
+ register: {
161
+ registered_at: '2019-01-01 01:01:01'
162
+ }
163
+ }
164
+ }
165
+ end
166
+
167
+ before { subject.attributes = attributes }
168
+
169
+ it 'builds customer attributes' do
170
+ customer_attributes = subject.__send__(:customer_attributes)
171
+
172
+ expect(customer_attributes[:id]).to eq '1234'
173
+ expect(customer_attributes[:name]).to eq 'John Appleseed'
174
+ expect(customer_attributes[:email]).to eq 'john@example.com'
175
+ expect(customer_attributes[:phone1]).to eq '858585858585'
176
+ expect(customer_attributes[:created_at]).to eq '2019-01-01 01:01:01'
177
+ end
178
+ end
179
+
180
+ describe '#payment_attributes' do
181
+ let(:attributes) do
182
+ {
183
+ customer: {
184
+ document_number: '1234',
185
+ name: 'John Appleseed',
186
+ email: 'john@example.com',
187
+ phone: { ddi: '85', ddd: '85', number: '85858585' }
188
+ },
189
+ antifraud_metadata: {
190
+ register: {
191
+ registered_at: '2019-01-01 01:01:01'
192
+ }
193
+ }
194
+ }
195
+ end
196
+
197
+ let(:transaction) do
198
+ double(status: 'authorized', card: double(first_digits: '123456', last_digits: '7890', expiration_date: '1122'))
199
+ end
200
+
201
+ before do
202
+ subject.attributes = attributes
203
+ subject.transaction = transaction
204
+ end
205
+
206
+ it 'builds customer attributes' do
207
+ payment_attributes = subject.__send__(:payment_attributes)
208
+
209
+ expect(payment_attributes[:type]).to eq 'credit'
210
+ expect(payment_attributes[:bin]).to eq '123456'
211
+ expect(payment_attributes[:last4]).to eq '7890'
212
+ expect(payment_attributes[:expiration_date]).to eq '112022'
213
+ end
214
+
215
+ context 'when transaction status is authorized' do
216
+ it 'build with approved status' do
217
+ payment_attributes = subject.__send__(:payment_attributes)
218
+ expect(payment_attributes[:status]).to eq 'approved'
219
+ end
220
+ end
221
+
222
+ context 'when transaction status isn`t authorized' do
223
+ let(:transaction) do
224
+ double(status: 'refused', card: double(first_digits: '123456', last_digits: '7890', expiration_date: '1122'))
225
+ end
226
+
227
+ it 'build with declined status' do
228
+ payment_attributes = subject.__send__(:payment_attributes)
229
+ expect(payment_attributes[:status]).to eq 'declined'
230
+ end
231
+ end
232
+ end
233
+
234
+ describe '#billing_address_attributes' do
235
+ let(:attributes) do
236
+ {
237
+ customer: {
238
+ name: 'John Appleseed'
239
+ },
240
+ antifraud_metadata: {
241
+ billing: {
242
+ address: {
243
+ street: 'R. A',
244
+ city: 'New City',
245
+ state: 'NC',
246
+ zipcode: '1245'
247
+ }
248
+ }
249
+ }
250
+ }
251
+ end
252
+
253
+ let(:transaction) { double(card: double(country: 'BRAZIL')) }
254
+
255
+ before do
256
+ subject.attributes = attributes
257
+ subject.transaction = transaction
258
+ end
259
+
260
+ it 'builds customer attributes' do
261
+ billing_address_attributes = subject.__send__(:billing_address_attributes)
262
+
263
+ expect(billing_address_attributes[:name]).to eq 'John Appleseed'
264
+ expect(billing_address_attributes[:address1]).to eq 'R. A'
265
+ expect(billing_address_attributes[:city]).to eq 'New City'
266
+ expect(billing_address_attributes[:state]).to eq 'NC'
267
+ expect(billing_address_attributes[:zip]).to eq '1245'
268
+ expect(billing_address_attributes[:country]).to eq 'BR'
269
+ end
270
+ end
271
+
272
+ describe '#shipping_address_attributes' do
273
+ let(:attributes) do
274
+ {
275
+ antifraud_metadata: {
276
+ shipping: {
277
+ customer: {
278
+ name: 'John Appleseed'
279
+ },
280
+ address: {
281
+ street: 'R. A',
282
+ city: 'New City',
283
+ state: 'NC',
284
+ zipcode: '1245'
285
+ }
286
+ }
287
+ }
288
+ }
289
+ end
290
+
291
+ let(:transaction) { double(card: double(country: 'BRAZIL')) }
292
+
293
+ before do
294
+ subject.attributes = attributes
295
+ subject.transaction = transaction
296
+ end
297
+
298
+ it 'builds customer attributes' do
299
+ shipping_address_attributes = subject.__send__(:shipping_address_attributes)
300
+
301
+ expect(shipping_address_attributes[:name]).to eq 'John Appleseed'
302
+ expect(shipping_address_attributes[:address1]).to eq 'R. A'
303
+ expect(shipping_address_attributes[:city]).to eq 'New City'
304
+ expect(shipping_address_attributes[:state]).to eq 'NC'
305
+ expect(shipping_address_attributes[:zip]).to eq '1245'
306
+ end
307
+ end
308
+
309
+ describe '#item_attributes' do
310
+ let(:attributes) do
311
+ {
312
+ amount: 1000,
313
+ metadata: {
314
+ contribution_id: 'contribution-id',
315
+ project_online: '2019-01-01 01:01:01'
316
+ },
317
+ antifraud_metadata: {
318
+ shopping_cart: [
319
+ { name: 'Book' }
320
+ ]
321
+ }
322
+ }
323
+ end
324
+
325
+ before { subject.attributes = attributes }
326
+
327
+ it 'builds customer attributes' do
328
+ item_attributes = subject.__send__(:item_attributes)
329
+
330
+ expect(item_attributes[:sku]).to eq 'contribution-id'
331
+ expect(item_attributes[:product_code]).to eq 'contribution-id'
332
+ expect(item_attributes[:category]).to eq 9999
333
+ expect(item_attributes[:name]).to eq 'Book'
334
+ expect(item_attributes[:unit_cost]).to eq 10.0
335
+ expect(item_attributes[:quantity]).to eq 1
336
+ expect(item_attributes[:created_at]).to eq '2019-01-01'
337
+ end
338
+ end
339
+
340
+
341
+ describe '#seller_attributes' do
342
+ let(:attributes) do
343
+ {
344
+ antifraud_metadata: {
345
+ events: [
346
+ {
347
+ id: 'event-id',
348
+ venue_name: 'Autor',
349
+ date: '2019-01-01'
350
+ }
351
+ ]
352
+ }
353
+ }
354
+ end
355
+
356
+ before { subject.attributes = attributes }
357
+
358
+ it 'builds customer attributes' do
359
+ seller_attributes = subject.__send__(:seller_attributes)
360
+
361
+ expect(seller_attributes[:id]).to eq 'event-id'
362
+ expect(seller_attributes[:name]).to eq 'Autor'
363
+ expect(seller_attributes[:created_at]).to eq '2019-01-01'
364
+ end
365
+ end
366
+ end
@@ -3,19 +3,6 @@ require 'spec_helper'
3
3
  describe CatarsePagarme::CreditCardTransaction do
4
4
  let(:payment) { create(:payment, value: 100) }
5
5
 
6
- let(:pagarme_transaction) {
7
- double({
8
- id: 'abcd',
9
- charge: true,
10
- status: 'paid',
11
- boleto_url: nil,
12
- installments: 3,
13
- acquirer_name: 'stone',
14
- tid: '123123',
15
- card_brand: 'visa'
16
- })
17
- }
18
-
19
6
  let(:valid_attributes) do
20
7
  {
21
8
  payment_method: 'credit_card',
@@ -33,54 +20,255 @@ describe CatarsePagarme::CreditCardTransaction do
33
20
  let(:card_transaction) { CatarsePagarme::CreditCardTransaction.new(valid_attributes, payment) }
34
21
 
35
22
  before do
36
- PagarMe::Transaction.stub(:new).and_return(pagarme_transaction)
23
+ # PagarMe::Transaction.stub(:new).and_return(pagarme_transaction)
37
24
  CatarsePagarme::PaymentDelegator.any_instance.stub(:change_status_by_transaction).and_return(true)
38
25
  CatarsePagarme.configuration.stub(:credit_card_tax).and_return(0.01)
39
26
  end
40
27
 
41
- describe '#charge!' do
42
- describe 'with valid attributes' do
28
+ describe '#process!' do
29
+ let(:transaction) { double(status: 'refused') }
30
+
31
+ before do
32
+ allow(card_transaction).to receive(:transaction).and_return(transaction)
33
+ allow(card_transaction).to receive(:authorize!).and_return(true)
34
+ allow(card_transaction).to receive(:change_payment_state).and_return(true)
35
+ end
36
+
37
+ it 'authorizes transaction' do
38
+ expect(card_transaction).to receive(:authorize!)
39
+ card_transaction.process!
40
+ end
41
+
42
+ context 'when transaction is authorized' do
43
+ let(:transaction) { double(status: 'authorized', capture: true, refund: true) }
44
+
45
+ context 'when credit card was used before' do
46
+ before { allow(card_transaction).to receive(:was_credit_card_used_before?).and_return(true) }
47
+
48
+ it 'captures transaction' do
49
+ expect(card_transaction.transaction).to receive(:capture)
50
+
51
+ card_transaction.process!
52
+ end
53
+ end
54
+
55
+ context 'when is a new credit credit card' do
56
+ let(:antifraud_outcome) { double(recommendation: :APPROVE) }
57
+
58
+ before do
59
+ allow(card_transaction).to receive(:was_credit_card_used_before?).and_return(false)
60
+ allow(card_transaction).to receive(:process_antifraud).and_return(antifraud_outcome)
61
+ end
62
+
63
+ it 'processes antifraud' do
64
+ expect(card_transaction).to receive(:process_antifraud)
65
+
66
+ card_transaction.process!
67
+ end
68
+
69
+ context 'when antifraud recommends approve transaction' do
70
+ let(:antifraud_outcome) { double(recommendation: :APPROVE) }
71
+
72
+ it 'captures transaction' do
73
+ expect(card_transaction.transaction).to receive(:capture)
74
+
75
+ card_transaction.process!
76
+ end
77
+ end
78
+
79
+ context 'when antifraude recommends decline transaction' do
80
+ let(:antifraud_outcome) { double(recommendation: :DECLINE) }
81
+
82
+ it 'refunds transaction' do
83
+ expect(card_transaction.transaction).to receive(:refund)
84
+
85
+ card_transaction.process!
86
+ end
87
+ end
88
+ end
89
+ end
90
+
91
+ it 'changes payment state' do
92
+ expect(card_transaction).to receive(:change_payment_state)
93
+
94
+ card_transaction.process!
95
+ end
96
+ end
97
+
98
+ describe '#authorize!' do
99
+ let(:attributes) do
100
+ { amount: 10, card_hash: 'capgojepaogejpeoajgpeaoj124pih3p4h32p', postback_url: 'https://example.com/postback' }
101
+ end
102
+
103
+ let(:transaction) do
104
+ PagarMe::Transaction.new(
105
+ amount: attributes[:amount],
106
+ card_hash: attributes[:card_hash],
107
+ capture: false,
108
+ async: false,
109
+ postback_url: attributes[:postback_url]
110
+ )
111
+ end
112
+
113
+ before do
114
+ card_transaction.attributes = attributes
115
+ allow_any_instance_of(PagarMe::Transaction).to receive(:charge).and_return(true)
116
+ allow(card_transaction).to receive(:change_payment_state).and_return(true)
117
+ end
118
+
119
+ it 'build a new pagarme transaction' do
120
+ transaction_attributes = {
121
+ amount: attributes[:amount],
122
+ card_hash: attributes[:card_hash],
123
+ capture: false,
124
+ async: false,
125
+ postback_url: attributes[:postback_url]
126
+ }
127
+
128
+ allow(PagarMe::Transaction).to receive(:new).with(transaction_attributes).and_return(transaction)
129
+
130
+ card_transaction.authorize!
131
+
132
+ expect(card_transaction.transaction).to eq transaction
133
+ end
134
+
135
+ it 'updates payment gateway and payment_method' do
136
+ card_transaction.authorize!
137
+
138
+ expect(payment.gateway).to eq 'Pagarme'
139
+ expect(payment.payment_method).to eq 'CartaoDeCredito'
140
+ end
141
+
142
+ it 'charges transaction' do
143
+ allow(PagarMe::Transaction).to receive(:new).and_return(transaction)
144
+ expect(transaction).to receive(:charge)
145
+
146
+ card_transaction.authorize!
147
+ end
148
+
149
+ it 'changes payment state' do
150
+ expect(card_transaction).to receive(:change_payment_state)
151
+
152
+ card_transaction.authorize!
153
+ end
154
+
155
+ context 'when transaction status is refused' do
43
156
  before do
44
- payment.should_receive(:update_attributes).at_least(1).and_call_original
45
- PagarMe::Transaction.should_receive(:find_by_id).with(pagarme_transaction.id).and_return(pagarme_transaction)
46
- CatarsePagarme::PaymentDelegator.any_instance.should_receive(:change_status_by_transaction).with('paid')
157
+ allow_any_instance_of(PagarMe::Transaction).to receive(:status).and_return('refused')
158
+ allow(card_transaction.antifraud_wrapper).to receive(:send).with(analyze: false).and_return(true)
159
+ end
160
+
161
+ it 'sends to antifraud' do
162
+ expect(card_transaction.antifraud_wrapper).to receive(:send).with(analyze: false)
47
163
 
48
- card_transaction.charge!
49
- payment.reload
164
+ card_transaction.authorize! rescue nil
50
165
  end
51
166
 
52
- it "should update payment payment_id" do
53
- expect(payment.gateway_id).to eq('abcd')
167
+ it 'raises PagarMeError exception' do
168
+ expect do
169
+ card_transaction.authorize!
170
+ end.to raise_error(PagarMe::PagarMeError)
54
171
  end
172
+ end
173
+
174
+ context 'when save_card attribute is true' do
175
+ it 'saves credit card' do
176
+ card_transaction.attributes[:save_card] = true
177
+ expect(card_transaction).to receive(:save_user_credit_card)
55
178
 
56
- it "should update payment payment_service_fee" do
57
- expect(payment.gateway_fee).to eq(payment.pagarme_delegator.get_fee)
179
+ card_transaction.authorize!
58
180
  end
181
+ end
182
+
183
+ context 'when save_card attribute is false' do
184
+ it 'does`t save credit card' do
185
+ card_transaction.attributes[:save_card] = false
186
+ expect(card_transaction).to_not receive(:save_user_credit_card)
59
187
 
60
- it "should update payment payment_method" do
61
- expect(payment.gateway).to eq('Pagarme')
188
+ card_transaction.authorize!
62
189
  end
190
+ end
191
+ end
192
+
193
+ describe '#was_credit_card_used_before?' do
194
+ let(:transaction) { double(card: double(id: '123')) }
63
195
 
64
- it "should update payment installments" do
65
- expect(payment.installments).to eq(3)
196
+ before { card_transaction.transaction = transaction }
197
+
198
+ context 'when credit card was used before' do
199
+ before do
200
+ allow(PaymentEngines).to receive(:was_credit_card_used_before?)
201
+ .with(transaction.card.id)
202
+ .and_return(true)
66
203
  end
67
204
 
68
- it "should update payment payment_choice" do
69
- expect(payment.payment_method).to eq(CatarsePagarme::PaymentType::CREDIT_CARD)
205
+ it 'returns true' do
206
+ expect(card_transaction.was_credit_card_used_before?).to be_truthy
70
207
  end
208
+ end
71
209
 
72
- it "should update payment acquirer_name" do
73
- expect(payment.gateway_data["acquirer_name"]).to eq('stone')
210
+ context 'when credit card wasn`t used before' do
211
+ before do
212
+ allow(PaymentEngines).to receive(:was_credit_card_used_before?)
213
+ .with(transaction.card.id)
214
+ .and_return(false)
74
215
  end
75
216
 
76
- it "should update payment acquirer_tid" do
77
- expect(payment.gateway_data["acquirer_tid"]).to eq('123123')
217
+ it 'returns false' do
218
+ expect(card_transaction.was_credit_card_used_before?).to be_falsey
78
219
  end
220
+ end
221
+ end
222
+
223
+ describe '#process_antifraud' do
224
+ it 'sends antifraud order' do
225
+ expect(card_transaction.antifraud_wrapper).to receive(:send).with(analyze: true).once
226
+
227
+ card_transaction.process_antifraud
228
+ end
229
+
230
+ context 'when there is an error' do
231
+ let(:exception) { RuntimeError.new('Error') }
232
+ before { allow(card_transaction.antifraud_wrapper).to receive(:send).and_raise(exception) }
79
233
 
80
- it "should update payment installment_value" do
81
- expect(payment.installment_value).to_not be_nil
234
+ it 'captures exception with Raven' do
235
+ expect(Raven).to receive(:capture_exception).with(exception)
236
+
237
+ card_transaction.process_antifraud
238
+ end
239
+
240
+ it 'returns a struct with decline recommendation' do
241
+ outcome = card_transaction.process_antifraud
242
+
243
+ expect(outcome.recommendation).to eq :DECLINE
82
244
  end
83
245
  end
84
246
  end
85
247
 
248
+ describe '#antifraud_wrapper' do
249
+ let(:antifraud_wrapper) { double }
250
+
251
+ context 'when @antifraud_wrapper isn`t nil' do
252
+ it 'returns @antifraude_wrapper' do
253
+ card_transaction.instance_variable_set('@antifraud_wrapper', antifraud_wrapper)
254
+ expect(card_transaction.antifraud_wrapper).to eq antifraud_wrapper
255
+ end
256
+ end
257
+
258
+ context 'when @antifraud_wrapper is nil' do
259
+ let(:transaction) { double }
260
+
261
+ before do
262
+ card_transaction.instance_variable_set('@antifraud_wrapper', nil)
263
+ card_transaction.transaction = transaction
264
+ allow(CatarsePagarme::AntifraudOrderWrapper).to receive(:new)
265
+ .with(valid_attributes, transaction)
266
+ .and_return(antifraud_wrapper)
267
+ end
268
+
269
+ it 'returns a new antifraud order wrapper' do
270
+ expect(card_transaction.antifraud_wrapper).to eq antifraud_wrapper
271
+ end
272
+ end
273
+ end
86
274
  end