lib/fake_braintree/customer.rb in fake_braintree-0.1.1 vs lib/fake_braintree/customer.rb in fake_braintree-0.2.0
- old
+ new
@@ -1,146 +1,186 @@
module FakeBraintree
class Customer
include Helpers
- def initialize(customer_hash, options)
+ def initialize(customer_hash_from_params, options)
@customer_hash = {
- "id" => options[:id],
+ "id" => options[:id],
"merchant_id" => options[:merchant_id]
- }.merge(customer_hash)
+ }.merge(customer_hash_from_params)
+
+ set_customer_id
end
def create
if invalid?
- failure_response
+ response_for_invalid_card
else
- hash = customer_hash
- create_customer_with(hash)
- create_credit_card_with(hash)
- creation_response_for(hash)
+ credit_cards = customer_hash["credit_cards"]
+ create_customer_with(customer_hash)
+ credit_cards.each { |card| add_credit_card_to_registry(card) }
+ response_for_created_customer(customer_hash)
end
end
def update
- if existing_customer_hash
- hash = update_existing_customer!
- gzipped_response(200, hash.to_xml(:root => 'customer'))
+ if customer_exists_in_registry?
+ if credit_card_is_failure?
+ response_for_invalid_card
+ else
+ updates = customer_hash
+ updated_customer = update_existing_customer(updates)
+ response_for_updated_customer(updated_customer)
+ end
else
- failure_response(404)
+ response_for_customer_not_found
end
end
def delete
- FakeBraintree.registry.customers[existing_customer_id] = nil
- gzipped_response(200, '')
+ delete_customer_with_id(customer_id)
+ deletion_response
end
- def customer_hash
- hash = @customer_hash.dup
- hash["id"] ||= create_id
-
- if hash["credit_card"] && hash["credit_card"].is_a?(Hash)
- if !hash["credit_card"].empty?
- hash["credit_card"]["last_4"] = last_four(hash)
- hash["credit_card"]["token"] = credit_card_token(hash)
- split_expiration_date_into_month_and_year!(hash)
-
- credit_card = hash.delete("credit_card")
- hash["credit_cards"] = [credit_card]
- end
- end
-
- hash
- end
-
private
def invalid?
credit_card_is_failure? || invalid_credit_card?
end
- def split_expiration_date_into_month_and_year!(hash)
- if expiration_date = hash["credit_card"].delete("expiration_date")
- hash["credit_card"]["expiration_month"] = expiration_date.split('/')[0]
- hash["credit_card"]["expiration_year"] = expiration_date.split('/')[1]
- end
+ def create_customer_with(hash)
+ FakeBraintree.registry.customers[hash["id"]] = hash
end
- def existing_customer_hash
- existing_customer_id && FakeBraintree.registry.customers[existing_customer_id]
+ def add_credit_card_to_registry(new_credit_card_hash)
+ token = new_credit_card_hash["token"]
+ FakeBraintree.registry.credit_cards[token] = new_credit_card_hash
end
- def update_existing_customer!
- existing_customer_hash.merge!(customer_hash)
+ def update_existing_customer(updates_hash)
+ customer_from_registry.merge!(updates_hash)
end
- def credit_card_token(hash)
- md5("#{hash['merchant_id']}#{hash['id']}")
+ def customer_hash
+ @customer_hash.merge("credit_cards" => generate_credit_cards_from(@customer_hash["credit_card"]))
end
- def last_four(hash)
- hash["credit_card"].delete("number")[-4..-1]
+ def customer_from_registry
+ FakeBraintree.registry.customers[customer_id]
end
- def failure_response(code = 422)
- gzipped_response(code, FakeBraintree.failure_response(credit_card_number).to_xml(:root => 'api_error_response'))
+ def customer_exists_in_registry?
+ FakeBraintree.registry.customers.key?(customer_id)
end
def credit_card_is_failure?
- @customer_hash.key?('credit_card') &&
- FakeBraintree.failure?(@customer_hash["credit_card"]["number"])
+ has_credit_card? && FakeBraintree.failure?(credit_card_number)
end
def invalid_credit_card?
- verify_credit_card?(@customer_hash) && has_invalid_credit_card?(@customer_hash)
+ verify_credit_card?(customer_hash) && has_invalid_credit_card?(customer_hash)
end
- def verify_credit_card?(customer_hash)
+ def verify_credit_card?(customer_hash_for_verification)
return true if FakeBraintree.verify_all_cards
- @customer_hash.key?("credit_card") &&
- @customer_hash["credit_card"].is_a?(Hash) &&
- @customer_hash["credit_card"].key?("options") &&
- @customer_hash["credit_card"]["options"].is_a?(Hash) &&
- @customer_hash["credit_card"]["options"]["verify_card"] == true
+ credit_card_hash_for_verification = customer_hash_for_verification["credit_card"]
+ if credit_card_hash_for_verification.is_a?(Hash) &&
+ credit_card_hash_for_verification.key?("options")
+ options = credit_card_hash_for_verification["options"]
+ options["verify_card"] == true
+ end
end
def has_invalid_credit_card?(customer_hash)
- has_credit_card_number? &&
- ! FakeBraintree::VALID_CREDIT_CARDS.include?(@customer_hash["credit_card"]["number"])
+ credit_card_number &&
+ ! FakeBraintree::VALID_CREDIT_CARDS.include?(credit_card_number)
end
- def has_credit_card_number?
- @customer_hash.key?("credit_card") &&
- @customer_hash["credit_card"].is_a?(Hash) &&
- @customer_hash["credit_card"].key?("number")
+ def credit_card_number
+ credit_card_hash["number"]
end
- def credit_card_number
- has_credit_card_number? && @customer_hash["credit_card"]["number"]
+ def generate_credit_cards_from(new_credit_card_hash)
+ if new_credit_card_hash.present? && new_credit_card_hash.is_a?(Hash)
+ new_credit_card_hash["last_4"] = new_credit_card_hash["number"][-4..-1]
+ new_credit_card_hash["token"] = credit_card_token(new_credit_card_hash)
+
+ if credit_card_expiration_month
+ new_credit_card_hash["expiration_month"] = credit_card_expiration_month
+ end
+
+ if credit_card_expiration_year
+ new_credit_card_hash["expiration_year"] = credit_card_expiration_year
+ end
+
+ [new_credit_card_hash]
+ else
+ []
+ end
end
- def existing_customer_id
- @customer_hash['id']
+ def credit_card_expiration_month
+ credit_card_expiration_date[0]
end
- def creation_response_for(hash)
+ def credit_card_expiration_year
+ credit_card_expiration_date[1]
+ end
+
+ def credit_card_expiration_date
+ if credit_card_hash.key?("expiration_date")
+ credit_card_hash["expiration_date"].split('/')
+ else
+ []
+ end
+ end
+
+ def delete_customer_with_id(id)
+ FakeBraintree.registry.customers[id] = nil
+ end
+
+ def deletion_response
+ gzipped_response(200, '')
+ end
+
+ def response_for_created_customer(hash)
gzipped_response(201, hash.to_xml(:root => 'customer'))
end
- def create_customer_with(hash)
- FakeBraintree.registry.customers[hash["id"]] = hash
+ def response_for_updated_customer(hash)
+ gzipped_response(200, hash.to_xml(:root => 'customer'))
end
- def create_credit_card_with(hash)
- if hash.key?("credit_cards")
- hash["credit_cards"].each do |credit_card|
- add_credit_card_to_registry(credit_card)
- end
- end
+ def response_for_invalid_card
+ failure_response(422)
end
- def add_credit_card_to_registry(credit_card_hash)
- FakeBraintree.registry.credit_cards[credit_card_hash["token"]] = credit_card_hash
+ def response_for_customer_not_found
+ failure_response(404)
+ end
+
+ def failure_response(code)
+ gzipped_response(code, FakeBraintree.failure_response(credit_card_number).to_xml(:root => 'api_error_response'))
+ end
+
+ def customer_id
+ customer_hash["id"]
+ end
+
+ def has_credit_card?
+ credit_card_hash.present?
+ end
+
+ def credit_card_hash
+ @customer_hash["credit_card"] || {}
+ end
+
+ def set_customer_id
+ @customer_hash["id"] ||= create_id(@customer_hash["merchant_id"])
+ end
+
+ def credit_card_token(credit_card_hash_without_token)
+ md5("#{credit_card_hash_without_token["number"]}#{@customer_hash["merchant_id"]}")
end
end
end