fat_zebra 1.1.3 → 1.1.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,15 @@
1
+ ---
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ YmU1MzgwMjdkYTJlMDM2OTc2MDEzZWVlODI3OTMzN2Y0MzAyZjRmZA==
5
+ data.tar.gz: !binary |-
6
+ ODBlZTlmNzY2MGQ2ZTY0MTI4MTJmOTcyY2VjMmFkMWYwMjM4ZWNjMQ==
7
+ !binary "U0hBNTEy":
8
+ metadata.gz: !binary |-
9
+ MTA3ZDc2ZWIyZTcxNGZmMTg0ZDViMWRkNmI0NTQyNzdhODExNzdkMmI5NDg4
10
+ NzY1M2JiNGNlODNjNDk1YzE4ZTQzZDIxNWVhZWQ2ZTMxZGUwOGRkZTg1NTUy
11
+ OTI1Y2U5ODEzYmQzYWIyODNlNTA0MzlmMDY5NjBiN2Q1ZDQyYWY=
12
+ data.tar.gz: !binary |-
13
+ NjQ4NjIxOWJjMmQ0OWEwYzE4MzBiMTY0Y2ExZWUzNGQ0ZjFlNTIwZmQyMjlm
14
+ NjY0ZjExYTE0Y2MwZWExZGY3NWJiMWZlMTQxY2E4NDJlOTVkNDE2NDY2ZTA4
15
+ NDMxZjg5MDFlMTk2YTkyZDhjZjE5MjA2NDA4OTE4YzQwMWE2NjY=
data/README.markdown CHANGED
@@ -1,7 +1,7 @@
1
1
  Ruby API Library for Fat Zebra
2
2
  ==============================
3
3
 
4
- Release 1.1.3 for API version 1.0
4
+ Release 1.1.4 for API version 1.0
5
5
 
