Improve error message when serializing unsaved records for jobs

This commit is contained in:
Faraz Yashar 2015-06-28 14:58:01 -04:00
parent aba43b7da1
commit fd8122a878
2 changed files with 21 additions and 7 deletions

View File

@ -16,13 +16,13 @@ module ActiveJob
end
end
# Raised when an unsupported argument type is being set as job argument. We
# Raised when an unsupported argument type is set as a job argument. We
# currently support NilClass, Fixnum, Float, String, TrueClass, FalseClass,
# Bignum and object that can be represented as GlobalIDs (ex: Active Record).
# Also raised if you set the key for a Hash something else than a string or
# a symbol.
class SerializationError < ArgumentError
end
# Bignum and objects that can be represented as GlobalIDs (ex: Active Record).
# Raised if you set the key for a Hash something else than a string or
# a symbol. Also raised when trying to serialize an object which can't be
# identified with a Global ID - such as an unpersisted Active Record model.
class SerializationError < ArgumentError; end
module Arguments
extend self
@ -59,7 +59,7 @@ module ActiveJob
when *TYPE_WHITELIST
argument
when GlobalID::Identification
{ GLOBALID_KEY => argument.to_global_id.to_s }
convert_to_global_id_hash(argument)
when Array
argument.map { |arg| serialize_argument(arg) }
when ActiveSupport::HashWithIndifferentAccess
@ -147,5 +147,12 @@ module ActiveJob
end
end
end
def convert_to_global_id_hash(argument)
{ GLOBALID_KEY => argument.to_global_id.to_s }
rescue URI::GID::MissingModelIdError
raise SerializationError, "Unable to serialize #{argument.class} " \
"without an id. (Maybe you forgot to call save?)"
end
end
end

View File

@ -88,6 +88,13 @@ class ArgumentSerializationTest < ActiveSupport::TestCase
assert_equal "Job with argument: 2", JobBuffer.last_value
end
test 'raises a friendly SerializationError for records without ids' do
err = assert_raises ActiveJob::SerializationError do
ActiveJob::Arguments.serialize [Person.new(nil)]
end
assert_match 'Unable to serialize Person without an id.', err.message
end
private
def assert_arguments_unchanged(*args)
assert_arguments_roundtrip args