samurai 0.2.29 → 0.3.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.
@@ -17,7 +17,7 @@
17
17
 
18
18
  <p><strong>Date / Time:</strong> <%= transaction.created_at %></p>
19
19
  <p>
20
- <strong>Descriptor:</strong> <%= transaction.descriptor %><br>
20
+ <strong>Description:</strong> <%= transaction.description %><br>
21
21
  <strong>Billing Reference:</strong> <%= transaction.billing_reference %><br>
22
22
  <strong>Customer Reference: </strong> <%= transaction.customer_reference %><br>
23
23
  <strong>Custom Data: </strong> <%= transaction.custom %><br>
@@ -26,4 +26,4 @@
26
26
  <p>
27
27
  <strong>AVS Response:</strong> <%= transaction.processor_response.try(:avs_result_code) || 'None' %>
28
28
  </p>
29
- <% end %>
29
+ <% end %>
@@ -29,7 +29,7 @@ class Samurai::Message < Samurai::Base
29
29
  'error input.merchant_login invalid' => 'The merchant ID is not valid or active.',
30
30
  'error input.store_number invalid' => 'Invalid Store Number.',
31
31
  'error processor.bank_info invalid' => 'Invalid banking information.',
32
- 'error processor.transaction not_allowed' => 'Merchant can not accept this card.',
32
+ 'error processor.transaction not_allowed' => 'This transaction type is not allowed.',
33
33
  'error processor.transaction type_invalid' => 'Requested transaction type is not allowed for this card/merchant.',
34
34
  'error processor.transaction method_invalid' => 'The requested transaction could not be performed for this merchant.',
35
35
  'error input.amount exceeds_limit' => 'The maximum transaction amount was exceeded.',
@@ -59,14 +59,17 @@ class Samurai::Message < Samurai::Base
59
59
  'error input.card_number too_short' => 'The card number was too short.',
60
60
  'error input.card_number too_long' => 'The card number was too long.',
61
61
  'error input.card_number failed_checksum' => 'The card number was invalid.',
62
+ 'error input.card_number is_invalid' => 'The card number was invalid.',
62
63
  'error input.cvv is_blank' => 'The CVV was blank.',
63
64
  'error input.cvv not_numeric' => 'The CVV was invalid.',
64
65
  'error input.cvv too_short' => 'The CVV was too short.',
65
66
  'error input.cvv too_long' => 'The CVV was too long.',
66
67
  'error input.expiry_month is_blank' => 'The expiration month was blank.',
67
68
  'error input.expiry_month not_numeric' => 'The expiration month was invalid.',
69
+ 'error input.expiry_month is_invalid' => 'The expiration month was invalid.',
68
70
  'error input.expiry_year is_blank' => 'The expiration year was blank.',
69
71
  'error input.expiry_year not_numeric' => 'The expiration year was invalid.',
72
+ 'error input.expiry_year is_invalid' => 'The expiration year was invalid.',
70
73
  }
71
74
 
72
75
  def self.response_mappings
@@ -4,12 +4,13 @@
4
4
  # This class represents a Samurai Processor connection
5
5
  # It can be used to create purchase & authorize transactions
6
6
  class Samurai::Processor < Samurai::Base
7
-
7
+ alias_method :token, :id
8
+
8
9
  # Returns the default processor specified by Samurai.processor_token if you passed it into Samurai.setup_site.
9
10
  def self.the_processor
10
11
  Samurai::Processor.new(:id => Samurai.processor_token)
11
12
  end
12
-
13
+
13
14
  # Convenience method that calls the purchase method on the default processor.
14
15
  def self.purchase(*args)
15
16
  the_processor.purchase(*args)
@@ -19,14 +20,16 @@ class Samurai::Processor < Samurai::Base
19
20
  def self.authorize(*args)
20
21
  the_processor.authorize(*args)
21
22
  end
22
-
23
+
23
24
  # Convenience method to authorize and capture a payment_method for a particular amount in one transaction.
24
25
  # Parameters:
25
26
  #
26
27
  # * `payment_method_token`: token identifying the payment method to authorize
27
28
  # * `amount`: amount to authorize
28
29
  # * `options`: an optional has of additional values to pass in accepted values are:
29
- # * `descriptor`: descriptor for the transaction
30
+ # * `description`: description for the transaction
31
+ # * `descriptor_name`: dynamic descriptor name field
32
+ # * `descriptor_phone`: dynamic descriptor phone field
30
33
  # * `custom`: custom data, this data does not get passed to the processor, it is stored within `api.samurai.feefighters.com` only
31
34
  # * `customer_reference`: an identifier for the customer, this will appear in the processor if supported
32
35
  # * `billing_reference`: an identifier for the purchase, this will appear in the processor if supported
@@ -43,7 +46,9 @@ class Samurai::Processor < Samurai::Base
43
46
  # * `amount`: amount to authorize
44
47
  #
45
48
  # * options: an optional has of additional values to pass in accepted values are:
46
- # * `descriptor`: descriptor for the transaction
49
+ # * `description`: description for the transaction
50
+ # * `descriptor_name`: dynamic descriptor name field
51
+ # * `descriptor_phone`: dynamic descriptor phone field
47
52
  # * `custom`: custom data, this data does not get passed to the processor, it is stored within api.samurai.feefighters.com only
48
53
  # * `customer_reference`: an identifier for the customer, this will appear in the processor if supported
49
54
  # * `billing_reference`: an identifier for the purchase, this will appear in the processor if supported
@@ -52,7 +57,7 @@ class Samurai::Processor < Samurai::Base
52
57
  def authorize(payment_method_token, amount, options = {})
53
58
  execute(:authorize, options.merge(:payment_method_token => payment_method_token, :amount => amount))
54
59
  end
55
-
60
+
56
61
  private
57
62
 
58
63
  # Make the actual ActiveResource POST request, process the response
@@ -77,5 +82,5 @@ class Samurai::Processor < Samurai::Base
77
82
  end
78
83
  end
79
84
  end
80
-
81
- end
85
+
86
+ end
@@ -33,13 +33,14 @@ class Samurai::Transaction < Samurai::Base
33
33
 
34
34
  # Reverse this transaction. First, tries a void.
35
35
  # If a void is unsuccessful, (because the transaction has already settled) perform a credit for the full amount.
36
- def reverse(options = {})
36
+ def reverse(amount = nil, options = {})
37
37
  execute(:reverse, {:amount => amount || self.amount}.reverse_merge(options))
38
38
  end
39
39
 
