mongoid 7.1.0 → 7.1.6
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/CHANGELOG.md +6 -6
- data/README.md +1 -1
- data/Rakefile +14 -5
- data/lib/config/locales/en.yml +5 -5
- data/lib/mongoid/association/accessors.rb +37 -2
- data/lib/mongoid/association/embedded/embeds_many.rb +2 -1
- data/lib/mongoid/association/embedded/embeds_one.rb +2 -1
- data/lib/mongoid/association/proxy.rb +1 -1
- data/lib/mongoid/association/referenced/belongs_to/binding.rb +1 -1
- data/lib/mongoid/association/referenced/belongs_to/eager.rb +38 -2
- data/lib/mongoid/association/referenced/eager.rb +29 -9
- data/lib/mongoid/association/referenced/has_one/proxy.rb +6 -1
- data/lib/mongoid/atomic.rb +13 -3
- data/lib/mongoid/clients/factory.rb +2 -2
- data/lib/mongoid/clients/options.rb +8 -8
- data/lib/mongoid/clients/sessions.rb +20 -4
- data/lib/mongoid/clients/storage_options.rb +5 -5
- data/lib/mongoid/config.rb +39 -9
- data/lib/mongoid/criteria.rb +23 -4
- data/lib/mongoid/criteria/modifiable.rb +2 -1
- data/lib/mongoid/criteria/queryable/extensions/numeric.rb +1 -1
- data/lib/mongoid/criteria/queryable/extensions/regexp.rb +6 -6
- data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +12 -0
- data/lib/mongoid/criteria/queryable/mergeable.rb +75 -8
- data/lib/mongoid/criteria/queryable/pipeline.rb +3 -2
- data/lib/mongoid/criteria/queryable/selectable.rb +120 -13
- data/lib/mongoid/criteria/queryable/storable.rb +104 -99
- data/lib/mongoid/errors/eager_load.rb +2 -0
- data/lib/mongoid/errors/no_client_config.rb +2 -2
- data/lib/mongoid/errors/no_default_client.rb +1 -1
- data/lib/mongoid/extensions/hash.rb +4 -2
- data/lib/mongoid/extensions/regexp.rb +1 -1
- data/lib/mongoid/fields.rb +2 -1
- data/lib/mongoid/fields/validators/macro.rb +4 -1
- data/lib/mongoid/matchable/regexp.rb +2 -2
- data/lib/mongoid/persistable/pushable.rb +11 -2
- data/lib/mongoid/persistence_context.rb +6 -6
- data/lib/mongoid/query_cache.rb +61 -18
- data/lib/mongoid/serializable.rb +9 -3
- data/lib/mongoid/tasks/database.rb +38 -3
- data/lib/mongoid/validatable/uniqueness.rb +1 -1
- data/lib/mongoid/version.rb +1 -1
- data/lib/rails/generators/mongoid/config/templates/mongoid.yml +32 -23
- data/lib/rails/generators/mongoid/model/templates/model.rb.tt +1 -1
- data/spec/app/models/coding.rb +4 -0
- data/spec/app/models/coding/pull_request.rb +12 -0
- data/spec/app/models/delegating_patient.rb +16 -0
- data/spec/app/models/passport.rb +1 -0
- data/spec/app/models/person.rb +2 -0
- data/spec/app/models/phone.rb +1 -0
- data/spec/app/models/publication.rb +5 -0
- data/spec/app/models/publication/encyclopedia.rb +12 -0
- data/spec/app/models/publication/review.rb +14 -0
- data/spec/app/models/series.rb +1 -0
- data/spec/app/models/wiki_page.rb +1 -0
- data/spec/integration/app_spec.rb +254 -0
- data/spec/integration/associations/embedded_spec.rb +54 -0
- 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 +76 -0
- data/spec/integration/associations/has_one_spec.rb +76 -0
- data/spec/integration/bson_regexp_raw_spec.rb +20 -0
- data/spec/integration/criteria/date_field_spec.rb +41 -0
- data/spec/integration/criteria/logical_spec.rb +13 -0
- data/spec/integration/document_spec.rb +22 -0
- data/spec/integration/shardable_spec.rb +20 -4
- data/spec/lite_spec_helper.rb +12 -4
- data/spec/mongoid/association/accessors_spec.rb +238 -63
- data/spec/mongoid/association/embedded/embeds_many_models.rb +19 -0
- data/spec/mongoid/association/embedded/embeds_many_spec.rb +10 -0
- data/spec/mongoid/association/embedded/embeds_one_spec.rb +0 -2
- data/spec/mongoid/association/referenced/belongs_to/eager_spec.rb +193 -10
- data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_spec.rb +140 -1
- data/spec/mongoid/association/referenced/has_many/enumerable_spec.rb +105 -0
- data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +2 -1
- data/spec/mongoid/clients/factory_spec.rb +8 -8
- data/spec/mongoid/clients/options_spec.rb +11 -11
- data/spec/mongoid/clients/sessions_spec.rb +8 -4
- data/spec/mongoid/clients/transactions_spec.rb +20 -8
- data/spec/mongoid/clients_spec.rb +2 -2
- data/spec/mongoid/contextual/atomic_spec.rb +22 -11
- data/spec/mongoid/contextual/geo_near_spec.rb +11 -2
- data/spec/mongoid/contextual/map_reduce_spec.rb +20 -5
- data/spec/mongoid/contextual/mongo_spec.rb +76 -53
- data/spec/mongoid/criteria/queryable/extensions/regexp_raw_spec.rb +1 -1
- data/spec/mongoid/criteria/queryable/extensions/regexp_spec.rb +7 -7
- data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +1 -1
- data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +19 -7
- data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +28 -1
- data/spec/mongoid/criteria/queryable/mergeable_spec.rb +45 -12
- data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +1051 -392
- data/spec/mongoid/criteria/queryable/selectable_spec.rb +52 -0
- data/spec/mongoid/criteria/queryable/storable_spec.rb +80 -2
- data/spec/mongoid/criteria_spec.rb +36 -2
- data/spec/mongoid/document_persistence_context_spec.rb +33 -0
- data/spec/mongoid/errors/no_client_config_spec.rb +2 -2
- data/spec/mongoid/errors/no_client_database_spec.rb +3 -3
- data/spec/mongoid/errors/no_client_hosts_spec.rb +3 -3
- data/spec/mongoid/fields_spec.rb +24 -1
- data/spec/mongoid/indexable_spec.rb +6 -4
- data/spec/mongoid/matchable/default_spec.rb +1 -1
- data/spec/mongoid/matchable/regexp_spec.rb +2 -2
- data/spec/mongoid/matchable_spec.rb +2 -2
- data/spec/mongoid/persistable/pushable_spec.rb +55 -1
- data/spec/mongoid/query_cache_spec.rb +77 -9
- data/spec/mongoid/relations/proxy_spec.rb +1 -1
- data/spec/mongoid/scopable_spec.rb +2 -1
- data/spec/mongoid/serializable_spec.rb +129 -18
- data/spec/mongoid/shardable_models.rb +1 -1
- data/spec/mongoid/shardable_spec.rb +2 -2
- data/spec/mongoid/tasks/database_rake_spec.rb +13 -13
- data/spec/mongoid/tasks/database_spec.rb +1 -1
- data/spec/shared/LICENSE +20 -0
- data/spec/shared/lib/mrss/child_process_helper.rb +80 -0
- data/spec/shared/lib/mrss/cluster_config.rb +211 -0
- data/spec/shared/lib/mrss/constraints.rb +312 -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 -31
- data/spec/support/child_process_helper.rb +76 -0
- data/spec/support/cluster_config.rb +3 -3
- data/spec/support/constraints.rb +26 -10
- data/spec/support/expectations.rb +3 -1
- data/spec/support/helpers.rb +11 -0
- data/spec/support/session_registry.rb +50 -0
- data/spec/support/spec_config.rb +12 -4
- metadata +520 -473
- metadata.gz.sig +0 -0
|
@@ -18,6 +18,25 @@ class EmmLegislator
|
|
|
18
18
|
field :b, type: Integer, default: 0
|
|
19
19
|
end
|
|
20
20
|
|
|
21
|
+
# Models with associations with :class_name as a :: prefixed string
|
|
22
|
+
|
|
23
|
+
class EmmCcCongress
|
|
24
|
+
include Mongoid::Document
|
|
25
|
+
|
|
26
|
+
embeds_many :legislators, class_name: '::EmmCcLegislator'
|
|
27
|
+
|
|
28
|
+
field :name, type: String
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
class EmmCcLegislator
|
|
32
|
+
include Mongoid::Document
|
|
33
|
+
|
|
34
|
+
embedded_in :congress, class_name: '::EmmCcCongress'
|
|
35
|
+
|
|
36
|
+
field :a, type: Integer, default: 0
|
|
37
|
+
field :b, type: Integer, default: 0
|
|
38
|
+
end
|
|
39
|
+
|
|
21
40
|
class EmmManufactory
|
|
22
41
|
include Mongoid::Document
|
|
23
42
|
|
|
@@ -649,6 +649,16 @@ describe Mongoid::Association::Embedded::EmbedsMany do
|
|
|
649
649
|
it 'returns the class name option' do
|
|
650
650
|
expect(association.klass).to eq(_class)
|
|
651
651
|
end
|
|
652
|
+
|
|
653
|
+
context 'when the class name is prefixed with ::' do
|
|
654
|
+
let(:options) do
|
|
655
|
+
{ class_name: '::OtherEmbeddedObject' }
|
|
656
|
+
end
|
|
657
|
+
|
|
658
|
+
it 'returns the class name option' do
|
|
659
|
+
expect(association.klass).to eq(_class)
|
|
660
|
+
end
|
|
661
|
+
end
|
|
652
662
|
end
|
|
653
663
|
|
|
654
664
|
context 'when the class_name option is not specified' do
|
|
@@ -114,13 +114,13 @@ describe Mongoid::Association::Referenced::BelongsTo::Eager do
|
|
|
114
114
|
end
|
|
115
115
|
|
|
116
116
|
it "does not query when touching the association" do
|
|
117
|
-
|
|
117
|
+
expect_no_queries do
|
|
118
118
|
expect(eager.person).to eq(person)
|
|
119
119
|
end
|
|
120
120
|
end
|
|
121
121
|
|
|
122
122
|
it "does not query when updating the association" do
|
|
123
|
-
|
|
123
|
+
expect_no_queries do
|
|
124
124
|
eager.person.username = "arthurnn"
|
|
125
125
|
end
|
|
126
126
|
end
|
|
@@ -146,18 +146,201 @@ describe Mongoid::Association::Referenced::BelongsTo::Eager do
|
|
|
146
146
|
|
|
147
147
|
context "when the association is polymorphic" do
|
|
148
148
|
|
|
149
|
-
|
|
150
|
-
|
|
149
|
+
context "without namespaces" do
|
|
150
|
+
|
|
151
|
+
let!(:stand_alone_rating) do
|
|
152
|
+
Rating.create(value: 7)
|
|
153
|
+
end
|
|
154
|
+
|
|
155
|
+
let!(:bar) do
|
|
156
|
+
Bar.create(name: "FooBar")
|
|
157
|
+
end
|
|
158
|
+
|
|
159
|
+
let(:bar_rating) do
|
|
160
|
+
bar.create_rating(value: 5)
|
|
161
|
+
end
|
|
162
|
+
|
|
163
|
+
let!(:movie) do
|
|
164
|
+
Movie.create(name: "Bladerunner")
|
|
165
|
+
end
|
|
166
|
+
|
|
167
|
+
let(:movie_rating) do
|
|
168
|
+
movie.ratings.create(value: 10)
|
|
169
|
+
end
|
|
170
|
+
|
|
171
|
+
let(:eager) do
|
|
172
|
+
Rating.includes(:ratable).entries
|
|
173
|
+
end
|
|
174
|
+
|
|
175
|
+
context "when the eager load has returned documents" do
|
|
176
|
+
|
|
177
|
+
before do
|
|
178
|
+
bar_rating
|
|
179
|
+
movie_rating
|
|
180
|
+
eager
|
|
181
|
+
end
|
|
182
|
+
|
|
183
|
+
it "puts the documents in the parent document" do
|
|
184
|
+
expect(eager.map { |e| e.ivar(:ratable) }).to eq([nil, bar, movie])
|
|
185
|
+
end
|
|
186
|
+
|
|
187
|
+
it "does not query when touching the association" do
|
|
188
|
+
expect_no_queries do
|
|
189
|
+
expect(eager.map(&:ratable)).to eq([nil, bar, movie])
|
|
190
|
+
end
|
|
191
|
+
end
|
|
192
|
+
|
|
193
|
+
it "does not query when updating the association" do
|
|
194
|
+
expect_no_queries do
|
|
195
|
+
eager.last.ratable.name = "Easy rider"
|
|
196
|
+
end
|
|
197
|
+
end
|
|
198
|
+
end
|
|
199
|
+
|
|
200
|
+
context "when the eager load has not returned documents" do
|
|
201
|
+
|
|
202
|
+
before { eager }
|
|
203
|
+
|
|
204
|
+
it "does not set anything on the parent" do
|
|
205
|
+
expect(eager.map { |e| e.ivar(:ratable) }).to all(be nil)
|
|
206
|
+
end
|
|
207
|
+
|
|
208
|
+
it "has a nil association" do
|
|
209
|
+
expect(eager.map(&:ratable)).to all(be nil)
|
|
210
|
+
end
|
|
211
|
+
end
|
|
212
|
+
end
|
|
213
|
+
|
|
214
|
+
context "with namespaces" do
|
|
215
|
+
|
|
216
|
+
let!(:stand_alone_review) do
|
|
217
|
+
Publication::Review.create(summary: "awful")
|
|
218
|
+
end
|
|
219
|
+
|
|
220
|
+
let!(:encyclopedia) do
|
|
221
|
+
Publication::Encyclopedia.create(title: "Encyclopedia Britannica")
|
|
222
|
+
end
|
|
223
|
+
|
|
224
|
+
let(:encyclopedia_review) do
|
|
225
|
+
encyclopedia.reviews.create(summary: "inspiring")
|
|
226
|
+
end
|
|
227
|
+
|
|
228
|
+
let!(:pull_request) do
|
|
229
|
+
Coding::PullRequest.create(title: "Add eager loading for polymorphic belongs_to associations")
|
|
230
|
+
end
|
|
231
|
+
|
|
232
|
+
let(:pull_request_review) do
|
|
233
|
+
pull_request.reviews.create(summary: "Looks good to me")
|
|
234
|
+
end
|
|
235
|
+
|
|
236
|
+
let(:eager) do
|
|
237
|
+
Publication::Review.includes(:reviewable).entries
|
|
238
|
+
end
|
|
239
|
+
|
|
240
|
+
context "when the eager load has returned documents" do
|
|
241
|
+
|
|
242
|
+
before do
|
|
243
|
+
encyclopedia_review
|
|
244
|
+
pull_request_review
|
|
245
|
+
eager
|
|
246
|
+
end
|
|
247
|
+
|
|
248
|
+
it "puts the documents in the parent document" do
|
|
249
|
+
expect(eager.map { |e| e.ivar(:reviewable) }).to eq([nil, encyclopedia, pull_request])
|
|
250
|
+
end
|
|
251
|
+
|
|
252
|
+
it "does not query when touching the association" do
|
|
253
|
+
expect_no_queries do
|
|
254
|
+
expect(eager.map(&:reviewable)).to eq([nil, encyclopedia, pull_request])
|
|
255
|
+
end
|
|
256
|
+
end
|
|
257
|
+
|
|
258
|
+
it "does not query when updating the association" do
|
|
259
|
+
expect_no_queries do
|
|
260
|
+
eager.last.reviewable.title = "Load stuff eagerly"
|
|
261
|
+
end
|
|
262
|
+
end
|
|
263
|
+
end
|
|
264
|
+
|
|
265
|
+
context "when the eager load has not returned documents" do
|
|
266
|
+
|
|
267
|
+
before { eager }
|
|
268
|
+
|
|
269
|
+
it "does not set anything on the parent" do
|
|
270
|
+
expect(eager.map { |e| e.ivar(:reviewable) }).to all(be nil)
|
|
271
|
+
end
|
|
272
|
+
|
|
273
|
+
it "has a nil association" do
|
|
274
|
+
expect(eager.map(&:reviewable)).to all(be nil)
|
|
275
|
+
end
|
|
276
|
+
end
|
|
151
277
|
end
|
|
152
278
|
|
|
153
|
-
|
|
154
|
-
|
|
279
|
+
context 'when eager loading multiple associations' do
|
|
280
|
+
let(:reviewable) do
|
|
281
|
+
Publication::Encyclopedia.create!(title: "Encyclopedia Britannica")
|
|
282
|
+
end
|
|
283
|
+
|
|
284
|
+
let!(:reviewable_review) do
|
|
285
|
+
Publication::Review.create!(summary: "awful",
|
|
286
|
+
reviewable: reviewable)
|
|
287
|
+
end
|
|
288
|
+
|
|
289
|
+
let(:reviewer) do
|
|
290
|
+
Dog.create!
|
|
291
|
+
end
|
|
292
|
+
|
|
293
|
+
let!(:reviewer_review) do
|
|
294
|
+
Publication::Review.create(summary: "okay",
|
|
295
|
+
reviewer: reviewer)
|
|
296
|
+
end
|
|
297
|
+
|
|
298
|
+
let(:template) do
|
|
299
|
+
Template.create!
|
|
300
|
+
end
|
|
301
|
+
|
|
302
|
+
let!(:template_review) do
|
|
303
|
+
Publication::Review.create(summary: "Looks good to me",
|
|
304
|
+
template: template)
|
|
305
|
+
end
|
|
306
|
+
|
|
307
|
+
let(:eager) do
|
|
308
|
+
Publication::Review.includes(:reviewable, :reviewer, :template).entries
|
|
309
|
+
end
|
|
310
|
+
|
|
311
|
+
it 'loads all associations eagerly' do
|
|
312
|
+
loaded = expect_query(4) do
|
|
313
|
+
eager
|
|
314
|
+
end
|
|
315
|
+
|
|
316
|
+
expect_no_queries do
|
|
317
|
+
eager.map(&:reviewable).compact.should == [reviewable]
|
|
318
|
+
end
|
|
319
|
+
|
|
320
|
+
expect_no_queries do
|
|
321
|
+
eager.map(&:reviewer).compact.should == [reviewer]
|
|
322
|
+
end
|
|
323
|
+
|
|
324
|
+
expect_no_queries do
|
|
325
|
+
eager.map(&:template).compact.should == [template]
|
|
326
|
+
end
|
|
327
|
+
end
|
|
155
328
|
end
|
|
156
329
|
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
330
|
+
context 'when eager loading an association that has type but not value set' do
|
|
331
|
+
|
|
332
|
+
let!(:reviewer_review) do
|
|
333
|
+
Publication::Review.create(summary: "okay",
|
|
334
|
+
reviewer_type: 'Dog')
|
|
335
|
+
end
|
|
336
|
+
|
|
337
|
+
let(:eager) do
|
|
338
|
+
Publication::Review.includes(:reviewable, :reviewer, :template).entries
|
|
339
|
+
end
|
|
340
|
+
|
|
341
|
+
it 'does not error' do
|
|
342
|
+
eager.map(&:reviewer).should == [nil]
|
|
343
|
+
end
|
|
161
344
|
end
|
|
162
345
|
end
|
|
163
346
|
|
|
@@ -1757,6 +1757,43 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
|
|
|
1757
1757
|
end
|
|
1758
1758
|
end
|
|
1759
1759
|
|
|
1760
|
+
describe "#any?" do
|
|
1761
|
+
|
|
1762
|
+
let(:person) do
|
|
1763
|
+
Person.create
|
|
1764
|
+
end
|
|
1765
|
+
|
|
1766
|
+
context "when nothing exists on the relation" do
|
|
1767
|
+
|
|
1768
|
+
context "when no document is added" do
|
|
1769
|
+
|
|
1770
|
+
let!(:sandwich) do
|
|
1771
|
+
Sandwich.create!
|
|
1772
|
+
end
|
|
1773
|
+
|
|
1774
|
+
it "returns false" do
|
|
1775
|
+
expect(sandwich.meats.any?).to be false
|
|
1776
|
+
end
|
|
1777
|
+
end
|
|
1778
|
+
|
|
1779
|
+
context "when the document is destroyed" do
|
|
1780
|
+
|
|
1781
|
+
before do
|
|
1782
|
+
Meat.create!
|
|
1783
|
+
end
|
|
1784
|
+
|
|
1785
|
+
let!(:sandwich) do
|
|
1786
|
+
Sandwich.create!
|
|
1787
|
+
end
|
|
1788
|
+
|
|
1789
|
+
it "returns false" do
|
|
1790
|
+
sandwich.destroy
|
|
1791
|
+
expect(sandwich.meats.any?).to be false
|
|
1792
|
+
end
|
|
1793
|
+
end
|
|
1794
|
+
end
|
|
1795
|
+
end
|
|
1796
|
+
|
|
1760
1797
|
context "when documents have been persisted" do
|
|
1761
1798
|
|
|
1762
1799
|
let!(:preference) do
|
|
@@ -1846,6 +1883,107 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
|
|
|
1846
1883
|
end
|
|
1847
1884
|
end
|
|
1848
1885
|
|
|
1886
|
+
describe "#any?" do
|
|
1887
|
+
|
|
1888
|
+
let(:sandwich) do
|
|
1889
|
+
Sandwich.create
|
|
1890
|
+
end
|
|
1891
|
+
|
|
1892
|
+
context "when nothing exists on the relation" do
|
|
1893
|
+
|
|
1894
|
+
context "when no document is added" do
|
|
1895
|
+
|
|
1896
|
+
let!(:sandwich) do
|
|
1897
|
+
Sandwich.create!
|
|
1898
|
+
end
|
|
1899
|
+
|
|
1900
|
+
it "returns false" do
|
|
1901
|
+
expect(sandwich.meats.any?).to be false
|
|
1902
|
+
end
|
|
1903
|
+
end
|
|
1904
|
+
|
|
1905
|
+
context "when the document is destroyed" do
|
|
1906
|
+
|
|
1907
|
+
before do
|
|
1908
|
+
Meat.create!
|
|
1909
|
+
end
|
|
1910
|
+
|
|
1911
|
+
let!(:sandwich) do
|
|
1912
|
+
Sandwich.create!
|
|
1913
|
+
end
|
|
1914
|
+
|
|
1915
|
+
it "returns false" do
|
|
1916
|
+
sandwich.destroy
|
|
1917
|
+
expect(sandwich.meats.any?).to be false
|
|
1918
|
+
end
|
|
1919
|
+
end
|
|
1920
|
+
end
|
|
1921
|
+
|
|
1922
|
+
context "when appending to a relation and _loaded/_unloaded are empty" do
|
|
1923
|
+
|
|
1924
|
+
let!(:sandwich) do
|
|
1925
|
+
Sandwich.create!
|
|
1926
|
+
end
|
|
1927
|
+
|
|
1928
|
+
before do
|
|
1929
|
+
sandwich.meats << Meat.new
|
|
1930
|
+
end
|
|
1931
|
+
|
|
1932
|
+
it "returns true" do
|
|
1933
|
+
expect(sandwich.meats.any?).to be true
|
|
1934
|
+
end
|
|
1935
|
+
end
|
|
1936
|
+
|
|
1937
|
+
context "when appending to a relation in a transaction" do
|
|
1938
|
+
require_transaction_support
|
|
1939
|
+
|
|
1940
|
+
let!(:sandwich) do
|
|
1941
|
+
Sandwich.create!
|
|
1942
|
+
end
|
|
1943
|
+
|
|
1944
|
+
it "returns true" do
|
|
1945
|
+
sandwich.with_session do |session|
|
|
1946
|
+
session.with_transaction do
|
|
1947
|
+
expect{ sandwich.meats << Meat.new }.to_not raise_error
|
|
1948
|
+
expect(sandwich.meats.any?).to be true
|
|
1949
|
+
end
|
|
1950
|
+
end
|
|
1951
|
+
end
|
|
1952
|
+
end
|
|
1953
|
+
|
|
1954
|
+
context "when documents have been persisted" do
|
|
1955
|
+
|
|
1956
|
+
let!(:meat) do
|
|
1957
|
+
sandwich.meats.create
|
|
1958
|
+
end
|
|
1959
|
+
|
|
1960
|
+
it "returns true" do
|
|
1961
|
+
expect(sandwich.meats.any?).to be true
|
|
1962
|
+
end
|
|
1963
|
+
end
|
|
1964
|
+
|
|
1965
|
+
context "when documents have not been persisted" do
|
|
1966
|
+
|
|
1967
|
+
let!(:meat) do
|
|
1968
|
+
sandwich.meats.build
|
|
1969
|
+
end
|
|
1970
|
+
|
|
1971
|
+
it "returns false" do
|
|
1972
|
+
expect(sandwich.meats.any?).to be true
|
|
1973
|
+
end
|
|
1974
|
+
end
|
|
1975
|
+
|
|
1976
|
+
context "when new documents exist in the database" do
|
|
1977
|
+
before do
|
|
1978
|
+
Meat.create(sandwiches: [sandwich])
|
|
1979
|
+
end
|
|
1980
|
+
|
|
1981
|
+
it "returns true" do
|
|
1982
|
+
expect(sandwich.meats.any?).to be true
|
|
1983
|
+
end
|
|
1984
|
+
end
|
|
1985
|
+
end
|
|
1986
|
+
|
|
1849
1987
|
[ :create, :create! ].each do |method|
|
|
1850
1988
|
|
|
1851
1989
|
describe "##{method}" do
|
|
@@ -2689,7 +2827,8 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
|
|
|
2689
2827
|
expect(preferences).to eq([ preference_one ])
|
|
2690
2828
|
end
|
|
2691
2829
|
|
|
2692
|
-
context 'when providing a collation'
|
|
2830
|
+
context 'when providing a collation' do
|
|
2831
|
+
min_server_version '3.4'
|
|
2693
2832
|
|
|
2694
2833
|
let(:preferences) do
|
|
2695
2834
|
person.preferences.where(name: "FIRST").collation(locale: 'en_US', strength: 2).to_a
|
|
@@ -256,6 +256,111 @@ describe Mongoid::Association::Referenced::HasMany::Targets::Enumerable do
|
|
|
256
256
|
end
|
|
257
257
|
end
|
|
258
258
|
end
|
|
259
|
+
|
|
260
|
+
context "when the documents have been loaded" do
|
|
261
|
+
let(:criteria) do
|
|
262
|
+
Post.where(person_id: person.id)
|
|
263
|
+
end
|
|
264
|
+
|
|
265
|
+
let!(:enumerable) do
|
|
266
|
+
described_class.new(criteria)
|
|
267
|
+
end
|
|
268
|
+
|
|
269
|
+
before do
|
|
270
|
+
enumerable.load_all!
|
|
271
|
+
end
|
|
272
|
+
|
|
273
|
+
it "is _loaded" do
|
|
274
|
+
expect(enumerable._loaded?).to be true
|
|
275
|
+
end
|
|
276
|
+
|
|
277
|
+
context "when a block is given" do
|
|
278
|
+
it "returns true when the predicate is true" do
|
|
279
|
+
expect(
|
|
280
|
+
enumerable.any? { |doc| true }
|
|
281
|
+
).to be true
|
|
282
|
+
end
|
|
283
|
+
|
|
284
|
+
it "returns false when the predicate is false" do
|
|
285
|
+
expect(
|
|
286
|
+
enumerable.any? { |doc| false }
|
|
287
|
+
).to be false
|
|
288
|
+
end
|
|
289
|
+
end
|
|
290
|
+
|
|
291
|
+
context "when an argument is given" do
|
|
292
|
+
ruby_version_gte '2.5'
|
|
293
|
+
|
|
294
|
+
it "returns true when the argument is true" do
|
|
295
|
+
expect(enumerable.any?(Post)).to be true
|
|
296
|
+
end
|
|
297
|
+
|
|
298
|
+
it "returns false when the argument is false" do
|
|
299
|
+
expect(enumerable.any?(Sandwich)).to be false
|
|
300
|
+
end
|
|
301
|
+
end
|
|
302
|
+
|
|
303
|
+
context "when both an argument and a block are given" do
|
|
304
|
+
ruby_version_gte '2.5'
|
|
305
|
+
|
|
306
|
+
it "gives precedence to the pattern" do
|
|
307
|
+
expect(
|
|
308
|
+
enumerable.any?(Post) { |doc| false }
|
|
309
|
+
).to be true
|
|
310
|
+
end
|
|
311
|
+
end
|
|
312
|
+
end
|
|
313
|
+
|
|
314
|
+
context "when the documents are not loaded" do
|
|
315
|
+
|
|
316
|
+
let(:criteria) do
|
|
317
|
+
Post.where(person_id: person.id)
|
|
318
|
+
end
|
|
319
|
+
|
|
320
|
+
let!(:enumerable) do
|
|
321
|
+
described_class.new(criteria)
|
|
322
|
+
end
|
|
323
|
+
|
|
324
|
+
it "is not _loaded" do
|
|
325
|
+
expect(enumerable._loaded?).to be false
|
|
326
|
+
end
|
|
327
|
+
|
|
328
|
+
context "when a block is given" do
|
|
329
|
+
it "returns true when the predicate is true" do
|
|
330
|
+
expect(
|
|
331
|
+
enumerable.any? { |doc| true }
|
|
332
|
+
).to be true
|
|
333
|
+
end
|
|
334
|
+
|
|
335
|
+
it "returns false when the predicate is false" do
|
|
336
|
+
expect(
|
|
337
|
+
enumerable.any? { |doc| false }
|
|
338
|
+
).to be false
|
|
339
|
+
end
|
|
340
|
+
end
|
|
341
|
+
|
|
342
|
+
context "when an argument is given" do
|
|
343
|
+
ruby_version_gte '2.5'
|
|
344
|
+
|
|
345
|
+
it "returns true when the argument is true" do
|
|
346
|
+
expect(enumerable.any?(Post)).to be true
|
|
347
|
+
end
|
|
348
|
+
|
|
349
|
+
it "returns false when the argument is false" do
|
|
350
|
+
expect(enumerable.any?(Sandwich)).to be false
|
|
351
|
+
end
|
|
352
|
+
end
|
|
353
|
+
|
|
354
|
+
context "when both an argument and a block are given" do
|
|
355
|
+
ruby_version_gte '2.5'
|
|
356
|
+
|
|
357
|
+
it "gives precedence to the pattern" do
|
|
358
|
+
expect(
|
|
359
|
+
enumerable.any?(Post) { |doc| false }
|
|
360
|
+
).to be true
|
|
361
|
+
end
|
|
362
|
+
end
|
|
363
|
+
end
|
|
259
364
|
end
|
|
260
365
|
|
|
261
366
|
describe "#clear" do
|