refactored update api operation, added ruby 1.9 tests back

This commit is contained in:
kiran-b 2013-10-09 13:52:39 -07:00
parent 5626199c86
commit a0f1856cbb
2 changed files with 86 additions and 57 deletions

View File

@ -2,66 +2,55 @@ module Stripe
module APIOperations
module Update
def save
set_metadata = process_metadata_values()
values = serialize_params(self)
if @unsaved_values.length > 0 or set_metadata.length > 0
values = @unsaved_values.reduce({}) do |h, k|
h.update(k => @values[k].nil? ? '' : @values[k])
end
if @values[:metadata]
values[:metadata] = serialize_metadata
end
if values.length > 0
values.delete(:id)
# if the object supports metadata
if @values[:metadata]
values[:metadata] = set_metadata
end
response, api_key = Stripe.request(:post, url, @api_key, values)
refresh_from(response, api_key)
end
self
end
def process_metadata_values
# if unsetting metadata, return ''
return '' if @values[:metadata] == nil
set_metadata = {}
# if we're updating metadata as a whole,
# (metadata = {key => val})
def serialize_metadata
if @unsaved_values.include?(:metadata)
set_metadata.update(@values[:metadata])
# unset keys from previous request
set_metadata.update(metadata_unset_hash(set_metadata))
# the metadata object has been reassigned
# i.e. as object.metadata = {key => val}
metadata_update = @values[:metadata] # new hash
new_keys = metadata_update.keys.map(&:to_sym)
# remove keys at the server, but not known locally
keys_to_unset = @previous_metadata.keys - new_keys
keys_to_unset.each {|key| metadata_update[key] = ''}
metadata_update
else
# metadata is a StripeObject, and can be serialized normally
serialize_params(@values[:metadata])
end
# if we're updating keys individually,
# (metadata[key] = val)
set_metadata.update(unsaved_metadata_hash())
set_metadata
end
def metadata_unset_hash(updated_hash)
unset = {}
@previous_metadata.each do |key, val|
# don't unset if setting to a new value in the same request
unset.update(key => '') unless updated_hash.has_key?(key.to_s)
end
unset
end
def serialize_params(obj)
case obj
when nil
''
when StripeObject
unsaved_keys = obj.instance_variable_get(:@unsaved_values)
obj_values = obj.instance_variable_get(:@values)
update_hash = {}
def unsaved_metadata_hash
unsaved_keys = self.metadata.instance_eval { @unsaved_values }
unsaved_hash = {}
if not unsaved_keys.nil?
metadata_vals = self.metadata.instance_eval { @values }
unsaved_hash = unsaved_keys.reduce({}) do |h, k|
h.update(k => metadata_vals[k].nil? ? '' : metadata_vals[k])
unsaved_keys.each do |k|
update_hash[k] = serialize_params(obj_values[k])
end
end
unsaved_hash
update_hash
else
obj
end
end
end
end

View File

@ -4,29 +4,50 @@ module Stripe
class MetadataTest < Test::Unit::TestCase
setup do
@metadata_supported = {
:charge => {:new => Stripe::Charge.method(:new),
:test => method(:test_charge),
:url => "/v1/charges/#{test_charge()[:id]}"},
:customer => {:new => Stripe::Customer.method(:new),
:test => method(:test_customer),
:url => "/v1/customers/#{test_customer()[:id]}"},
:recipient => {:new => Stripe::Recipient.method(:new),
:test => method(:test_recipient),
:url => "/v1/recipients/#{test_recipient()[:id]}"},
:transfer => {:new => Stripe::Transfer.method(:new),
:test => method(:test_transfer),
:url => "/v1/transfers/#{test_transfer()[:id]}"}
:charge => {
:new => Stripe::Charge.method(:new),
:test => method(:test_charge),
:url => "/v1/charges/#{test_charge()[:id]}"
},
:customer => {
:new => Stripe::Customer.method(:new),
:test => method(:test_customer),
:url => "/v1/customers/#{test_customer()[:id]}"
},
:recipient => {
:new => Stripe::Recipient.method(:new),
:test => method(:test_recipient),
:url => "/v1/recipients/#{test_recipient()[:id]}"
},
:transfer => {
:new => Stripe::Transfer.method(:new),
:test => method(:test_transfer),
:url => "/v1/transfers/#{test_transfer()[:id]}"
}
}
@base_url = 'https://api.stripe.com'
end
should "not touch metadata" do
update_actions = lambda {|obj| obj.description = 'test'}
check_metadata({:metadata => {'initial' => 'true'}},
'description=test',
update_actions)
end
should "update metadata as a whole" do
update_actions = lambda {|obj| obj.metadata = {'uuid' => '6735'}}
check_metadata({:metadata => {}},
'metadata[uuid]=6735',
update_actions)
if is_greater_than_ruby_1_9?
check_metadata({:metadata => {:initial => 'true'}},
'metadata[uuid]=6735&metadata[initial]=',
update_actions)
end
end
should "update metadata keys individually" do
@ -50,6 +71,20 @@ module Stripe
update_actions)
end
should "handle combinations of whole and partial metadata updates" do
if is_greater_than_ruby_1_9?
update_actions = lambda do |obj|
obj.metadata = {'type' => 'summer'}
obj.metadata['uuid'] = '6735'
end
params = {:metadata => {'type' => 'summer', 'uuid' => '6735'}}
curl_args = Stripe.uri_encode(params)
check_metadata({:metadata => {'type' => 'christmas'}},
curl_args,
update_actions)
end
end
def check_metadata (initial_params, curl_args, metadata_update)
@metadata_supported.each do |name, methods|
neu = methods[:new]
@ -70,5 +105,10 @@ module Stripe
obj.save
end
end
def is_greater_than_ruby_1_9?
version = RUBY_VERSION.dup # clone preserves frozen state
Gem::Version.new(version) >= Gem::Version.new('1.9')
end
end
end