mongoid 7.2.0.rc1 → 7.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/Rakefile +30 -11
- data/lib/mongoid/association/referenced/has_one/buildable.rb +8 -0
- data/lib/mongoid/association/referenced/has_one/proxy.rb +6 -1
- data/lib/mongoid/copyable.rb +5 -1
- data/lib/mongoid/extensions.rb +1 -0
- data/lib/mongoid/fields.rb +3 -0
- data/lib/mongoid/stringified_symbol.rb +53 -0
- data/lib/mongoid/version.rb +1 -1
- data/spec/README.md +19 -4
- data/spec/integration/app_spec.rb +12 -12
- data/spec/integration/associations/embeds_many_spec.rb +24 -0
- data/spec/integration/associations/embeds_one_spec.rb +24 -0
- data/spec/integration/associations/has_many_spec.rb +60 -0
- data/spec/integration/associations/has_one_spec.rb +60 -0
- data/spec/integration/stringified_symbol_field_spec.rb +190 -0
- data/spec/lite_spec_helper.rb +4 -3
- data/spec/mongoid/association/referenced/has_many_models.rb +12 -0
- data/spec/mongoid/association/referenced/has_one_models.rb +12 -0
- data/spec/mongoid/association/referenced/has_one_spec.rb +1 -1
- data/spec/mongoid/copyable_spec.rb +44 -17
- data/spec/mongoid/copyable_spec_models.rb +14 -0
- data/spec/mongoid/equality_spec.rb +0 -1
- data/spec/mongoid/extensions/stringified_symbol_spec.rb +85 -0
- data/spec/shared/LICENSE +20 -0
- data/spec/shared/lib/mrss/child_process_helper.rb +80 -0
- data/spec/shared/lib/mrss/constraints.rb +303 -0
- data/spec/shared/lib/mrss/lite_constraints.rb +175 -0
- data/spec/shared/lib/mrss/spec_organizer.rb +149 -0
- data/spec/spec_helper.rb +2 -0
- data/spec/support/constraints.rb +0 -226
- data/spec/support/models/order.rb +11 -0
- data/spec/support/models/person.rb +2 -0
- data/spec/support/models/series.rb +1 -0
- data/spec/support/models/wiki_page.rb +1 -0
- metadata +512 -496
- metadata.gz.sig +0 -0
- data/spec/support/child_process_helper.rb +0 -79
- data/spec/support/lite_constraints.rb +0 -22
- data/spec/support/spec_organizer.rb +0 -130
@@ -0,0 +1,190 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe "StringifiedSymbol fields" do
|
4
|
+
|
5
|
+
before do
|
6
|
+
Order.destroy_all
|
7
|
+
end
|
8
|
+
|
9
|
+
context "when querying the database" do
|
10
|
+
|
11
|
+
let!(:document) do
|
12
|
+
Order.create!(saved_status: :test)
|
13
|
+
end
|
14
|
+
|
15
|
+
let(:string_query) do
|
16
|
+
{'saved_status' => {'$eq' => 'test'}}
|
17
|
+
end
|
18
|
+
|
19
|
+
let(:symbol_query) do
|
20
|
+
{'saved_status' => {'$eq' => :test}}
|
21
|
+
end
|
22
|
+
|
23
|
+
it "can be queried with a string" do
|
24
|
+
doc = Order.where(string_query).first
|
25
|
+
expect(doc.saved_status).to eq(:test)
|
26
|
+
end
|
27
|
+
|
28
|
+
it "can be queried with a symbol" do
|
29
|
+
doc = Order.where(symbol_query).first
|
30
|
+
expect(doc.saved_status).to eq(:test)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
# Using command monitoring to test that StringifiedSymbol sends a string and returns a symbol
|
35
|
+
let(:client) { Order.collection.client }
|
36
|
+
|
37
|
+
before do
|
38
|
+
client.subscribe(Mongo::Monitoring::COMMAND, subscriber)
|
39
|
+
end
|
40
|
+
|
41
|
+
after do
|
42
|
+
client.unsubscribe(Mongo::Monitoring::COMMAND, subscriber)
|
43
|
+
end
|
44
|
+
|
45
|
+
let(:subscriber) do
|
46
|
+
EventSubscriber.new
|
47
|
+
end
|
48
|
+
|
49
|
+
let(:find_events) do
|
50
|
+
subscriber.started_events.select { |event| event.command_name.to_s == 'find' }
|
51
|
+
end
|
52
|
+
|
53
|
+
let(:insert_events) do
|
54
|
+
subscriber.started_events.select { |event| event.command_name.to_s == 'insert' }
|
55
|
+
end
|
56
|
+
|
57
|
+
let(:update_events) do
|
58
|
+
subscriber.started_events.select { |event| event.command_name.to_s == 'update' }
|
59
|
+
end
|
60
|
+
|
61
|
+
before do
|
62
|
+
subscriber.clear_events!
|
63
|
+
end
|
64
|
+
|
65
|
+
let(:query) do
|
66
|
+
{'saved_status' => {'$eq' => 'test'}}
|
67
|
+
end
|
68
|
+
|
69
|
+
let!(:document1) do
|
70
|
+
Order.create!(saved_status: :test)
|
71
|
+
end
|
72
|
+
|
73
|
+
let!(:document2) do
|
74
|
+
Order.where(query).first
|
75
|
+
end
|
76
|
+
|
77
|
+
context "when inserting document" do
|
78
|
+
|
79
|
+
it "sends the value as a string" do
|
80
|
+
Order.create!(saved_status: :test)
|
81
|
+
event = insert_events.first
|
82
|
+
doc = event.command["documents"].first
|
83
|
+
expect(doc["saved_status"]).to eq("test")
|
84
|
+
end
|
85
|
+
|
86
|
+
it "sends the value as a string" do
|
87
|
+
Order.create!(saved_status: 42)
|
88
|
+
event = insert_events.second
|
89
|
+
doc = event.command["documents"].first
|
90
|
+
expect(doc["saved_status"]).to eq("42")
|
91
|
+
end
|
92
|
+
|
93
|
+
it "sends the value as a string" do
|
94
|
+
Order.create(saved_status: [0, 1, 2])
|
95
|
+
event = insert_events.second
|
96
|
+
doc = event.command["documents"].first
|
97
|
+
expect(doc["saved_status"]).to eq("[0, 1, 2]")
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
context "when finding document" do
|
102
|
+
|
103
|
+
it "receives the value as a symbol" do
|
104
|
+
event = find_events.first
|
105
|
+
expect(document2.saved_status).to eq(:test)
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
context "when reading a BSON Symbol field" do
|
110
|
+
|
111
|
+
before do
|
112
|
+
client["orders"].insert_one(saved_status: BSON::Symbol::Raw.new("test"), _id: 12)
|
113
|
+
end
|
114
|
+
|
115
|
+
it "receives the value as a symbol" do
|
116
|
+
expect(Order.find(12).saved_status).to eq(:test)
|
117
|
+
end
|
118
|
+
|
119
|
+
it "saves the value as a string" do
|
120
|
+
s = Order.find(12)
|
121
|
+
s.saved_status = :other
|
122
|
+
s.save!
|
123
|
+
event = update_events.first
|
124
|
+
expect(event.command["updates"].first["u"]["$set"]["saved_status"]).to eq("other")
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
context "when value is nil" do
|
129
|
+
|
130
|
+
before do
|
131
|
+
client["orders"].insert_one(saved_status: nil, _id: 15)
|
132
|
+
end
|
133
|
+
|
134
|
+
it "returns nil" do
|
135
|
+
expect(Order.find(15).saved_status).to be_nil
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
139
|
+
context "when writing nil" do
|
140
|
+
|
141
|
+
before do
|
142
|
+
client["orders"].insert_one(saved_status: "hello", _id: 16)
|
143
|
+
end
|
144
|
+
|
145
|
+
it "saves the value as nil" do
|
146
|
+
s = Order.find(16)
|
147
|
+
s.saved_status = nil
|
148
|
+
s.save!
|
149
|
+
event = update_events.first
|
150
|
+
expect(event.command["updates"].first["u"]["$set"]["saved_status"]).to be_nil
|
151
|
+
end
|
152
|
+
end
|
153
|
+
|
154
|
+
context "when reading an integer" do
|
155
|
+
|
156
|
+
before do
|
157
|
+
client["orders"].insert_one(saved_status: 42, _id: 13)
|
158
|
+
end
|
159
|
+
|
160
|
+
it "receives the value as a symbol" do
|
161
|
+
expect(Order.find(13).saved_status).to eq(:"42")
|
162
|
+
end
|
163
|
+
|
164
|
+
it "saves the value as a string" do
|
165
|
+
s = Order.find(13)
|
166
|
+
s.saved_status = 24
|
167
|
+
s.save!
|
168
|
+
event = update_events.first
|
169
|
+
expect(event.command["updates"].first["u"]["$set"]["saved_status"]).to eq("24")
|
170
|
+
end
|
171
|
+
end
|
172
|
+
|
173
|
+
context "when reading an array" do
|
174
|
+
before do
|
175
|
+
client["orders"].insert_one(saved_status: [0, 1, 2], _id: 14)
|
176
|
+
end
|
177
|
+
|
178
|
+
it "receives the value as a symbol" do
|
179
|
+
expect(Order.find(14).saved_status).to be(:"[0, 1, 2]")
|
180
|
+
end
|
181
|
+
|
182
|
+
it "saves the value as a string" do
|
183
|
+
s = Order.find(14)
|
184
|
+
s.saved_status = [3, 4, 5]
|
185
|
+
s.save!
|
186
|
+
event = update_events.first
|
187
|
+
expect(event.command["updates"].first["u"]["$set"]["saved_status"]).to eq("[3, 4, 5]")
|
188
|
+
end
|
189
|
+
end
|
190
|
+
end
|
data/spec/lite_spec_helper.rb
CHANGED
@@ -3,6 +3,7 @@
|
|
3
3
|
|
4
4
|
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
5
5
|
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), "..", "lib"))
|
6
|
+
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), "shared", "lib"))
|
6
7
|
|
7
8
|
# Load byebug before mongoid, to place breakpoints in the lib methods.
|
8
9
|
# But SpecConfig needs the driver code - require the driver here.
|
@@ -15,8 +16,8 @@ require "mongo"
|
|
15
16
|
require 'pp'
|
16
17
|
|
17
18
|
require 'support/spec_config'
|
18
|
-
require '
|
19
|
-
require "support/session_registry"
|
19
|
+
require 'mrss/lite_constraints'
|
20
|
+
require "support/session_registry"
|
20
21
|
|
21
22
|
unless SpecConfig.instance.ci?
|
22
23
|
begin
|
@@ -68,7 +69,7 @@ RSpec.configure do |config|
|
|
68
69
|
end
|
69
70
|
end
|
70
71
|
|
71
|
-
config.extend(LiteConstraints)
|
72
|
+
config.extend(Mrss::LiteConstraints)
|
72
73
|
end
|
73
74
|
|
74
75
|
# require all shared examples
|
@@ -58,3 +58,15 @@ class HomPolymorphicChild
|
|
58
58
|
|
59
59
|
belongs_to :p_parent, polymorphic: true
|
60
60
|
end
|
61
|
+
|
62
|
+
class HomBus
|
63
|
+
include Mongoid::Document
|
64
|
+
|
65
|
+
has_one :driver, class_name: 'HomBusDriver'
|
66
|
+
end
|
67
|
+
|
68
|
+
class HomBusDriver
|
69
|
+
include Mongoid::Document
|
70
|
+
|
71
|
+
# No belongs_to :bus
|
72
|
+
end
|
@@ -1,7 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
# encoding: utf-8
|
3
3
|
|
4
|
-
# -*- coding: utf-8 -*-
|
5
4
|
require "spec_helper"
|
6
5
|
|
7
6
|
require_relative './copyable_spec_models'
|
@@ -65,30 +64,58 @@ describe Mongoid::Copyable do
|
|
65
64
|
|
66
65
|
context "when a document has fields from a legacy schema" do
|
67
66
|
|
68
|
-
|
69
|
-
|
70
|
-
|
67
|
+
shared_examples 'behaves as expected' do
|
68
|
+
let!(:instance) do
|
69
|
+
cls.create(name: "test")
|
70
|
+
end
|
71
71
|
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
72
|
+
before do
|
73
|
+
legacy_fields = { "this_is_not_a_field" => 1, "this_legacy_field_is_nil" => nil }
|
74
|
+
cls.collection.find(_id: instance.id).update_one("$set" => legacy_fields)
|
75
|
+
end
|
76
76
|
|
77
|
-
|
78
|
-
|
79
|
-
|
77
|
+
let(:cloned) do
|
78
|
+
instance.reload.send(method)
|
79
|
+
end
|
80
|
+
|
81
|
+
it "sets the legacy attribute" do
|
82
|
+
expect(cloned.attributes['this_is_not_a_field']).to eq(1)
|
83
|
+
end
|
84
|
+
|
85
|
+
it "contains legacy attributes that are nil" do
|
86
|
+
expect(cloned.attributes.key?('this_legacy_field_is_nil')).to eq(true)
|
87
|
+
end
|
80
88
|
|
81
|
-
|
82
|
-
|
89
|
+
it "copies the known attributes" do
|
90
|
+
expect(cloned.name).to eq('test')
|
91
|
+
end
|
92
|
+
|
93
|
+
it 'calls constructor with explicitly declared attributes only' do
|
94
|
+
expect(cls).to receive(:new).with('name' => 'test').and_call_original
|
95
|
+
cloned
|
96
|
+
end
|
83
97
|
end
|
84
98
|
|
85
|
-
|
86
|
-
|
99
|
+
context 'without Attributes::Dynamic' do
|
100
|
+
let(:cls) { CopyableSpec::Reg }
|
101
|
+
|
102
|
+
before do
|
103
|
+
cls.should_not include(Mongoid::Attributes::Dynamic)
|
104
|
+
end
|
105
|
+
|
106
|
+
include_examples 'behaves as expected'
|
87
107
|
end
|
88
108
|
|
89
|
-
|
90
|
-
|
109
|
+
context 'with Attributes::Dynamic' do
|
110
|
+
let(:cls) { CopyableSpec::Dyn }
|
111
|
+
|
112
|
+
before do
|
113
|
+
cls.should include(Mongoid::Attributes::Dynamic)
|
114
|
+
end
|
115
|
+
|
116
|
+
include_examples 'behaves as expected'
|
91
117
|
end
|
118
|
+
|
92
119
|
end
|
93
120
|
|
94
121
|
context "when using store_as" do
|
@@ -31,4 +31,18 @@ module CopyableSpec
|
|
31
31
|
class Blurb
|
32
32
|
include Mongoid::Document
|
33
33
|
end
|
34
|
+
|
35
|
+
# Do not include Attributes::Dynamic
|
36
|
+
class Reg
|
37
|
+
include Mongoid::Document
|
38
|
+
|
39
|
+
field :name, type: String
|
40
|
+
end
|
41
|
+
|
42
|
+
class Dyn
|
43
|
+
include Mongoid::Document
|
44
|
+
include Mongoid::Attributes::Dynamic
|
45
|
+
|
46
|
+
field :name, type: String
|
47
|
+
end
|
34
48
|
end
|
@@ -0,0 +1,85 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
# encoding: utf-8
|
3
|
+
|
4
|
+
require "spec_helper"
|
5
|
+
|
6
|
+
describe Mongoid::StringifiedSymbol do
|
7
|
+
|
8
|
+
describe ".demongoize" do
|
9
|
+
|
10
|
+
context "when the object is not a symbol" do
|
11
|
+
|
12
|
+
it "returns the symbol" do
|
13
|
+
expect(Mongoid::StringifiedSymbol.demongoize("test")).to eq(:test)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
context "when the object is a symbol" do
|
18
|
+
|
19
|
+
it "returns the symbol" do
|
20
|
+
expect(Mongoid::StringifiedSymbol.demongoize(:test)).to eq(:test)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
context "when the object is a BSON Symbol" do
|
25
|
+
|
26
|
+
it "returns a symbol" do
|
27
|
+
expect(Mongoid::StringifiedSymbol.demongoize(BSON::Symbol::Raw.new(:test))).to eq(:test)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
|
32
|
+
context "when the object is an integer" do
|
33
|
+
|
34
|
+
it "returns a symbol" do
|
35
|
+
expect(Mongoid::StringifiedSymbol.demongoize(14)).to eq(:"14")
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
context "when the object is nil" do
|
40
|
+
|
41
|
+
it "returns nil" do
|
42
|
+
expect(Mongoid::StringifiedSymbol.demongoize(nil)).to be_nil
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
describe ".mongoize" do
|
48
|
+
|
49
|
+
context "when the object is not a symbol" do
|
50
|
+
|
51
|
+
it "returns the object" do
|
52
|
+
expect(Mongoid::StringifiedSymbol.mongoize("test")).to eq("test")
|
53
|
+
end
|
54
|
+
|
55
|
+
it "returns the string" do
|
56
|
+
expect(Mongoid::StringifiedSymbol.mongoize([0,1,2])).to eq("[0, 1, 2]")
|
57
|
+
end
|
58
|
+
|
59
|
+
it "returns the string" do
|
60
|
+
expect(Mongoid::StringifiedSymbol.mongoize(2)).to eq("2")
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
context "when the object is a symbol" do
|
65
|
+
|
66
|
+
it "returns a string" do
|
67
|
+
expect(Mongoid::StringifiedSymbol.mongoize(:test)).to eq("test")
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
context "when the object is nil" do
|
72
|
+
|
73
|
+
it "returns nil" do
|
74
|
+
expect(Mongoid::StringifiedSymbol.mongoize(nil)).to be_nil
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
describe "#mongoize" do
|
80
|
+
|
81
|
+
it "returns self" do
|
82
|
+
expect(:test.mongoize).to eq(:test)
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|