40
40
  def success?
41
41
  respond_to?(:processor_response) && processor_response && processor_response.success
42
42
  end
43
+ alias_method :success, :success?
43
44
  def failed?
44
45
  !success?
45
46
  end
@@ -65,11 +66,12 @@ class Samurai::Transaction < Samurai::Base
65
66
  # Override base error processing with specific Transaction behavior
66
67
  # Examine the `<processor_response><messages>` array, and add an error to the Errors object for each `<message>`
67
68
  def process_response_errors
68
- if respond_to?(:processor_response) && self.processor_response.respond_to?(:messages)
69
- self.processor_response.messages.each do |message|
70
- if message.subclass == 'error'
71
- self.errors.add message.context, message.description
72
- end
69
+ _messages = []
70
+ _messages += processor_response.messages if respond_to?(:processor_response) && processor_response.respond_to?(:messages)
71
+ _messages += payment_method.messages if payment_method
72
+ _messages.each do |message|
73
+ if message.subclass == 'error'
74
+ self.errors.add message.context, message.description
73
75
  end
74
76
  end
75
77
  end
@@ -82,7 +84,9 @@ class Samurai::Transaction < Samurai::Base
82
84
  :type => options[:type],
83
85
  :payment_method_token => options[:payment_method_token],
84
86
  :currency_code => options[:currency_code] || (options[:payment_method_token] && 'USD'), # currency code is only required for payloads that include the PMT
85
- :descriptor => options[:descriptor],
87
+ :description => options[:description],
88
+ :descriptor_name => options[:descriptor_name],
89
+ :descriptor_phone => options[:descriptor_phone],
86
90
  :custom => options[:custom],
87
91
  :customer_reference => options[:customer_reference],
88
92
  :billing_reference => options[:billing_reference]
@@ -94,7 +98,8 @@ class Samurai::Transaction < Samurai::Base
94
98
  # Setup the Transaction schema for ActiveResource, so that new objects contain empty attributes
95
99
  KNOWN_ATTRIBUTES = [
96
100
  :amount, :type, :payment_method_token, :currency_code,
97
- :descriptor, :custom, :customer_reference, :billing_reference, :processor_response
101
+ :description, :custom, :customer_reference, :billing_reference, :processor_response,
102
+ :descriptor_name, :descriptor_phone
98
103
  ]
99
104
  if [ActiveResource::VERSION::MAJOR, ActiveResource::VERSION::MINOR].compact.join('.').to_f < 3.1
100
105
  # If we're using ActiveResource pre-3.1, there's no schema class method, so we resort to some tricks...
@@ -1,3 +1,3 @@
1
1
  module Samurai
2
- VERSION = "0.2.29".freeze
2
+ VERSION = "0.3.0".freeze
3
3
  end
@@ -1,97 +1,247 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe "PaymentMethod actions" do
3
+ describe "PaymentMethod" do
4
+ before do
5
+ @params = {
6
+ :first_name => "FirstName",
7
+ :last_name => "LastName",
8
+ :address_1 => "123 Main St.",
9
+ :address_2 => "Apt #3",
10
+ :city => "Chicago",
11
+ :state => "IL",
12
+ :zip => "10101",
13
+ :card_number => "4111-1111-1111-1111",
14
+ :cvv => "123",
15
+ :expiry_month => '03',
16
+ :expiry_year => "2015",
17
+ }
18
+ end
4
19
 
5
- it "should create a new PaymentMethod using S2S endpoint" do
6
- Samurai::PaymentMethod.create(
7
- :city => "Chicago",
8
- :zip => "53211",
9
- :expiry_month => 03,
10
- :cvv => "123",
11
- :card_number => "4111111111111111",
12
- :address_1 => "1240 W Monroe #1",
13
- :address_2 => "",
14
- :last_name => "harper",
15
- :expiry_year => "2015",
16
- :first_name => "sean",
17
- :state => "IL")
20
+ describe 'S2S #create' do
21
+ it 'should be successful' do
22
+ pm = Samurai::PaymentMethod.create @params
23
+ Samurai::PaymentMethod.find(pm.token).tap do |pm|
24
+ pm.is_sensitive_data_valid.should be_true
25
+ pm.is_expiration_valid.should be_true
26
+ pm.first_name.should == @params[:first_name]
27
+ pm.last_name.should == @params[:last_name]
28
+ pm.address_1.should == @params[:address_1]
29
+ pm.address_2.should == @params[:address_2]
30
+ pm.city.should == @params[:city]
31
+ pm.state.should == @params[:state]
32
+ pm.zip.should == @params[:zip]
33
+ pm.last_four_digits.should == @params[:card_number][-4, 4]
34
+ pm.expiry_month.should == @params[:expiry_month].to_i
35
+ pm.expiry_year.should == @params[:expiry_year].to_i
36
+ end
37
+ end
38
+ describe 'fail on input.card_number' do
39
+ it 'should return is_blank' do
40
+ pm = Samurai::PaymentMethod.create @params.merge(:card_number => '')
41
+ pm.is_sensitive_data_valid.should be_false
42
+ pm.errors['input.card_number'].should == [ 'The card number was blank.' ]
43
+ end
44
+ it 'should return too_short' do
45
+ pm = Samurai::PaymentMethod.create @params.merge(:card_number => '4111-1')
46
+ pm.is_sensitive_data_valid.should be_false
47
+ pm.errors['input.card_number'].should == [ 'The card number was too short.' ]
48
+ end
49
+ it 'should return too_long' do
50
+ pm = Samurai::PaymentMethod.create @params.merge(:card_number => '4111-1111-1111-1111-11')
51
+ pm.is_sensitive_data_valid.should be_false
52
+ pm.errors['input.card_number'].should == [ 'The card number was too long.' ]
53
+ end
54
+ it 'should return failed_checksum' do
55
+ pm = Samurai::PaymentMethod.create @params.merge(:card_number => '4111-1111-1111-1234')
56
+ pm.is_sensitive_data_valid.should be_false
57
+ pm.errors['input.card_number'].should == [ 'The card number was invalid.' ]
58
+ end
59
+ end
60
+ describe 'fail on input.cvv' do
61
+ it 'should return too_short' do
62
+ pm = Samurai::PaymentMethod.create @params.merge(:cvv => '1')
63
+ pm.is_sensitive_data_valid.should be_false
64
+ pm.errors['input.cvv'].should == [ 'The CVV was too short.' ]
65
+ end
66
+ it 'should return too_long' do
67
+ pm = Samurai::PaymentMethod.create @params.merge(:cvv => '111111')
68
+ pm.is_sensitive_data_valid.should be_false
69
+ pm.errors['input.cvv'].should == [ 'The CVV was too long.' ]
70
+ end
71
+ it 'should return not_numeric' do
72
+ pm = Samurai::PaymentMethod.create @params.merge(:cvv => 'abcd1')
73
+ pm.is_sensitive_data_valid.should be_false
74
+ pm.errors['input.cvv'].should == [ 'The CVV was invalid.' ]
75
+ end
76
+ end
77
+ describe 'fail on input.expiry_month' do
78
+ it 'should return is_blank' do
79
+ pm = Samurai::PaymentMethod.create @params.merge(:expiry_month => '')
80
+ pm.is_sensitive_data_valid.should be_true
81
+ pm.is_expiration_valid.should be_false
82
+ pm.errors['input.expiry_month'].should == [ 'The expiration month was blank.' ]
83
+ end
84
+ it 'should return is_invalid' do
85
+ pm = Samurai::PaymentMethod.create @params.merge(:expiry_month => 'abcd')
86
+ pm.is_sensitive_data_valid.should be_true
87
+ pm.is_expiration_valid.should be_false
88
+ pm.errors['input.expiry_month'].should == [ 'The expiration month was invalid.' ]
89
+ end
90
+ end
91
+ describe 'fail on input.expiry_year' do
92
+ it 'should return is_blank' do
93
+ pm = Samurai::PaymentMethod.create @params.merge(:expiry_year => '')
94
+ pm.is_sensitive_data_valid.should be_true
95
+ pm.is_expiration_valid.should be_false
96
+ pm.errors['input.expiry_year'].should == [ 'The expiration year was blank.' ]
97
+ end
98
+ it 'should return is_invalid' do
99
+ pm = Samurai::PaymentMethod.create @params.merge(:expiry_year => 'abcd')
100
+ pm.is_sensitive_data_valid.should be_true
101
+ pm.is_expiration_valid.should be_false
102
+ pm.errors['input.expiry_year'].should == [ 'The expiration year was invalid.' ]
103
+ end
104
+ end
18
105
  end
