diff --git a/lib/dolly/property.rb b/lib/dolly/property.rb index 3f89965..246f99e 100644 --- a/lib/dolly/property.rb +++ b/lib/dolly/property.rb @@ -14,7 +14,7 @@ def initialize(key, class_name, default = nil) end def cast_value(value) - return set_default if value.nil? + return set_default if empty_value?(value) return value unless class_name return custom_class(value) unless respond_to?(klass_sym) send(klass_sym, value) @@ -29,6 +29,11 @@ def boolean? [TrueClass, FalseClass].include?(class_name) end + def empty_value?(value) + return value&.empty? if value.respond_to?(:empty?) + value.nil? + end + def string_value(value) value.to_s end diff --git a/test/support/property_test.rb b/test/support/property_test.rb new file mode 100644 index 0000000..28dbb2d --- /dev/null +++ b/test/support/property_test.rb @@ -0,0 +1,36 @@ +require 'test_helper' + +class TestHashDoc < Dolly::Document + property :roles, class_name: Hash, default: { teacher: {} } +end + +class TestIntegerDoc < Dolly::Document + property :count, class_name: Integer, default: 0 +end + +class PropertyTest < Test::Unit::TestCase + test 'With a hash property with a default value' do + doc = TestHashDoc.new + assert_equal(doc.roles, { teacher: {} }) + end + + test 'With a hash property with an empty value it sets the default value' do + doc = TestHashDoc.new(roles: []) + assert_equal(doc.roles, { teacher: {} }) + end + + test 'With a hash property with a previous non empty value it preserves the value' do + doc = TestHashDoc.new(roles: { teacher: { 'user/amco@mail.com': {} } }) + assert_equal(doc.roles, { teacher: { 'user/amco@mail.com': {} } }) + end + + test 'With an Integer property with a nil value it sets the default value' do + doc = TestIntegerDoc.new(count: nil) + assert_equal(doc.count, 0) + end + + test 'With an Integer property with a previous non empty value it preserves the value' do + doc = TestIntegerDoc.new(count: 10) + assert_equal(doc.count, 10) + end +end