mongoid 8.0.3 → 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/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 +23 -21
- 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 +5 -1
- data/lib/mongoid/association/referenced/has_many/enumerable.rb +2 -2
- data/lib/mongoid/association/referenced/has_many/proxy.rb +7 -3
- data/lib/mongoid/association/reflections.rb +2 -2
- 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 +104 -4
- 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/extensions/array.rb +1 -1
- data/lib/mongoid/criteria/queryable/extensions/hash.rb +1 -1
- data/lib/mongoid/criteria/queryable/extensions/numeric.rb +0 -8
- data/lib/mongoid/criteria/queryable/extensions/string.rb +1 -11
- data/lib/mongoid/criteria/queryable/extensions/symbol.rb +0 -10
- 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/translator.rb +45 -0
- data/lib/mongoid/criteria.rb +7 -5
- data/lib/mongoid/deprecable.rb +1 -1
- data/lib/mongoid/document.rb +50 -13
- 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/factory.rb +21 -8
- 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/matcher.rb +21 -6
- 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/shardable.rb +35 -11
- 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/threaded.rb +30 -0
- data/lib/mongoid/traversable.rb +1 -1
- 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 +57 -57
- 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 +148 -224
- data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +111 -164
- data/spec/mongoid/association/syncable_spec.rb +1 -1
- data/spec/mongoid/attributes_spec.rb +5 -8
- 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 -69
- data/spec/mongoid/criteria/queryable/extensions/symbol_spec.rb +0 -59
- data/spec/mongoid/criteria/queryable/optional_spec.rb +15 -0
- 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/translator_spec.rb +132 -0
- 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 -4
- data/spec/mongoid/scopable_spec.rb +70 -0
- data/spec/mongoid/serializable_spec.rb +9 -30
- data/spec/mongoid/shardable_models.rb +14 -0
- data/spec/mongoid/shardable_spec.rb +153 -61
- 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 +35 -9
- 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 +700 -656
- 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
|
@@ -4,6 +4,59 @@ require "spec_helper"
|
|
|
4
4
|
|
|
5
5
|
describe "Mongoid::Tasks::Database" do
|
|
6
6
|
|
|
7
|
+
before(:all) do
|
|
8
|
+
module DatabaseSpec
|
|
9
|
+
class Measurement
|
|
10
|
+
include Mongoid::Document
|
|
11
|
+
|
|
12
|
+
field :timestamp, type: Time
|
|
13
|
+
field :temperature, type: Integer
|
|
14
|
+
|
|
15
|
+
embeds_many :comments
|
|
16
|
+
|
|
17
|
+
store_in collection: "measurement",
|
|
18
|
+
collection_options: {
|
|
19
|
+
capped: true, size: 10000
|
|
20
|
+
}
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
class Comment
|
|
24
|
+
include Mongoid::Document
|
|
25
|
+
|
|
26
|
+
field :content, type: String
|
|
27
|
+
|
|
28
|
+
embedded_in :measurement
|
|
29
|
+
|
|
30
|
+
store_in collection_options: {
|
|
31
|
+
capped: true, size: 10000
|
|
32
|
+
}
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
class Note
|
|
36
|
+
include Mongoid::Document
|
|
37
|
+
|
|
38
|
+
field :text
|
|
39
|
+
|
|
40
|
+
recursively_embeds_one
|
|
41
|
+
|
|
42
|
+
store_in collection_options: {
|
|
43
|
+
capped: true, size: 10000
|
|
44
|
+
}
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
after(:all) do
|
|
50
|
+
Mongoid.deregister_model(DatabaseSpec::Measurement)
|
|
51
|
+
DatabaseSpec.send(:remove_const, :Measurement)
|
|
52
|
+
Mongoid.deregister_model(DatabaseSpec::Comment)
|
|
53
|
+
DatabaseSpec.send(:remove_const, :Comment)
|
|
54
|
+
Mongoid.deregister_model(DatabaseSpec::Note)
|
|
55
|
+
DatabaseSpec.send(:remove_const, :Note)
|
|
56
|
+
Object.send(:remove_const, :DatabaseSpec)
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
|
|
7
60
|
let(:logger) do
|
|
8
61
|
double("logger").tap do |log|
|
|
9
62
|
allow(log).to receive(:info)
|
|
@@ -18,6 +71,80 @@ describe "Mongoid::Tasks::Database" do
|
|
|
18
71
|
[ User, Account, Address, Draft ]
|
|
19
72
|
end
|
|
20
73
|
|
|
74
|
+
describe '.create_collections' do
|
|
75
|
+
context 'collection_options are specified' do
|
|
76
|
+
let(:models) do
|
|
77
|
+
[DatabaseSpec::Measurement]
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
after do
|
|
81
|
+
DatabaseSpec::Measurement.collection.drop
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
[true, false].each do |force|
|
|
85
|
+
context "when force is #{force}" do
|
|
86
|
+
it 'creates the collection' do
|
|
87
|
+
expect(DatabaseSpec::Measurement).to receive(:create_collection).once.with(force: force)
|
|
88
|
+
Mongoid::Tasks::Database.create_collections(models, force: force)
|
|
89
|
+
end
|
|
90
|
+
end
|
|
91
|
+
end
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
context 'collection_options are not specified' do
|
|
95
|
+
let(:models) do
|
|
96
|
+
[Person]
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
[true, false].each do |force|
|
|
100
|
+
context "when force is #{force}" do
|
|
101
|
+
it 'creates the collection' do
|
|
102
|
+
expect(Person).to receive(:create_collection).once.with(force: force)
|
|
103
|
+
Mongoid::Tasks::Database.create_collections(models, force: force)
|
|
104
|
+
end
|
|
105
|
+
end
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
context "when collection options is defined on embedded model" do
|
|
109
|
+
|
|
110
|
+
let(:models) do
|
|
111
|
+
[DatabaseSpec::Comment]
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
let(:logger) do
|
|
115
|
+
double("logger").tap do |log|
|
|
116
|
+
expect(log).to receive(:info).once.with(/MONGOID: collection options ignored on: .*, please define in the root model/)
|
|
117
|
+
end
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
before do
|
|
121
|
+
allow(Mongoid::Tasks::Database).to receive(:logger).and_return(logger)
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
it "does nothing, but logging" do
|
|
125
|
+
expect(DatabaseSpec::Comment).to receive(:create_collection).never
|
|
126
|
+
Mongoid::Tasks::Database.create_collections(models)
|
|
127
|
+
end
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
context "when collection options is defined on cyclic model" do
|
|
131
|
+
|
|
132
|
+
let(:models) do
|
|
133
|
+
[DatabaseSpec::Note]
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
after do
|
|
137
|
+
DatabaseSpec::Note.collection.drop
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
it "creates the collection" do
|
|
141
|
+
expect(DatabaseSpec::Note).to receive(:create_collection).once
|
|
142
|
+
Mongoid::Tasks::Database.create_collections(models)
|
|
143
|
+
end
|
|
144
|
+
end
|
|
145
|
+
end
|
|
146
|
+
end
|
|
147
|
+
|
|
21
148
|
describe ".create_indexes" do
|
|
22
149
|
|
|
23
150
|
let!(:klass) do
|
|
@@ -17,12 +17,7 @@ describe Mongoid::Timestamps do
|
|
|
17
17
|
|
|
18
18
|
let(:time_zone) { "Pacific Time (US & Canada)" }
|
|
19
19
|
|
|
20
|
-
|
|
21
|
-
z = Time.zone
|
|
22
|
-
Time.zone = time_zone
|
|
23
|
-
ex.run
|
|
24
|
-
Time.zone = z
|
|
25
|
-
end
|
|
20
|
+
time_zone_override "Pacific Time (US & Canada)"
|
|
26
21
|
|
|
27
22
|
before do
|
|
28
23
|
document.run_callbacks(:create)
|
|
@@ -77,17 +72,20 @@ describe Mongoid::Timestamps do
|
|
|
77
72
|
context "when the document has changed with updated_at specified" do
|
|
78
73
|
|
|
79
74
|
let(:document) do
|
|
80
|
-
Dokument.
|
|
75
|
+
Dokument.create(created_at: Time.now.utc)
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
let(:expected_updated_at) do
|
|
79
|
+
DateTime.parse("2001-06-12")
|
|
81
80
|
end
|
|
82
81
|
|
|
83
82
|
before do
|
|
84
|
-
document.
|
|
85
|
-
document.updated_at = DateTime.parse("2001-06-12")
|
|
83
|
+
document.updated_at = expected_updated_at
|
|
86
84
|
end
|
|
87
85
|
|
|
88
86
|
it "does not set updated at" do
|
|
89
|
-
expect(document).to receive(:updated_at=).never
|
|
90
87
|
document.save!
|
|
88
|
+
expect(document.reload.updated_at).to be == expected_updated_at
|
|
91
89
|
end
|
|
92
90
|
end
|
|
93
91
|
|
|
@@ -127,7 +125,7 @@ describe Mongoid::Timestamps do
|
|
|
127
125
|
end
|
|
128
126
|
|
|
129
127
|
# This section of tests describes the behavior of the updated_at field for
|
|
130
|
-
# different updates on associations, as outlined in PR #5219.
|
|
128
|
+
# different updates on referenced associations, as outlined in PR #5219.
|
|
131
129
|
describe "updated_at attribute" do
|
|
132
130
|
let!(:start_time) { Timecop.freeze(Time.at(Time.now.to_i)) }
|
|
133
131
|
|
|
@@ -89,7 +89,7 @@ describe Mongoid::Touchable do
|
|
|
89
89
|
end
|
|
90
90
|
end
|
|
91
91
|
|
|
92
|
-
shared_examples 'updates the parent when :touch is
|
|
92
|
+
shared_examples 'updates the parent when :touch is false' do
|
|
93
93
|
it 'does not update updated_at on parent' do
|
|
94
94
|
entrance
|
|
95
95
|
update_time
|
|
@@ -130,7 +130,7 @@ describe Mongoid::Touchable do
|
|
|
130
130
|
|
|
131
131
|
include_examples 'updates the child'
|
|
132
132
|
include_examples 'updates the parent when :touch is true'
|
|
133
|
-
include_examples 'updates the parent when :touch is
|
|
133
|
+
include_examples 'updates the parent when :touch is false'
|
|
134
134
|
|
|
135
135
|
context 'when also updating an additional field' do
|
|
136
136
|
it 'persists the update to the additional field' do
|
|
@@ -587,7 +587,7 @@ describe Mongoid::Touchable do
|
|
|
587
587
|
|
|
588
588
|
context "when the touch option is true" do
|
|
589
589
|
|
|
590
|
-
shared_examples "updates the updated_at" do
|
|
590
|
+
shared_examples "updates the parent's updated_at" do
|
|
591
591
|
|
|
592
592
|
let!(:start_time) { Timecop.freeze(Time.at(Time.now.to_i)) }
|
|
593
593
|
|
|
@@ -624,19 +624,58 @@ describe Mongoid::Touchable do
|
|
|
624
624
|
end
|
|
625
625
|
end
|
|
626
626
|
|
|
627
|
+
shared_examples "updates the child's updated_at" do
|
|
628
|
+
|
|
629
|
+
let!(:start_time) { Timecop.freeze(Time.at(Time.now.to_i)) }
|
|
630
|
+
|
|
631
|
+
let(:update_time) do
|
|
632
|
+
Timecop.freeze(Time.at(Time.now.to_i) + 2)
|
|
633
|
+
end
|
|
634
|
+
|
|
635
|
+
after do
|
|
636
|
+
Timecop.return
|
|
637
|
+
end
|
|
638
|
+
|
|
639
|
+
let(:building) do
|
|
640
|
+
parent_cls.create!
|
|
641
|
+
end
|
|
642
|
+
|
|
643
|
+
let(:floor) do
|
|
644
|
+
building.floors.create!
|
|
645
|
+
end
|
|
646
|
+
|
|
647
|
+
before do
|
|
648
|
+
floor
|
|
649
|
+
update_time
|
|
650
|
+
floor.level = 9
|
|
651
|
+
floor.send(meth)
|
|
652
|
+
end
|
|
653
|
+
|
|
654
|
+
it "the parent is not nil" do
|
|
655
|
+
expect(floor.building).to_not be nil
|
|
656
|
+
end
|
|
657
|
+
|
|
658
|
+
it "updates the child's timestamp" do
|
|
659
|
+
floor.updated_at.should == update_time
|
|
660
|
+
floor.reload.updated_at.should == update_time
|
|
661
|
+
end
|
|
662
|
+
end
|
|
663
|
+
|
|
627
664
|
[ :save!, :destroy, :touch].each do |meth|
|
|
628
665
|
context "with #{meth} on referenced associations" do
|
|
629
666
|
let(:parent_cls) { TouchableSpec::Referenced::Building }
|
|
630
667
|
let(:meth) { meth }
|
|
631
668
|
|
|
632
|
-
include_examples "updates the updated_at"
|
|
669
|
+
include_examples "updates the child's updated_at" unless meth == :destroy
|
|
670
|
+
include_examples "updates the parent's updated_at"
|
|
633
671
|
end
|
|
634
672
|
|
|
635
673
|
context "with #{meth} on embedded associations" do
|
|
636
674
|
let(:parent_cls) { TouchableSpec::Embedded::Building }
|
|
637
675
|
let(:meth) { meth }
|
|
638
676
|
|
|
639
|
-
include_examples "updates the updated_at"
|
|
677
|
+
include_examples "updates the child's updated_at" unless meth == :destroy
|
|
678
|
+
include_examples "updates the parent's updated_at"
|
|
640
679
|
end
|
|
641
680
|
end
|
|
642
681
|
end
|
|
@@ -701,4 +740,237 @@ describe Mongoid::Touchable do
|
|
|
701
740
|
end
|
|
702
741
|
end
|
|
703
742
|
end
|
|
743
|
+
|
|
744
|
+
describe "when saving a document" do
|
|
745
|
+
|
|
746
|
+
let!(:start_time) { Timecop.freeze(Time.at(Time.now.to_i)) }
|
|
747
|
+
|
|
748
|
+
let(:update_time) do
|
|
749
|
+
Timecop.freeze(Time.at(Time.now.to_i) + 2)
|
|
750
|
+
end
|
|
751
|
+
|
|
752
|
+
after do
|
|
753
|
+
Timecop.return
|
|
754
|
+
end
|
|
755
|
+
|
|
756
|
+
context "when only using the root document" do
|
|
757
|
+
|
|
758
|
+
shared_examples "timeless is cleared" do
|
|
759
|
+
it "clears the timeless option" do
|
|
760
|
+
expect(doc.timeless?).to be false
|
|
761
|
+
end
|
|
762
|
+
end
|
|
763
|
+
|
|
764
|
+
shared_examples "touches the document" do
|
|
765
|
+
it "touches the document" do
|
|
766
|
+
expect(doc.created_at).to eq(start_time)
|
|
767
|
+
expect(doc.updated_at).to eq(start_time)
|
|
768
|
+
end
|
|
769
|
+
end
|
|
770
|
+
|
|
771
|
+
shared_examples "updates the document" do
|
|
772
|
+
it "updates the document" do
|
|
773
|
+
expect(doc.created_at).to eq(start_time)
|
|
774
|
+
expect(doc.updated_at).to eq(update_time)
|
|
775
|
+
end
|
|
776
|
+
end
|
|
777
|
+
|
|
778
|
+
let(:doc) { Dokument.new }
|
|
779
|
+
|
|
780
|
+
context "when saving a new document" do
|
|
781
|
+
|
|
782
|
+
context "when not passing a touch option" do
|
|
783
|
+
|
|
784
|
+
before do
|
|
785
|
+
doc.save!
|
|
786
|
+
end
|
|
787
|
+
|
|
788
|
+
include_examples "touches the document"
|
|
789
|
+
include_examples "timeless is cleared"
|
|
790
|
+
end
|
|
791
|
+
|
|
792
|
+
context "when passing touch: true" do
|
|
793
|
+
|
|
794
|
+
before do
|
|
795
|
+
doc.save!(touch: true)
|
|
796
|
+
end
|
|
797
|
+
|
|
798
|
+
include_examples "touches the document"
|
|
799
|
+
include_examples "timeless is cleared"
|
|
800
|
+
end
|
|
801
|
+
|
|
802
|
+
context "when passing touch: false" do
|
|
803
|
+
|
|
804
|
+
before do
|
|
805
|
+
doc.save!(touch: false)
|
|
806
|
+
end
|
|
807
|
+
|
|
808
|
+
include_examples "touches the document"
|
|
809
|
+
include_examples "timeless is cleared"
|
|
810
|
+
end
|
|
811
|
+
end
|
|
812
|
+
|
|
813
|
+
context "when updating a document" do
|
|
814
|
+
before do
|
|
815
|
+
doc.save!
|
|
816
|
+
doc.title = "title"
|
|
817
|
+
update_time
|
|
818
|
+
end
|
|
819
|
+
|
|
820
|
+
context "when not passing a touch option" do
|
|
821
|
+
|
|
822
|
+
before do
|
|
823
|
+
doc.save!
|
|
824
|
+
end
|
|
825
|
+
|
|
826
|
+
include_examples "updates the document"
|
|
827
|
+
include_examples "timeless is cleared"
|
|
828
|
+
end
|
|
829
|
+
|
|
830
|
+
context "when passing touch: true" do
|
|
831
|
+
|
|
832
|
+
before do
|
|
833
|
+
doc.save!(touch: true)
|
|
834
|
+
end
|
|
835
|
+
|
|
836
|
+
include_examples "updates the document"
|
|
837
|
+
include_examples "timeless is cleared"
|
|
838
|
+
end
|
|
839
|
+
|
|
840
|
+
context "when passing touch: false" do
|
|
841
|
+
|
|
842
|
+
before do
|
|
843
|
+
doc.save!(touch: false)
|
|
844
|
+
end
|
|
845
|
+
|
|
846
|
+
include_examples "touches the document"
|
|
847
|
+
include_examples "timeless is cleared"
|
|
848
|
+
end
|
|
849
|
+
end
|
|
850
|
+
end
|
|
851
|
+
|
|
852
|
+
context "when saving embedded associations with cascadable callbacks" do
|
|
853
|
+
|
|
854
|
+
shared_examples "timeless is cleared" do
|
|
855
|
+
it "clears the timeless option" do
|
|
856
|
+
expect(book.timeless?).to be false
|
|
857
|
+
expect(book.covers.first.timeless?).to be false
|
|
858
|
+
end
|
|
859
|
+
end
|
|
860
|
+
|
|
861
|
+
shared_examples "touches the document" do
|
|
862
|
+
it "touches the document" do
|
|
863
|
+
expect(book.created_at).to eq(start_time)
|
|
864
|
+
expect(book.updated_at).to eq(start_time)
|
|
865
|
+
end
|
|
866
|
+
end
|
|
867
|
+
|
|
868
|
+
shared_examples "updates the document" do
|
|
869
|
+
it "updates the document" do
|
|
870
|
+
expect(book.created_at).to eq(start_time)
|
|
871
|
+
expect(book.updated_at).to eq(update_time)
|
|
872
|
+
end
|
|
873
|
+
end
|
|
874
|
+
|
|
875
|
+
shared_examples "touches the children" do
|
|
876
|
+
it "touches the children" do
|
|
877
|
+
expect(book.covers.first.created_at).to eq(start_time)
|
|
878
|
+
expect(book.covers.first.updated_at).to eq(start_time)
|
|
879
|
+
end
|
|
880
|
+
end
|
|
881
|
+
|
|
882
|
+
shared_examples "updates the children" do
|
|
883
|
+
it "updates the children" do
|
|
884
|
+
expect(book.covers.first.created_at).to eq(start_time)
|
|
885
|
+
expect(book.covers.first.updated_at).to eq(update_time)
|
|
886
|
+
end
|
|
887
|
+
end
|
|
888
|
+
|
|
889
|
+
let(:book) do
|
|
890
|
+
Book.new(covers: [ cover ])
|
|
891
|
+
end
|
|
892
|
+
|
|
893
|
+
let(:cover) do
|
|
894
|
+
Cover.new
|
|
895
|
+
end
|
|
896
|
+
|
|
897
|
+
context "when saving a new document" do
|
|
898
|
+
|
|
899
|
+
context "when not passing a touch option" do
|
|
900
|
+
|
|
901
|
+
before do
|
|
902
|
+
book.save!
|
|
903
|
+
end
|
|
904
|
+
|
|
905
|
+
include_examples "touches the document"
|
|
906
|
+
include_examples "touches the children"
|
|
907
|
+
include_examples "timeless is cleared"
|
|
908
|
+
end
|
|
909
|
+
|
|
910
|
+
context "when passing touch: true" do
|
|
911
|
+
|
|
912
|
+
before do
|
|
913
|
+
book.save!(touch: true)
|
|
914
|
+
end
|
|
915
|
+
|
|
916
|
+
include_examples "touches the document"
|
|
917
|
+
include_examples "touches the children"
|
|
918
|
+
include_examples "timeless is cleared"
|
|
919
|
+
end
|
|
920
|
+
|
|
921
|
+
context "when passing touch: false" do
|
|
922
|
+
|
|
923
|
+
before do
|
|
924
|
+
book.save!(touch: false)
|
|
925
|
+
end
|
|
926
|
+
|
|
927
|
+
include_examples "touches the document"
|
|
928
|
+
include_examples "touches the children"
|
|
929
|
+
include_examples "timeless is cleared"
|
|
930
|
+
end
|
|
931
|
+
end
|
|
932
|
+
|
|
933
|
+
context "when updating a document" do
|
|
934
|
+
before do
|
|
935
|
+
book.save!
|
|
936
|
+
book.title = "title"
|
|
937
|
+
book.covers.first.title = "title"
|
|
938
|
+
update_time
|
|
939
|
+
end
|
|
940
|
+
|
|
941
|
+
context "when not passing a touch option" do
|
|
942
|
+
|
|
943
|
+
before do
|
|
944
|
+
book.save!
|
|
945
|
+
end
|
|
946
|
+
|
|
947
|
+
include_examples "updates the document"
|
|
948
|
+
include_examples "updates the children"
|
|
949
|
+
include_examples "timeless is cleared"
|
|
950
|
+
end
|
|
951
|
+
|
|
952
|
+
context "when passing touch: true" do
|
|
953
|
+
|
|
954
|
+
before do
|
|
955
|
+
book.save!(touch: true)
|
|
956
|
+
end
|
|
957
|
+
|
|
958
|
+
include_examples "updates the document"
|
|
959
|
+
include_examples "updates the children"
|
|
960
|
+
include_examples "timeless is cleared"
|
|
961
|
+
end
|
|
962
|
+
|
|
963
|
+
context "when passing touch: false" do
|
|
964
|
+
|
|
965
|
+
before do
|
|
966
|
+
book.save!(touch: false)
|
|
967
|
+
end
|
|
968
|
+
|
|
969
|
+
include_examples "touches the document"
|
|
970
|
+
include_examples "touches the children"
|
|
971
|
+
include_examples "timeless is cleared"
|
|
972
|
+
end
|
|
973
|
+
end
|
|
974
|
+
end
|
|
975
|
+
end
|
|
704
976
|
end
|
|
@@ -6,6 +6,8 @@ module TouchableSpec
|
|
|
6
6
|
include Mongoid::Document
|
|
7
7
|
include Mongoid::Timestamps
|
|
8
8
|
|
|
9
|
+
field :title, type: String
|
|
10
|
+
|
|
9
11
|
embeds_many :entrances, class_name: "TouchableSpec::Embedded::Entrance"
|
|
10
12
|
embeds_many :floors, class_name: "TouchableSpec::Embedded::Floor"
|
|
11
13
|
end
|
|
@@ -14,7 +16,7 @@ module TouchableSpec
|
|
|
14
16
|
include Mongoid::Document
|
|
15
17
|
include Mongoid::Timestamps
|
|
16
18
|
|
|
17
|
-
embedded_in :building, class_name: "TouchableSpec::Embedded::Building"
|
|
19
|
+
embedded_in :building, touch: false, class_name: "TouchableSpec::Embedded::Building"
|
|
18
20
|
|
|
19
21
|
field :last_used_at, type: Time
|
|
20
22
|
end
|
|
@@ -531,9 +531,9 @@ describe Mongoid::Traversable do
|
|
|
531
531
|
end
|
|
532
532
|
|
|
533
533
|
context "before class creation" do
|
|
534
|
-
|
|
535
|
-
Mongoid.discriminator_key = "test"
|
|
534
|
+
config_override :discriminator_key, "test"
|
|
536
535
|
|
|
536
|
+
before do
|
|
537
537
|
class PreGlobalDiscriminatorParent
|
|
538
538
|
include Mongoid::Document
|
|
539
539
|
end
|
|
@@ -542,10 +542,6 @@ describe Mongoid::Traversable do
|
|
|
542
542
|
end
|
|
543
543
|
end
|
|
544
544
|
|
|
545
|
-
after do
|
|
546
|
-
Mongoid.discriminator_key = "_type"
|
|
547
|
-
end
|
|
548
|
-
|
|
549
545
|
it "creates a field with new discriminator key in the parent" do
|
|
550
546
|
expect(PreGlobalDiscriminatorParent.fields.keys).to include("test")
|
|
551
547
|
end
|
|
@@ -677,9 +673,9 @@ describe Mongoid::Traversable do
|
|
|
677
673
|
end
|
|
678
674
|
|
|
679
675
|
context "before class creation" do
|
|
680
|
-
|
|
681
|
-
Mongoid.discriminator_key = :test
|
|
676
|
+
config_override :discriminator_key, :test
|
|
682
677
|
|
|
678
|
+
before do
|
|
683
679
|
class PreGlobalSymDiscriminatorParent
|
|
684
680
|
include Mongoid::Document
|
|
685
681
|
end
|
|
@@ -688,10 +684,6 @@ describe Mongoid::Traversable do
|
|
|
688
684
|
end
|
|
689
685
|
end
|
|
690
686
|
|
|
691
|
-
after do
|
|
692
|
-
Mongoid.discriminator_key = "_type"
|
|
693
|
-
end
|
|
694
|
-
|
|
695
687
|
it "creates a field with new discriminator key as a string in the parent" do
|
|
696
688
|
expect(PreGlobalSymDiscriminatorParent.fields.keys).to include("test")
|
|
697
689
|
end
|
|
@@ -829,8 +821,9 @@ describe Mongoid::Traversable do
|
|
|
829
821
|
end
|
|
830
822
|
|
|
831
823
|
context "when setting a field equal to discriminator key and duplicate_fields_exception is true" do
|
|
824
|
+
config_override :duplicate_fields_exception, true
|
|
825
|
+
|
|
832
826
|
before do
|
|
833
|
-
Mongoid.duplicate_fields_exception = true
|
|
834
827
|
|
|
835
828
|
class DuplicateDiscriminatorKeyParent
|
|
836
829
|
include Mongoid::Document
|
|
@@ -841,10 +834,6 @@ describe Mongoid::Traversable do
|
|
|
841
834
|
end
|
|
842
835
|
end
|
|
843
836
|
|
|
844
|
-
after do
|
|
845
|
-
Mongoid.duplicate_fields_exception = false
|
|
846
|
-
end
|
|
847
|
-
|
|
848
837
|
it "does not raise an error" do
|
|
849
838
|
expect do
|
|
850
839
|
DuplicateDiscriminatorKeyParent.discriminator_key = "dkey"
|
|
@@ -871,9 +860,10 @@ describe Mongoid::Traversable do
|
|
|
871
860
|
end
|
|
872
861
|
|
|
873
862
|
context "when setting a field equal to global discriminator key and duplicate_fields_exception is true" do
|
|
863
|
+
config_override :duplicate_fields_exception, true
|
|
864
|
+
config_override :discriminator_key, "dkey"
|
|
865
|
+
|
|
874
866
|
before do
|
|
875
|
-
Mongoid.duplicate_fields_exception = true
|
|
876
|
-
Mongoid.discriminator_key = "dkey"
|
|
877
867
|
|
|
878
868
|
class GlobalDuplicateDiscriminatorKeyParent
|
|
879
869
|
include Mongoid::Document
|
|
@@ -883,11 +873,6 @@ describe Mongoid::Traversable do
|
|
|
883
873
|
end
|
|
884
874
|
end
|
|
885
875
|
|
|
886
|
-
after do
|
|
887
|
-
Mongoid.duplicate_fields_exception = false
|
|
888
|
-
Mongoid.discriminator_key = "_type"
|
|
889
|
-
end
|
|
890
|
-
|
|
891
876
|
it "raises an error" do
|
|
892
877
|
expect do
|
|
893
878
|
GlobalDuplicateDiscriminatorKeyParent.class_eval do
|
|
@@ -2476,11 +2476,10 @@ describe Mongoid::Validatable::UniquenessValidator do
|
|
|
2476
2476
|
describe "i18n" do
|
|
2477
2477
|
|
|
2478
2478
|
context 'when using a different locale' do
|
|
2479
|
-
|
|
2480
|
-
I18n.with_locale(:fr) { example.run }
|
|
2481
|
-
end
|
|
2479
|
+
with_default_i18n_configs
|
|
2482
2480
|
|
|
2483
2481
|
before do
|
|
2482
|
+
I18n.locale = :fr
|
|
2484
2483
|
# Translation key location is as per rails-i18n gem.
|
|
2485
2484
|
# See: https://github.com/svenfuchs/rails-i18n/blob/master/rails/locale/en.yml
|
|
2486
2485
|
I18n.backend.store_translations(:fr, { errors: { messages: { taken: 'est déjà utilisé(e)' } } })
|
data/spec/mongoid_spec.rb
CHANGED
|
@@ -13,22 +13,46 @@ describe Mongoid do
|
|
|
13
13
|
end
|
|
14
14
|
end
|
|
15
15
|
|
|
16
|
-
context "when a block is
|
|
16
|
+
context "when a block is given" do
|
|
17
|
+
config_override :preload_models, false
|
|
17
18
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
19
|
+
context "with arity 0" do
|
|
20
|
+
|
|
21
|
+
before do
|
|
22
|
+
Mongoid.configure do
|
|
23
|
+
config.preload_models = true
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
it "sets the values on the config instance" do
|
|
28
|
+
expect(Mongoid.preload_models).to be true
|
|
21
29
|
end
|
|
22
30
|
end
|
|
23
31
|
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
32
|
+
context "with arity 1" do
|
|
33
|
+
|
|
34
|
+
before do
|
|
35
|
+
Mongoid.configure do |config|
|
|
36
|
+
config.preload_models = true
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
it "sets the values on the config instance" do
|
|
41
|
+
expect(Mongoid.preload_models).to be true
|
|
27
42
|
end
|
|
28
43
|
end
|
|
29
44
|
|
|
30
|
-
|
|
31
|
-
|
|
45
|
+
context "with arity 2" do
|
|
46
|
+
|
|
47
|
+
before do
|
|
48
|
+
Mongoid.configure do |config, _other|
|
|
49
|
+
config.preload_models = true
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
it "sets the values on the config instance" do
|
|
54
|
+
expect(Mongoid.preload_models).to be true
|
|
55
|
+
end
|
|
32
56
|
end
|
|
33
57
|
end
|
|
34
58
|
end
|
|
@@ -51,6 +75,8 @@ describe Mongoid do
|
|
|
51
75
|
end
|
|
52
76
|
|
|
53
77
|
it "disconnects from all active clients" do
|
|
78
|
+
pending 'https://jira.mongodb.org/browse/MONGOID-5621'
|
|
79
|
+
|
|
54
80
|
clients.each do |client|
|
|
55
81
|
expect(client.cluster).to receive(:disconnect!).and_call_original
|
|
56
82
|
end
|