19
106
 
20
- describe 'with errors' do
21
- before(:each) do
107
+ describe 'S2S #update' do
108
+ before do
22
109
  @params = {
23
- :city => "Chicago",
24
- :zip => "53211",
25
- :expiry_month => 03,
26
- :cvv => "123",
27
- :card_number => "4111111111111111",
28
- :address_1 => "1240 W Monroe #1",
29
- :address_2 => "",
30
- :last_name => "harper",
31
- :expiry_year => "2015",
32
- :first_name => "sean",
33
- :state => "IL",
110
+ :first_name => "FirstNameX",
111
+ :last_name => "LastNameX",
112
+ :address_1 => "123 Main St.X",
113
+ :address_2 => "Apt #3X",
114
+ :city => "ChicagoX",
115
+ :state => "IL",
116
+ :zip => "10101",
117
+ :card_number => "5454-5454-5454-5454",
118
+ :cvv => "456",
119
+ :expiry_month => '05',
120
+ :expiry_year => "2016",
34
121
  }
122
+ @pm = Samurai::PaymentMethod.find create_payment_method(default_payment_method_params)[:payment_method_token]
35
123
  end
36
-
37
- it 'should validate blank card number' do
38
- pm = Samurai::PaymentMethod.create @params.merge(:card_number=>'')
39
- pm.has_errors?.should be_true
40
- pm.errors.count.should == 1
41
- pm.errors['input.card_number'].should == [ 'The card number was blank.' ]
42
- end
43
- it 'should validate invalid card number' do
44
- pm = Samurai::PaymentMethod.create @params.merge(:card_number=>'abc123')
45
- pm.has_errors?.should be_true
46
- pm.errors.count.should == 1
47
- pm.errors['input.card_number'].should == [ 'The card number was invalid.' ]
124
+ it 'should be successful' do
125
+ @pm.update_attributes @params
126
+ Samurai::PaymentMethod.find(@pm.token).tap do |pm|
127
+ pm.is_sensitive_data_valid.should be_true
128
+ pm.is_expiration_valid.should be_true
129
+ pm.first_name.should == @params[:first_name]
130
+ pm.last_name.should == @params[:last_name]
131
+ pm.address_1.should == @params[:address_1]
132
+ pm.address_2.should == @params[:address_2]
133
+ pm.city.should == @params[:city]
134
+ pm.state.should == @params[:state]
135
+ pm.zip.should == @params[:zip]
136
+ pm.last_four_digits.should == @params[:card_number][-4, 4]
137
+ pm.expiry_month.should == @params[:expiry_month].to_i
138
+ pm.expiry_year.should == @params[:expiry_year].to_i
139
+ end
48
140
  end
49
- it 'should validate short card number' do
50
- pm = Samurai::PaymentMethod.create @params.merge(:card_number=>'1234')
51
- pm.has_errors?.should be_true
52
- pm.errors.count.should == 1
53
- pm.errors['input.card_number'].should == [ 'The card number was too short.' ]
141
+ it 'should be successful preserving sensitive data' do
142
+ _params = @params.merge({
143
+ :card_number => '****************',
144
+ :cvv => '***',
145
+ })
146
+ @pm.update_attributes _params
147
+ Samurai::PaymentMethod.find(@pm.token).tap do |pm|
148
+ pm.is_sensitive_data_valid.should be_true
149
+ pm.is_expiration_valid.should be_true
150
+ pm.first_name.should == @params[:first_name]
151
+ pm.last_name.should == @params[:last_name]
152
+ pm.address_1.should == @params[:address_1]
153
+ pm.address_2.should == @params[:address_2]
154
+ pm.city.should == @params[:city]
155
+ pm.state.should == @params[:state]
156
+ pm.zip.should == @params[:zip]
157
+ pm.last_four_digits.should == '1111'
158
+ pm.expiry_month.should == @params[:expiry_month].to_i
159
+ pm.expiry_year.should == @params[:expiry_year].to_i
160
+ end
54
161
  end
