mongoid 5.1.6 → 5.2.0.rc0
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/lib/config/locales/en.yml +15 -0
- data/lib/mongoid.rb +5 -0
- data/lib/mongoid/clients/factory.rb +2 -0
- data/lib/mongoid/config.rb +1 -0
- data/lib/mongoid/contextual/map_reduce.rb +20 -97
- data/lib/mongoid/contextual/memory.rb +1 -0
- data/lib/mongoid/contextual/mongo.rb +15 -13
- data/lib/mongoid/errors.rb +1 -0
- data/lib/mongoid/errors/in_memory_collation_not_supported.rb +20 -0
- data/lib/mongoid/errors/mongoid_error.rb +1 -1
- data/lib/mongoid/extensions.rb +1 -0
- data/lib/mongoid/extensions/decimal128.rb +39 -0
- data/lib/mongoid/indexable/validators/options.rb +2 -1
- data/lib/mongoid/persistable/deletable.rb +3 -7
- data/lib/mongoid/query_cache.rb +2 -2
- data/lib/mongoid/version.rb +1 -1
- data/lib/rails/generators/mongoid/config/templates/mongoid.yml +4 -0
- data/spec/app/models/band.rb +1 -0
- data/spec/config/mongoid.yml +5 -0
- data/spec/mongoid/clients/factory_spec.rb +8 -0
- data/spec/mongoid/clients_spec.rb +78 -1
- data/spec/mongoid/config_spec.rb +31 -0
- data/spec/mongoid/contextual/atomic_spec.rb +342 -76
- data/spec/mongoid/contextual/map_reduce_spec.rb +102 -135
- data/spec/mongoid/contextual/memory_spec.rb +316 -56
- data/spec/mongoid/contextual/mongo_spec.rb +367 -5
- data/spec/mongoid/criteria_spec.rb +19 -0
- data/spec/mongoid/extensions/decimal128_spec.rb +44 -0
- data/spec/mongoid/indexable_spec.rb +43 -0
- data/spec/mongoid/query_cache_spec.rb +34 -0
- data/spec/mongoid/relations/referenced/many_spec.rb +11 -0
- data/spec/mongoid/relations/referenced/many_to_many_spec.rb +11 -0
- data/spec/mongoid/scopable_spec.rb +12 -0
- data/spec/spec_helper.rb +9 -0
- metadata +19 -9
- metadata.gz.sig +0 -0
data/lib/mongoid/version.rb
CHANGED
@@ -130,6 +130,10 @@ development:
|
|
130
130
|
# environment. The Mongoid logger will be set to the Rails logger
|
131
131
|
# otherwise.(default: :info)
|
132
132
|
# log_level: :info
|
133
|
+
|
134
|
+
# Application name that is printed to the mongodb logs upon establishing a
|
135
|
+
# connection in server versions >= 3.4. Note that the name cannot exceed 128 bytes.
|
136
|
+
# app_name: MyApplicationName
|
133
137
|
test:
|
134
138
|
clients:
|
135
139
|
default:
|
data/spec/app/models/band.rb
CHANGED
@@ -13,6 +13,7 @@ class Band
|
|
13
13
|
field :upserted, type: Mongoid::Boolean, default: false
|
14
14
|
field :created, type: DateTime
|
15
15
|
field :sales, type: BigDecimal
|
16
|
+
field :decimal, type: BSON::Decimal128
|
16
17
|
field :y, as: :years, type: Integer
|
17
18
|
field :founded, type: Date
|
18
19
|
field :deleted, type: Boolean
|
data/spec/config/mongoid.yml
CHANGED
@@ -13,6 +13,10 @@ test:
|
|
13
13
|
tag_sets:
|
14
14
|
- use: web
|
15
15
|
max_pool_size: 1
|
16
|
+
reports:
|
17
|
+
database: reports
|
18
|
+
hosts:
|
19
|
+
- <%=ENV["MONGOID_SPEC_HOST"]%>:<%=ENV["MONGOID_SPEC_PORT"]%>
|
16
20
|
options:
|
17
21
|
include_root_in_json: false
|
18
22
|
include_type_for_serialization: false
|
@@ -22,3 +26,4 @@ test:
|
|
22
26
|
use_activesupport_time_zone: true
|
23
27
|
use_utc: false
|
24
28
|
log_level: :warn
|
29
|
+
app_name: 'testing'
|
@@ -36,6 +36,10 @@ describe Mongoid::Clients::Factory do
|
|
36
36
|
it "sets the cluster's seeds" do
|
37
37
|
expect(cluster.addresses.first.to_s).to eq("127.0.0.1:27017")
|
38
38
|
end
|
39
|
+
|
40
|
+
it "sets the platform to Mongoid's platform constant" do
|
41
|
+
expect(client.options[:platform]).to eq(Mongoid::PLATFORM_DETAILS)
|
42
|
+
end
|
39
43
|
end
|
40
44
|
|
41
45
|
context "when the configuration has no ports" do
|
@@ -280,5 +284,9 @@ describe Mongoid::Clients::Factory do
|
|
280
284
|
it "sets the write concern" do
|
281
285
|
expect(client.write_concern).to be_a(Mongo::WriteConcern::Acknowledged)
|
282
286
|
end
|
287
|
+
|
288
|
+
it "sets the platform to Mongoid's platform constant" do
|
289
|
+
expect(client.options[:platform]).to eq(Mongoid::PLATFORM_DETAILS)
|
290
|
+
end
|
283
291
|
end
|
284
292
|
end
|
@@ -408,6 +408,14 @@ describe Mongoid::Clients do
|
|
408
408
|
it "returns the default client" do
|
409
409
|
expect(mongo_client.options[:database].to_s).to eq(database_id)
|
410
410
|
end
|
411
|
+
|
412
|
+
it "sets the platform to Mongoid's platform constant" do
|
413
|
+
expect(mongo_client.options[:platform]).to eq(Mongoid::PLATFORM_DETAILS)
|
414
|
+
end
|
415
|
+
|
416
|
+
it "sets the app_name to the config value" do
|
417
|
+
expect(mongo_client.options[:app_name]).to eq('testing')
|
418
|
+
end
|
411
419
|
end
|
412
420
|
|
413
421
|
context "when no client exists with the key" do
|
@@ -416,6 +424,10 @@ describe Mongoid::Clients do
|
|
416
424
|
Band.store_in(client: :nonexistent)
|
417
425
|
end
|
418
426
|
|
427
|
+
after do
|
428
|
+
Band.reset_storage_options!
|
429
|
+
end
|
430
|
+
|
419
431
|
let(:band) do
|
420
432
|
Band.new
|
421
433
|
end
|
@@ -426,6 +438,63 @@ describe Mongoid::Clients do
|
|
426
438
|
}.to raise_error(Mongoid::Errors::NoClientConfig)
|
427
439
|
end
|
428
440
|
end
|
441
|
+
|
442
|
+
context "when getting a client by name", if: testing_locally? do
|
443
|
+
|
444
|
+
let(:file) do
|
445
|
+
File.join(File.dirname(__FILE__), "..", "config", "mongoid.yml")
|
446
|
+
end
|
447
|
+
|
448
|
+
before do
|
449
|
+
described_class.clear
|
450
|
+
Mongoid.load!(file, :test)
|
451
|
+
Band.store_in(client: :reports)
|
452
|
+
end
|
453
|
+
|
454
|
+
after do
|
455
|
+
mongo_client.close
|
456
|
+
Mongoid::Config.reset
|
457
|
+
Band.reset_storage_options!
|
458
|
+
end
|
459
|
+
|
460
|
+
let!(:band) do
|
461
|
+
Band.store_in(client: :reports)
|
462
|
+
end
|
463
|
+
|
464
|
+
let!(:mongo_client) do
|
465
|
+
Band.new.mongo_client
|
466
|
+
end
|
467
|
+
|
468
|
+
it "uses the reports client" do
|
469
|
+
expect(mongo_client.options[:database].to_s).to eq('reports')
|
470
|
+
end
|
471
|
+
|
472
|
+
it "sets the platform to Mongoid's platform constant" do
|
473
|
+
expect(mongo_client.options[:platform]).to eq(Mongoid::PLATFORM_DETAILS)
|
474
|
+
end
|
475
|
+
|
476
|
+
it "sets the app_name to the config value" do
|
477
|
+
expect(mongo_client.options[:app_name]).to eq('testing')
|
478
|
+
end
|
479
|
+
end
|
480
|
+
|
481
|
+
context 'when the app_name is not set in the config' do
|
482
|
+
|
483
|
+
before do
|
484
|
+
Mongoid::Config.reset
|
485
|
+
Mongoid.configure do |config|
|
486
|
+
config.load_configuration(CONFIG)
|
487
|
+
end
|
488
|
+
end
|
489
|
+
|
490
|
+
let(:mongo_client) do
|
491
|
+
Band.new.mongo_client
|
492
|
+
end
|
493
|
+
|
494
|
+
it 'does not set the Mongoid.app_name option' do
|
495
|
+
expect(mongo_client.options.has_key?(:app_name)).to be(false)
|
496
|
+
end
|
497
|
+
end
|
429
498
|
end
|
430
499
|
|
431
500
|
describe ".mongo_client", if: non_legacy_server? do
|
@@ -457,13 +526,21 @@ describe Mongoid::Clients do
|
|
457
526
|
Mongoid.clients[:default][:database] = database_id
|
458
527
|
end
|
459
528
|
|
460
|
-
let
|
529
|
+
let(:mongo_client) do
|
461
530
|
Band.mongo_client
|
462
531
|
end
|
463
532
|
|
464
533
|
it "returns the default client" do
|
465
534
|
expect(mongo_client.options[:database].to_s).to eq(database_id)
|
466
535
|
end
|
536
|
+
|
537
|
+
it "sets the platform to Mongoid's platform constant" do
|
538
|
+
expect(mongo_client.options[:platform]).to eq(Mongoid::PLATFORM_DETAILS)
|
539
|
+
end
|
540
|
+
|
541
|
+
it "sets the app_name to the config value" do
|
542
|
+
expect(mongo_client.options[:app_name]).to eq('testing')
|
543
|
+
end
|
467
544
|
end
|
468
545
|
|
469
546
|
context "when no client exists with the key" do
|
data/spec/mongoid/config_spec.rb
CHANGED
@@ -82,6 +82,37 @@ describe Mongoid::Config do
|
|
82
82
|
end
|
83
83
|
end
|
84
84
|
|
85
|
+
context 'when the app_name is set in the config' do
|
86
|
+
|
87
|
+
let(:conf) do
|
88
|
+
CONFIG.merge(options: {app_name: 'admin-reporting'})
|
89
|
+
end
|
90
|
+
|
91
|
+
before do
|
92
|
+
Mongoid.configure do |config|
|
93
|
+
config.load_configuration(conf)
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
it 'sets the Mongoid.app_name to the provided value' do
|
98
|
+
expect(Mongoid.app_name).to eq('admin-reporting')
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
context 'when the app_name is not set in the config' do
|
103
|
+
|
104
|
+
before do
|
105
|
+
Mongoid::Config.reset
|
106
|
+
Mongoid.configure do |config|
|
107
|
+
config.load_configuration(CONFIG)
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
it 'does not set the Mongoid.app_name option' do
|
112
|
+
expect(Mongoid.app_name).to be_nil
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
85
116
|
describe "#load!" do
|
86
117
|
|
87
118
|
before(:all) do
|
@@ -73,6 +73,29 @@ describe Mongoid::Contextual::Atomic do
|
|
73
73
|
expect(smiths.reload.members).to eq([ "Dave" ])
|
74
74
|
end
|
75
75
|
end
|
76
|
+
|
77
|
+
context 'when the criteria has a collation', if: collation_supported? do
|
78
|
+
|
79
|
+
let(:criteria) do
|
80
|
+
Band.where(members: [ "DAVE" ]).collation(locale: 'en_US', strength: 2)
|
81
|
+
end
|
82
|
+
|
83
|
+
let(:context) do
|
84
|
+
Mongoid::Contextual::Mongo.new(criteria)
|
85
|
+
end
|
86
|
+
|
87
|
+
before do
|
88
|
+
context.add_to_set(members: "Dave", genres: "Electro")
|
89
|
+
end
|
90
|
+
|
91
|
+
it "does not add duplicates" do
|
92
|
+
expect(depeche_mode.reload.members).to eq([ "Dave" ])
|
93
|
+
end
|
94
|
+
|
95
|
+
it "adds multiple operations" do
|
96
|
+
expect(depeche_mode.reload.genres).to eq([ "Electro" ])
|
97
|
+
end
|
98
|
+
end
|
76
99
|
end
|
77
100
|
|
78
101
|
describe "#bit" do
|
@@ -121,6 +144,29 @@ describe Mongoid::Contextual::Atomic do
|
|
121
144
|
expect(depeche_mode.reload.likes).to eq(14)
|
122
145
|
end
|
123
146
|
end
|
147
|
+
|
148
|
+
context 'when the criteria has a collation', if: collation_supported? do
|
149
|
+
|
150
|
+
let!(:depeche_mode) do
|
151
|
+
Band.create(members: [ "Dave" ], likes: 60)
|
152
|
+
end
|
153
|
+
|
154
|
+
let(:criteria) do
|
155
|
+
Band.where(members: [ "DAVE" ]).collation(locale: 'en_US', strength: 2)
|
156
|
+
end
|
157
|
+
|
158
|
+
let(:context) do
|
159
|
+
Mongoid::Contextual::Mongo.new(criteria)
|
160
|
+
end
|
161
|
+
|
162
|
+
before do
|
163
|
+
context.bit(likes: { and: 13, or: 10 })
|
164
|
+
end
|
165
|
+
|
166
|
+
it "performs the bitwise operation on initialized fields" do
|
167
|
+
expect(depeche_mode.reload.likes).to eq(14)
|
168
|
+
end
|
169
|
+
end
|
124
170
|
end
|
125
171
|
|
126
172
|
describe "#inc" do
|
@@ -177,6 +223,29 @@ describe Mongoid::Contextual::Atomic do
|
|
177
223
|
expect(beatles.reload.y).to eq(3)
|
178
224
|
end
|
179
225
|
end
|
226
|
+
|
227
|
+
context 'when the criteria has a collation', if: collation_supported? do
|
228
|
+
|
229
|
+
let!(:depeche_mode) do
|
230
|
+
Band.create(members: [ "Dave" ])
|
231
|
+
end
|
232
|
+
|
233
|
+
let(:criteria) do
|
234
|
+
Band.where(members: [ "DAVE" ]).collation(locale: 'en_US', strength: 2)
|
235
|
+
end
|
236
|
+
|
237
|
+
let(:context) do
|
238
|
+
Mongoid::Contextual::Mongo.new(criteria)
|
239
|
+
end
|
240
|
+
|
241
|
+
before do
|
242
|
+
context.inc(years: 1)
|
243
|
+
end
|
244
|
+
|
245
|
+
it "incs the value and read from alias" do
|
246
|
+
expect(depeche_mode.reload.years).to eq(1)
|
247
|
+
end
|
248
|
+
end
|
180
249
|
end
|
181
250
|
|
182
251
|
describe "#pop" do
|
@@ -226,6 +295,29 @@ describe Mongoid::Contextual::Atomic do
|
|
226
295
|
expect(smiths.reload.members).to be_nil
|
227
296
|
end
|
228
297
|
end
|
298
|
+
|
299
|
+
context 'when the criteria has a collation', if: collation_supported? do
|
300
|
+
|
301
|
+
let!(:depeche_mode) do
|
302
|
+
Band.create(members: [ "Dave" ])
|
303
|
+
end
|
304
|
+
|
305
|
+
let(:criteria) do
|
306
|
+
Band.where(members: [ "DAVE" ]).collation(locale: 'en_US', strength: 2)
|
307
|
+
end
|
308
|
+
|
309
|
+
let(:context) do
|
310
|
+
Mongoid::Contextual::Mongo.new(criteria)
|
311
|
+
end
|
312
|
+
|
313
|
+
before do
|
314
|
+
context.pop(members: 1)
|
315
|
+
end
|
316
|
+
|
317
|
+
it "pops the last element off the array" do
|
318
|
+
expect(depeche_mode.reload.members).to be_empty
|
319
|
+
end
|
320
|
+
end
|
229
321
|
end
|
230
322
|
|
231
323
|
describe "#pull" do
|
@@ -257,129 +349,276 @@ describe Mongoid::Contextual::Atomic do
|
|
257
349
|
it "does not error on non existent fields" do
|
258
350
|
expect(smiths.reload.members).to be_nil
|
259
351
|
end
|
352
|
+
|
353
|
+
context 'when the criteria has a collation', if: collation_supported? do
|
354
|
+
|
355
|
+
let!(:depeche_mode) do
|
356
|
+
Band.create(members: [ "Dave" ])
|
357
|
+
end
|
358
|
+
|
359
|
+
let(:criteria) do
|
360
|
+
Band.where(members: [ "DAVE" ]).collation(locale: 'en_US', strength: 2)
|
361
|
+
end
|
362
|
+
|
363
|
+
let(:context) do
|
364
|
+
Mongoid::Contextual::Mongo.new(criteria)
|
365
|
+
end
|
366
|
+
|
367
|
+
before do
|
368
|
+
context.pull(members: "DAVE")
|
369
|
+
end
|
370
|
+
|
371
|
+
it "pulls when the value is found" do
|
372
|
+
expect(depeche_mode.reload.members).to be_empty
|
373
|
+
end
|
374
|
+
end
|
260
375
|
end
|
261
376
|
|
262
377
|
describe "#pull_all" do
|
263
378
|
|
264
|
-
|
265
|
-
Band.create(members: [ "Dave", "Alan", "Fletch" ])
|
266
|
-
end
|
379
|
+
context 'when the criteria does not have a collation' do
|
267
380
|
|
268
|
-
|
269
|
-
|
270
|
-
|
381
|
+
let!(:depeche_mode) do
|
382
|
+
Band.create(members: [ "Dave", "Alan", "Fletch" ])
|
383
|
+
end
|
271
384
|
|
272
|
-
|
273
|
-
|
274
|
-
|
385
|
+
let!(:smiths) do
|
386
|
+
Band.create
|
387
|
+
end
|
275
388
|
|
276
|
-
|
277
|
-
|
278
|
-
|
389
|
+
let(:criteria) do
|
390
|
+
Band.all
|
391
|
+
end
|
279
392
|
|
280
|
-
|
281
|
-
|
282
|
-
|
393
|
+
let(:context) do
|
394
|
+
Mongoid::Contextual::Mongo.new(criteria)
|
395
|
+
end
|
396
|
+
|
397
|
+
before do
|
398
|
+
context.pull_all(members: [ "Alan", "Dave" ])
|
399
|
+
end
|
283
400
|
|
284
|
-
|
285
|
-
|
401
|
+
it "pulls when the values are found" do
|
402
|
+
expect(depeche_mode.reload.members).to eq([ "Fletch" ])
|
403
|
+
end
|
404
|
+
|
405
|
+
it "does not error on non existent fields" do
|
406
|
+
expect(smiths.reload.members).to be_nil
|
407
|
+
end
|
286
408
|
end
|
287
409
|
|
288
|
-
|
289
|
-
|
410
|
+
context 'when the criteria has a collation', if: collation_supported? do
|
411
|
+
|
412
|
+
let!(:depeche_mode) do
|
413
|
+
Band.create(members: [ "Dave", "Alan", "Fletch" ])
|
414
|
+
end
|
415
|
+
|
416
|
+
let(:criteria) do
|
417
|
+
Band.all.collation(locale: 'en_US', strength: 2)
|
418
|
+
end
|
419
|
+
|
420
|
+
let(:context) do
|
421
|
+
Mongoid::Contextual::Mongo.new(criteria)
|
422
|
+
end
|
423
|
+
|
424
|
+
before do
|
425
|
+
context.pull_all(members: [ "ALAN", "DAVE" ])
|
426
|
+
end
|
427
|
+
|
428
|
+
it "pulls when the value is found" do
|
429
|
+
expect(depeche_mode.reload.members).to eq([ "Fletch" ])
|
430
|
+
end
|
290
431
|
end
|
291
432
|
end
|
292
433
|
|
293
434
|
describe "#push" do
|
294
435
|
|
295
|
-
|
296
|
-
Band.create(members: [ "Dave" ])
|
297
|
-
end
|
436
|
+
context 'when the criteria does not have a collation' do
|
298
437
|
|
299
|
-
|
300
|
-
|
301
|
-
|
438
|
+
let!(:depeche_mode) do
|
439
|
+
Band.create(members: [ "Dave" ])
|
440
|
+
end
|
302
441
|
|
303
|
-
|
304
|
-
|
305
|
-
|
442
|
+
let!(:smiths) do
|
443
|
+
Band.create
|
444
|
+
end
|
306
445
|
|
307
|
-
|
308
|
-
|
309
|
-
|
446
|
+
let(:criteria) do
|
447
|
+
Band.all
|
448
|
+
end
|
310
449
|
|
311
|
-
|
312
|
-
|
313
|
-
|
450
|
+
let(:context) do
|
451
|
+
Mongoid::Contextual::Mongo.new(criteria)
|
452
|
+
end
|
453
|
+
|
454
|
+
before do
|
455
|
+
context.push(members: "Alan")
|
456
|
+
end
|
457
|
+
|
458
|
+
it "pushes the value to existing arrays" do
|
459
|
+
expect(depeche_mode.reload.members).to eq([ "Dave", "Alan" ])
|
460
|
+
end
|
314
461
|
|
315
|
-
|
316
|
-
|
462
|
+
it "pushes to non existent fields" do
|
463
|
+
expect(smiths.reload.members).to eq([ "Alan" ])
|
464
|
+
end
|
317
465
|
end
|
318
466
|
|
319
|
-
|
320
|
-
|
467
|
+
context 'when the criteria has a collation', if: collation_supported? do
|
468
|
+
|
469
|
+
let!(:depeche_mode) do
|
470
|
+
Band.create(members: [ "Dave" ])
|
471
|
+
end
|
472
|
+
|
473
|
+
let!(:smiths) do
|
474
|
+
Band.create
|
475
|
+
end
|
476
|
+
|
477
|
+
let(:criteria) do
|
478
|
+
Band.where(members: ['DAVE']).collation(locale: 'en_US', strength: 2)
|
479
|
+
end
|
480
|
+
|
481
|
+
let(:context) do
|
482
|
+
Mongoid::Contextual::Mongo.new(criteria)
|
483
|
+
end
|
484
|
+
|
485
|
+
before do
|
486
|
+
context.push(members: "Alan")
|
487
|
+
end
|
488
|
+
|
489
|
+
it "pushes the value to existing arrays" do
|
490
|
+
expect(depeche_mode.reload.members).to eq([ "Dave", "Alan" ])
|
491
|
+
end
|
492
|
+
|
493
|
+
it "pushes to non existent fields" do
|
494
|
+
expect(smiths.reload.members).to be_nil
|
495
|
+
end
|
321
496
|
end
|
322
497
|
end
|
323
498
|
|
324
499
|
describe "#push_all" do
|
325
500
|
|
326
|
-
|
327
|
-
Band.create(members: [ "Dave" ])
|
328
|
-
end
|
501
|
+
context 'when the criteria does not have a collation' do
|
329
502
|
|
330
|
-
|
331
|
-
|
332
|
-
|
503
|
+
let!(:depeche_mode) do
|
504
|
+
Band.create(members: [ "Dave" ])
|
505
|
+
end
|
333
506
|
|
334
|
-
|
335
|
-
|
336
|
-
|
507
|
+
let!(:smiths) do
|
508
|
+
Band.create
|
509
|
+
end
|
337
510
|
|
338
|
-
|
339
|
-
|
340
|
-
|
511
|
+
let(:criteria) do
|
512
|
+
Band.all
|
513
|
+
end
|
341
514
|
|
342
|
-
|
343
|
-
|
344
|
-
|
515
|
+
let(:context) do
|
516
|
+
Mongoid::Contextual::Mongo.new(criteria)
|
517
|
+
end
|
518
|
+
|
519
|
+
before do
|
520
|
+
context.push_all(members: [ "Alan", "Fletch" ])
|
521
|
+
end
|
345
522
|
|
346
|
-
|
347
|
-
|
523
|
+
it "pushes the values to existing arrays" do
|
524
|
+
expect(depeche_mode.reload.members).to eq([ "Dave", "Alan", "Fletch" ])
|
525
|
+
end
|
526
|
+
|
527
|
+
it "pushes to non existent fields" do
|
528
|
+
expect(smiths.reload.members).to eq([ "Alan", "Fletch" ])
|
529
|
+
end
|
348
530
|
end
|
349
531
|
|
350
|
-
|
351
|
-
|
532
|
+
context 'when the criteria has a collation', if: collation_supported? do
|
533
|
+
|
534
|
+
let!(:depeche_mode) do
|
535
|
+
Band.create(members: [ "Dave" ])
|
536
|
+
end
|
537
|
+
|
538
|
+
let!(:smiths) do
|
539
|
+
Band.create
|
540
|
+
end
|
541
|
+
|
542
|
+
let(:criteria) do
|
543
|
+
Band.where(members: ['DAVE']).collation(locale: 'en_US', strength: 2)
|
544
|
+
end
|
545
|
+
|
546
|
+
let(:context) do
|
547
|
+
Mongoid::Contextual::Mongo.new(criteria)
|
548
|
+
end
|
549
|
+
|
550
|
+
before do
|
551
|
+
context.push_all(members: [ "Alan", "Fletch" ])
|
552
|
+
end
|
553
|
+
|
554
|
+
it "pushes the values to existing arrays" do
|
555
|
+
expect(depeche_mode.reload.members).to eq([ "Dave", "Alan", "Fletch" ])
|
556
|
+
end
|
352
557
|
end
|
353
558
|
end
|
354
559
|
|
355
560
|
describe "#rename" do
|
356
561
|
|
357
|
-
|
358
|
-
Band.create(members: [ "Dave" ])
|
359
|
-
end
|
562
|
+
context 'when the criteria does not have a collation' do
|
360
563
|
|
361
|
-
|
362
|
-
|
363
|
-
|
564
|
+
let!(:depeche_mode) do
|
565
|
+
Band.create(members: [ "Dave" ])
|
566
|
+
end
|
364
567
|
|
365
|
-
|
366
|
-
|
367
|
-
|
568
|
+
let!(:smiths) do
|
569
|
+
Band.create
|
570
|
+
end
|
368
571
|
|
369
|
-
|
370
|
-
|
371
|
-
|
572
|
+
let(:criteria) do
|
573
|
+
Band.all
|
574
|
+
end
|
372
575
|
|
373
|
-
|
374
|
-
|
375
|
-
|
576
|
+
let(:context) do
|
577
|
+
Mongoid::Contextual::Mongo.new(criteria)
|
578
|
+
end
|
376
579
|
|
377
|
-
|
378
|
-
|
580
|
+
before do
|
581
|
+
context.rename(members: :artists)
|
582
|
+
end
|
583
|
+
|
584
|
+
it "renames existing fields" do
|
585
|
+
expect(depeche_mode.reload.artists).to eq([ "Dave" ])
|
586
|
+
end
|
587
|
+
|
588
|
+
it "does not rename non existent fields" do
|
589
|
+
expect(smiths.reload).to_not respond_to(:artists)
|
590
|
+
end
|
379
591
|
end
|
380
592
|
|
381
|
-
|
382
|
-
|
593
|
+
context 'when the criteria has a collation', if: collation_supported? do
|
594
|
+
|
595
|
+
let!(:depeche_mode) do
|
596
|
+
Band.create(members: [ "Dave" ])
|
597
|
+
end
|
598
|
+
|
599
|
+
let!(:smiths) do
|
600
|
+
Band.create
|
601
|
+
end
|
602
|
+
|
603
|
+
let(:criteria) do
|
604
|
+
Band.where(members: ['DAVE']).collation(locale: 'en_US', strength: 2)
|
605
|
+
end
|
606
|
+
|
607
|
+
let(:context) do
|
608
|
+
Mongoid::Contextual::Mongo.new(criteria)
|
609
|
+
end
|
610
|
+
|
611
|
+
before do
|
612
|
+
context.rename(members: :artists)
|
613
|
+
end
|
614
|
+
|
615
|
+
it "renames existing fields" do
|
616
|
+
expect(depeche_mode.reload.artists).to eq([ "Dave" ])
|
617
|
+
end
|
618
|
+
|
619
|
+
it "does not rename non existent fields" do
|
620
|
+
expect(smiths.reload).to_not respond_to(:artists)
|
621
|
+
end
|
383
622
|
end
|
384
623
|
end
|
385
624
|
|
@@ -509,5 +748,32 @@ describe Mongoid::Contextual::Atomic do
|
|
509
748
|
end
|
510
749
|
end
|
511
750
|
end
|
751
|
+
|
752
|
+
context 'when the criteria has a collation', if: collation_supported? do
|
753
|
+
|
754
|
+
let!(:depeche_mode) do
|
755
|
+
Band.create(name: "Depeche Mode", years: 10)
|
756
|
+
end
|
757
|
+
|
758
|
+
let!(:new_order) do
|
759
|
+
Band.create(name: "New Order", years: 10)
|
760
|
+
end
|
761
|
+
|
762
|
+
let(:criteria) do
|
763
|
+
Band.where(name: 'DEPECHE MODE').collation(locale: 'en_US', strength: 2)
|
764
|
+
end
|
765
|
+
|
766
|
+
let(:context) do
|
767
|
+
Mongoid::Contextual::Mongo.new(criteria)
|
768
|
+
end
|
769
|
+
|
770
|
+
before do
|
771
|
+
context.unset(:name)
|
772
|
+
end
|
773
|
+
|
774
|
+
it "unsets the unaliased field" do
|
775
|
+
expect(depeche_mode.reload.name).to be_nil
|
776
|
+
end
|
777
|
+
end
|
512
778
|
end
|
513
779
|
end
|