mongoid 5.4.0 → 6.4.8
Sign up to get free protection for your applications and to get access to all the features.
- 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
data/spec/mongoid/config_spec.rb
CHANGED
@@ -9,6 +9,12 @@ describe Mongoid::Config do
|
|
9
9
|
end
|
10
10
|
end
|
11
11
|
|
12
|
+
after do
|
13
|
+
Mongoid.configure do |config|
|
14
|
+
config.load_configuration(CONFIG)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
12
18
|
describe "#configured?" do
|
13
19
|
|
14
20
|
after do
|
@@ -64,7 +70,7 @@ describe Mongoid::Config do
|
|
64
70
|
|
65
71
|
before do
|
66
72
|
if defined?(Rails)
|
67
|
-
RailsTemp = Rails
|
73
|
+
RailsTemp = Rails unless defined?(RailsTemp)
|
68
74
|
Object.send(:remove_const, :Rails)
|
69
75
|
end
|
70
76
|
|
@@ -82,10 +88,62 @@ describe Mongoid::Config do
|
|
82
88
|
end
|
83
89
|
end
|
84
90
|
|
91
|
+
context 'when the belongs_to_required_by_default option is not set in the config' do
|
92
|
+
|
93
|
+
before do
|
94
|
+
Mongoid::Config.reset
|
95
|
+
Mongoid.configure do |config|
|
96
|
+
config.load_configuration(clients: CONFIG[:clients])
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
it 'sets the Mongoid.belongs_to_required_by_default value to true' do
|
101
|
+
expect(Mongoid.belongs_to_required_by_default).to be(true)
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
context 'when the belongs_to_required_by_default option is set in the config' do
|
106
|
+
|
107
|
+
before do
|
108
|
+
Mongoid.configure do |config|
|
109
|
+
config.load_configuration(conf)
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
context 'when the value is set to true' do
|
114
|
+
|
115
|
+
let(:conf) do
|
116
|
+
CONFIG.merge(options: { belongs_to_required_by_default: true })
|
117
|
+
end
|
118
|
+
|
119
|
+
it 'sets the Mongoid.belongs_to_required_by_default value to true' do
|
120
|
+
expect(Mongoid.belongs_to_required_by_default).to be(true)
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
124
|
+
context 'when the value is set to false' do
|
125
|
+
|
126
|
+
let(:conf) do
|
127
|
+
CONFIG.merge(options: { belongs_to_required_by_default: false })
|
128
|
+
end
|
129
|
+
|
130
|
+
before do
|
131
|
+
Mongoid::Config.reset
|
132
|
+
Mongoid.configure do |config|
|
133
|
+
config.load_configuration(conf)
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
137
|
+
it 'sets the Mongoid.belongs_to_required_by_default value to false' do
|
138
|
+
expect(Mongoid.belongs_to_required_by_default).to be(false)
|
139
|
+
end
|
140
|
+
end
|
141
|
+
end
|
142
|
+
|
85
143
|
context 'when the app_name is set in the config' do
|
86
144
|
|
87
145
|
let(:conf) do
|
88
|
-
CONFIG.merge(options: {app_name: 'admin-reporting'})
|
146
|
+
CONFIG.merge(options: { app_name: 'admin-reporting' })
|
89
147
|
end
|
90
148
|
|
91
149
|
before do
|
@@ -137,6 +195,10 @@ describe Mongoid::Config do
|
|
137
195
|
described_class.load!(file, :test)
|
138
196
|
end
|
139
197
|
|
198
|
+
after do
|
199
|
+
client.close
|
200
|
+
end
|
201
|
+
|
140
202
|
it "clears the previous clients" do
|
141
203
|
expect(Mongoid::Clients.clients[:test]).to be_nil
|
142
204
|
end
|
@@ -148,12 +210,6 @@ describe Mongoid::Config do
|
|
148
210
|
described_class.load!(file, :test)
|
149
211
|
end
|
150
212
|
|
151
|
-
after do
|
152
|
-
Mongoid.configure do |config|
|
153
|
-
config.load_configuration(CONFIG)
|
154
|
-
end
|
155
|
-
end
|
156
|
-
|
157
213
|
it "sets the Mongoid logger level" do
|
158
214
|
expect(Mongoid.logger.level).to eq(Logger::WARN)
|
159
215
|
end
|
@@ -176,7 +232,7 @@ describe Mongoid::Config do
|
|
176
232
|
|
177
233
|
after do
|
178
234
|
if defined?(Rails)
|
179
|
-
RailsTemp = Rails
|
235
|
+
RailsTemp = Rails unless defined?(RailsTemp)
|
180
236
|
Object.send(:remove_const, :Rails)
|
181
237
|
end
|
182
238
|
end
|
@@ -282,7 +338,7 @@ describe Mongoid::Config do
|
|
282
338
|
context "when a default is provided" do
|
283
339
|
|
284
340
|
before do
|
285
|
-
described_class.load!(file)
|
341
|
+
described_class.load!(file, :test_with_max_staleness)
|
286
342
|
end
|
287
343
|
|
288
344
|
let(:default) do
|
@@ -301,7 +357,7 @@ describe Mongoid::Config do
|
|
301
357
|
|
302
358
|
it "sets the read option" do
|
303
359
|
expect(options["read"]).to eq({ "mode" => :primary_preferred,
|
304
|
-
"
|
360
|
+
"max_staleness" => 100 })
|
305
361
|
end
|
306
362
|
end
|
307
363
|
end
|
@@ -496,7 +496,7 @@ describe Mongoid::Contextual::Atomic do
|
|
496
496
|
end
|
497
497
|
end
|
498
498
|
|
499
|
-
describe "#
|
499
|
+
describe "#push_all" do
|
500
500
|
|
501
501
|
context 'when the criteria does not have a collation' do
|
502
502
|
|
@@ -517,7 +517,7 @@ describe Mongoid::Contextual::Atomic do
|
|
517
517
|
end
|
518
518
|
|
519
519
|
before do
|
520
|
-
context.
|
520
|
+
context.push_all(members: [ "Alan", "Fletch" ])
|
521
521
|
end
|
522
522
|
|
523
523
|
it "pushes the values to existing arrays" do
|
@@ -548,7 +548,7 @@ describe Mongoid::Contextual::Atomic do
|
|
548
548
|
end
|
549
549
|
|
550
550
|
before do
|
551
|
-
context.
|
551
|
+
context.push_all(members: [ "Alan", "Fletch" ])
|
552
552
|
end
|
553
553
|
|
554
554
|
it "pushes the values to existing arrays" do
|
@@ -228,36 +228,36 @@ describe Mongoid::Contextual::Mongo do
|
|
228
228
|
it "returns the number of documents deleted" do
|
229
229
|
expect(deleted).to eq(1)
|
230
230
|
end
|
231
|
-
end
|
232
231
|
|
233
|
-
|
232
|
+
context 'when the criteria has a collation', if: collation_supported? do
|
234
233
|
|
235
|
-
|
236
|
-
|
237
|
-
|
234
|
+
let(:criteria) do
|
235
|
+
Band.where(name: "DEPECHE MODE").collation(locale: 'en_US', strength: 2)
|
236
|
+
end
|
238
237
|
|
239
|
-
|
240
|
-
|
241
|
-
|
238
|
+
let(:context) do
|
239
|
+
described_class.new(criteria)
|
240
|
+
end
|
242
241
|
|
243
|
-
|
244
|
-
|
245
|
-
|
242
|
+
let!(:deleted) do
|
243
|
+
context.send(method)
|
244
|
+
end
|
246
245
|
|
247
|
-
|
248
|
-
|
249
|
-
|
246
|
+
it "deletes the matching documents" do
|
247
|
+
expect(Band.find(new_order.id)).to eq(new_order)
|
248
|
+
end
|
250
249
|
|
251
|
-
|
252
|
-
|
253
|
-
|
250
|
+
it "deletes the correct number of documents" do
|
251
|
+
expect(Band.count).to eq(1)
|
252
|
+
end
|
254
253
|
|
255
|
-
|
256
|
-
|
254
|
+
it "returns the number of documents deleted" do
|
255
|
+
expect(deleted).to eq(1)
|
256
|
+
end
|
257
257
|
end
|
258
258
|
end
|
259
259
|
|
260
|
-
context "when the selector is not
|
260
|
+
context "when the selector is not contraining" do
|
261
261
|
|
262
262
|
let(:criteria) do
|
263
263
|
Band.all
|
@@ -275,6 +275,23 @@ describe Mongoid::Contextual::Mongo do
|
|
275
275
|
expect(Band.count).to eq(0)
|
276
276
|
end
|
277
277
|
end
|
278
|
+
|
279
|
+
context 'when the write concern is unacknowledged' do
|
280
|
+
|
281
|
+
let(:criteria) do
|
282
|
+
Band.all
|
283
|
+
end
|
284
|
+
|
285
|
+
let!(:deleted) do
|
286
|
+
criteria.with(write: { w: 0 }) do |crit|
|
287
|
+
crit.send(method)
|
288
|
+
end
|
289
|
+
end
|
290
|
+
|
291
|
+
it 'returns 0' do
|
292
|
+
expect(deleted).to eq(0)
|
293
|
+
end
|
294
|
+
end
|
278
295
|
end
|
279
296
|
end
|
280
297
|
|
@@ -363,6 +380,27 @@ describe Mongoid::Contextual::Mongo do
|
|
363
380
|
end
|
364
381
|
end
|
365
382
|
end
|
383
|
+
|
384
|
+
context 'when the write concern is unacknowledged' do
|
385
|
+
|
386
|
+
before do
|
387
|
+
2.times { Band.create }
|
388
|
+
end
|
389
|
+
|
390
|
+
let(:criteria) do
|
391
|
+
Band.all
|
392
|
+
end
|
393
|
+
|
394
|
+
let!(:deleted) do
|
395
|
+
criteria.with(write: { w: 0 }) do |crit|
|
396
|
+
crit.send(method)
|
397
|
+
end
|
398
|
+
end
|
399
|
+
|
400
|
+
it 'returns 0' do
|
401
|
+
expect(deleted).to eq(0)
|
402
|
+
end
|
403
|
+
end
|
366
404
|
end
|
367
405
|
|
368
406
|
describe "#distinct" do
|
@@ -413,7 +451,7 @@ describe Mongoid::Contextual::Mongo do
|
|
413
451
|
end
|
414
452
|
|
415
453
|
it "returns the distinct field values" do
|
416
|
-
expect(context.distinct(:years)).to eq([
|
454
|
+
expect(context.distinct(:years).sort).to eq([ 25, 30 ])
|
417
455
|
end
|
418
456
|
end
|
419
457
|
|
@@ -1124,6 +1162,92 @@ describe Mongoid::Contextual::Mongo do
|
|
1124
1162
|
end
|
1125
1163
|
end
|
1126
1164
|
|
1165
|
+
context 'when the criteria has no sort' do
|
1166
|
+
|
1167
|
+
let(:criteria) do
|
1168
|
+
Band.all
|
1169
|
+
end
|
1170
|
+
|
1171
|
+
let(:context) do
|
1172
|
+
described_class.new(criteria)
|
1173
|
+
end
|
1174
|
+
|
1175
|
+
|
1176
|
+
it 'applies a sort on _id' do
|
1177
|
+
expect(context.send(method)).to eq(depeche_mode)
|
1178
|
+
end
|
1179
|
+
|
1180
|
+
context 'when calling #last' do
|
1181
|
+
|
1182
|
+
it 'returns the last document, sorted by _id' do
|
1183
|
+
expect(context.send(method)).to eq(depeche_mode)
|
1184
|
+
expect(context.last).to eq(new_order)
|
1185
|
+
end
|
1186
|
+
end
|
1187
|
+
|
1188
|
+
context 'with option { sort: :none }' do
|
1189
|
+
|
1190
|
+
let(:opts) do
|
1191
|
+
{ id_sort: :none }
|
1192
|
+
end
|
1193
|
+
|
1194
|
+
it 'does not apply the sort on _id' do
|
1195
|
+
expect(context.send(method, opts)).to eq(depeche_mode)
|
1196
|
+
end
|
1197
|
+
|
1198
|
+
context 'when calling #last' do
|
1199
|
+
|
1200
|
+
it 'does not apply a sort on _id' do
|
1201
|
+
expect(context.send(method, opts)).to eq(depeche_mode)
|
1202
|
+
expect(context.last(opts)).to eq(depeche_mode)
|
1203
|
+
end
|
1204
|
+
end
|
1205
|
+
end
|
1206
|
+
end
|
1207
|
+
|
1208
|
+
context 'when the criteria has a sort' do
|
1209
|
+
|
1210
|
+
let(:criteria) do
|
1211
|
+
Band.desc(:name)
|
1212
|
+
end
|
1213
|
+
|
1214
|
+
let(:context) do
|
1215
|
+
described_class.new(criteria)
|
1216
|
+
end
|
1217
|
+
|
1218
|
+
|
1219
|
+
it 'applies the criteria sort' do
|
1220
|
+
expect(context.send(method)).to eq(new_order)
|
1221
|
+
end
|
1222
|
+
|
1223
|
+
context 'when calling #last' do
|
1224
|
+
|
1225
|
+
it 'applies the criteria sort' do
|
1226
|
+
expect(context.send(method)).to eq(new_order)
|
1227
|
+
expect(context.last).to eq(depeche_mode)
|
1228
|
+
end
|
1229
|
+
end
|
1230
|
+
|
1231
|
+
context 'with option { sort: :none }' do
|
1232
|
+
|
1233
|
+
let(:opts) do
|
1234
|
+
{ id_sort: :none }
|
1235
|
+
end
|
1236
|
+
|
1237
|
+
it 'applies the criteria sort' do
|
1238
|
+
expect(context.send(method, opts)).to eq(new_order)
|
1239
|
+
end
|
1240
|
+
|
1241
|
+
context 'when calling #last' do
|
1242
|
+
|
1243
|
+
it 'applies the criteria sort' do
|
1244
|
+
expect(context.send(method, opts)).to eq(new_order)
|
1245
|
+
expect(context.last(opts)).to eq(depeche_mode)
|
1246
|
+
end
|
1247
|
+
end
|
1248
|
+
end
|
1249
|
+
end
|
1250
|
+
|
1127
1251
|
context "when using .sort" do
|
1128
1252
|
|
1129
1253
|
let(:criteria) do
|
@@ -1674,6 +1798,65 @@ describe Mongoid::Contextual::Mongo do
|
|
1674
1798
|
end
|
1675
1799
|
end
|
1676
1800
|
|
1801
|
+
context "when the output specifies a different db" do
|
1802
|
+
|
1803
|
+
let(:criteria) do
|
1804
|
+
Band.limit(1)
|
1805
|
+
end
|
1806
|
+
|
1807
|
+
let(:context) do
|
1808
|
+
described_class.new(criteria)
|
1809
|
+
end
|
1810
|
+
|
1811
|
+
after do
|
1812
|
+
Band.with(database: 'another-db') do |b|
|
1813
|
+
b.all.delete
|
1814
|
+
end
|
1815
|
+
end
|
1816
|
+
|
1817
|
+
context 'when db is a string' do
|
1818
|
+
|
1819
|
+
let(:results) do
|
1820
|
+
context.map_reduce(map, reduce).out(merge: :mr_output, db: 'another-db')
|
1821
|
+
end
|
1822
|
+
|
1823
|
+
it "returns the correct number of documents" do
|
1824
|
+
expect(results.count).to eq(1)
|
1825
|
+
end
|
1826
|
+
|
1827
|
+
it "contains the entire results" do
|
1828
|
+
expect(results).to eq([
|
1829
|
+
{ "_id" => "Depeche Mode", "value" => { "likes" => 200 }}
|
1830
|
+
])
|
1831
|
+
end
|
1832
|
+
|
1833
|
+
it 'writes to the specified db' do
|
1834
|
+
expect(Band.mongo_client.with(database: 'another-db')[:mr_output].find.count).to eq(1)
|
1835
|
+
end
|
1836
|
+
end
|
1837
|
+
|
1838
|
+
context 'when db is a symbol' do
|
1839
|
+
|
1840
|
+
let(:results) do
|
1841
|
+
context.map_reduce(map, reduce).out(merge: :mr_output, 'db' => 'another-db')
|
1842
|
+
end
|
1843
|
+
|
1844
|
+
it "returns the correct number of documents" do
|
1845
|
+
expect(results.count).to eq(1)
|
1846
|
+
end
|
1847
|
+
|
1848
|
+
it "contains the entire results" do
|
1849
|
+
expect(results).to eq([
|
1850
|
+
{ "_id" => "Depeche Mode", "value" => { "likes" => 200 }}
|
1851
|
+
])
|
1852
|
+
end
|
1853
|
+
|
1854
|
+
it 'writes to the specified db' do
|
1855
|
+
expect(Band.mongo_client.with(database: 'another-db')[:mr_output].find.count).to eq(1)
|
1856
|
+
end
|
1857
|
+
end
|
1858
|
+
end
|
1859
|
+
|
1677
1860
|
context "when providing no output" do
|
1678
1861
|
|
1679
1862
|
let(:criteria) do
|
@@ -1949,6 +2132,41 @@ describe Mongoid::Contextual::Mongo do
|
|
1949
2132
|
expect(context.update).to be false
|
1950
2133
|
end
|
1951
2134
|
end
|
2135
|
+
|
2136
|
+
context 'when provided array filters', if: array_filters_supported? do
|
2137
|
+
|
2138
|
+
before do
|
2139
|
+
Band.delete_all
|
2140
|
+
b = Band.new(name: 'Depeche Mode')
|
2141
|
+
b.labels << Label.new(name: 'Warner')
|
2142
|
+
b.labels << Label.new(name: 'Sony')
|
2143
|
+
b.labels << Label.new(name: 'Cbs')
|
2144
|
+
b.save
|
2145
|
+
|
2146
|
+
b = Band.new(name: 'FKA Twigs')
|
2147
|
+
b.labels << Label.new(name: 'Warner')
|
2148
|
+
b.labels << Label.new(name: 'Cbs')
|
2149
|
+
b.save
|
2150
|
+
end
|
2151
|
+
|
2152
|
+
|
2153
|
+
let(:criteria) do
|
2154
|
+
Band.where(name: 'Depeche Mode')
|
2155
|
+
end
|
2156
|
+
|
2157
|
+
let!(:update) do
|
2158
|
+
context.update({ '$set' => { 'labels.$[i].name' => 'Sony' } },
|
2159
|
+
array_filters: [{ 'i.name' => 'Cbs' }])
|
2160
|
+
end
|
2161
|
+
|
2162
|
+
it 'applies the array filters' do
|
2163
|
+
expect(Band.where(name: 'Depeche Mode').first.labels.collect(&:name)).to match_array(['Warner', 'Sony', 'Sony'])
|
2164
|
+
end
|
2165
|
+
|
2166
|
+
it 'does not affect other documents' do
|
2167
|
+
expect(Band.where(name: 'FKA Twigs').first.labels.collect(&:name)).to match_array(['Warner', 'Cbs'])
|
2168
|
+
end
|
2169
|
+
end
|
1952
2170
|
end
|
1953
2171
|
|
1954
2172
|
describe "#update_all" do
|
@@ -2086,6 +2304,41 @@ describe Mongoid::Contextual::Mongo do
|
|
2086
2304
|
expect(context.update_all).to be false
|
2087
2305
|
end
|
2088
2306
|
end
|
2307
|
+
|
2308
|
+
context 'when provided array filters', if: array_filters_supported? do
|
2309
|
+
|
2310
|
+
before do
|
2311
|
+
Band.delete_all
|
2312
|
+
b = Band.new(name: 'Depeche Mode')
|
2313
|
+
b.labels << Label.new(name: 'Warner')
|
2314
|
+
b.labels << Label.new(name: 'Sony')
|
2315
|
+
b.labels << Label.new(name: 'Cbs')
|
2316
|
+
b.save
|
2317
|
+
|
2318
|
+
b = Band.new(name: 'FKA Twigs')
|
2319
|
+
b.labels << Label.new(name: 'Warner')
|
2320
|
+
b.labels << Label.new(name: 'Cbs')
|
2321
|
+
b.save
|
2322
|
+
end
|
2323
|
+
|
2324
|
+
|
2325
|
+
let(:criteria) do
|
2326
|
+
Band.all
|
2327
|
+
end
|
2328
|
+
|
2329
|
+
let!(:update) do
|
2330
|
+
context.update_all({ '$set' => { 'labels.$[i].name' => 'Sony' } },
|
2331
|
+
array_filters: [{ 'i.name' => 'Cbs' }])
|
2332
|
+
end
|
2333
|
+
|
2334
|
+
it 'applies the array filters' do
|
2335
|
+
expect(Band.where(name: 'Depeche Mode').first.labels.collect(&:name)).to match_array(['Warner', 'Sony', 'Sony'])
|
2336
|
+
end
|
2337
|
+
|
2338
|
+
it 'updates all documents' do
|
2339
|
+
expect(Band.where(name: 'FKA Twigs').first.labels.collect(&:name)).to match_array(['Warner', 'Sony'])
|
2340
|
+
end
|
2341
|
+
end
|
2089
2342
|
end
|
2090
2343
|
|
2091
2344
|
describe '#pipeline' do
|
@@ -2110,7 +2363,7 @@ describe Mongoid::Contextual::Mongo do
|
|
2110
2363
|
end
|
2111
2364
|
|
2112
2365
|
it 'creates a pipeline with the selector as one of the $match criteria' do
|
2113
|
-
expect(pipeline_match).to include({
|
2366
|
+
expect(pipeline_match).to include({ '$text' => { '$search' => "New Order" } })
|
2114
2367
|
end
|
2115
2368
|
|
2116
2369
|
it 'creates a pipeline with the $exists operator as one of the $match criteria' do
|
@@ -65,6 +65,21 @@ describe Mongoid::Contextual::None do
|
|
65
65
|
end
|
66
66
|
end
|
67
67
|
|
68
|
+
describe "#distinct" do
|
69
|
+
|
70
|
+
let!(:band) do
|
71
|
+
Band.create(name: "Depeche Mode")
|
72
|
+
end
|
73
|
+
|
74
|
+
let(:context) do
|
75
|
+
described_class.new(Band.where(name: "Depeche Mode"))
|
76
|
+
end
|
77
|
+
|
78
|
+
it "returns an empty array" do
|
79
|
+
expect(context.distinct(:id)).to eq([])
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
68
83
|
describe "#pluck" do
|
69
84
|
|
70
85
|
let!(:band) do
|
@@ -54,22 +54,31 @@ describe Mongoid::Copyable do
|
|
54
54
|
end
|
55
55
|
end
|
56
56
|
|
57
|
-
context "when a document has
|
57
|
+
context "when a document has fields from a legacy schema" do
|
58
58
|
|
59
59
|
let!(:actor) do
|
60
60
|
Actor.create(name: "test")
|
61
61
|
end
|
62
62
|
|
63
63
|
before do
|
64
|
-
|
64
|
+
legacy_fields = { "this_is_not_a_field" => 1, "this_legacy_field_is_nil" => nil }
|
65
|
+
Actor.collection.find(_id: actor.id).update_one("$set" => legacy_fields)
|
65
66
|
end
|
66
67
|
|
67
68
|
let(:cloned) do
|
68
69
|
actor.reload.send(method)
|
69
70
|
end
|
70
71
|
|
71
|
-
it "
|
72
|
-
expect(cloned.this_is_not_a_field).to eq(1)
|
72
|
+
it "sets the legacy attribute" do
|
73
|
+
expect(cloned.attributes['this_is_not_a_field']).to eq(1)
|
74
|
+
end
|
75
|
+
|
76
|
+
it "contains legacy attributes that are nil" do
|
77
|
+
expect(cloned.attributes.key?('this_legacy_field_is_nil')).to eq(true)
|
78
|
+
end
|
79
|
+
|
80
|
+
it "copies the known attributes" do
|
81
|
+
expect(cloned.name).to eq('test')
|
73
82
|
end
|
74
83
|
end
|
75
84
|
|