55
- it 'should validate long card number' do
56
- pm = Samurai::PaymentMethod.create @params.merge(:card_number=>'41111111111111111')
57
- pm.has_errors?.should be_true
58
- pm.errors.count.should == 1
59
- pm.errors['input.card_number'].should == [ 'The card number was too long.' ]
162
+ describe 'fail on input.card_number' do
163
+ it 'should return too_short' do
164
+ @pm.update_attributes @params.merge(:card_number => '4111-1')
165
+ @pm.is_sensitive_data_valid.should be_false
166
+ @pm.errors['input.card_number'].should == [ 'The card number was too short.' ]
167
+ end
168
+ it 'should return too_long' do
169
+ @pm.update_attributes @params.merge(:card_number => '4111-1111-1111-1111-11')
170
+ @pm.is_sensitive_data_valid.should be_false
171
+ @pm.errors['input.card_number'].should == [ 'The card number was too long.' ]
172
+ end
173
+ it 'should return failed_checksum' do
174
+ @pm.update_attributes @params.merge(:card_number => '4111-1111-1111-1234')
175
+ @pm.is_sensitive_data_valid.should be_false
176
+ @pm.errors['input.card_number'].should == [ 'The card number was invalid.' ]
177
+ end
60
178
  end
61
- it 'should not validate blank cvv' do
62
- pm = Samurai::PaymentMethod.create @params.merge(:cvv=>'')
63
- pm.has_errors?.should be_false
64
- pm.errors.count.should == 0
179
+ describe 'fail on input.cvv' do
180
+ it 'should return too_short' do
181
+ @pm.update_attributes @params.merge(:cvv => '1')
182
+ @pm.is_sensitive_data_valid.should be_false
183
+ @pm.errors['input.cvv'].should == [ 'The CVV was too short.' ]
184
+ end
185
+ it 'should return too_long' do
186
+ @pm.update_attributes @params.merge(:cvv => '111111')
187
+ @pm.is_sensitive_data_valid.should be_false
188
+ @pm.errors['input.cvv'].should == [ 'The CVV was too long.' ]
189
+ end
65
190
  end
66
- it 'should validate invalid cvv' do
67
- pm = Samurai::PaymentMethod.create @params.merge(:cvv=>'abc')
68
- pm.has_errors?.should be_true
69
- pm.errors.count.should == 1
70
- pm.errors['input.cvv'].should == [ 'The CVV was invalid.' ]
191
+ describe 'fail on input.expiry_month' do
192
+ it 'should return is_blank' do
193
+ @pm.update_attributes @params.merge(:expiry_month => '')
194
+ @pm.is_sensitive_data_valid.should be_true
195
+ @pm.is_expiration_valid.should be_false
196
+ @pm.errors['input.expiry_month'].should == [ 'The expiration month was blank.' ]
197
+ end
198
+ it 'should return is_invalid' do
199
+ @pm.update_attributes @params.merge(:expiry_month => 'abcd')
200
+ @pm.is_sensitive_data_valid.should be_true
201
+ @pm.is_expiration_valid.should be_false
202
+ @pm.errors['input.expiry_month'].should == [ 'The expiration month was invalid.' ]
203
+ end
71
204
  end
72
- it 'should validate short cvv' do
73
- pm = Samurai::PaymentMethod.create @params.merge(:cvv=>'1')
74
- pm.has_errors?.should be_true
75
- pm.errors.count.should == 1
76
- pm.errors['input.cvv'].should == [ 'The CVV was too short.' ]
205
+ describe 'fail on input.expiry_year' do
206
+ it 'should return is_blank' do
207
+ @pm.update_attributes @params.merge(:expiry_year => '')
208
+ @pm.is_sensitive_data_valid.should be_true
209
+ @pm.is_expiration_valid.should be_false
210
+ @pm.errors['input.expiry_year'].should == [ 'The expiration year was blank.' ]
211
+ end
212
+ it 'should return is_invalid' do
213
+ @pm.update_attributes @params.merge(:expiry_year => 'abcd')
214
+ @pm.is_sensitive_data_valid.should be_true
215
+ @pm.is_expiration_valid.should be_false
216
+ @pm.errors['input.expiry_year'].should == [ 'The expiration year was invalid.' ]
217
+ end
77
218
  end
78
- it 'should validate long cvv' do
79
- pm = Samurai::PaymentMethod.create @params.merge(:cvv=>'11111')
80
- pm.has_errors?.should be_true
81
- pm.errors.count.should == 1
82
- pm.errors['input.cvv'].should == [ 'The CVV was too long.' ]
219
+ end
220
+
221
+ describe '#find' do
222
+ before do
223
+ @token = Samurai::PaymentMethod.create(@params).token
83
224
  end
84
- it 'should validate blank expiry_month' do
85
- pm = Samurai::PaymentMethod.create @params.merge(:expiry_month=>'')
86
- pm.has_errors?.should be_true
87
- pm.errors.count.should == 1
88
- pm.errors['input.expiry_month'].should == [ 'The expiration month was blank.' ]
225
+ it 'should be successful' do
226
+ Samurai::PaymentMethod.find(@token).tap do |pm|
227
+ pm.is_sensitive_data_valid.should be_true
228
+ pm.is_expiration_valid.should be_true
229
+ pm.first_name.should == @params[:first_name]
230
+ pm.last_name.should == @params[:last_name]
231
+ pm.address_1.should == @params[:address_1]
232
+ pm.address_2.should == @params[:address_2]
233
+ pm.city.should == @params[:city]
234
+ pm.state.should == @params[:state]
235
+ pm.zip.should == @params[:zip]
236
+ pm.last_four_digits.should == @params[:card_number][-4, 4]
237
+ pm.expiry_month.should == @params[:expiry_month].to_i
238
+ pm.expiry_year.should == @params[:expiry_year].to_i
239
+ end
89
240
  end
90
- it 'should validate blank expiry_year' do
91
- pm = Samurai::PaymentMethod.create @params.merge(:expiry_year=>'')
92
- pm.has_errors?.should be_true
93
- pm.errors.count.should == 1
94
- pm.errors['input.expiry_year'].should == [ 'The expiration year was blank.' ]
241
+ it 'should fail on an invalid token' do
242
+ lambda do
243
+ Samurai::PaymentMethod.find('abc123')
244
+ end.should raise_error(ActiveResource::ResourceNotFound)
95
245
  end
96
246
  end
97
247
 
@@ -1,35 +1,194 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe "Processor actions" do
3
+ describe "Processor" do
4
4
  before :each do
5
+ @rand = rand(1000)
5
6
  @payment_method_token = create_payment_method(default_payment_method_params)[:payment_method_token]
6
7
  end
7
8
 