6
6
  A Ruby client for the [Fat Zebra](https://www.fatzebra.com.au) Online Payment Gateway (for Australian Merchants)
7
7
 
@@ -0,0 +1,39 @@
1
+ module FatZebra
2
+ class Config
3
+
4
+ # Returns the config values in a hash
5
+ def config
6
+ @config ||= {}
7
+ end
8
+
9
+ [:username, :token, :test_mode, :sandbox, :options, :gateway].each do |attr|
10
+ define_method "#{attr}" do |value = nil|
11
+ if value.nil?
12
+ config[attr.to_s]
13
+ else
14
+ config[attr.to_s] = value
15
+ end
16
+ end
17
+ end
18
+
19
+ # Validates the configuration
20
+ def validate!
21
+ @errors = []
22
+
23
+ @errors << "Username is required" if self.username.nil?
24
+ @errors << "Username must begin with TEST when using Sandbox Mode" if self.sandbox && !self.username.match(/\ATEST/)
25
+ @errors << "Token is required" if self.token.nil?
26
+
27
+ raise "The following errors were raised during configuration: #{@errors.join(", ")}}" unless @errors.empty?
28
+ end
29
+
30
+ def self.from_hash(hash)
31
+ c = new
32
+ hash.each do |key, value|
33
+ c.send key, value
34
+ end
35
+
36
+ c
37
+ end
38
+ end
39
+ end
@@ -1,4 +1,5 @@
1
1
  module FatZebra
2
2
  class InvalidArgumentError < StandardError; end
3
3
  class RequestError < StandardError; end
4
+ class GatewayError < StandardError; end
4
5
  end
@@ -4,14 +4,25 @@ module FatZebra
4
4
 
5
5
  DEFAULT_OPTIONS = {:secure => true, :version => API_VERSION}
6
6
 
7
- # Public: initializes a new gateway object
7
+ class << self
8
+ def configure(config)
9
+ g = Gateway.new(config.username, config.token, config.gateway || GATEWAY_SERVER)
10
+ g.options ||= {}
11
+ g.options[:test_mode] = config.test_mode
12
+ g.options.merge!(config.options || {})
13
+
14
+ g
15
+ end
16
+ end
17
+
18
+ # Initializes a new gateway object
8
19
  #
9
- # username - merchants username
10
- # token - merchants token for authentication
11
- # gateway_server - the server for the gateway, defaults to 'gateway.fatzebra.com.au'
12
- # options - the options for the gateway connection (e.g. secure, version etc)
20
+ # @param [String] merchants username
21
+ # @param [String] merchants token for authentication
22
+ # @param [String] the server for the gateway, defaults to 'gateway.fatzebra.com.au'
23
+ # @param [Hash] the options for the gateway connection (e.g. secure, version etc)
13
24
  #
14
- # Returns a new FatZebra::Gateway instance
25
+ # @return FatZebra::Gateway instance
15
26
  def initialize(username, token, gateway_server = GATEWAY_SERVER, options = {})
16
27
  self.username = username
17
28
  self.token = token
@@ -21,7 +32,7 @@ module FatZebra
21
32
  require_field :username, :token, :gateway_server
22
33
  end
23
34
 
24
- # Public: Performs a purchase transaction against the gateway
35
+ # Performs a purchase transaction against the gateway
25
36
  #
26
37
  # amount - the amount as an integer e.g. (1.00 * 100).to_i
27
38
  # card_data - a hash of the card data (example: {:card_holder => "John Smith", :number => "...", :expiry => "...", :cvv => "123"} or {:token => "abcdefg1"})
@@ -35,38 +46,8 @@ module FatZebra
35
46
  #
36
47
  # Returns a new FatZebra::Models::Response (purchase) object
37
48
  def purchase(amount, card_data, reference, customer_ip, currency = "AUD")
38
-
39
- if card_data.keys.include?(:token)
40
- warn "[DEPRECATED] please use {:card_token => \".....\"} instead of {:token => \".....\"}"
41
- card_data[:card_token] ||= card_data.delete(:token)
42
- end
43
-
44
- if card_data.keys.include?(:number)
45
- warn "[DEPRECATED] please use :card_number instead of :number"
46
- card_data[:card_number] ||= card_data.delete(:number)
47
- end
48
-
49
- if card_data.keys.include?(:expiry)
50
- warn "[DEPRECATED] please use :card_expiry instead of :expiry"
51
- card_data[:card_expiry] ||= card_data.delete(:expiry)
52
- end
53
-
54
- params = {
55
- :amount => amount,
56
- :card_holder => card_data.delete(:card_holder),
57
- :card_number => card_data.delete(:card_number),
58
- :card_expiry => extract_date(card_data.delete(:card_expiry)),
59
- :cvv => card_data.delete(:cvv),
60
- :card_token => card_data.delete(:card_token),
61
- :reference => reference,
62
- :customer_ip => customer_ip,
63
- :currency => currency
64
- }
65
-
66
- params.delete_if {|key, value| value.nil? } # If token is nil, remove, otherwise, remove card values
67
-
68
- response = make_request(:post, "purchases", params)
69
- FatZebra::Models::Response.new(response)
49
+ warn "[DEPRECATED] Gateway#purchase is deprecated, please use Purchase.create instead" unless options[:silence]
50
+ Models::Purchase.create(amount, card_data, reference, customer_ip, currency)
70
51
  end
71
52
 
72
53
  # Retrieves purchases specified by the options hash
@@ -80,36 +61,10 @@ module FatZebra
80
61
  # - offset (defaults to 0) - for pagination
81
62
  # - limit (defaults to 10) for pagination
82
63
  # @return [Array<Purchase>] array of purchases
64
+ # @deprecated Please use Purchase.find(options) instead
83
65
  def purchases(options = {})
84
- id = options.delete(:id)
85
- options.merge!({:offets => 0, :limit => 10})
86
-
87
- # Format dates for the request
88
- options[:from] = options[:from].strftime("%Y%m%dT%H%M") if options[:from]
89
- options[:to] = options[:to].strftime("%Y%m%dT%H%M") if options[:to]
90
-
91
-
92
- if id.nil?
93
- response = make_request(:get, "purchases", options)
94
- if response["successful"]
95
- purchases = []
96
- response["response"].each do |purchase|
97
- purchases << FatZebra::Models::Purchase.new(purchase)
98
- end
99
-
100
- purchases.size == 1 ? purchases.first : purchases
101
- else
102
- # TODO: This should raise a defined exception
103
- raise StandardError, "Unable to query purchases, #{response["errors"].inspect}"
104
- end
105
- else
106
- response = make_request(:get, "purchases/#{id}.json")
107
- if response["successful"]
108
- FatZebra::Models::Purchase.new(response["response"])
109
- else
110
- raise StandardError, "Unable to query purchases, #{response["errors"].inspect}"
111
- end
112
- end
66
+ warn "[DEPRECATED] Gateway#purchases is deprecated, please use Purchase.find instead" unless options[:silence]
67
+ Models::Purchase.find(options)
113
68
  end
114
69
 
115
70
  # Public: Performs an authorization transaction against the gateway
@@ -137,29 +92,24 @@ module FatZebra
137
92
  raise "Sorry we haven't compelted this functionality yet."
138
93
  end
139
94
 
140
- # Public: Refunds a transaction
95
+ # Refunds a transaction
141
96
  #
142
- # transaction_id - the ID of the original transaction to be refunded
143
- # amount - the amount to be refunded, as an integer
144
- # reference - the reference for the refund
97
+ # @param [String] the ID of the original transaction to be refunded
98
+ # @param [Integer] the amount to be refunded, as an integer
99
+ # @param [String] the reference for the refund
145
100
  #
146
- # Returns a new FatZebra::Models::Refund object
101
+ # @return [Refund] refund result object
102
+ # @deprecated Please use Refund.create or Purchase#refund instead
147
103
  def refund(transaction_id, amount, reference)
148
- params = {
149
- :transaction_id => transaction_id,
150
- :amount => amount,
151
- :reference => reference
152
- }
153
-
154
- response = make_request(:post, "refunds", params)
155
- FatZebra::Models::Response.new(response, :refund)
104
+ warn "[DEPRECATED] Gateway#refund is deprecated, please use Refund.create or Purchase#refund instead`" unless options[:silence]
105
+ Models::Refund.create(transaction_id, amount, reference)
156
106
  end
157
107
 
158
- # Public: Pings the Fat Zebra service
108
+ # Pings the Fat Zebra service
159
109
  #
160
- # nonce - the data to be echoed back
110
+ # @param [String] the data to be echoed back
161
111
  #
162
- # Returns true if reply is valid, false if times out or otherwise
112
+ # @return true if reply is valid, false if the request times out, or otherwise
163
113
  def ping(nonce = SecureRandom.hex)
164
114
  begin
165
115
  response = RestClient.get(build_url("ping") + "?echo=#{nonce}")
@@ -171,52 +121,48 @@ module FatZebra
171
121
  end
172
122
  end
173
123
 
174
- # Public: Tokenizes a credit card
124
+ # Tokenizes a credit card
175
125
  #
176
- # card_holder - the credit card holder name
177
- # card_number - the card number
178
- # expiry - the credit card expiry date (mm/yyyy)
179
- # cvv - the card CVV
126
+ # @param [String] the credit card holder name
127
+ # @param [String] the card number
128
+ # @param [String] the credit card expiry date (mm/yyyy)
129
+ # @param [String] the card CVV
180
130
  #
181
- # Returns FatZebra::Models::Response
131
+ # @return Response
132
+ # @deprecated Please use Card.create instead
182
133
  def tokenize(card_holder, card_number, expiry, cvv)
183
- params = {
184
- :card_holder => card_holder,
185
- :card_number => card_number,
186
- :card_expiry => expiry,
187
- :cvv => cvv
188
- }
189
-
190
- response = make_request(:post, "credit_cards", params)
191
- FatZebra::Models::Response.new(response, :card)
134
+ warn "[DEPRECATED] Gateway#tokenize is deprecated, please use Card.create instead" unless options[:silence]
135
+ Models::Card.create(card_holder, card_number, expiry, cvv)
192
136
  end
193
137
 
194
- # Public: Fetch a previously tokenized card
138
+ # Public: Performs the HTTP(s) request and returns a response object, handing errors etc
195
139
  #
196
- # token - the card token
140
+ # method - the request method (:post or :get)
141
+ # resource - the resource for the request
142
+ # data - a hash of the data for the request
197
143
  #
198
- # Returns FatZebra::Models::Response (Card)
199
- def tokenized_card(token)
200
- response = make_request(:get, "credit_cards/#{token}.json")
201
- FatZebra::Models::Response.new(response, :card)
202
- end
144
+ # Returns hash of response data
145
+ def make_request(method, resource, data = nil)
146
+ resource = get_resource(resource, method, data)
203
147
 
204
- def tokenized_cards
205
- records = []
206
- options = {:offets => 0, :limit => 10}
148
+ if method == :post
149
+ data[:test] = options[:test_mode] if options[:test_mode]
150
+ payload = data.to_json
151
+ else
152
+ payload = {}
153
+ end
207
154
 
208
- # Format dates for the request
209
- options[:from] = options[:from].strftime("%Y%m%dT%H%M") if options[:from]
210
- options[:to] = options[:to].strftime("%Y%m%dT%H%M") if options[:to]
155
+ headers = options[:headers] || {}
211
156
 
212
- response = make_request(:get, "credit_cards.json", options)
213
- if response["successful"]
214
- response["response"].each do |record|
215
- records << FatZebra::Models::Card.new(record)
157
+ if method == :get
158
+ resource.send(method, headers) do |response, request, result, &block|
159
+ handle_response(response)
216
160
  end
217
- records
218
161
  else
219
- raise StandardError, "Unable to query credit cards, #{response["errors"].inspect}"
162
+ # Add in test flag is test mode...
163
+ resource.send(method, payload, headers) do |response, request, result, &block|
164
+ handle_response(response)
165
+ end
220
166
  end
221
167
  end
222
168
 
@@ -304,30 +250,6 @@ module FatZebra
304
250
  RestClient::Resource.new(url, opts.merge(ssl_options))
305
251
  end
306
252
 
307
- # Public: Performs the HTTP(s) request and returns a response object, handing errors etc
308
- #
309
- # method - the request method (:post or :get)
310
- # resource - the resource for the request
311
- # data - a hash of the data for the request
312
- #
313
- # Returns hash of response data
314
- def make_request(method, resource, data = nil)
315
- resource = get_resource(resource, method, data)
316
-
317
- payload = (method == :post) ? data.to_json : {}
318
- headers = options[:headers] || {}
319
-
320
- if method == :get
321
- resource.send(method, headers) do |response, request, result, &block|
322
- handle_response(response)
323
- end
324
- else
325
- resource.send(method, payload, headers) do |response, request, result, &block|
326
- handle_response(response)
327
- end
328
- end
329
- end
330
-
331
253
  def handle_response(response)
332
254
  case response.code
333
255
  when 201
@@ -3,9 +3,7 @@ module FatZebra
3
3
  class Card < Base
4
4
  attribute :token, :card_holder, :card_number, :card_expiry, :transaction_count, :raw
5
5
 
6
- def charge!()
7
-
8
- end
6
+ def successful; true; end
9
7
 
10
8
  class << self
11
9
  # Tokenizes a credit card
@@ -1,19 +1,112 @@
1
1
  module FatZebra
2
- module Models
3
- class Purchase < Base
4
- attribute :id, :amount, :reference, :message, :authorization, :transaction_id, :card_number,
5
- :card_holder, :card_expiry, :authorized, :successful, :card_token, :raw, :currency
6
-
7
- def approved?
8
- self.successful
2
+ module Models
3
+ class Purchase < Base
4
+ attribute :id, :amount, :reference, :message, :authorization, :transaction_id, :card_number,
5
+ :card_holder, :card_expiry, :authorized, :successful, :card_token, :currency, :raw
6
+
7
+ # Refunds the current transaction
8
+ #
9
+ # @param [Integer] the amount to be refunded
10
+ # @param [String] the refund reference
11
+ #
12
+ # @return Response (Refund) object
13
+ def refund(amount, reference)
14
+ Refund.create(self.id, amount, reference)
9
15
  end
10
16
 
11
- def card_type
12
- cards = []
13
- cards[4] = "VISA"
14
- cards[5] = "MasterCard"
15
- cards[3] = "AMEX/JCB"
17
+ class << self
18
+ # Performs a purchase transaction against the gateway
19
+ #
20
+ # @param [Integer] the amount as an integer e.g. (1.00 * 100).to_i
21
+ # @param [Hash] a hash of the card data (example: {:card_holder => "John Smith", :number => "...", :expiry => "...", :cvv => "123"} or {:token => "abcdefg1"})
22
+ # @param [String] the card holders name
23
+ # @param [String] the customers credit card number
24
+ # @param [Date] the customers card expiry date (as Date or string [mm/yyyy])
25
+ # @param [String] the credit card verification value (cvv, cav, csc etc)
26
+ # @param [String] a reference for the purchase
27
+ # @param [String] the customers IP address (for fraud prevention)
28
+ # @param [String] currency code ("AUD", "USD", etc)
29
+ #
30
+ # @return [Response] response (purchase) object
31
+ def create(amount, card_data, reference, customer_ip, currency = "AUD")
32
+ params = {
33
+ :amount => amount,
34
+ :card_holder => card_data.delete(:card_holder),
35
+ :card_number => card_data.delete(:number),
36
+ :card_expiry => extract_date(card_data.delete(:expiry)),
37
+ :cvv => card_data.delete(:cvv),
38
+ :card_token => card_data.delete(:token),
39
+ :reference => reference,
40
+ :customer_ip => customer_ip,
41
+ :currency => currency
42
+ }
43
+
44
+ params.delete_if {|key, value| value.nil? } # If token is nil, remove, otherwise, remove card values
45
+
46
+ response = FatZebra.gateway.make_request(:post, "purchases", params)
47
+ Response.new(response)
48
+ end
49
+
50
+ # Retrieves purchases specified by the options hash
51
+ #
52
+ # @param [Hash] options for lookup
53
+ # includes:
54
+ # - id (unique purchase ID)
55
+ # - reference (merchant reference)
56
+ # - from (Date)
57
+ # - to (Date)
58
+ # - offset (defaults to 0) - for pagination
59
+ # - limit (defaults to 10) for pagination
60
+ # @return [Array<Purchase>] array of purchases
61
+ def find(options = {})
62
+ id = options.delete(:id)
63
+ options.merge!({:offets => 0, :limit => 10})
64
+
65
+ # Format dates for the request
66
+ options[:from] = options[:from].strftime("%Y%m%dT%H%M") if options[:from]
67
+ options[:to] = options[:to].strftime("%Y%m%dT%H%M") if options[:to]
68
+
69
+
70
+ if id.nil?
71
+ response = FatZebra.gateway.make_request(:get, "purchases", options)
72
+ if response["successful"]
73
+ purchases = []
74
+ response["response"].each do |purchase|
75
+ purchases << Purchase.new(purchase)
76
+ end
77
+
78
+ purchases.size == 1 ? purchases.first : purchases
79
+ else
80
+ # TODO: This should raise a defined exception
81
+ raise StandardError, "Unable to query purchases, #{response["errors"].inspect}"
82
+ end
83
+ else
84
+ response = FatZebra.gateway.make_request(:get, "purchases/#{id}.json")
85
+ if response["successful"]
86
+ Purchase.new(response["response"])
87
+ else
88
+ raise StandardError, "Unable to query purchases, #{response["errors"].inspect}"
89
+ end
90
+ end
91
+ end
92
+
93
+ private
94
+ # Private: Extracts the date value from a Date/DateTime value
95
+ #
96
+ # value - the string or date value to extract the value from
97
+ #
98
+ # Returns date string as MM/YYYY
99
+ def extract_date(value)
100
+ return nil if value.nil?
101
+
102
+ if value.is_a?(String)
103
+ return value
104
+ elsif value.respond_to?(:strftime)
105
+ return value.strftime("%m/%Y")
106
+ end
107
+ end
108
+
16
109
  end
17
- end
18
- end
110
+ end
111
+ end
19
112
  end
@@ -3,14 +3,40 @@ module FatZebra
3
3
  class Refund < Base
4
4
  attribute :amount, :reference, :refunded, :id, :message, :transaction_id, :original_transaction_id, :raw
5
5
 
6
+ # Returns the original transaction for this refund
7
+ #
8
+ # @return Purchase
6
9
  def original_transaction
7
10
  @original_transaction ||= Purchase.find(self.original_transaction_id)
8
11
  end
9
12
 
13
+ # Indicates if the refund was successful or not
14
+ #
15
+ # @return Boolean
10
16
  def successful
11
17
  self.refunded == "Approved"
12
18
  end
13
19
  alias successful? successful
20
+
21
+ class << self
22
+ # Refunds a transaction
23
+ #
24
+ # @param [String] the ID of the original transaction to be refunded
25
+ # @param [Integer] the amount to be refunded, as an integer
26
+ # @param [String] the reference for the refund
27
+ #
28
+ # @return [Refund] refund result object
29
+ def create(transaction_id, amount, reference)
30
+ params = {
31
+ :transaction_id => transaction_id,
32
+ :amount => amount,
33
+ :reference => reference
34
+ }
35
+
36
+ response = FatZebra.gateway.make_request(:post, "refunds", params)
37
+ Response.new(response, :refund)
38
+ end
39
+ end
14
40
  end
15
41
  end
16
42
  end
@@ -1,3 +1,3 @@
1
1
  module FatZebra
2
- VERSION = "1.1.3"
2
+ VERSION = "1.1.4"
3
3
  end
data/lib/fat_zebra.rb CHANGED
@@ -1,6 +1,7 @@
1
1
  require 'securerandom'
2
2
  require 'json'
3
3
  require 'rest_client'
4
+ require 'fat_zebra/config'
4
5
  require 'fat_zebra/errors'
5
6
  require "fat_zebra/version"
6
7
  require 'fat_zebra/constants'
@@ -9,4 +10,43 @@ require 'fat_zebra/models/base'
9
10
  require 'fat_zebra/models/purchase'
10
11
  require 'fat_zebra/models/refund'
11
12
  require 'fat_zebra/models/card'
12
- require 'fat_zebra/models/response'
13
+ require 'fat_zebra/models/response'
14
+
15
+ module FatZebra
16
+ extend self
17
+ extend Forwardable
18
+
19
+ attr_accessor :config
20
+ attr_accessor :_gateway
21
+
22
+ # Configure the Fat Zebra gateway
23
+ def configure(auth = nil, &block)
24
+ raise ArgumentError, "missing authentication parameters or block" unless auth || block_given?
25
+
26
+ if !auth
27
+ self.config = Config.new
28
+ if (block.arity > 0)
29
+ block.call(self.config)
30
+ else
31
+ self.config.instance_eval(&block)
32
+ end
33
+ else
34
+ self.config = Config.from_hash(auth)
35
+ end
36
+
37
+ self.config.validate!
38
+
39
+ self.configure_gateway
40
+
41
+ self.config
42
+ end
43
+
44
+ def configure_gateway
45
+ self._gateway = Gateway.configure(self.config)
46
+ end
47
+
48
+ def gateway
49
+ raise GatewayError.new("Please configure the Gateway before use. See FatZebra.configure { }") if self.config.nil?
50
+ self._gateway
51
+ end
52
+ end
@@ -0,0 +1,37 @@
1
+ require 'spec_helper'
2
+
3
+ describe FatZebra::Config do
4
+ it "should configure with a block" do
5
+ FatZebra.configure do
6
+ username "TEST"
7
+ token "TEST"
8
+ sandbox true
9
+ end
10
+
11
+ FatZebra.config.username.should == "TEST"
12
+ FatZebra.config.token.should == "TEST"
13
+ FatZebra.config.sandbox.should be_true
14
+ end
15
+
16
+ it "should configure from a hash" do
17
+ config = FatZebra.configure(:username => "TEST", :token => "TEST", :sandbox => true)
18
+ config.username.should == 'TEST'
19
+ end
20
+
21
+ it "should prepare a new gateway when configured" do
22
+ FatZebra.configure do
23
+ username "TEST"
24
+ token "TEST"
25
+ test_mode true
26
+ sandbox true
27
+ options :headers => {"A" => "B"}
28
+ end
29
+
30
+ FatZebra.gateway.should_not be_nil
31
+ end
32
+
33
+ it "should raise an error when trying to access the gateway before it is configured" do
34
+ FatZebra.config = nil
35
+ lambda { FatZebra.gateway }.should raise_exception(FatZebra::GatewayError)
36
+ end
37
+ end
data/spec/gateway_spec.rb CHANGED
@@ -8,7 +8,15 @@ describe FatZebra::Gateway do
8
8
  before :each do
9
9
  # Setup the gateway for testing
10
10
  server = TEST_LOCAL == true ? "fatapi.dev" : "gateway.sandbox.fatzebra.com.au"
11
- @gw = FatZebra::Gateway.new(TEST_USER, TEST_TOKEN, server, {:secure => !TEST_LOCAL})
11
+ FatZebra.configure do
12
+ username TEST_USER
13
+ token TEST_TOKEN
14
+ sandbox true
15
+ test_mode true
16
+ gateway server
17
+ options :secure => !TEST_LOCAL, :silence => true # Silence keeps the warnings quiet for testing (deprecation warnings)
18
+ end
19
+ @gw = FatZebra.gateway
12
20
  end
13
21
 
14
22
  it "should require username and token are provided" do
@@ -24,22 +32,22 @@ describe FatZebra::Gateway do
24
32
  end
25
33
 
26
34
  it "should perform a purchase" do
27
- result = @gw.purchase(10000, {:card_holder => "Matthew Savage", :card_number => "5555555555554444", :card_expiry => "05/2013", :cvv => 123}, "TEST#{rand}", "1.2.3.4")
35
+ result = FatZebra::Models::Purchase.create(10000, {:card_holder => "Matthew Savage", :number => "5555555555554444", :expiry => "05/2013", :cvv => 123}, "TEST#{rand}", "1.2.3.4")
28
36
  result.should be_successful
29
37
  result.errors.should be_empty
30
38
  end
31
39
 
32
40
  it "should fetch a purchase" do
33
- result = @gw.purchase(10000, {:card_holder => "Matthew Savage", :card_number => "5555555555554444", :card_expiry => "05/2013", :cvv => 123}, "TES#{rand}T", "1.2.3.4")
34
- purchase = @gw.purchases(:id => result.purchase.id)
41
+ result = FatZebra::Models::Purchase.create(10000, {:card_holder => "Matthew Savage", :number => "5555555555554444", :expiry => "05/2013", :cvv => 123}, "TES#{rand}T", "1.2.3.4")
42
+ purchase = FatZebra::Models::Purchase.find(:id => result.purchase.id)
35
43
  purchase.id.should == result.purchase.id
36
44
  end
37
45
 
38
46
  it "should fetch a purchase via reference" do
39
47
  ref = "TES#{rand}T"
40
- result = @gw.purchase(10000, {:card_holder => "Matthew Savage", :card_number => "5555555555554444", :card_expiry => "05/2013", :cvv => 123}, ref, "1.2.3.4")
48
+ result = FatZebra::Models::Purchase.create(10000, {:card_holder => "Matthew Savage", :number => "5555555555554444", :expiry => "05/2013", :cvv => 123}, ref, "1.2.3.4")
41
49
 
42
- purchases = @gw.purchases(:reference => ref)
50
+ purchases = FatZebra::Models::Purchase.find(:reference => ref)
43
51
  purchases.id.should == result.purchase.id
44
52
  end
45
53
 
@@ -56,16 +64,16 @@ describe FatZebra::Gateway do
56
64
  it "should fetch purchases with a from date" do
57
65
  start = Time.now
58
66
  5.times do |i|
59
- @gw.purchase(10000, {:card_holder => "Matthew Savage", :card_number => "5555555555554444", :card_expiry => "05/2013", :cvv => 123}, "TEST#{rand(1000)}-#{i}", "1.2.3.4")
67
+ FatZebra::Models::Purchase.create(10000, {:card_holder => "Matthew Savage", :number => "5555555555554444", :expiry => "05/2013", :cvv => 123}, "TEST#{rand(1000)}-#{i}", "1.2.3.4")
60
68
  end
61
69
 
62
- purchases = @gw.purchases(:from => start)
70
+ purchases = FatZebra::Models::Purchase.find(:from => start)
63
71
  purchases.count.should >= 5
64
72
  end
65
73
 
66
74
  it "should refund a transaction" do
67
- purchase = @gw.purchase(10000, {:card_holder => "Matthew Savage", :card_number => "5555555555554444", :card_expiry => "05/2013", :cvv => 123}, "TES#{rand}T", "1.2.3.4")
68
- result = @gw.refund(purchase.result.id, 100, "REFUND-#{purchase.result.id}")
75
+ purchase = FatZebra::Models::Purchase.create(10000, {:card_holder => "Matthew Savage", :number => "5555555555554444", :expiry => "05/2013", :cvv => 123}, "TES#{rand}T", "1.2.3.4")
76
+ result = FatZebra::Models::Refund.create(purchase.result.id, 100, "REFUND-#{purchase.result.id}")
69
77
 
70
78
  result.should be_successful
71
79
  result.result.successful.should be_true
@@ -77,26 +85,33 @@ describe FatZebra::Gateway do
77
85
  response.result.token.should_not be_nil
78
86
  end
79
87
 
80
- it "should fetch a tokenized card" do
81
- token = @gw.tokenize("M Smith", "5123456789012346", "05/2013", "123").result.token
82
- card_response = @gw.tokenized_card(token)
88
+ # it "should fetch a tokenized card" do
89
+ # token = @gw.tokenize("M Smith", "5123456789012346", "05/2013", "123").result.token
90
+ # card_response = @gw.tokenized_card(token)
83
91
 
84
- card_response.should be_successful
85
- card_response.result.token.should == token
86
- card_response.result.card_number.should == "512345XXXXXX2346"
87
- end
92
+ # card_response.should be_successful
93
+ # card_response.result.token.should == token
94
+ # card_response.result.card_number.should == "512345XXXXXX2346"
95
+ # end
88
96
 
89
- it "should fetch all cards" do
90
- cards = @gw.tokenized_cards
97
+ # it "should fetch all cards" do
98
+ # cards = @gw.tokenized_cards
91
99
 
92
- cards.first.should be_instance_of(FatZebra::Models::Card)
93
- end
100
+ # cards.first.should be_instance_of(FatZebra::Models::Card)
101
+ # end
94
102
 
95
103
  it "should perform a purchase with a tokenized card" do
96
104
  token = @gw.tokenize("M Smith", "5123456789012346", "05/2013", "123").result.token
97
- purchase = @gw.purchase(10000, {:card_token => token}, "TEST#{rand}}", "127.0.0.1")
105
+ purchase = @gw.purchase(10000, {:token => token}, "TEST#{rand}}", "127.0.0.1")
98
106
 
99
107
  purchase.should be_successful
100
108
  purchase.result.successful.should be_true
101
109
  end
110
+
111
+ it "should transact in USD" do
112
+ result = FatZebra::Models::Purchase.create(10000, {:card_holder => "Matthew Savage", :number => "5555555555554444", :expiry => "05/2013", :cvv => 123}, "TEST#{rand}", "1.2.3.4", 'USD')
113
+ result.should be_successful, result.raw
114
+ result.errors.should be_empty
115
+ result.result.currency.should == 'USD'
116
+ end
102
117
  end
@@ -34,4 +34,22 @@ describe FatZebra::Models::Purchase do
34
34
  r = FatZebra::Models::Purchase.new(response)
35
35
  r.card_token.should == "a1bhj98j"
36
36
  end
37
+
38
+ it "should return the currency code" do
39
+ response = {
40
+ "authorization" => "55355",
41
+ "id" => "001-P-12345AA",
42
+ "card_number" => "512345XXXXXX2346",
43
+ "card_holder" => "John Smith",
44
+ "card_expiry" => "10/2011",
45
+ "card_token" => "a1bhj98j",
46
+ "amount" => 349,
47
+ "authorized" => true,
48
+ "reference" => "ABC123",
49
+ "message" => "Approved",
50
+ "currency" => "USD"
51
+ }
52
+ r = FatZebra::Models::Purchase.new(response)
53
+ r.currency.should == "USD"
54
+ end
37
55
  end
metadata CHANGED
@@ -1,93 +1,113 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fat_zebra
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.3
5
- prerelease:
4
+ version: 1.1.4
6
5
  platform: ruby
7
6
  authors:
8
7
  - Matthew Savage
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2013-01-18 00:00:00.000000000 Z
11
+ date: 2013-11-12 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: rspec
16
- requirement: &70319775786820 !ruby/object:Gem::Requirement
17
- none: false
15
+ requirement: !ruby/object:Gem::Requirement
18
16
  requirements:
19
17
  - - ! '>='
20
18
  - !ruby/object:Gem::Version
21
19
  version: '0'
22
20
  type: :development
23
21
  prerelease: false
24
- version_requirements: *70319775786820
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ! '>='
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
25
27
  - !ruby/object:Gem::Dependency
26
28
  name: rake
27
- requirement: &70319775828120 !ruby/object:Gem::Requirement
28
- none: false
29
+ requirement: !ruby/object:Gem::Requirement
29
30
  requirements:
30
31
  - - ! '>='
31
32
  - !ruby/object:Gem::Version
32
33
  version: '0'
33
34
  type: :development
34
35
  prerelease: false
35
- version_requirements: *70319775828120
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ! '>='
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
36
41
  - !ruby/object:Gem::Dependency
37
42
  name: yard
38
- requirement: &70319775827160 !ruby/object:Gem::Requirement
39
- none: false
43
+ requirement: !ruby/object:Gem::Requirement
40
44
  requirements:
41
45
  - - ! '>='
42
46
  - !ruby/object:Gem::Version
43
47
  version: '0'
44
48
  type: :development
45
49
  prerelease: false
46
- version_requirements: *70319775827160
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ! '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
47
55
  - !ruby/object:Gem::Dependency
48
56
  name: yard-tomdoc
49
- requirement: &70319775826140 !ruby/object:Gem::Requirement
50
- none: false
57
+ requirement: !ruby/object:Gem::Requirement
51
58
  requirements:
52
59
  - - ! '>='
53
60
  - !ruby/object:Gem::Version
54
61
  version: '0'
55
62
  type: :development
56
63
  prerelease: false
57
- version_requirements: *70319775826140
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ! '>='
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
58
69
  - !ruby/object:Gem::Dependency
59
70
  name: ZenTest
60
- requirement: &70319775824660 !ruby/object:Gem::Requirement
61
- none: false
71
+ requirement: !ruby/object:Gem::Requirement
62
72
  requirements:
63
73
  - - ! '>='
64
74
  - !ruby/object:Gem::Version
65
75
  version: '0'
66
76
  type: :development
67
77
  prerelease: false
68
- version_requirements: *70319775824660
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ! '>='
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
69
83
  - !ruby/object:Gem::Dependency
70
84
  name: rest-client
71
- requirement: &70319775824080 !ruby/object:Gem::Requirement
72
- none: false
85
+ requirement: !ruby/object:Gem::Requirement
73
86
  requirements:
74
87
  - - ! '>='
75
88
  - !ruby/object:Gem::Version
76
89
  version: '0'
77
90
  type: :runtime
78
91
  prerelease: false
79
- version_requirements: *70319775824080
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ! '>='
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
80
97
  - !ruby/object:Gem::Dependency
81
98
  name: json
82
- requirement: &70319775823500 !ruby/object:Gem::Requirement
83
- none: false
99
+ requirement: !ruby/object:Gem::Requirement
84
100
  requirements:
85
101
  - - ! '>='
86
102
  - !ruby/object:Gem::Version
87
103
  version: '0'
88
104
  type: :runtime
89
105
  prerelease: false
90
- version_requirements: *70319775823500
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ! '>='
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
91
111
  description: Provides integration with the Fat Zebra internet payment gateway (www.fatzebra.com.au),
92
112
  including purchase, refund, auth, capture and recurring billing functionality.
93
113
  email:
@@ -104,6 +124,7 @@ files:
104
124
  - README.markdown
105
125
  - Rakefile
106
126
  - lib/fat_zebra.rb
127
+ - lib/fat_zebra/config.rb
107
128
  - lib/fat_zebra/constants.rb
108
129
  - lib/fat_zebra/errors.rb
109
130
  - lib/fat_zebra/gateway.rb
@@ -113,6 +134,7 @@ files:
113
134
  - lib/fat_zebra/models/refund.rb
114
135
  - lib/fat_zebra/models/response.rb
115
136
  - lib/fat_zebra/version.rb
137
+ - spec/config_spec.rb
116
138
  - spec/gateway_spec.rb
117
139
  - spec/models/purchase_spec.rb
118
140
  - spec/models/refund_spec.rb
@@ -121,35 +143,29 @@ files:
121
143
  - vendor/cacert.pem
122
144
  homepage: ''
123
145
  licenses: []
146
+ metadata: {}
124
147
  post_install_message:
125
148
  rdoc_options: []
126
149
  require_paths:
127
150
  - lib
128
151
  required_ruby_version: !ruby/object:Gem::Requirement
129
- none: false
130
152
  requirements:
131
153
  - - ! '>='
132
154
  - !ruby/object:Gem::Version
133
155
  version: '0'
134
- segments:
135
- - 0
136
- hash: -2567456050335982654
137
156
  required_rubygems_version: !ruby/object:Gem::Requirement
138
- none: false
139
157
  requirements:
140
158
  - - ! '>='
141
159
  - !ruby/object:Gem::Version
142
160
  version: '0'
143
- segments:
144
- - 0
145
- hash: -2567456050335982654
146
161
  requirements: []
147
162
  rubyforge_project: fat_zebra
148
- rubygems_version: 1.8.17
163
+ rubygems_version: 2.0.7
149
164
  signing_key:
150
- specification_version: 3
165
+ specification_version: 4
151
166
  summary: Fat Zebra payments gem - integrate your ruby app with Fat Zebra
152
167
  test_files:
168
+ - spec/config_spec.rb
153
169
  - spec/gateway_spec.rb
154
170
  - spec/models/purchase_spec.rb
155
171
  - spec/models/refund_spec.rb