Skip to content

Commit b3cf1f9

Browse files
committed
Add specs
1 parent 3ce1afc commit b3cf1f9

File tree

2 files changed

+81
-1
lines changed

2 files changed

+81
-1
lines changed

lib/mongoid/criteria/queryable/selector.rb

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,14 @@ def evolve_multi(specs)
150150
#
151151
# @return [ Object ] The serialized object.
152152
def evolve(serializer, value)
153+
154+
if value.is_a?(Mongoid::RawValue)
155+
value = value.raw_value
156+
157+
# Mongoid::RawValue skips any field-specific serialization logic
158+
serializer = nil
159+
end
160+
153161
_value = case value
154162
when Hash
155163
evolve_hash(serializer, value)
@@ -162,7 +170,6 @@ def evolve(serializer, value)
162170
else
163171
(serializer || value.class).evolve(value)
164172
end
165-
_value = _value.raw_value if _value.is_a?(Mongoid::RawValue)
166173
_value
167174
end
168175

spec/mongoid/criteria/queryable/selector_spec.rb

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -403,6 +403,32 @@ def localized?
403403
end
404404
end
405405
end
406+
407+
context "when providing a Mongoid::RawValue" do
408+
409+
context "and raw_value is a string" do
410+
411+
before do
412+
selector.send(method, "key", Mongoid::RawValue("Foo"))
413+
end
414+
415+
it "serializes the raw_value" do
416+
expect(selector["key"]).to eq("Foo")
417+
end
418+
end
419+
420+
context "and raw_value is a complex type" do
421+
config_override :map_big_decimal_to_decimal128, true
422+
423+
before do
424+
selector.send(method, "key", Mongoid::RawValue([{ foo: 1, "Bar" => [/baz/, BigDecimal('2'), 4..5] }, 3]))
425+
end
426+
427+
it "serializes the raw_value" do
428+
expect(selector["key"]).to eq([{ foo: 1, "Bar" => [/baz/, BSON::Decimal128.new('2'), {"$gte"=>4, "$lte"=>5}] }, 3])
429+
end
430+
end
431+
end
406432
end
407433

408434
context "when serializers are provided" do
@@ -603,6 +629,53 @@ def localized?
603629
end
604630
end
605631
end
632+
633+
context "when the criterion is a Mongoid::RawValue" do
634+
635+
context "and raw_value is a serializable string" do
636+
637+
before do
638+
selector.send(method, "key", Mongoid::RawValue("1"))
639+
end
640+
641+
it "serializes the value" do
642+
expect(selector["key"]).to eq("1")
643+
end
644+
end
645+
646+
context "and raw_value is a serializable type" do
647+
648+
before do
649+
selector.send(method, "key", Mongoid::RawValue(BigDecimal('2')))
650+
end
651+
652+
it "serializes the value" do
653+
expect(selector["key"]).to eq(BSON::Decimal128.new('2'))
654+
end
655+
end
656+
657+
context "and raw_value is a non-serializable string" do
658+
659+
before do
660+
selector.send(method, "key", Mongoid::RawValue("Foo"))
661+
end
662+
663+
it "serializes the value" do
664+
expect(selector["key"]).to eq("Foo")
665+
end
666+
end
667+
668+
context "and raw_value is a complex type" do
669+
670+
before do
671+
selector.send(method, "key", Mongoid::RawValue([{ foo: "1", "Bar" => [/baz/, BigDecimal('2'), 4..5] }, 3]))
672+
end
673+
674+
it "serializes the raw_value" do
675+
expect(selector["key"]).to eq([{ foo: "1", "Bar" => [/baz/, BSON::Decimal128.new('2'), {"$gte"=>4, "$lte"=>5}] }, 3])
676+
end
677+
end
678+
end
606679
end
607680
end
608681
end

0 commit comments

Comments
 (0)