8
- it "should return an empty processor" do
9
- processor = Samurai::Processor.the_processor
10
- processor.should_not be_nil
9
+ describe 'the_processor' do
10
+ it "should return the default processor" do
11
+ processor = Samurai::Processor.the_processor
12
+ processor.should_not be_nil
13
+ processor.token.should == DEFAULT_OPTIONS[:processor_token]
14
+ end
11
15
  end
12
16
 
13
- it "should create a new purchase" do
14
- purchase = Samurai::Processor.purchase(@payment_method_token, 1.0, :billing_reference=>rand(1000))
15
- purchase.processor_response.success.should be_true
16
- # FakeWeb.last_request
17
+ describe 'new processor' do
18
+ it "should return a processor" do
19
+ processor = Samurai::Processor.new(:id=>'abc123')
20
+ processor.should_not be_nil
21
+ processor.token.should == 'abc123'
22
+ end
17
23
  end
18
24
 
19
- it "should create a new purchase with tracking data" do
20
- purchase = Samurai::Processor.purchase(@payment_method_token, 1.0, {
21
- :descriptor => "A test purchase",
22
- :custom => "some optional custom data",
23
- :billing_reference => "ABC123",
24
- :customer_reference => "Customer (123)"
25
- })
26
- purchase.processor_response.success.should be_true
27
- # FakeWeb.last_request
25
+ describe 'purchase' do
26
+ it 'should be successful' do
27
+ purchase = Samurai::Processor.purchase(@payment_method_token, 100.0, {
28
+ :description => "description",
29
+ :descriptor_name => "descriptor_name",
30
+ :descriptor_phone => "descriptor_phone",
31
+ :custom => "custom_data",
32
+ :billing_reference => "ABC123#{@rand}",
33
+ :customer_reference => "Customer (123)",
34
+ })
35
+ purchase.success.should be_true
36
+ purchase.description.should == 'description'
37
+ purchase.descriptor_name.should == 'descriptor_name'
38
+ purchase.descriptor_phone.should == 'descriptor_phone'
39
+ purchase.custom.should == 'custom_data'
40
+ purchase.billing_reference.should == "ABC123#{@rand}"
41
+ purchase.customer_reference.should == "Customer (123)"
42
+ end
43
+ describe 'failures' do
44
+ it 'should return processor.transaction - declined' do
45
+ purchase = Samurai::Processor.purchase(@payment_method_token, 1.02, :billing_reference=>rand(1000))
46
+ purchase.success.should be_false
47
+ purchase.errors['processor.transaction'].should == [ 'The card was declined.' ]
48
+ end
49
+ it 'should return input.amount - invalid' do
50
+ purchase = Samurai::Processor.purchase(@payment_method_token, 1.10, :billing_reference=>rand(1000))
51
+ purchase.success.should be_false
52
+ purchase.errors['input.amount'].should == [ 'The transaction amount was invalid.' ]
53
+ end
54
+ end
55
+ describe 'cvv responses' do
56
+ it 'should return processor.cvv_result_code = M' do
57
+ params = default_payment_method_params.merge('credit_card[cvv]'=>'111')
58
+ payment_method_token = create_payment_method(params)[:payment_method_token]
59
+ purchase = Samurai::Processor.purchase(payment_method_token, 1.00, :billing_reference=>rand(1000))
60
+ purchase.success.should be_true
61
+ purchase.processor_response.cvv_result_code.should == 'M'
62
+ end
63
+ it 'should return processor.cvv_result_code = N' do
64
+ params = default_payment_method_params.merge('credit_card[cvv]'=>'222')
65
+ payment_method_token = create_payment_method(params)[:payment_method_token]
66
+ purchase = Samurai::Processor.purchase(payment_method_token, 1.00, :billing_reference=>rand(1000))
67
+ purchase.success.should be_true
68
+ purchase.processor_response.cvv_result_code.should == 'N'
69
+ end
70
+ end
71
+ describe 'avs responses' do
72
+ it 'should return processor.avs_result_code = Y' do
73
+ params = default_payment_method_params.merge({
74
+ 'credit_card[address_1]' => '1000 1st Av',
75
+ 'credit_card[address_2]' => '',
76
+ 'credit_card[zip]' => '10101',
77
+ })
78
+ payment_method_token = create_payment_method(params)[:payment_method_token]
79
+ purchase = Samurai::Processor.purchase(payment_method_token, 1.00, :billing_reference=>rand(1000))
80
+ purchase.success.should be_true
81
+ purchase.processor_response.avs_result_code.should == 'Y'
82
+ end
83
+ it 'should return processor.avs_result_code = Z' do
84
+ params = default_payment_method_params.merge({
85
+ 'credit_card[address_1]' => '',
86
+ 'credit_card[address_2]' => '',
87
+ 'credit_card[zip]' => '10101',
88
+ })
89
+ payment_method_token = create_payment_method(params)[:payment_method_token]
90
+ purchase = Samurai::Processor.purchase(payment_method_token, 1.00, :billing_reference=>rand(1000))
91
+ purchase.success.should be_true
92
+ purchase.processor_response.avs_result_code.should == 'Z'
93
+ end
94
+ it 'should return processor.avs_result_code = N' do
95
+ params = default_payment_method_params.merge({
96
+ 'credit_card[address_1]' => '123 Main St',
97
+ 'credit_card[address_2]' => '',
98
+ 'credit_card[zip]' => '60610',
99
+ })
100
+ payment_method_token = create_payment_method(params)[:payment_method_token]
101
+ Samurai::PaymentMethod.find(payment_method_token)
102
+ purchase = Samurai::Processor.purchase(payment_method_token, 1.00, :billing_reference=>rand(1000))
103
+ purchase.success.should be_true
104
+ purchase.processor_response.avs_result_code.should == 'N'
105
+ end
106
+ end
28
107
  end
29
108
 
