test/test_mongoo.rb in mongoo-0.4.4 vs test/test_mongoo.rb in mongoo-0.4.5
- old
+ new
@@ -227,18 +227,10 @@
assert_equal ["snowboarding", "travelling"], p.interests
p = Person.find_one(p.id)
assert_equal ["snowboarding", "travelling"], p.interests
end
- should "not be able to modify fields that don't exist" do
- p = Person.new("name" => "Ben", "visits" => 0)
- p.insert!
- assert_raise(Mongoo::UnknownAttributeError) do
- p.mod! { |mod| mod.push("idontexist", "foobar") }
- end
- end
-
should "be able to access a hash type directly" do
p = Person.new("name" => "Ben")
p.insert!
assert_equal nil, p.misc
p.misc = { "height" => 5.5, "weight" => 160 }
@@ -347,9 +339,79 @@
new: true
})
assert_equal ["skydiving", "coding", "swimming"], p2.interests
assert_equal ["skydiving", "coding"], p.interests
p.reload
+ assert_equal ["skydiving", "coding", "swimming"], p.interests
+ end
+
+ should "still do set/unset updates on granular attributes on a hash field" do
+ p = Person.new(name: "Ben", interests: ["skydiving", "coding"], misc: { foo: { bar: 1, zar: 2 } })
+ p.insert!
+ p.misc['foo']['zar'] = 3
+ assert_equal [[:set, "misc.foo.zar", 3]], p.changelog
+ end
+
+ should "be able to apply modifiers on hash attribute values" do
+ p = Person.new(name: "Ben", interests: ["skydiving", "coding"], misc: { foo: { bar: 1, zar: 2 } })
+ p.insert!
+ p.mod { |m| m.inc 'misc.foo.zar', 2 }
+ assert_equal 4, p.misc['foo']['zar']
+ p.reload
+ assert_equal 4, p.misc['foo']['zar']
+ end
+
+ should "be able to abort modifier update if there are stale values" do
+ p = Person.new(name: "Ben", interests: ["skydiving", "coding"], misc: { foo: { bar: 1, zar: 2 } })
+ p.insert!
+ p.mod { |m| m.inc 'misc.foo.zar', 2 }
+
+ p2 = Person.find_one(p.id)
+ p2.mod { |m| m.inc 'misc.foo.zar', 2 }
+ assert_equal 6, p2.misc['foo']['zar']
+
+ assert_raise(Mongoo::ModifierUpdateError) do
+ p.mod(only_if_current: true) { |m| m.inc 'misc.foo.zar', 1 }
+ end
+ end
+
+ should "be able to do a find_and_modify when using modifiers" do
+ p = Person.new(name: "Ben", interests: ["skydiving", "coding"], misc: { foo: { bar: 1, zar: 2 } })
+ p.insert!
+ p.mod { |m| m.inc 'misc.foo.zar', 2 }
+
+ p2 = Person.find_one(p.id)
+ p2.mod { |m| m.inc 'misc.foo.zar', 2 }
+ assert_equal 6, p2.misc['foo']['zar']
+
+ p.mod { |m| m.inc 'misc.foo.zar', 1 }
+ assert_equal 5, p.misc['foo']['zar']
+
+ # but if we do a find_and_modify ....
+
+ p = Person.new(name: "Ben", interests: ["skydiving", "coding"], misc: { foo: { bar: 1, zar: 2 } })
+ p.insert!
+ p.mod { |m| m.inc 'misc.foo.zar', 2 }
+
+ p2 = Person.find_one(p.id)
+ p2.mod { |m| m.inc 'misc.foo.zar', 2 }
+ assert_equal 6, p2.misc['foo']['zar']
+
+ p.mod(find_and_modify: true) { |m| m.inc 'misc.foo.zar', 1 }
+ assert_equal 7, p.misc['foo']['zar']
+ end
+
+ should "be able to do an update using find_and_modify" do
+ p = Person.new(name: "Ben", interests: ["skydiving", "coding"])
+ p.insert!
+
+ p2 = Person.find_one(p.id)
+ p2.mod! { |m| m.push "interests", "swimming" }
+
+ assert_equal ["skydiving","coding"], p.interests
+ p.name = "Ben Myles"
+ p.update!(find_and_modify: true)
+ assert_equal "Ben Myles", p.name
assert_equal ["skydiving", "coding", "swimming"], p.interests
end
end