mongoid 5.4.0 → 6.4.8
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/README.md +3 -3
- data/Rakefile +26 -0
- data/lib/config/locales/en.yml +40 -0
- data/lib/mongoid/atomic/modifiers.rb +2 -2
- data/lib/mongoid/atomic.rb +5 -5
- data/lib/mongoid/attributes/readonly.rb +22 -0
- data/lib/mongoid/attributes.rb +22 -21
- data/lib/mongoid/cacheable.rb +36 -0
- data/lib/mongoid/changeable.rb +36 -0
- data/lib/mongoid/clients/options.rb +55 -250
- data/lib/mongoid/clients/sessions.rb +113 -0
- data/lib/mongoid/clients/storage_options.rb +2 -69
- data/lib/mongoid/clients.rb +10 -63
- data/lib/mongoid/composable.rb +29 -2
- data/lib/mongoid/config.rb +1 -0
- data/lib/mongoid/contextual/aggregable/mongo.rb +1 -1
- data/lib/mongoid/contextual/atomic.rb +4 -4
- data/lib/mongoid/contextual/map_reduce.rb +7 -3
- data/lib/mongoid/contextual/memory.rb +9 -4
- data/lib/mongoid/contextual/mongo.rb +65 -30
- data/lib/mongoid/contextual/none.rb +12 -0
- data/lib/mongoid/copyable.rb +13 -6
- data/lib/mongoid/criteria/marshalable.rb +2 -2
- data/lib/mongoid/criteria/modifiable.rb +29 -3
- data/lib/mongoid/criteria/options.rb +25 -0
- data/lib/mongoid/criteria/queryable/aggregable.rb +120 -0
- data/lib/mongoid/criteria/queryable/extensions/array.rb +185 -0
- data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +37 -0
- data/lib/mongoid/criteria/queryable/extensions/boolean.rb +34 -0
- data/lib/mongoid/criteria/queryable/extensions/date.rb +63 -0
- data/lib/mongoid/criteria/queryable/extensions/date_time.rb +53 -0
- data/lib/mongoid/criteria/queryable/extensions/hash.rb +200 -0
- data/lib/mongoid/criteria/queryable/extensions/nil_class.rb +86 -0
- data/lib/mongoid/criteria/queryable/extensions/numeric.rb +90 -0
- data/lib/mongoid/criteria/queryable/extensions/object.rb +206 -0
- data/lib/mongoid/criteria/queryable/extensions/range.rb +70 -0
- data/lib/mongoid/criteria/queryable/extensions/regexp.rb +79 -0
- data/lib/mongoid/criteria/queryable/extensions/set.rb +34 -0
- data/lib/mongoid/criteria/queryable/extensions/string.rb +137 -0
- data/lib/mongoid/criteria/queryable/extensions/symbol.rb +79 -0
- data/lib/mongoid/criteria/queryable/extensions/time.rb +60 -0
- data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +54 -0
- data/lib/mongoid/criteria/queryable/extensions.rb +28 -0
- data/lib/mongoid/criteria/queryable/forwardable.rb +65 -0
- data/lib/mongoid/criteria/queryable/key.rb +103 -0
- data/lib/mongoid/criteria/queryable/macroable.rb +27 -0
- data/lib/mongoid/criteria/queryable/mergeable.rb +273 -0
- data/lib/mongoid/criteria/queryable/optional.rb +429 -0
- data/lib/mongoid/criteria/queryable/options.rb +153 -0
- data/lib/mongoid/criteria/queryable/pipeline.rb +111 -0
- data/lib/mongoid/criteria/queryable/selectable.rb +689 -0
- data/lib/mongoid/criteria/queryable/selector.rb +212 -0
- data/lib/mongoid/criteria/queryable/smash.rb +104 -0
- data/lib/mongoid/criteria/queryable.rb +87 -0
- data/lib/mongoid/criteria.rb +6 -2
- data/lib/mongoid/document.rb +34 -41
- data/lib/mongoid/errors/ambiguous_relationship.rb +1 -1
- data/lib/mongoid/errors/in_memory_collation_not_supported.rb +1 -1
- data/lib/mongoid/errors/invalid_field.rb +2 -2
- data/lib/mongoid/errors/invalid_persistence_option.rb +29 -0
- data/lib/mongoid/errors/invalid_relation.rb +66 -0
- data/lib/mongoid/errors/invalid_session_use.rb +24 -0
- data/lib/mongoid/errors.rb +3 -0
- data/lib/mongoid/evolvable.rb +1 -1
- data/lib/mongoid/extensions/big_decimal.rb +17 -8
- data/lib/mongoid/extensions/date.rb +4 -1
- data/lib/mongoid/extensions/decimal128.rb +3 -3
- data/lib/mongoid/extensions/hash.rb +1 -0
- data/lib/mongoid/extensions/regexp.rb +1 -0
- data/lib/mongoid/extensions/string.rb +6 -3
- data/lib/mongoid/extensions/time.rb +4 -1
- data/lib/mongoid/extensions.rb +0 -4
- data/lib/mongoid/factory.rb +2 -1
- data/lib/mongoid/fields/validators/macro.rb +18 -0
- data/lib/mongoid/findable.rb +2 -2
- data/lib/mongoid/indexable.rb +16 -14
- data/lib/mongoid/interceptable.rb +9 -22
- data/lib/mongoid/matchable/all.rb +2 -2
- data/lib/mongoid/matchable/and.rb +3 -3
- data/lib/mongoid/matchable/default.rb +2 -2
- data/lib/mongoid/matchable/elem_match.rb +28 -0
- data/lib/mongoid/matchable/exists.rb +2 -2
- data/lib/mongoid/matchable/gt.rb +4 -2
- data/lib/mongoid/matchable/gte.rb +4 -2
- data/lib/mongoid/matchable/in.rb +2 -2
- data/lib/mongoid/matchable/lt.rb +4 -2
- data/lib/mongoid/matchable/lte.rb +4 -2
- data/lib/mongoid/matchable/ne.rb +2 -2
- data/lib/mongoid/matchable/nin.rb +2 -2
- data/lib/mongoid/matchable/nor.rb +37 -0
- data/lib/mongoid/matchable/or.rb +3 -3
- data/lib/mongoid/matchable/regexp.rb +3 -3
- data/lib/mongoid/matchable/size.rb +2 -2
- data/lib/mongoid/matchable.rb +16 -7
- data/lib/mongoid/persistable/creatable.rb +5 -3
- data/lib/mongoid/persistable/deletable.rb +5 -3
- data/lib/mongoid/persistable/destroyable.rb +1 -5
- data/lib/mongoid/persistable/settable.rb +5 -5
- data/lib/mongoid/persistable/updatable.rb +7 -14
- data/lib/mongoid/persistable/upsertable.rb +2 -1
- data/lib/mongoid/persistable.rb +4 -6
- data/lib/mongoid/persistence_context.rb +220 -0
- data/lib/mongoid/query_cache.rb +67 -23
- data/lib/mongoid/railtie.rb +17 -1
- data/lib/mongoid/railties/controller_runtime.rb +86 -0
- data/lib/mongoid/relations/accessors.rb +3 -0
- data/lib/mongoid/relations/auto_save.rb +12 -4
- data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +4 -4
- data/lib/mongoid/relations/counter_cache.rb +15 -5
- data/lib/mongoid/relations/eager/base.rb +3 -3
- data/lib/mongoid/relations/eager/has_and_belongs_to_many.rb +2 -2
- data/lib/mongoid/relations/eager/has_many.rb +1 -1
- data/lib/mongoid/relations/eager.rb +6 -11
- data/lib/mongoid/relations/embedded/batchable.rb +20 -18
- data/lib/mongoid/relations/embedded/in.rb +13 -1
- data/lib/mongoid/relations/embedded/many.rb +51 -10
- data/lib/mongoid/relations/embedded/one.rb +14 -1
- data/lib/mongoid/relations/macros.rb +9 -1
- data/lib/mongoid/relations/many.rb +4 -0
- data/lib/mongoid/relations/metadata.rb +3 -3
- data/lib/mongoid/relations/options.rb +2 -2
- data/lib/mongoid/relations/proxy.rb +1 -31
- data/lib/mongoid/relations/referenced/in.rb +19 -10
- data/lib/mongoid/relations/referenced/many.rb +30 -26
- data/lib/mongoid/relations/referenced/many_to_many.rb +20 -13
- data/lib/mongoid/relations/referenced/one.rb +15 -1
- data/lib/mongoid/relations/synchronization.rb +12 -12
- data/lib/mongoid/relations/targets/enumerable.rb +24 -4
- data/lib/mongoid/relations/touchable.rb +7 -4
- data/lib/mongoid/reloadable.rb +2 -2
- data/lib/mongoid/scopable.rb +3 -3
- data/lib/mongoid/serializable.rb +1 -1
- data/lib/mongoid/stateful.rb +1 -0
- data/lib/mongoid/tasks/database.rb +3 -2
- data/lib/mongoid/threaded.rb +74 -0
- data/lib/mongoid/traversable.rb +1 -1
- data/lib/mongoid/validatable/uniqueness.rb +1 -2
- data/lib/mongoid/version.rb +1 -1
- data/lib/mongoid.rb +6 -6
- data/lib/rails/generators/mongoid/config/templates/mongoid.yml +18 -3
- data/spec/app/models/agent.rb +2 -0
- data/spec/app/models/album.rb +5 -1
- data/spec/app/models/array_field.rb +7 -0
- data/spec/app/models/artist.rb +21 -0
- data/spec/app/models/band.rb +3 -0
- data/spec/app/models/book.rb +2 -1
- data/spec/app/models/delegating_patient.rb +16 -0
- data/spec/app/models/dokument.rb +1 -0
- data/spec/app/models/ordered_post.rb +5 -0
- data/spec/app/models/oscar.rb +1 -2
- data/spec/app/models/page.rb +1 -1
- data/spec/app/models/person.rb +3 -3
- data/spec/app/models/princess.rb +2 -0
- data/spec/app/models/record.rb +1 -0
- data/spec/app/models/subscription.rb +1 -0
- data/spec/app/models/thing.rb +1 -1
- data/spec/config/mongoid.yml +15 -0
- data/spec/integration/document_spec.rb +22 -0
- data/spec/mongoid/atomic/modifiers_spec.rb +3 -3
- data/spec/mongoid/atomic_spec.rb +5 -5
- data/spec/mongoid/attributes/nested_spec.rb +18 -14
- data/spec/mongoid/attributes/readonly_spec.rb +87 -44
- data/spec/mongoid/attributes_spec.rb +90 -5
- data/spec/mongoid/cacheable_spec.rb +112 -0
- data/spec/mongoid/changeable_spec.rb +58 -0
- data/spec/mongoid/clients/factory_spec.rb +80 -28
- data/spec/mongoid/clients/options_spec.rb +396 -95
- data/spec/mongoid/clients/sessions_spec.rb +334 -0
- data/spec/mongoid/clients_spec.rb +243 -101
- data/spec/mongoid/composable_spec.rb +7 -0
- data/spec/mongoid/config_spec.rb +67 -11
- data/spec/mongoid/contextual/atomic_spec.rb +3 -3
- data/spec/mongoid/contextual/geo_near_spec.rb +1 -0
- data/spec/mongoid/contextual/mongo_spec.rb +275 -22
- data/spec/mongoid/contextual/none_spec.rb +15 -0
- data/spec/mongoid/copyable_spec.rb +13 -4
- data/spec/mongoid/criteria/modifiable_spec.rb +297 -16
- data/spec/mongoid/criteria/options_spec.rb +29 -0
- data/spec/mongoid/criteria/queryable/aggregable_spec.rb +370 -0
- data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +523 -0
- data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +59 -0
- data/spec/mongoid/criteria/queryable/extensions/bignum_spec.rb +58 -0
- data/spec/mongoid/criteria/queryable/extensions/boolean_spec.rb +213 -0
- data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +330 -0
- data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +405 -0
- data/spec/mongoid/criteria/queryable/extensions/fixnum_spec.rb +58 -0
- data/spec/mongoid/criteria/queryable/extensions/float_spec.rb +65 -0
- data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +327 -0
- data/spec/mongoid/criteria/queryable/extensions/integer_spec.rb +65 -0
- data/spec/mongoid/criteria/queryable/extensions/nil_class_spec.rb +77 -0
- data/spec/mongoid/criteria/queryable/extensions/object_spec.rb +108 -0
- data/spec/mongoid/criteria/queryable/extensions/range_spec.rb +309 -0
- data/spec/mongoid/{extensions/origin → criteria/queryable/extensions}/regexp_raw_spec.rb +2 -2
- data/spec/mongoid/criteria/queryable/extensions/regexp_spec.rb +90 -0
- data/spec/mongoid/criteria/queryable/extensions/set_spec.rb +39 -0
- data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +302 -0
- data/spec/mongoid/criteria/queryable/extensions/symbol_spec.rb +167 -0
- data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +376 -0
- data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +347 -0
- data/spec/mongoid/criteria/queryable/forwardable_spec.rb +87 -0
- data/spec/mongoid/criteria/queryable/key_spec.rb +52 -0
- data/spec/mongoid/criteria/queryable/mergeable_spec.rb +49 -0
- data/spec/mongoid/criteria/queryable/optional_spec.rb +1799 -0
- data/spec/mongoid/criteria/queryable/options_spec.rb +360 -0
- data/spec/mongoid/criteria/queryable/pipeline_spec.rb +200 -0
- data/spec/mongoid/criteria/queryable/queryable_spec.rb +137 -0
- data/spec/mongoid/criteria/queryable/selectable_spec.rb +4242 -0
- data/spec/mongoid/criteria/queryable/selector_spec.rb +844 -0
- data/spec/mongoid/criteria/queryable/smash_spec.rb +30 -0
- data/spec/mongoid/criteria/scopable_spec.rb +81 -0
- data/spec/mongoid/criteria_spec.rb +156 -22
- data/spec/mongoid/document_spec.rb +100 -90
- data/spec/mongoid/errors/invalid_relation_spec.rb +37 -0
- data/spec/mongoid/errors/mongoid_error_spec.rb +6 -3
- data/spec/mongoid/extensions/big_decimal_spec.rb +321 -19
- data/spec/mongoid/extensions/boolean_spec.rb +14 -0
- data/spec/mongoid/extensions/date_spec.rb +2 -6
- data/spec/mongoid/extensions/date_time_spec.rb +2 -6
- data/spec/mongoid/extensions/decimal128_spec.rb +1 -1
- data/spec/mongoid/extensions/float_spec.rb +8 -1
- data/spec/mongoid/extensions/hash_spec.rb +15 -0
- data/spec/mongoid/extensions/integer_spec.rb +8 -1
- data/spec/mongoid/extensions/object_spec.rb +11 -0
- data/spec/mongoid/extensions/regexp_spec.rb +23 -0
- data/spec/mongoid/extensions/string_spec.rb +53 -4
- data/spec/mongoid/extensions/time_spec.rb +2 -6
- data/spec/mongoid/extensions/time_with_zone_spec.rb +2 -6
- data/spec/mongoid/factory_spec.rb +11 -0
- data/spec/mongoid/fields_spec.rb +1 -1
- data/spec/mongoid/findable_spec.rb +47 -2
- data/spec/mongoid/indexable_spec.rb +15 -3
- data/spec/mongoid/interceptable_spec.rb +85 -19
- data/spec/mongoid/matchable/all_spec.rb +4 -4
- data/spec/mongoid/matchable/and_spec.rb +10 -10
- data/spec/mongoid/matchable/default_spec.rb +12 -12
- data/spec/mongoid/matchable/elem_match_spec.rb +86 -0
- data/spec/mongoid/matchable/exists_spec.rb +5 -5
- data/spec/mongoid/matchable/gt_spec.rb +18 -7
- data/spec/mongoid/matchable/gte_spec.rb +17 -7
- data/spec/mongoid/matchable/in_spec.rb +5 -5
- data/spec/mongoid/matchable/lt_spec.rb +18 -7
- data/spec/mongoid/matchable/lte_spec.rb +18 -7
- data/spec/mongoid/matchable/ne_spec.rb +5 -5
- data/spec/mongoid/matchable/nin_spec.rb +5 -5
- data/spec/mongoid/matchable/nor_spec.rb +209 -0
- data/spec/mongoid/matchable/or_spec.rb +7 -7
- data/spec/mongoid/matchable/regexp_spec.rb +5 -5
- data/spec/mongoid/matchable/size_spec.rb +3 -3
- data/spec/mongoid/matchable_spec.rb +199 -54
- data/spec/mongoid/persistable/creatable_spec.rb +7 -2
- data/spec/mongoid/persistable/deletable_spec.rb +35 -1
- data/spec/mongoid/persistable/destroyable_spec.rb +25 -2
- data/spec/mongoid/persistable/incrementable_spec.rb +6 -6
- data/spec/mongoid/persistable/savable_spec.rb +34 -29
- data/spec/mongoid/persistable/settable_spec.rb +77 -27
- data/spec/mongoid/persistable/updatable_spec.rb +182 -3
- data/spec/mongoid/persistable_spec.rb +16 -16
- data/spec/mongoid/persistence_context_spec.rb +694 -0
- data/spec/mongoid/positional_spec.rb +1 -1
- data/spec/mongoid/query_cache_spec.rb +170 -12
- data/spec/mongoid/relations/accessors_spec.rb +1 -1
- data/spec/mongoid/relations/auto_save_spec.rb +39 -6
- data/spec/mongoid/relations/bindings/referenced/many_to_many_spec.rb +4 -4
- data/spec/mongoid/relations/builders_spec.rb +37 -10
- data/spec/mongoid/relations/counter_cache_spec.rb +64 -3
- data/spec/mongoid/relations/eager/has_and_belongs_to_many_spec.rb +16 -0
- data/spec/mongoid/relations/eager_spec.rb +40 -0
- data/spec/mongoid/relations/embedded/many_spec.rb +305 -59
- data/spec/mongoid/relations/embedded/one_spec.rb +2 -1
- data/spec/mongoid/relations/macros_spec.rb +415 -7
- data/spec/mongoid/relations/metadata_spec.rb +15 -1
- data/spec/mongoid/relations/proxy_spec.rb +27 -1
- data/spec/mongoid/relations/referenced/in_spec.rb +41 -1
- data/spec/mongoid/relations/referenced/many_spec.rb +35 -25
- data/spec/mongoid/relations/referenced/many_to_many_spec.rb +14 -26
- data/spec/mongoid/relations/synchronization_spec.rb +48 -2
- data/spec/mongoid/relations/targets/enumerable_spec.rb +108 -0
- data/spec/mongoid/relations/touchable_spec.rb +40 -0
- data/spec/mongoid/reloadable_spec.rb +51 -0
- data/spec/mongoid/scopable_spec.rb +13 -0
- data/spec/mongoid/serializable_spec.rb +0 -50
- data/spec/mongoid/threaded_spec.rb +68 -0
- data/spec/mongoid/validatable/presence_spec.rb +1 -1
- data/spec/mongoid/validatable/uniqueness_spec.rb +18 -9
- data/spec/mongoid/validatable_spec.rb +16 -0
- data/spec/rails/controller_extension/controller_runtime_spec.rb +110 -0
- data/spec/spec_helper.rb +101 -8
- data/spec/support/cluster_config.rb +158 -0
- data/spec/support/constraints.rb +101 -0
- data/spec/support/macros.rb +20 -0
- data/spec/support/session_registry.rb +50 -0
- data/spec/support/spec_config.rb +42 -0
- data.tar.gz.sig +0 -0
- metadata +163 -61
- metadata.gz.sig +0 -0
- data/lib/mongoid/clients/thread_options.rb +0 -19
- data/lib/mongoid/extensions/origin/regexp_raw.rb +0 -43
- data/lib/mongoid/railties/document.rb +0 -12
- data/spec/mongoid/railties/document_spec.rb +0 -24
@@ -15,12 +15,50 @@ describe Mongoid::Relations::Macros do
|
|
15
15
|
klass._validators.clear
|
16
16
|
end
|
17
17
|
|
18
|
+
after do
|
19
|
+
klass.relations.clear
|
20
|
+
klass.validators.clear
|
21
|
+
end
|
22
|
+
|
23
|
+
describe 'Model loading' do
|
24
|
+
|
25
|
+
let(:model_associations) do
|
26
|
+
class TestModel
|
27
|
+
include Mongoid::Document
|
28
|
+
field :associations
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
after do
|
33
|
+
Object.send(:remove_const, :TestModel)
|
34
|
+
end
|
35
|
+
|
36
|
+
it 'prohibits the use of :associations as an attribute' do
|
37
|
+
expect {
|
38
|
+
model_associations
|
39
|
+
}.to raise_exception(Mongoid::Errors::InvalidField)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
18
43
|
describe ".embedded_in" do
|
19
44
|
|
20
45
|
it "defines the macro" do
|
21
46
|
expect(klass).to respond_to(:embedded_in)
|
22
47
|
end
|
23
48
|
|
49
|
+
context 'when the relation name is invalid' do
|
50
|
+
|
51
|
+
let(:relation) do
|
52
|
+
klass.embedded_in(:fields)
|
53
|
+
end
|
54
|
+
|
55
|
+
it 'raises an InvalidRelation exception' do
|
56
|
+
expect {
|
57
|
+
relation
|
58
|
+
}.to raise_exception(Mongoid::Errors::InvalidRelation)
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
24
62
|
context "when defining the relation" do
|
25
63
|
|
26
64
|
before do
|
@@ -74,6 +112,19 @@ describe Mongoid::Relations::Macros do
|
|
74
112
|
|
75
113
|
context "when defining the relation" do
|
76
114
|
|
115
|
+
context 'when the relation name is invalid' do
|
116
|
+
|
117
|
+
let(:relation) do
|
118
|
+
klass.embeds_many(:fields)
|
119
|
+
end
|
120
|
+
|
121
|
+
it 'raises an InvalidRelation exception' do
|
122
|
+
expect {
|
123
|
+
relation
|
124
|
+
}.to raise_exception(Mongoid::Errors::InvalidRelation)
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
77
128
|
before do
|
78
129
|
klass.embeds_many(:addresses)
|
79
130
|
end
|
@@ -132,8 +183,8 @@ describe Mongoid::Relations::Macros do
|
|
132
183
|
expect(metadata.order).to_not be_nil
|
133
184
|
end
|
134
185
|
|
135
|
-
it "returns
|
136
|
-
expect(metadata.order).to be_kind_of(
|
186
|
+
it "returns Mongoid::Criteria::Queryable::Key" do
|
187
|
+
expect(metadata.order).to be_kind_of(Mongoid::Criteria::Queryable::Key)
|
137
188
|
end
|
138
189
|
end
|
139
190
|
|
@@ -157,6 +208,19 @@ describe Mongoid::Relations::Macros do
|
|
157
208
|
|
158
209
|
context "when defining the relation" do
|
159
210
|
|
211
|
+
context 'when the relation name is invalid' do
|
212
|
+
|
213
|
+
let(:relation) do
|
214
|
+
klass.embeds_one(:fields)
|
215
|
+
end
|
216
|
+
|
217
|
+
it 'raises an InvalidRelation exception' do
|
218
|
+
expect {
|
219
|
+
relation
|
220
|
+
}.to raise_exception(Mongoid::Errors::InvalidRelation)
|
221
|
+
end
|
222
|
+
end
|
223
|
+
|
160
224
|
before do
|
161
225
|
klass.embeds_one(:name)
|
162
226
|
end
|
@@ -223,8 +287,300 @@ describe Mongoid::Relations::Macros do
|
|
223
287
|
|
224
288
|
describe ".belongs_to" do
|
225
289
|
|
290
|
+
let(:_class) do
|
291
|
+
class RelationsTestClass
|
292
|
+
include Mongoid::Document
|
293
|
+
end
|
294
|
+
end
|
295
|
+
|
296
|
+
let(:conf) do
|
297
|
+
CONFIG.merge(options: { belongs_to_required_by_default: default_require })
|
298
|
+
end
|
299
|
+
|
300
|
+
let(:relation) do
|
301
|
+
_class.new
|
302
|
+
end
|
303
|
+
|
304
|
+
let(:relation_options) { {} }
|
305
|
+
|
306
|
+
let(:default_require) { Mongoid.belongs_to_required_by_default }
|
307
|
+
|
308
|
+
before do
|
309
|
+
Mongoid.configure do |config|
|
310
|
+
config.load_configuration(conf)
|
311
|
+
end
|
312
|
+
_class.belongs_to(:person, relation_options)
|
313
|
+
end
|
314
|
+
|
315
|
+
after do
|
316
|
+
Object.send(:remove_const, _class.name)
|
317
|
+
end
|
318
|
+
|
319
|
+
after(:all) do
|
320
|
+
Mongoid.configure do |config|
|
321
|
+
config.load_configuration(CONFIG)
|
322
|
+
end
|
323
|
+
end
|
324
|
+
|
226
325
|
it "defines the macro" do
|
227
|
-
expect(
|
326
|
+
expect(_class).to respond_to(:belongs_to)
|
327
|
+
end
|
328
|
+
|
329
|
+
context 'when the relation has options' do
|
330
|
+
|
331
|
+
context 'when the relation has the option :required' do
|
332
|
+
|
333
|
+
context 'when the relation does not have the :optional option' do
|
334
|
+
|
335
|
+
context 'when :required is true' do
|
336
|
+
|
337
|
+
let(:relation_options) do
|
338
|
+
{ required: true }
|
339
|
+
end
|
340
|
+
|
341
|
+
context 'when the default config is to require the association' do
|
342
|
+
|
343
|
+
let(:default_require) { true }
|
344
|
+
|
345
|
+
it 'requires the association' do
|
346
|
+
expect(relation.save).to be(false)
|
347
|
+
end
|
348
|
+
end
|
349
|
+
|
350
|
+
context 'when the default config is to not require the association' do
|
351
|
+
|
352
|
+
let(:default_require) { false }
|
353
|
+
|
354
|
+
it 'requires the association' do
|
355
|
+
expect(relation.save).to be(false)
|
356
|
+
end
|
357
|
+
end
|
358
|
+
end
|
359
|
+
|
360
|
+
context 'when :required is false' do
|
361
|
+
|
362
|
+
let(:relation_options) do
|
363
|
+
{ required: false }
|
364
|
+
end
|
365
|
+
|
366
|
+
context 'when the default config is to require the association' do
|
367
|
+
|
368
|
+
let(:default_require) { true }
|
369
|
+
|
370
|
+
it 'does not require the association' do
|
371
|
+
expect(relation.save).to be(true)
|
372
|
+
end
|
373
|
+
end
|
374
|
+
|
375
|
+
context 'when the default config is to not require the association' do
|
376
|
+
|
377
|
+
let(:default_require) { false }
|
378
|
+
|
379
|
+
it 'does not require the association' do
|
380
|
+
expect(relation.save).to be(true)
|
381
|
+
end
|
382
|
+
end
|
383
|
+
end
|
384
|
+
end
|
385
|
+
|
386
|
+
context 'when the relation has the option :optional' do
|
387
|
+
|
388
|
+
context 'when :required is true' do
|
389
|
+
|
390
|
+
context 'when :optional is true' do
|
391
|
+
|
392
|
+
let(:relation_options) do
|
393
|
+
{
|
394
|
+
required: true,
|
395
|
+
optional: true
|
396
|
+
}
|
397
|
+
end
|
398
|
+
|
399
|
+
context 'when the default config is to require the association' do
|
400
|
+
|
401
|
+
let(:default_require) { true }
|
402
|
+
|
403
|
+
it 'requires the association' do
|
404
|
+
expect(relation.save).to be(false)
|
405
|
+
end
|
406
|
+
end
|
407
|
+
|
408
|
+
context 'when the default config is to not require the association' do
|
409
|
+
|
410
|
+
let(:default_require) { false }
|
411
|
+
|
412
|
+
it 'requires the association' do
|
413
|
+
expect(relation.save).to be(false)
|
414
|
+
end
|
415
|
+
end
|
416
|
+
end
|
417
|
+
|
418
|
+
context 'when :optional is false' do
|
419
|
+
|
420
|
+
let(:relation_options) do
|
421
|
+
{
|
422
|
+
required: true,
|
423
|
+
optional: false
|
424
|
+
}
|
425
|
+
end
|
426
|
+
|
427
|
+
context 'when the default config is to require the association' do
|
428
|
+
|
429
|
+
let(:default_require) { true }
|
430
|
+
|
431
|
+
it 'requires the association' do
|
432
|
+
expect(relation.save).to be(false)
|
433
|
+
end
|
434
|
+
end
|
435
|
+
|
436
|
+
context 'when the default config is to not require the association' do
|
437
|
+
|
438
|
+
let(:default_require) { false }
|
439
|
+
|
440
|
+
it 'requires the association' do
|
441
|
+
expect(relation.save).to be(false)
|
442
|
+
end
|
443
|
+
end
|
444
|
+
end
|
445
|
+
end
|
446
|
+
|
447
|
+
context 'when :required is false' do
|
448
|
+
|
449
|
+
context 'when :optional is true' do
|
450
|
+
|
451
|
+
let(:relation_options) do
|
452
|
+
{
|
453
|
+
required: false,
|
454
|
+
optional: true
|
455
|
+
}
|
456
|
+
end
|
457
|
+
|
458
|
+
context 'when the default config is to require the association' do
|
459
|
+
|
460
|
+
let(:default_require) { true }
|
461
|
+
|
462
|
+
it 'does not require the association' do
|
463
|
+
expect(relation.save).to be(true)
|
464
|
+
end
|
465
|
+
end
|
466
|
+
|
467
|
+
context 'when the default config is to not require the association' do
|
468
|
+
|
469
|
+
let(:default_require) { true }
|
470
|
+
|
471
|
+
it 'does not require the association' do
|
472
|
+
expect(relation.save).to be(true)
|
473
|
+
end
|
474
|
+
end
|
475
|
+
end
|
476
|
+
|
477
|
+
context 'when :optional is false' do
|
478
|
+
|
479
|
+
let(:relation_options) do
|
480
|
+
{
|
481
|
+
required: false,
|
482
|
+
optional: false
|
483
|
+
}
|
484
|
+
end
|
485
|
+
|
486
|
+
context 'when the default config is to require the association' do
|
487
|
+
|
488
|
+
let(:default_require) { true }
|
489
|
+
|
490
|
+
it 'does not require the association' do
|
491
|
+
expect(relation.save).to be(true)
|
492
|
+
end
|
493
|
+
end
|
494
|
+
|
495
|
+
context 'when the default config is to not require the association' do
|
496
|
+
|
497
|
+
let(:default_require) { false }
|
498
|
+
|
499
|
+
it 'does not require the association' do
|
500
|
+
expect(relation.save).to be(true)
|
501
|
+
end
|
502
|
+
end
|
503
|
+
end
|
504
|
+
end
|
505
|
+
end
|
506
|
+
end
|
507
|
+
|
508
|
+
context 'when the relation does not have the option :required' do
|
509
|
+
|
510
|
+
context 'when the relation has the option :optional' do
|
511
|
+
|
512
|
+
context 'when :optional is true' do
|
513
|
+
|
514
|
+
let(:relation_options) do
|
515
|
+
{ optional: true }
|
516
|
+
end
|
517
|
+
|
518
|
+
context 'when the default config is to require the association' do
|
519
|
+
|
520
|
+
let(:default_require) { true }
|
521
|
+
|
522
|
+
it 'does not require the association' do
|
523
|
+
expect(relation.save).to be(true)
|
524
|
+
end
|
525
|
+
end
|
526
|
+
|
527
|
+
context 'when the default config is to not require the association' do
|
528
|
+
|
529
|
+
let(:default_require) { false }
|
530
|
+
|
531
|
+
it 'does not require the association' do
|
532
|
+
expect(relation.save).to be(true)
|
533
|
+
end
|
534
|
+
end
|
535
|
+
end
|
536
|
+
|
537
|
+
context 'when :optional is false' do
|
538
|
+
|
539
|
+
let(:relation_options) do
|
540
|
+
{ optional: false }
|
541
|
+
end
|
542
|
+
|
543
|
+
context 'when the default config is to require the association' do
|
544
|
+
|
545
|
+
let(:default_require) { true }
|
546
|
+
|
547
|
+
it 'requires the association' do
|
548
|
+
expect(relation.save).to be(false)
|
549
|
+
end
|
550
|
+
end
|
551
|
+
|
552
|
+
context 'when the default config is to not require the association' do
|
553
|
+
|
554
|
+
let(:default_require) { false }
|
555
|
+
|
556
|
+
it 'requires the association' do
|
557
|
+
expect(relation.save).to be(false)
|
558
|
+
end
|
559
|
+
end
|
560
|
+
end
|
561
|
+
end
|
562
|
+
end
|
563
|
+
end
|
564
|
+
|
565
|
+
context 'when the relation does not have options' do
|
566
|
+
|
567
|
+
context 'when the default config is to require the association' do
|
568
|
+
|
569
|
+
let(:default_require) { true }
|
570
|
+
|
571
|
+
it 'requires the association' do
|
572
|
+
expect(relation.save).to be(false)
|
573
|
+
end
|
574
|
+
end
|
575
|
+
|
576
|
+
context 'when the default config is to not require the association' do
|
577
|
+
|
578
|
+
let(:default_require) { false }
|
579
|
+
|
580
|
+
it 'does not require the association' do
|
581
|
+
expect(relation.save).to be(true)
|
582
|
+
end
|
583
|
+
end
|
228
584
|
end
|
229
585
|
|
230
586
|
context "when the relation is polymorphic" do
|
@@ -247,6 +603,19 @@ describe Mongoid::Relations::Macros do
|
|
247
603
|
|
248
604
|
context "when defining the relation" do
|
249
605
|
|
606
|
+
context 'when the relation name is invalid' do
|
607
|
+
|
608
|
+
let(:relation) do
|
609
|
+
klass.belongs_to(:fields)
|
610
|
+
end
|
611
|
+
|
612
|
+
it 'raises an InvalidRelation exception' do
|
613
|
+
expect {
|
614
|
+
relation
|
615
|
+
}.to raise_exception(Mongoid::Errors::InvalidRelation)
|
616
|
+
end
|
617
|
+
end
|
618
|
+
|
250
619
|
before do
|
251
620
|
klass.belongs_to(:person)
|
252
621
|
end
|
@@ -306,6 +675,19 @@ describe Mongoid::Relations::Macros do
|
|
306
675
|
|
307
676
|
context "when defining the relation" do
|
308
677
|
|
678
|
+
context 'when the relation name is invalid' do
|
679
|
+
|
680
|
+
let(:relation) do
|
681
|
+
klass.has_many(:fields)
|
682
|
+
end
|
683
|
+
|
684
|
+
it 'raises an InvalidRelation exception' do
|
685
|
+
expect {
|
686
|
+
relation
|
687
|
+
}.to raise_exception(Mongoid::Errors::InvalidRelation)
|
688
|
+
end
|
689
|
+
end
|
690
|
+
|
309
691
|
before do
|
310
692
|
klass.has_many(:posts)
|
311
693
|
end
|
@@ -364,8 +746,8 @@ describe Mongoid::Relations::Macros do
|
|
364
746
|
expect(metadata.order).to_not be_nil
|
365
747
|
end
|
366
748
|
|
367
|
-
it "returns
|
368
|
-
expect(metadata.order).to be_kind_of(
|
749
|
+
it "returns Mongoid::Criteria::Queryable::Key" do
|
750
|
+
expect(metadata.order).to be_kind_of(Mongoid::Criteria::Queryable::Key)
|
369
751
|
end
|
370
752
|
end
|
371
753
|
|
@@ -389,6 +771,19 @@ describe Mongoid::Relations::Macros do
|
|
389
771
|
|
390
772
|
context "when defining the relation" do
|
391
773
|
|
774
|
+
context 'when the relation name is invalid' do
|
775
|
+
|
776
|
+
let(:relation) do
|
777
|
+
klass.has_and_belongs_to_many(:fields)
|
778
|
+
end
|
779
|
+
|
780
|
+
it 'raises an InvalidRelation exception' do
|
781
|
+
expect {
|
782
|
+
relation
|
783
|
+
}.to raise_exception(Mongoid::Errors::InvalidRelation)
|
784
|
+
end
|
785
|
+
end
|
786
|
+
|
392
787
|
before do
|
393
788
|
klass.has_and_belongs_to_many(:preferences)
|
394
789
|
end
|
@@ -429,8 +824,8 @@ describe Mongoid::Relations::Macros do
|
|
429
824
|
expect(metadata.order).to_not be_nil
|
430
825
|
end
|
431
826
|
|
432
|
-
it "returns
|
433
|
-
expect(metadata.order).to be_kind_of(
|
827
|
+
it "returns Mongoid::Criteria::Queryable::Key" do
|
828
|
+
expect(metadata.order).to be_kind_of(Mongoid::Criteria::Queryable::Key)
|
434
829
|
end
|
435
830
|
end
|
436
831
|
|
@@ -459,6 +854,19 @@ describe Mongoid::Relations::Macros do
|
|
459
854
|
|
460
855
|
context "when defining the relation" do
|
461
856
|
|
857
|
+
context 'when the relation name is invalid' do
|
858
|
+
|
859
|
+
let(:relation) do
|
860
|
+
klass.has_one(:fields)
|
861
|
+
end
|
862
|
+
|
863
|
+
it 'raises an InvalidRelation exception' do
|
864
|
+
expect {
|
865
|
+
relation
|
866
|
+
}.to raise_exception(Mongoid::Errors::InvalidRelation)
|
867
|
+
end
|
868
|
+
end
|
869
|
+
|
462
870
|
before do
|
463
871
|
klass.has_one(:game)
|
464
872
|
end
|
@@ -1896,6 +1896,21 @@ describe Mongoid::Relations::Metadata do
|
|
1896
1896
|
end
|
1897
1897
|
end
|
1898
1898
|
|
1899
|
+
context "when touch specifies additional field" do
|
1900
|
+
|
1901
|
+
let(:metadata) do
|
1902
|
+
described_class.new(
|
1903
|
+
name: :versions,
|
1904
|
+
relation: Mongoid::Relations::Referenced::In,
|
1905
|
+
touch: :changed_at
|
1906
|
+
)
|
1907
|
+
end
|
1908
|
+
|
1909
|
+
it "returns true" do
|
1910
|
+
expect(metadata).to be_touchable
|
1911
|
+
end
|
1912
|
+
end
|
1913
|
+
|
1899
1914
|
context "when touch is nil" do
|
1900
1915
|
|
1901
1916
|
let(:metadata) do
|
@@ -1967,5 +1982,4 @@ describe Mongoid::Relations::Metadata do
|
|
1967
1982
|
end
|
1968
1983
|
end
|
1969
1984
|
end
|
1970
|
-
|
1971
1985
|
end
|
@@ -19,7 +19,9 @@ describe Mongoid::Relations::Proxy do
|
|
19
19
|
|
20
20
|
it 'uses the new persistence options' do
|
21
21
|
expect {
|
22
|
-
animal.with(write: { w: 100 })
|
22
|
+
animal.with(write: { w: 100 }) do |an|
|
23
|
+
an.update_attribute(:name, 'kangaroo')
|
24
|
+
end
|
23
25
|
}.to raise_exception(Mongo::Error::OperationFailure)
|
24
26
|
end
|
25
27
|
end
|
@@ -95,4 +97,28 @@ describe Mongoid::Relations::Proxy do
|
|
95
97
|
end
|
96
98
|
end
|
97
99
|
end
|
100
|
+
|
101
|
+
describe "equality" do
|
102
|
+
let(:messages) do
|
103
|
+
Person.create.messages
|
104
|
+
end
|
105
|
+
|
106
|
+
it "is #equal? to itself" do
|
107
|
+
expect(messages.equal?(messages)).to eq(true)
|
108
|
+
end
|
109
|
+
|
110
|
+
it "is == to itself" do
|
111
|
+
expect(messages == messages).to eq(true)
|
112
|
+
end
|
113
|
+
|
114
|
+
it "is not #equal? to its target" do
|
115
|
+
expect(messages.equal?(messages.target)).to eq(false)
|
116
|
+
expect(messages.target.equal?(messages)).to eq(false)
|
117
|
+
end
|
118
|
+
|
119
|
+
it "is == to its target" do
|
120
|
+
expect(messages == messages.target).to eq(true)
|
121
|
+
expect(messages.target == messages).to eq(true)
|
122
|
+
end
|
123
|
+
end
|
98
124
|
end
|
@@ -264,6 +264,44 @@ describe Mongoid::Relations::Referenced::In do
|
|
264
264
|
|
265
265
|
context "when the relation is not polymorphic" do
|
266
266
|
|
267
|
+
context 'when the child has persistence options set' do
|
268
|
+
|
269
|
+
let(:person) do
|
270
|
+
Person.new
|
271
|
+
end
|
272
|
+
|
273
|
+
let(:post) do
|
274
|
+
Post.new
|
275
|
+
end
|
276
|
+
|
277
|
+
before do
|
278
|
+
post.with(collection: 'other-posts') do |p|
|
279
|
+
person.with(collection: 'other-people') do |per|
|
280
|
+
p.person = person
|
281
|
+
per.save
|
282
|
+
p.save
|
283
|
+
end
|
284
|
+
end
|
285
|
+
end
|
286
|
+
|
287
|
+
let(:other_people_count) do
|
288
|
+
Person.with(collection: 'other-people') do |person_class|
|
289
|
+
person_class.count
|
290
|
+
end
|
291
|
+
end
|
292
|
+
|
293
|
+
let(:other_posts_count) do
|
294
|
+
Post.with(collection: 'other-posts') do |post_class|
|
295
|
+
post_class.count
|
296
|
+
end
|
297
|
+
end
|
298
|
+
|
299
|
+
it 'applies the persistence options when saving the child' do
|
300
|
+
expect(other_people_count).to eq(1)
|
301
|
+
expect(other_posts_count).to eq(1)
|
302
|
+
end
|
303
|
+
end
|
304
|
+
|
267
305
|
context "when the child is a new record" do
|
268
306
|
|
269
307
|
let(:person) do
|
@@ -1028,7 +1066,9 @@ describe Mongoid::Relations::Referenced::In do
|
|
1028
1066
|
:index,
|
1029
1067
|
:polymorphic,
|
1030
1068
|
:primary_key,
|
1031
|
-
:touch
|
1069
|
+
:touch,
|
1070
|
+
:optional,
|
1071
|
+
:required
|
1032
1072
|
]
|
1033
1073
|
)
|
1034
1074
|
end
|