30
- it "should create a non-new authorization" do
31
- authorization = Samurai::Processor.authorize(@payment_method_token, 1.0)
32
- authorization.processor_response.success.should be_true
109
+ describe 'authorize' do
110
+ it 'should be successful' do
111
+ purchase = Samurai::Processor.authorize(@payment_method_token, 100.0, {
112
+ :description => "description",
113
+ :descriptor_name => "descriptor_name",
114
+ :descriptor_phone => "descriptor_phone",
115
+ :custom => "custom_data",
116
+ :billing_reference => "ABC123#{@rand}",
117
+ :customer_reference => "Customer (123)",
118
+ })
119
+ purchase.success.should be_true
120
+ purchase.description.should == 'description'
121
+ purchase.descriptor_name.should == 'descriptor_name'
122
+ purchase.descriptor_phone.should == 'descriptor_phone'
123
+ purchase.custom.should == 'custom_data'
124
+ purchase.billing_reference.should == "ABC123#{@rand}"
125
+ purchase.customer_reference.should == "Customer (123)"
126
+ end
127
+ describe 'failures' do
128
+ it 'should return processor.transaction - declined' do
129
+ authorize = Samurai::Processor.authorize(@payment_method_token, 1.02, :billing_reference=>rand(1000))
130
+ authorize.success.should be_false
131
+ authorize.errors['processor.transaction'].should == [ 'The card was declined.' ]
132
+ end
133
+ it 'should return input.amount - invalid' do
134
+ authorize = Samurai::Processor.authorize(@payment_method_token, 1.10, :billing_reference=>rand(1000))
135
+ authorize.success.should be_false
136
+ authorize.errors['input.amount'].should == [ 'The transaction amount was invalid.' ]
137
+ end
138
+ end
139
+ describe 'cvv responses' do
140
+ it 'should return processor.cvv_result_code = M' do
141
+ params = default_payment_method_params.merge('credit_card[cvv]'=>'111')
142
+ payment_method_token = create_payment_method(params)[:payment_method_token]
143
+ purchase = Samurai::Processor.authorize(payment_method_token, 1.00, :billing_reference=>rand(1000))
144
+ purchase.success.should be_true
145
+ purchase.processor_response.cvv_result_code.should == 'M'
146
+ end
147
+ it 'should return processor.cvv_result_code = N' do
148
+ params = default_payment_method_params.merge('credit_card[cvv]'=>'222')
149
+ payment_method_token = create_payment_method(params)[:payment_method_token]
150
+ purchase = Samurai::Processor.authorize(payment_method_token, 1.00, :billing_reference=>rand(1000))
151
+ purchase.success.should be_true
152
+ purchase.processor_response.cvv_result_code.should == 'N'
153
+ end
154
+ end
155
+ describe 'avs responses' do
156
+ it 'should return processor.avs_result_code = Y' do
157
+ params = default_payment_method_params.merge({
158
+ 'credit_card[address_1]' => '1000 1st Av',
159
+ 'credit_card[address_2]' => '',
160
+ 'credit_card[zip]' => '10101',
161
+ })
162
+ payment_method_token = create_payment_method(params)[:payment_method_token]
163
+ purchase = Samurai::Processor.authorize(payment_method_token, 1.00, :billing_reference=>rand(1000))
164
+ purchase.success.should be_true
165
+ purchase.processor_response.avs_result_code.should == 'Y'
166
+ end
167
+ it 'should return processor.avs_result_code = Z' do
168
+ params = default_payment_method_params.merge({
169
+ 'credit_card[address_1]' => '',
170
+ 'credit_card[address_2]' => '',
171
+ 'credit_card[zip]' => '10101',
172
+ })
173
+ payment_method_token = create_payment_method(params)[:payment_method_token]
174
+ purchase = Samurai::Processor.authorize(payment_method_token, 1.00, :billing_reference=>rand(1000))
175
+ purchase.success.should be_true
176
+ purchase.processor_response.avs_result_code.should == 'Z'
177
+ end
178
+ it 'should return processor.avs_result_code = N' do
179
+ params = default_payment_method_params.merge({
180
+ 'credit_card[address_1]' => '123 Main St',
181
+ 'credit_card[address_2]' => '',
182
+ 'credit_card[zip]' => '60610',
183
+ })
184
+ payment_method_token = create_payment_method(params)[:payment_method_token]
185
+ Samurai::PaymentMethod.find(payment_method_token)
186
+ purchase = Samurai::Processor.authorize(payment_method_token, 1.00, :billing_reference=>rand(1000))
187
+ purchase.success.should be_true
188
+ purchase.processor_response.avs_result_code.should == 'N'
189
+ end
190
+ end
33
191
  end
34
192
 
193
+
35
194
  end
