mirror of
https://github.com/stripe/stripe-ruby.git
synced 2025-09-22 00:00:31 -04:00
refactored update api operation, added ruby 1.9 tests back
This commit is contained in:
parent
5626199c86
commit
a0f1856cbb
@ -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
|
||||
|
@ -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
|
Loading…
x
Reference in New Issue
Block a user