mongoid 8.0.5 → 8.1.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/CHANGELOG.md +3 -3
- data/README.md +3 -3
- data/Rakefile +0 -25
- data/lib/config/locales/en.yml +46 -14
- data/lib/mongoid/association/accessors.rb +2 -2
- data/lib/mongoid/association/builders.rb +1 -1
- data/lib/mongoid/association/embedded/batchable.rb +2 -2
- data/lib/mongoid/association/embedded/embedded_in/buildable.rb +2 -2
- data/lib/mongoid/association/embedded/embedded_in/proxy.rb +2 -1
- data/lib/mongoid/association/embedded/embeds_many/buildable.rb +3 -2
- data/lib/mongoid/association/embedded/embeds_many/proxy.rb +6 -6
- data/lib/mongoid/association/embedded/embeds_one/buildable.rb +1 -1
- data/lib/mongoid/association/embedded/embeds_one/proxy.rb +1 -1
- data/lib/mongoid/association/nested/one.rb +40 -2
- data/lib/mongoid/association/proxy.rb +1 -1
- data/lib/mongoid/association/referenced/counter_cache.rb +2 -2
- data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +1 -1
- data/lib/mongoid/association/referenced/has_many/enumerable.rb +2 -2
- data/lib/mongoid/association/referenced/has_many/proxy.rb +3 -3
- data/lib/mongoid/association/reflections.rb +2 -2
- data/lib/mongoid/atomic.rb +0 -7
- data/lib/mongoid/attributes/dynamic.rb +1 -1
- data/lib/mongoid/attributes/nested.rb +2 -2
- data/lib/mongoid/attributes/projector.rb +1 -1
- data/lib/mongoid/attributes/readonly.rb +1 -1
- data/lib/mongoid/attributes.rb +8 -2
- data/lib/mongoid/changeable.rb +107 -5
- data/lib/mongoid/clients/storage_options.rb +2 -5
- data/lib/mongoid/clients/validators/storage.rb +1 -13
- data/lib/mongoid/collection_configurable.rb +58 -0
- data/lib/mongoid/composable.rb +2 -0
- data/lib/mongoid/config/defaults.rb +60 -0
- data/lib/mongoid/config/validators/async_query_executor.rb +24 -0
- data/lib/mongoid/config/validators.rb +1 -0
- data/lib/mongoid/config.rb +101 -0
- data/lib/mongoid/contextual/atomic.rb +1 -1
- data/lib/mongoid/contextual/memory.rb +233 -33
- data/lib/mongoid/contextual/mongo/documents_loader.rb +177 -0
- data/lib/mongoid/contextual/mongo.rb +373 -113
- data/lib/mongoid/contextual/none.rb +162 -7
- data/lib/mongoid/contextual.rb +12 -0
- data/lib/mongoid/criteria/findable.rb +2 -2
- data/lib/mongoid/criteria/includable.rb +4 -3
- data/lib/mongoid/criteria/queryable/key.rb +1 -1
- data/lib/mongoid/criteria/queryable/mergeable.rb +1 -1
- data/lib/mongoid/criteria/queryable/optional.rb +8 -8
- data/lib/mongoid/criteria/queryable/selectable.rb +43 -12
- data/lib/mongoid/criteria.rb +6 -5
- data/lib/mongoid/deprecable.rb +1 -1
- data/lib/mongoid/errors/create_collection_failure.rb +33 -0
- data/lib/mongoid/errors/drop_collection_failure.rb +27 -0
- data/lib/mongoid/errors/immutable_attribute.rb +26 -0
- data/lib/mongoid/errors/invalid_async_query_executor.rb +25 -0
- data/lib/mongoid/errors/invalid_global_executor_concurrency.rb +22 -0
- data/lib/mongoid/errors/invalid_storage_parent.rb +2 -0
- data/lib/mongoid/errors.rb +4 -1
- data/lib/mongoid/extensions/object.rb +2 -2
- data/lib/mongoid/extensions/time.rb +2 -0
- data/lib/mongoid/fields/localized.rb +10 -0
- data/lib/mongoid/fields/standard.rb +10 -0
- data/lib/mongoid/fields.rb +69 -13
- data/lib/mongoid/findable.rb +27 -3
- data/lib/mongoid/interceptable.rb +7 -6
- data/lib/mongoid/matcher/eq_impl.rb +1 -1
- data/lib/mongoid/matcher/type.rb +1 -1
- data/lib/mongoid/persistable/creatable.rb +1 -0
- data/lib/mongoid/persistable/deletable.rb +1 -1
- data/lib/mongoid/persistable/savable.rb +13 -1
- data/lib/mongoid/persistable/unsettable.rb +2 -2
- data/lib/mongoid/persistable/updatable.rb +51 -1
- data/lib/mongoid/persistable/upsertable.rb +20 -1
- data/lib/mongoid/persistable.rb +3 -0
- data/lib/mongoid/query_cache.rb +5 -1
- data/lib/mongoid/railties/database.rake +7 -2
- data/lib/mongoid/reloadable.rb +5 -3
- data/lib/mongoid/stateful.rb +22 -1
- data/lib/mongoid/tasks/database.rake +12 -0
- data/lib/mongoid/tasks/database.rb +20 -0
- data/lib/mongoid/utils.rb +22 -0
- data/lib/mongoid/validatable/macros.rb +5 -5
- data/lib/mongoid/validatable.rb +4 -1
- data/lib/mongoid/version.rb +1 -1
- data/lib/mongoid/warnings.rb +17 -1
- data/lib/mongoid.rb +16 -3
- data/spec/integration/app_spec.rb +2 -2
- data/spec/integration/callbacks_models.rb +37 -0
- data/spec/integration/callbacks_spec.rb +134 -0
- data/spec/integration/discriminator_key_spec.rb +4 -5
- data/spec/integration/i18n_fallbacks_spec.rb +3 -2
- data/spec/mongoid/association/embedded/embedded_in/proxy_spec.rb +27 -0
- data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +20 -25
- data/spec/mongoid/association/embedded/embeds_many_models.rb +1 -0
- data/spec/mongoid/association/embedded/embeds_one/proxy_spec.rb +15 -2
- data/spec/mongoid/association/referenced/belongs_to_spec.rb +2 -18
- data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_spec.rb +5 -27
- data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +9 -50
- data/spec/mongoid/association/syncable_spec.rb +1 -1
- data/spec/mongoid/attributes_spec.rb +3 -6
- data/spec/mongoid/changeable_spec.rb +299 -24
- data/spec/mongoid/clients_spec.rb +122 -13
- data/spec/mongoid/collection_configurable_spec.rb +158 -0
- data/spec/mongoid/config/defaults_spec.rb +160 -0
- data/spec/mongoid/config_spec.rb +154 -18
- data/spec/mongoid/contextual/memory_spec.rb +332 -76
- data/spec/mongoid/contextual/mongo/documents_loader_spec.rb +187 -0
- data/spec/mongoid/contextual/mongo_spec.rb +995 -36
- data/spec/mongoid/contextual/none_spec.rb +49 -2
- data/spec/mongoid/copyable_spec.rb +3 -11
- data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +4 -10
- data/spec/mongoid/criteria/queryable/options_spec.rb +1 -1
- data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +419 -0
- data/spec/mongoid/criteria/queryable/selectable_spec.rb +1 -1
- data/spec/mongoid/criteria/queryable/selector_spec.rb +1 -1
- data/spec/mongoid/criteria_projection_spec.rb +1 -4
- data/spec/mongoid/criteria_spec.rb +5 -9
- data/spec/mongoid/errors/readonly_document_spec.rb +2 -2
- data/spec/mongoid/extensions/time_spec.rb +8 -43
- data/spec/mongoid/extensions/time_with_zone_spec.rb +7 -52
- data/spec/mongoid/fields/localized_spec.rb +46 -28
- data/spec/mongoid/fields_spec.rb +136 -34
- data/spec/mongoid/findable_spec.rb +391 -34
- data/spec/mongoid/indexable_spec.rb +16 -10
- data/spec/mongoid/interceptable_spec.rb +15 -3
- data/spec/mongoid/persistable/deletable_spec.rb +26 -6
- data/spec/mongoid/persistable/destroyable_spec.rb +26 -6
- data/spec/mongoid/persistable/incrementable_spec.rb +37 -0
- data/spec/mongoid/persistable/logical_spec.rb +37 -0
- data/spec/mongoid/persistable/poppable_spec.rb +36 -0
- data/spec/mongoid/persistable/pullable_spec.rb +72 -0
- data/spec/mongoid/persistable/pushable_spec.rb +72 -0
- data/spec/mongoid/persistable/renamable_spec.rb +36 -0
- data/spec/mongoid/persistable/savable_spec.rb +96 -0
- data/spec/mongoid/persistable/settable_spec.rb +37 -0
- data/spec/mongoid/persistable/unsettable_spec.rb +36 -0
- data/spec/mongoid/persistable/updatable_spec.rb +20 -28
- data/spec/mongoid/persistable/upsertable_spec.rb +80 -6
- data/spec/mongoid/persistence_context_spec.rb +7 -57
- data/spec/mongoid/query_cache_spec.rb +56 -61
- data/spec/mongoid/reloadable_spec.rb +24 -28
- data/spec/mongoid/scopable_spec.rb +70 -0
- data/spec/mongoid/serializable_spec.rb +9 -30
- data/spec/mongoid/stateful_spec.rb +122 -8
- data/spec/mongoid/tasks/database_rake_spec.rb +74 -0
- data/spec/mongoid/tasks/database_spec.rb +127 -0
- data/spec/mongoid/timestamps_spec.rb +9 -11
- data/spec/mongoid/touchable_spec.rb +277 -5
- data/spec/mongoid/touchable_spec_models.rb +3 -1
- data/spec/mongoid/traversable_spec.rb +9 -24
- data/spec/mongoid/validatable/uniqueness_spec.rb +2 -3
- data/spec/mongoid_spec.rb +36 -10
- data/spec/shared/lib/mrss/docker_runner.rb +7 -0
- data/spec/shared/lib/mrss/event_subscriber.rb +15 -5
- data/spec/shared/lib/mrss/lite_constraints.rb +10 -2
- data/spec/shared/lib/mrss/server_version_registry.rb +16 -23
- data/spec/shared/lib/mrss/utils.rb +28 -6
- data/spec/shared/share/Dockerfile.erb +36 -40
- data/spec/shared/shlib/server.sh +32 -8
- data/spec/shared/shlib/set_env.sh +4 -4
- data/spec/spec_helper.rb +5 -0
- data/spec/support/immutable_ids.rb +118 -0
- data/spec/support/macros.rb +47 -15
- data/spec/support/models/artist.rb +0 -1
- data/spec/support/models/band.rb +1 -0
- data/spec/support/models/book.rb +1 -0
- data/spec/support/models/building.rb +2 -0
- data/spec/support/models/cover.rb +10 -0
- data/spec/support/models/product.rb +1 -0
- data.tar.gz.sig +0 -0
- metadata +686 -650
- metadata.gz.sig +0 -0
- data/spec/mongoid/criteria/queryable/extensions/bignum_spec.rb +0 -60
- data/spec/mongoid/criteria/queryable/extensions/fixnum_spec.rb +0 -60
@@ -155,5 +155,42 @@ describe Mongoid::Persistable::Logical do
|
|
155
155
|
end
|
156
156
|
end
|
157
157
|
end
|
158
|
+
|
159
|
+
context "when executing on a readonly document" do
|
160
|
+
|
161
|
+
let(:person) do
|
162
|
+
Person.create!(age: 10, score: 100)
|
163
|
+
end
|
164
|
+
|
165
|
+
context "when legacy_readonly is true" do
|
166
|
+
config_override :legacy_readonly, true
|
167
|
+
|
168
|
+
before do
|
169
|
+
person.__selected_fields = { "age" => 1, "score" => 1 }
|
170
|
+
end
|
171
|
+
|
172
|
+
it "persists the changes" do
|
173
|
+
expect(person).to be_readonly
|
174
|
+
person.bit(age: { and: 6 }, score: { or: 122 })
|
175
|
+
expect(person.age).to eq(2)
|
176
|
+
expect(person.score).to eq(126)
|
177
|
+
end
|
178
|
+
end
|
179
|
+
|
180
|
+
context "when legacy_readonly is false" do
|
181
|
+
config_override :legacy_readonly, false
|
182
|
+
|
183
|
+
before do
|
184
|
+
person.readonly!
|
185
|
+
end
|
186
|
+
|
187
|
+
it "raises a ReadonlyDocument error" do
|
188
|
+
expect(person).to be_readonly
|
189
|
+
expect do
|
190
|
+
person.bit(age: { and: 6 }, score: { or: 122 })
|
191
|
+
end.to raise_error(Mongoid::Errors::ReadonlyDocument)
|
192
|
+
end
|
193
|
+
end
|
194
|
+
end
|
158
195
|
end
|
159
196
|
end
|
@@ -127,5 +127,41 @@ describe Mongoid::Persistable::Poppable do
|
|
127
127
|
end
|
128
128
|
end
|
129
129
|
end
|
130
|
+
|
131
|
+
context "when executing on a readonly document" do
|
132
|
+
|
133
|
+
let(:person) do
|
134
|
+
Person.create!(test_array: [1, 2, 3])
|
135
|
+
end
|
136
|
+
|
137
|
+
context "when legacy_readonly is true" do
|
138
|
+
config_override :legacy_readonly, true
|
139
|
+
|
140
|
+
before do
|
141
|
+
person.__selected_fields = { "test_array" => 1 }
|
142
|
+
end
|
143
|
+
|
144
|
+
it "persists the changes" do
|
145
|
+
expect(person).to be_readonly
|
146
|
+
person.pop(test_array: 1)
|
147
|
+
expect(person.test_array).to eq([ 1, 2 ])
|
148
|
+
end
|
149
|
+
end
|
150
|
+
|
151
|
+
context "when legacy_readonly is false" do
|
152
|
+
config_override :legacy_readonly, false
|
153
|
+
|
154
|
+
before do
|
155
|
+
person.readonly!
|
156
|
+
end
|
157
|
+
|
158
|
+
it "raises a ReadonlyDocument error" do
|
159
|
+
expect(person).to be_readonly
|
160
|
+
expect do
|
161
|
+
person.pop(test_array: 1)
|
162
|
+
end.to raise_error(Mongoid::Errors::ReadonlyDocument)
|
163
|
+
end
|
164
|
+
end
|
165
|
+
end
|
130
166
|
end
|
131
167
|
end
|
@@ -127,6 +127,42 @@ describe Mongoid::Persistable::Pullable do
|
|
127
127
|
end
|
128
128
|
end
|
129
129
|
end
|
130
|
+
|
131
|
+
context "when executing on a readonly document" do
|
132
|
+
|
133
|
+
let(:person) do
|
134
|
+
Person.create!(test_array: [ 1, 1, 2, 3 ])
|
135
|
+
end
|
136
|
+
|
137
|
+
context "when legacy_readonly is true" do
|
138
|
+
config_override :legacy_readonly, true
|
139
|
+
|
140
|
+
before do
|
141
|
+
person.__selected_fields = { "test_array" => 1 }
|
142
|
+
end
|
143
|
+
|
144
|
+
it "persists the changes" do
|
145
|
+
expect(person).to be_readonly
|
146
|
+
person.pull(test_array: 1)
|
147
|
+
expect(person.test_array).to eq([ 2, 3 ])
|
148
|
+
end
|
149
|
+
end
|
150
|
+
|
151
|
+
context "when legacy_readonly is false" do
|
152
|
+
config_override :legacy_readonly, false
|
153
|
+
|
154
|
+
before do
|
155
|
+
person.readonly!
|
156
|
+
end
|
157
|
+
|
158
|
+
it "raises a ReadonlyDocument error" do
|
159
|
+
expect(person).to be_readonly
|
160
|
+
expect do
|
161
|
+
person.pull(test_array: 1)
|
162
|
+
end.to raise_error(Mongoid::Errors::ReadonlyDocument)
|
163
|
+
end
|
164
|
+
end
|
165
|
+
end
|
130
166
|
end
|
131
167
|
|
132
168
|
describe "#pull_all" do
|
@@ -254,5 +290,41 @@ describe Mongoid::Persistable::Pullable do
|
|
254
290
|
end
|
255
291
|
end
|
256
292
|
end
|
293
|
+
|
294
|
+
context "when executing on a readonly document" do
|
295
|
+
|
296
|
+
let(:person) do
|
297
|
+
Person.create!(test_array: [ 1, 1, 2, 3, 4 ])
|
298
|
+
end
|
299
|
+
|
300
|
+
context "when legacy_readonly is true" do
|
301
|
+
config_override :legacy_readonly, true
|
302
|
+
|
303
|
+
before do
|
304
|
+
person.__selected_fields = { "test_array" => 1 }
|
305
|
+
end
|
306
|
+
|
307
|
+
it "persists the changes" do
|
308
|
+
expect(person).to be_readonly
|
309
|
+
person.pull_all(test_array: [ 1, 2 ])
|
310
|
+
expect(person.test_array).to eq([ 3, 4 ])
|
311
|
+
end
|
312
|
+
end
|
313
|
+
|
314
|
+
context "when legacy_readonly is false" do
|
315
|
+
config_override :legacy_readonly, false
|
316
|
+
|
317
|
+
before do
|
318
|
+
person.readonly!
|
319
|
+
end
|
320
|
+
|
321
|
+
it "raises a ReadonlyDocument error" do
|
322
|
+
expect(person).to be_readonly
|
323
|
+
expect do
|
324
|
+
person.pull_all(test_array: [ 1, 2 ])
|
325
|
+
end.to raise_error(Mongoid::Errors::ReadonlyDocument)
|
326
|
+
end
|
327
|
+
end
|
328
|
+
end
|
257
329
|
end
|
258
330
|
end
|
@@ -204,6 +204,42 @@ describe Mongoid::Persistable::Pushable do
|
|
204
204
|
end
|
205
205
|
end
|
206
206
|
end
|
207
|
+
|
208
|
+
context "when executing on a readonly document" do
|
209
|
+
|
210
|
+
let(:person) do
|
211
|
+
Person.create!(test_array: [ 1, 2, 3 ])
|
212
|
+
end
|
213
|
+
|
214
|
+
context "when legacy_readonly is true" do
|
215
|
+
config_override :legacy_readonly, true
|
216
|
+
|
217
|
+
before do
|
218
|
+
person.__selected_fields = { "test_array" => 1 }
|
219
|
+
end
|
220
|
+
|
221
|
+
it "persists the changes" do
|
222
|
+
expect(person).to be_readonly
|
223
|
+
person.add_to_set(test_array: [ 1, 4 ])
|
224
|
+
expect(person.test_array).to eq([ 1, 2, 3, 4 ])
|
225
|
+
end
|
226
|
+
end
|
227
|
+
|
228
|
+
context "when legacy_readonly is false" do
|
229
|
+
config_override :legacy_readonly, false
|
230
|
+
|
231
|
+
before do
|
232
|
+
person.readonly!
|
233
|
+
end
|
234
|
+
|
235
|
+
it "raises a ReadonlyDocument error" do
|
236
|
+
expect(person).to be_readonly
|
237
|
+
expect do
|
238
|
+
person.add_to_set(test_array: [ 1, 4 ])
|
239
|
+
end.to raise_error(Mongoid::Errors::ReadonlyDocument)
|
240
|
+
end
|
241
|
+
end
|
242
|
+
end
|
207
243
|
end
|
208
244
|
|
209
245
|
describe "#push" do
|
@@ -349,5 +385,41 @@ describe Mongoid::Persistable::Pushable do
|
|
349
385
|
end
|
350
386
|
end
|
351
387
|
end
|
388
|
+
|
389
|
+
context "when executing on a readonly document" do
|
390
|
+
|
391
|
+
let(:person) do
|
392
|
+
Person.create!(test_array: [ 1, 2, 3 ])
|
393
|
+
end
|
394
|
+
|
395
|
+
context "when legacy_readonly is true" do
|
396
|
+
config_override :legacy_readonly, true
|
397
|
+
|
398
|
+
before do
|
399
|
+
person.__selected_fields = { "test_array" => 1 }
|
400
|
+
end
|
401
|
+
|
402
|
+
it "persists the changes" do
|
403
|
+
expect(person).to be_readonly
|
404
|
+
person.push(test_array: [ 1, 4 ])
|
405
|
+
expect(person.test_array).to eq([ 1, 2, 3, 1, 4 ])
|
406
|
+
end
|
407
|
+
end
|
408
|
+
|
409
|
+
context "when legacy_readonly is false" do
|
410
|
+
config_override :legacy_readonly, false
|
411
|
+
|
412
|
+
before do
|
413
|
+
person.readonly!
|
414
|
+
end
|
415
|
+
|
416
|
+
it "raises a ReadonlyDocument error" do
|
417
|
+
expect(person).to be_readonly
|
418
|
+
expect do
|
419
|
+
person.push(test_array: [ 1, 4 ])
|
420
|
+
end.to raise_error(Mongoid::Errors::ReadonlyDocument)
|
421
|
+
end
|
422
|
+
end
|
423
|
+
end
|
352
424
|
end
|
353
425
|
end
|
@@ -147,5 +147,41 @@ describe Mongoid::Persistable::Renamable do
|
|
147
147
|
end
|
148
148
|
end
|
149
149
|
end
|
150
|
+
|
151
|
+
context "when executing on a readonly document" do
|
152
|
+
|
153
|
+
let(:person) do
|
154
|
+
Person.create!(title: "sir")
|
155
|
+
end
|
156
|
+
|
157
|
+
context "when legacy_readonly is true" do
|
158
|
+
config_override :legacy_readonly, true
|
159
|
+
|
160
|
+
before do
|
161
|
+
person.__selected_fields = { "test_array" => 1 }
|
162
|
+
end
|
163
|
+
|
164
|
+
it "persists the changes" do
|
165
|
+
expect(person).to be_readonly
|
166
|
+
person.rename title: :salutation
|
167
|
+
expect(person.reload.salutation).to eq("sir")
|
168
|
+
end
|
169
|
+
end
|
170
|
+
|
171
|
+
context "when legacy_readonly is false" do
|
172
|
+
config_override :legacy_readonly, false
|
173
|
+
|
174
|
+
before do
|
175
|
+
person.readonly!
|
176
|
+
end
|
177
|
+
|
178
|
+
it "raises a ReadonlyDocument error" do
|
179
|
+
expect(person).to be_readonly
|
180
|
+
expect do
|
181
|
+
person.rename(title: :salutation)
|
182
|
+
end.to raise_error(Mongoid::Errors::ReadonlyDocument)
|
183
|
+
end
|
184
|
+
end
|
185
|
+
end
|
150
186
|
end
|
151
187
|
end
|
@@ -1,8 +1,11 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require "spec_helper"
|
4
|
+
require "support/immutable_ids"
|
4
5
|
|
5
6
|
describe Mongoid::Persistable::Savable do
|
7
|
+
extend Mongoid::ImmutableIds
|
8
|
+
immutable_id_examples_as "persisted _ids are immutable"
|
6
9
|
|
7
10
|
describe "#save" do
|
8
11
|
|
@@ -520,6 +523,99 @@ describe Mongoid::Persistable::Savable do
|
|
520
523
|
end
|
521
524
|
end
|
522
525
|
end
|
526
|
+
|
527
|
+
context "when saving a readonly document" do
|
528
|
+
|
529
|
+
context "when legacy_readonly is true" do
|
530
|
+
config_override :legacy_readonly, true
|
531
|
+
|
532
|
+
context "when its a new document" do
|
533
|
+
|
534
|
+
let(:document) do
|
535
|
+
Band.new
|
536
|
+
end
|
537
|
+
|
538
|
+
before do
|
539
|
+
document.__selected_fields = { 'test' => 1 }
|
540
|
+
expect(document).to be_readonly
|
541
|
+
end
|
542
|
+
|
543
|
+
it "persists the document" do
|
544
|
+
expect(Band.count).to eq(0)
|
545
|
+
document.save!
|
546
|
+
expect(Band.count).to eq(1)
|
547
|
+
end
|
548
|
+
end
|
549
|
+
|
550
|
+
context "when its an old document" do
|
551
|
+
|
552
|
+
let(:document) do
|
553
|
+
Band.only(:name).first
|
554
|
+
end
|
555
|
+
|
556
|
+
before do
|
557
|
+
Band.create!
|
558
|
+
expect(document).to be_readonly
|
559
|
+
end
|
560
|
+
|
561
|
+
it "updates the document" do
|
562
|
+
document.name = "The Rolling Stones"
|
563
|
+
document.save!
|
564
|
+
expect(Band.first.name).to eq("The Rolling Stones")
|
565
|
+
end
|
566
|
+
end
|
567
|
+
end
|
568
|
+
|
569
|
+
context "when legacy_readonly is false" do
|
570
|
+
config_override :legacy_readonly, false
|
571
|
+
|
572
|
+
context "when its a new document" do
|
573
|
+
|
574
|
+
let(:document) do
|
575
|
+
Band.new
|
576
|
+
end
|
577
|
+
|
578
|
+
before do
|
579
|
+
document.readonly!
|
580
|
+
expect(document).to be_readonly
|
581
|
+
end
|
582
|
+
|
583
|
+
it "raises a readonly error" do
|
584
|
+
expect do
|
585
|
+
document.save!
|
586
|
+
end.to raise_error(Mongoid::Errors::ReadonlyDocument)
|
587
|
+
end
|
588
|
+
end
|
589
|
+
|
590
|
+
context "when its an old document" do
|
591
|
+
|
592
|
+
let(:document) do
|
593
|
+
Band.first.tap(&:readonly!)
|
594
|
+
end
|
595
|
+
|
596
|
+
before do
|
597
|
+
Band.create!
|
598
|
+
expect(document).to be_readonly
|
599
|
+
end
|
600
|
+
|
601
|
+
it "raises a readonly error" do
|
602
|
+
document.name = "The Rolling Stones"
|
603
|
+
expect do
|
604
|
+
document.save!
|
605
|
+
end.to raise_error(Mongoid::Errors::ReadonlyDocument)
|
606
|
+
end
|
607
|
+
end
|
608
|
+
end
|
609
|
+
end
|
610
|
+
|
611
|
+
context "when the _id has been modified" do
|
612
|
+
def invoke_operation!
|
613
|
+
object._id = new_id_value
|
614
|
+
object.save
|
615
|
+
end
|
616
|
+
|
617
|
+
it_behaves_like "persisted _ids are immutable"
|
618
|
+
end
|
523
619
|
end
|
524
620
|
|
525
621
|
describe "save!" do
|
@@ -180,6 +180,43 @@ describe Mongoid::Persistable::Settable do
|
|
180
180
|
end
|
181
181
|
end
|
182
182
|
end
|
183
|
+
|
184
|
+
context "when executing on a readonly document" do
|
185
|
+
|
186
|
+
let(:person) do
|
187
|
+
Person.create!(title: "sir", age: 30)
|
188
|
+
end
|
189
|
+
|
190
|
+
context "when legacy_readonly is true" do
|
191
|
+
config_override :legacy_readonly, true
|
192
|
+
|
193
|
+
before do
|
194
|
+
person.__selected_fields = { "title" => 1, "age" => 1 }
|
195
|
+
end
|
196
|
+
|
197
|
+
it "persists the changes" do
|
198
|
+
expect(person).to be_readonly
|
199
|
+
person.set(title: "miss", age: 21)
|
200
|
+
expect(person.title).to eq("miss")
|
201
|
+
expect(person.age).to eq(21)
|
202
|
+
end
|
203
|
+
end
|
204
|
+
|
205
|
+
context "when legacy_readonly is false" do
|
206
|
+
config_override :legacy_readonly, false
|
207
|
+
|
208
|
+
before do
|
209
|
+
person.readonly!
|
210
|
+
end
|
211
|
+
|
212
|
+
it "raises a ReadonlyDocument error" do
|
213
|
+
expect(person).to be_readonly
|
214
|
+
expect do
|
215
|
+
person.set(title: "miss", age: 21)
|
216
|
+
end.to raise_error(Mongoid::Errors::ReadonlyDocument)
|
217
|
+
end
|
218
|
+
end
|
219
|
+
end
|
183
220
|
end
|
184
221
|
|
185
222
|
context "when dynamic attributes are not enabled" do
|
@@ -167,5 +167,41 @@ describe Mongoid::Persistable::Unsettable do
|
|
167
167
|
end
|
168
168
|
end
|
169
169
|
end
|
170
|
+
|
171
|
+
context "when executing on a readonly document" do
|
172
|
+
|
173
|
+
let(:person) do
|
174
|
+
Person.create!(title: "sir", age: 30)
|
175
|
+
end
|
176
|
+
|
177
|
+
context "when legacy_readonly is true" do
|
178
|
+
config_override :legacy_readonly, true
|
179
|
+
|
180
|
+
before do
|
181
|
+
person.__selected_fields = { "title" => 1, "age" => 1 }
|
182
|
+
end
|
183
|
+
|
184
|
+
it "persists the changes" do
|
185
|
+
expect(person).to be_readonly
|
186
|
+
person.unset(:title)
|
187
|
+
expect(person.title).to be nil
|
188
|
+
end
|
189
|
+
end
|
190
|
+
|
191
|
+
context "when legacy_readonly is false" do
|
192
|
+
config_override :legacy_readonly, false
|
193
|
+
|
194
|
+
before do
|
195
|
+
person.readonly!
|
196
|
+
end
|
197
|
+
|
198
|
+
it "raises a ReadonlyDocument error" do
|
199
|
+
expect(person).to be_readonly
|
200
|
+
expect do
|
201
|
+
person.unset(:title)
|
202
|
+
end.to raise_error(Mongoid::Errors::ReadonlyDocument)
|
203
|
+
end
|
204
|
+
end
|
205
|
+
end
|
170
206
|
end
|
171
207
|
end
|
@@ -1,8 +1,11 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require "spec_helper"
|
4
|
+
require "support/immutable_ids"
|
4
5
|
|
5
6
|
describe Mongoid::Persistable::Updatable do
|
7
|
+
extend Mongoid::ImmutableIds
|
8
|
+
immutable_id_examples_as "persisted _ids are immutable"
|
6
9
|
|
7
10
|
describe "#update_attribute" do
|
8
11
|
|
@@ -231,21 +234,17 @@ describe Mongoid::Persistable::Updatable do
|
|
231
234
|
end
|
232
235
|
|
233
236
|
context "when persisting a localized field" do
|
237
|
+
with_default_i18n_configs
|
234
238
|
|
235
239
|
let!(:product) do
|
236
240
|
Product.create!(description: "The bomb")
|
237
241
|
end
|
238
242
|
|
239
243
|
before do
|
240
|
-
I18n.enforce_available_locales = false
|
241
244
|
::I18n.locale = :de
|
242
245
|
product.update_attribute(:description, "Die Bombe")
|
243
246
|
end
|
244
247
|
|
245
|
-
after do
|
246
|
-
::I18n.locale = :en
|
247
|
-
end
|
248
|
-
|
249
248
|
let(:attributes) do
|
250
249
|
product.attributes["description"]
|
251
250
|
end
|
@@ -450,6 +449,14 @@ describe Mongoid::Persistable::Updatable do
|
|
450
449
|
end
|
451
450
|
end
|
452
451
|
end
|
452
|
+
|
453
|
+
context 'when the field is _id' do
|
454
|
+
def invoke_operation!
|
455
|
+
object.update_attribute "_id", new_id_value
|
456
|
+
end
|
457
|
+
|
458
|
+
it_behaves_like "persisted _ids are immutable"
|
459
|
+
end
|
453
460
|
end
|
454
461
|
|
455
462
|
[:update_attributes, :update].each do |method|
|
@@ -470,29 +477,6 @@ describe Mongoid::Persistable::Updatable do
|
|
470
477
|
end
|
471
478
|
end
|
472
479
|
|
473
|
-
context "when validation passes" do
|
474
|
-
|
475
|
-
let(:person) do
|
476
|
-
Person.create!
|
477
|
-
end
|
478
|
-
|
479
|
-
let!(:saved) do
|
480
|
-
person.update_attributes!(pets: false)
|
481
|
-
end
|
482
|
-
|
483
|
-
let(:from_db) do
|
484
|
-
Person.find(person.id)
|
485
|
-
end
|
486
|
-
|
487
|
-
it "returns true" do
|
488
|
-
expect(saved).to be true
|
489
|
-
end
|
490
|
-
|
491
|
-
it "saves the attributes" do
|
492
|
-
expect(from_db.pets).to be false
|
493
|
-
end
|
494
|
-
end
|
495
|
-
|
496
480
|
context "when the document has been destroyed" do
|
497
481
|
max_server_version '4.9'
|
498
482
|
|
@@ -721,6 +705,14 @@ describe Mongoid::Persistable::Updatable do
|
|
721
705
|
end
|
722
706
|
end
|
723
707
|
end
|
708
|
+
|
709
|
+
context 'when the _id is one of the fields' do
|
710
|
+
def invoke_operation!
|
711
|
+
object.update_attributes _id: new_id_value
|
712
|
+
end
|
713
|
+
|
714
|
+
it_behaves_like "persisted _ids are immutable"
|
715
|
+
end
|
724
716
|
end
|
725
717
|
end
|
726
718
|
|
@@ -42,8 +42,10 @@ describe Mongoid::Persistable::Upsertable do
|
|
42
42
|
end
|
43
43
|
end
|
44
44
|
|
45
|
+
let(:options) { {} }
|
46
|
+
|
45
47
|
before do
|
46
|
-
updated.upsert
|
48
|
+
updated.upsert(options)
|
47
49
|
end
|
48
50
|
|
49
51
|
it "updates the existing document" do
|
@@ -54,19 +56,46 @@ describe Mongoid::Persistable::Upsertable do
|
|
54
56
|
expect(existing).to be_persisted
|
55
57
|
end
|
56
58
|
|
57
|
-
|
58
|
-
|
59
|
-
Band.
|
59
|
+
shared_examples "replaces the existing fields" do
|
60
|
+
it 'replaces the existing fields' do
|
61
|
+
Band.count.should == 1
|
62
|
+
|
63
|
+
existing.reload
|
64
|
+
existing.views.should be nil
|
65
|
+
existing.name.should == 'Tool'
|
60
66
|
end
|
67
|
+
end
|
61
68
|
|
62
|
-
|
69
|
+
shared_examples "retains the existing fields" do
|
70
|
+
it 'retains the existing fields' do
|
63
71
|
Band.count.should == 1
|
64
72
|
|
65
73
|
existing.reload
|
66
|
-
existing.views.should
|
74
|
+
existing.views.should eq(42)
|
67
75
|
existing.name.should == 'Tool'
|
68
76
|
end
|
69
77
|
end
|
78
|
+
|
79
|
+
context 'when existing document contains other fields' do
|
80
|
+
let!(:existing) do
|
81
|
+
Band.create!(name: "Photek", views: 42)
|
82
|
+
end
|
83
|
+
|
84
|
+
context "when not passing any options" do
|
85
|
+
let(:options) { {} }
|
86
|
+
it_behaves_like "replaces the existing fields"
|
87
|
+
end
|
88
|
+
|
89
|
+
context "when passing replace: false" do
|
90
|
+
let(:options) { { replace: false } }
|
91
|
+
it_behaves_like "retains the existing fields"
|
92
|
+
end
|
93
|
+
|
94
|
+
context "when passing replace: true" do
|
95
|
+
let(:options) { { replace: true } }
|
96
|
+
it_behaves_like "replaces the existing fields"
|
97
|
+
end
|
98
|
+
end
|
70
99
|
end
|
71
100
|
|
72
101
|
context "when no matching document exists in the db" do
|
@@ -118,5 +147,50 @@ describe Mongoid::Persistable::Upsertable do
|
|
118
147
|
end
|
119
148
|
end
|
120
149
|
end
|
150
|
+
|
151
|
+
context "when the document is readonly" do
|
152
|
+
|
153
|
+
context "when legacy_readonly is true" do
|
154
|
+
config_override :legacy_readonly, true
|
155
|
+
|
156
|
+
let!(:existing) do
|
157
|
+
Band.create!(name: "Photek")
|
158
|
+
end
|
159
|
+
|
160
|
+
before do
|
161
|
+
existing.name = "Depeche Mode"
|
162
|
+
end
|
163
|
+
|
164
|
+
let!(:upsert) do
|
165
|
+
existing.upsert
|
166
|
+
end
|
167
|
+
|
168
|
+
it "updates the existing document" do
|
169
|
+
expect(existing.reload.name).to eq("Depeche Mode")
|
170
|
+
end
|
171
|
+
|
172
|
+
it "returns true" do
|
173
|
+
expect(upsert).to be true
|
174
|
+
end
|
175
|
+
end
|
176
|
+
|
177
|
+
context "when legacy_readonly is false" do
|
178
|
+
config_override :legacy_readonly, false
|
179
|
+
|
180
|
+
let!(:existing) do
|
181
|
+
Band.create!(name: "Photek").tap(&:readonly!)
|
182
|
+
end
|
183
|
+
|
184
|
+
before do
|
185
|
+
existing.name = "Depeche Mode"
|
186
|
+
end
|
187
|
+
|
188
|
+
it 'raises a ReadonlyDocument error' do
|
189
|
+
expect do
|
190
|
+
existing.upsert
|
191
|
+
end.to raise_error(Mongoid::Errors::ReadonlyDocument)
|
192
|
+
end
|
193
|
+
end
|
194
|
+
end
|
121
195
|
end
|
122
196
|
end
|