@@ -0,0 +1,143 @@
1
+ require 'spec_helper'
2
+
3
+ describe "Transaction" do
4
+ before do
5
+ @rand = rand(1000)
6
+ @payment_method_token = create_payment_method(default_payment_method_params)[:payment_method_token]
7
+ end
8
+
9
+ describe 'capture' do
10
+ describe 'success' do
11
+ before do
12
+ @auth = Samurai::Processor.authorize(@payment_method_token, 100.0)
13
+ end
14
+ it 'should be successful' do
15
+ capture = @auth.capture
16
+ capture.success.should be_true
17
+ end
18
+ it 'should be successful for full amount' do
19
+ capture = @auth.capture(100.0)
20
+ capture.success.should be_true
21
+ end
22
+ it 'should be successful for partial amount' do
23
+ capture = @auth.capture(50.0)
24
+ capture.success.should be_true
25
+ end
26
+ end
27
+ describe 'failures' do
28
+ it 'should return processor.transaction - invalid with declined auth' do
29
+ auth = Samurai::Processor.authorize(@payment_method_token, 100.02) # declined auth
30
+ capture = auth.capture
31
+ capture.success.should be_false
32
+ capture.errors['processor.transaction'].should == [ 'This transaction type is not allowed.' ]
33
+ end
34
+ it 'should return processor.transaction - declined' do
35
+ auth = Samurai::Processor.authorize(@payment_method_token, 100.00)
36
+ capture = auth.capture(100.02)
37
+ capture.success.should be_false
38
+ capture.errors['processor.transaction'].should == [ 'The card was declined.' ]
39
+ end
40
+ it 'should return input.amount - invalid' do
41
+ auth = Samurai::Processor.authorize(@payment_method_token, 100.00)
42
+ capture = auth.capture(100.10)
43
+ capture.success.should be_false
44
+ capture.errors['input.amount'].should == [ 'The transaction amount was invalid.' ]
45
+ end
46
+ end
47
+ end
48
+
49
+ describe 'reverse' do
50
+ describe 'on capture' do
51
+ before do
52
+ @purchase = Samurai::Processor.purchase(@payment_method_token, 100.0)
53
+ end
54
+ it 'should be successful' do
55
+ reverse = @purchase.reverse
56
+ reverse.success.should be_true
57
+ end
58
+ it 'should be successful for full amount' do
59
+ reverse = @purchase.reverse(100.0)
60
+ reverse.success.should be_true
61
+ end
62
+ it 'should be successful for partial amount' do
63
+ reverse = @purchase.reverse(50.0)
64
+ reverse.success.should be_true
65
+ end
66
+ end
67
+ describe 'on authorize' do
68
+ before do
69
+ @authorize = Samurai::Processor.authorize(@payment_method_token, 100.0)
70
+ end
71
+ it 'should be successful' do
72
+ reverse = @authorize.reverse
73
+ reverse.success.should be_true
74
+ end
75
+ end
76
+ describe 'failures' do
77
+ it 'should return input.amount - invalid' do
78
+ purchase = Samurai::Processor.purchase(@payment_method_token, 100.00)
79
+ reverse = purchase.reverse(100.10)
80
+ reverse.success.should be_false
81
+ reverse.errors['input.amount'].should == [ 'The transaction amount was invalid.' ]
82
+ end
83
+ end
84
+ end
85
+
86
+ describe 'credit' do
87
+ describe 'on capture' do
88
+ before do
89
+ @purchase = Samurai::Processor.purchase(@payment_method_token, 100.0)
90
+ end
91
+ it 'should be successful' do
92
+ credit = @purchase.credit
93
+ credit.success.should be_true
94
+ end
95
+ it 'should be successful for full amount' do
96
+ credit = @purchase.credit(100.0)
97
+ credit.success.should be_true
98
+ end
99
+ it 'should be successful for partial amount' do
100
+ credit = @purchase.credit(50.0)
101
+ credit.success.should be_true
102
+ end
103
+ end
104
+ describe 'on authorize' do
105
+ before do
106
+ @authorize = Samurai::Processor.authorize(@payment_method_token, 100.0)
107
+ end
108
+ it 'should be successful' do
109
+ credit = @authorize.credit
110
+ credit.success.should be_true
111
+ end
112
+ end
113
+ describe 'failures' do
114
+ it 'should return input.amount - invalid' do
115
+ purchase = Samurai::Processor.purchase(@payment_method_token, 100.00)
116
+ credit = purchase.credit(100.10)
117
+ credit.success.should be_false
118
+ credit.errors['input.amount'].should == [ 'The transaction amount was invalid.' ]
119
+ end
120
+ end
121
+ end
122
+
123
+ describe 'void' do
124
+ describe 'on authorized' do
125
+ before do
126
+ @authorize = Samurai::Processor.authorize(@payment_method_token, 100.0)
127
+ end
128
+ it 'should be successful' do
129
+ void = @authorize.void
130
+ void.success.should be_true
131
+ end
132
+ end
133
+ describe 'on captured' do
134
+ before do
135
+ @purchase = Samurai::Processor.purchase(@payment_method_token, 100.0)
136
+ end
137
+ it 'should be successful' do
138
+ void = @purchase.void
139
+ void.success.should be_true
140
+ end
141
+ end
142
+ end
143
+ end
@@ -1,10 +1,5 @@
1
1
  require 'rspec'
2
- require 'ruby-debug'
3
2
  require 'pp'
4
- Debugger.start
5
- Debugger.settings[:autoeval] = true
6
- Debugger.settings[:autolist] = 5
7
- Debugger.settings[:reload_source_on_change] = true
8
3
 
9
4
  Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each {|f| require f}
10
5
 
@@ -23,13 +18,13 @@ RSpec.configure do |c|
23
18
  end
24
19
 
25
20
  require 'samurai'
26
- Samurai.options = {
27
- :site => SITE,
21
+ DEFAULT_OPTIONS = {
22
+ :site => SITE,
28
23
  :merchant_key => ENV['merchant_key'] || 'a1ebafb6da5238fb8a3ac9f6',
29
24
  :merchant_password => ENV['merchant_password'] || 'ae1aa640f6b735c4730fbb56',
30
25
  :processor_token => ENV['processor_token'] || '5a0e1ca1e5a11a2997bbf912'
31
26
  }
32
-
27
+ Samurai.options = DEFAULT_OPTIONS.clone
33
28
 
34
29
 
35
30
  #
@@ -24,7 +24,7 @@ module TransparentRedirectHelper
24
24
  end
25
25
 
26
26
  def default_payment_method_params
27
- {
27
+ @default_payment_method_params ||= {
28
28
  'sandbox' => true,
29
29
  'redirect_url' => 'http://test.host',
30
30
  'merchant_key' => Samurai.merchant_key,
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: samurai
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.29
4
+ version: 0.3.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -10,11 +10,11 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2011-11-25 00:00:00.000000000Z
13
+ date: 2011-12-22 00:00:00.000000000Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: activeresource
17
- requirement: &2152093380 !ruby/object:Gem::Requirement
17
+ requirement: &70265074098340 !ruby/object:Gem::Requirement
18
18
  none: false
19
19
  requirements:
20
20
  - - ! '>='
@@ -22,10 +22,10 @@ dependencies:
22
22
  version: 2.2.2
23
23
  type: :runtime
24
24
  prerelease: false
25
- version_requirements: *2152093380
25
+ version_requirements: *70265074098340
26
26
  - !ruby/object:Gem::Dependency
27
27
  name: bundler
28
- requirement: &2152092320 !ruby/object:Gem::Requirement
28
+ requirement: &70265074097660 !ruby/object:Gem::Requirement
29
29
  none: false
30
30
  requirements:
31
31
  - - ! '>='
@@ -33,10 +33,10 @@ dependencies:
33
33
  version: 1.0.0
34
34
  type: :development
35
35
  prerelease: false
36
- version_requirements: *2152092320
36
+ version_requirements: *70265074097660
37
37
  - !ruby/object:Gem::Dependency
38
38
  name: rspec
39
- requirement: &2152090460 !ruby/object:Gem::Requirement
39
+ requirement: &70265074096960 !ruby/object:Gem::Requirement
40
40
  none: false
41
41
  requirements:
42
42
  - - ! '>='
@@ -44,10 +44,10 @@ dependencies:
44
44
  version: 2.6.0
45
45
  type: :development
46
46
  prerelease: false
47
- version_requirements: *2152090460
47
+ version_requirements: *70265074096960
48
48
  - !ruby/object:Gem::Dependency
49
49
  name: fakeweb
50
- requirement: &2152089360 !ruby/object:Gem::Requirement
50
+ requirement: &70265074096580 !ruby/object:Gem::Requirement
51
51
  none: false
52
52
  requirements:
53
53
  - - ! '>='
@@ -55,10 +55,10 @@ dependencies:
55
55
  version: '0'
56
56
  type: :development
57
57
  prerelease: false
58
- version_requirements: *2152089360
58
+ version_requirements: *70265074096580
59
59
  - !ruby/object:Gem::Dependency
60
60
  name: ruby-debug19
61
- requirement: &2152075280 !ruby/object:Gem::Requirement
61
+ requirement: &70265074095780 !ruby/object:Gem::Requirement
62
62
  none: false
63
63
  requirements:
64
64
  - - ! '>='
@@ -66,7 +66,7 @@ dependencies:
66
66
  version: '0'
67
67
  type: :development
68
68
  prerelease: false
69
- version_requirements: *2152075280
69
+ version_requirements: *70265074095780
70
70
  description: If you are an online merchant and using samurai.feefighters.com, this
71
71
  gem will make your life easy. Integrate with the samurai.feefighters.com portal
72
72
  and process transaction.
@@ -100,11 +100,10 @@ files:
100
100
  - lib/samurai/transaction.rb
101
101
  - lib/samurai/version.rb
102
102
  - samurai.gemspec
103
- - spec/lib/authorization_spec.rb
104
103
  - spec/lib/message_spec.rb
105
104
  - spec/lib/payment_method_spec.rb
106
105
  - spec/lib/processor_spec.rb
107
- - spec/lib/purchase_spec.rb
106
+ - spec/lib/transaction_spec.rb
108
107
  - spec/spec_helper.rb
109
108
  - spec/support/transaction_seed.rb
110
109
  - spec/support/transparent_redirect_helper.rb
@@ -128,7 +127,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
128
127
  version: 1.3.5
129
128
  requirements: []
130
129
  rubyforge_project:
131
- rubygems_version: 1.8.11
130
+ rubygems_version: 1.8.10
132
131
  signing_key:
133
132
  specification_version: 3
134
133
  summary: Integration gem for samurai.feefighters.com
@@ -1,52 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe "processing authorizations" do
4
-
5
- before :each do
6
- payment_method_token = create_payment_method(default_payment_method_params)[:payment_method_token]
7
- @authorization = Samurai::Processor.authorize(payment_method_token, 1.0, :billing_reference=>rand(1000))
8
- end
9
-
10
- it "should create a new authorization transaction" do
11
- @authorization.processor_response.success.should be_true
12
- end
13
-
14
- it "should find the authorization" do
15
- transaction = Samurai::Transaction.find(@authorization.reference_id)
16
- transaction.reference_id.should == @authorization.reference_id
17
- end
18
-
19
- it "should successfully capture" do
20
- capture = @authorization.capture(1.0)
21
- capture.processor_response.success.should be_true
22
- end
23
-
24
- it "should capture an authorization without specifying an amount" do
25
- capture = @authorization.capture
26
- capture.amount.should == "#{1.0}"
27
- capture.processor_response.success.should be_true
28
- end
29
-
30
- it "should partially capture an authorization" do
31
- capture = @authorization.capture(BigDecimal('0.5'))
32
- capture.amount.should == "#{BigDecimal('0.5')}"
33
- capture.processor_response.success.should be_true
34
- end
35
-
36
- it "should void an authorization" do
37
- void = @authorization.void
38
- void.processor_response.success.should be_true
39
- end
40
-
41
- it "should credit an authorization for the full amount by default" do
42
- credit = @authorization.credit
43
- credit.amount.should == "#{BigDecimal('1.0')}"
44
- credit.processor_response.success.should be_true
45
- end
46
-
47
- it "should partially credit an authorization" do
48
- credit = @authorization.credit(BigDecimal('0.5'))
49
- credit.amount.should == "#{BigDecimal('0.5')}"
50
- credit.processor_response.success.should be_true
51
- end
52
- end
@@ -1,82 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe "processing purchases" do
4
-
5
- describe 'for a successful transaction' do
6
- before :each do
7
- @payment_method_token = create_payment_method(default_payment_method_params)[:payment_method_token]
8
- @purchase = Samurai::Processor.purchase(@payment_method_token, 1.0, :billing_reference=>rand(1000))
9
- end
10
-
11
- it "should process successfully" do
12
- @purchase.processor_response.success.should be_true
13
- end
14
-
15
- it "should be able to void a recent purchase" do
16
- void = @purchase.void
17
- void.processor_response.success.should be_true
18
- end
19
-
20
- it "should be able to credit a recent purchase" do
21
- credit = @purchase.credit
22
- credit.processor_response.success.should be_true
23
- credit.transaction_type.should == 'Credit'
24
- end
25
-
26
- it "should be able to reverse a recent purchase" do
27
- reverse = @purchase.reverse
28
- reverse.processor_response.success.should be_true
29
- reverse.transaction_type.should == 'Credit'
30
- end
31
-
32
- it "should be able to reverse a settled purchase" do
33
- reverse = @purchase.reverse
34
- reverse.processor_response.success.should be_true
35
- end
36
-
37
- it "should be able to credit a settled purchase" do
38
- credit = @purchase.credit
39
- credit.processor_response.success.should be_true
40
- end
41
- end
42
-
43
- describe 'for a declined transaction' do
44
- before :each do
45
- @payment_method_token = create_payment_method(default_payment_method_params)[:payment_method_token]
46
- @purchase = Samurai::Processor.purchase(@payment_method_token, 1.02)
47
- end
48
-
49
- it "should process" do
50
- @purchase.processor_response.success.should be_false
51
- [@purchase.errors['processor.transaction']].flatten.first.should == 'The card was declined.'
52
- end
53
- end
54
-
55
-
56
- describe 'for a invalid card number transaction' do
57
- before :each do
58
- @payment_method_token = create_payment_method(default_payment_method_params)[:payment_method_token]
59
- @purchase = Samurai::Processor.purchase(@payment_method_token, 1.07)
60
- end
61
-
62
- it "should process" do
63
- @purchase.processor_response.success.should be_false
64
- [@purchase.errors['input.card_number']].flatten.first.should == 'The card number was invalid.'
65
- end
66
- end
67
-
68
- describe 'for a expired card transaction' do
69
- before :each do
70
- @payment_method_token = create_payment_method(default_payment_method_params)[:payment_method_token]
71
- @purchase = Samurai::Processor.purchase(@payment_method_token, 1.08)
72
- end
73
-
74
- it "should process" do
75
- @purchase.processor_response.success.should be_false
76
- [@purchase.errors['input.expiry_month']].flatten.first.should == 'The expiration date month was invalid, or prior to today.'
77
- [@purchase.errors['input.expiry_year']].flatten.first.should == 'The expiration date year was invalid, or prior to today.'
78
- end
79
- end
80
-
81
-
82
- end