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
|
@@ -202,7 +202,7 @@ describe Mongoid::Association::Embedded::EmbedsOne::Proxy do
|
|
|
202
202
|
end
|
|
203
203
|
end
|
|
204
204
|
end
|
|
205
|
-
|
|
205
|
+
|
|
206
206
|
context 'when the original document does not need to be unset because it will be replaced by the $set' do
|
|
207
207
|
|
|
208
208
|
let!(:pet_owner) do
|
|
@@ -971,7 +971,7 @@ describe Mongoid::Association::Embedded::EmbedsOne::Proxy do
|
|
|
971
971
|
before do
|
|
972
972
|
band.collection.
|
|
973
973
|
find(_id: band.id).
|
|
974
|
-
update_one("$set" => { label: { name: "Mute" }})
|
|
974
|
+
update_one("$set" => { label: { _id: BSON::ObjectId.new, name: "Mute" }})
|
|
975
975
|
end
|
|
976
976
|
|
|
977
977
|
context "when loading the documents" do
|
|
@@ -1022,4 +1022,17 @@ describe Mongoid::Association::Embedded::EmbedsOne::Proxy do
|
|
|
1022
1022
|
expect(building.building_address).to be_a(BuildingAddress)
|
|
1023
1023
|
end
|
|
1024
1024
|
end
|
|
1025
|
+
|
|
1026
|
+
context "when assigning a hash" do
|
|
1027
|
+
let(:building) { Building.create! }
|
|
1028
|
+
|
|
1029
|
+
before do
|
|
1030
|
+
building.building_address = { city: "NYC" }
|
|
1031
|
+
end
|
|
1032
|
+
|
|
1033
|
+
it "creates the objects correctly" do
|
|
1034
|
+
expect(building.building_address).to be_a(BuildingAddress)
|
|
1035
|
+
expect(building.building_address.city).to eq("NYC")
|
|
1036
|
+
end
|
|
1037
|
+
end
|
|
1025
1038
|
end
|
|
@@ -546,17 +546,7 @@ describe Mongoid::Association::Referenced::BelongsTo do
|
|
|
546
546
|
end
|
|
547
547
|
|
|
548
548
|
context 'when the global config option is true' do
|
|
549
|
-
|
|
550
|
-
around(:example) do |example|
|
|
551
|
-
original_config = Mongoid.belongs_to_required_by_default
|
|
552
|
-
Mongoid.belongs_to_required_by_default = true
|
|
553
|
-
example.run
|
|
554
|
-
Mongoid.belongs_to_required_by_default = original_config
|
|
555
|
-
end
|
|
556
|
-
|
|
557
|
-
let!(:original_required_config) do
|
|
558
|
-
Mongoid.belongs_to_required_by_default
|
|
559
|
-
end
|
|
549
|
+
config_override :belongs_to_required_by_default, true
|
|
560
550
|
|
|
561
551
|
context 'when the required option is true' do
|
|
562
552
|
|
|
@@ -684,13 +674,7 @@ describe Mongoid::Association::Referenced::BelongsTo do
|
|
|
684
674
|
end
|
|
685
675
|
|
|
686
676
|
context 'when the global config option is false' do
|
|
687
|
-
|
|
688
|
-
around(:example) do |example|
|
|
689
|
-
original_config = Mongoid.belongs_to_required_by_default
|
|
690
|
-
Mongoid.belongs_to_required_by_default = false
|
|
691
|
-
example.run
|
|
692
|
-
Mongoid.belongs_to_required_by_default = original_config
|
|
693
|
-
end
|
|
677
|
+
config_override :belongs_to_required_by_default, false
|
|
694
678
|
|
|
695
679
|
context 'when the required option is true' do
|
|
696
680
|
|
|
@@ -4,14 +4,12 @@ require "spec_helper"
|
|
|
4
4
|
require_relative "../has_and_belongs_to_many_models"
|
|
5
5
|
|
|
6
6
|
describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
|
|
7
|
+
config_override :raise_not_found_error, true
|
|
7
8
|
|
|
8
9
|
around(:each) do |example|
|
|
9
|
-
original_raise_not_found_error = Mongoid.raise_not_found_error
|
|
10
10
|
original_preferences_association = Person.relations["preferences"]
|
|
11
|
-
Mongoid.raise_not_found_error = true
|
|
12
11
|
Person.has_and_belongs_to_many :preferences, autosave: true
|
|
13
12
|
example.run
|
|
14
|
-
Mongoid.raise_not_found_error = original_raise_not_found_error
|
|
15
13
|
Person.relations["preferences"] = original_preferences_association
|
|
16
14
|
end
|
|
17
15
|
|
|
@@ -2087,283 +2085,229 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
|
|
|
2087
2085
|
end
|
|
2088
2086
|
end
|
|
2089
2087
|
|
|
2090
|
-
|
|
2088
|
+
%i[ delete delete_one ].each do |method|
|
|
2089
|
+
describe "\##{method}" do
|
|
2090
|
+
let(:person) { Person.create! }
|
|
2091
|
+
let(:preference_one) { Preference.create!(name: "Testing") }
|
|
2092
|
+
let(:preference_two) { Preference.create!(name: "Test") }
|
|
2091
2093
|
|
|
2092
|
-
|
|
2093
|
-
|
|
2094
|
-
end
|
|
2095
|
-
|
|
2096
|
-
let(:preference_one) do
|
|
2097
|
-
Preference.create!(name: "Testing")
|
|
2098
|
-
end
|
|
2099
|
-
|
|
2100
|
-
let(:preference_two) do
|
|
2101
|
-
Preference.create!(name: "Test")
|
|
2102
|
-
end
|
|
2103
|
-
|
|
2104
|
-
before do
|
|
2105
|
-
person.preferences << [ preference_one, preference_two ]
|
|
2106
|
-
end
|
|
2107
|
-
|
|
2108
|
-
context "when the document exists" do
|
|
2109
|
-
|
|
2110
|
-
let!(:deleted) do
|
|
2111
|
-
person.preferences.delete(preference_one)
|
|
2112
|
-
end
|
|
2113
|
-
|
|
2114
|
-
it "removes the document from the relation" do
|
|
2115
|
-
expect(person.preferences).to eq([ preference_two ])
|
|
2116
|
-
end
|
|
2117
|
-
|
|
2118
|
-
it "returns the document" do
|
|
2119
|
-
expect(deleted).to eq(preference_one)
|
|
2120
|
-
end
|
|
2121
|
-
|
|
2122
|
-
it "removes the document key from the foreign key" do
|
|
2123
|
-
expect(person.preference_ids).to eq([ preference_two.id ])
|
|
2124
|
-
end
|
|
2125
|
-
|
|
2126
|
-
it "removes the inverse reference" do
|
|
2127
|
-
expect(deleted.reload.people).to be_empty
|
|
2128
|
-
end
|
|
2129
|
-
|
|
2130
|
-
it "removes the base id from the inverse keys" do
|
|
2131
|
-
expect(deleted.reload.person_ids).to be_empty
|
|
2094
|
+
before do
|
|
2095
|
+
person.preferences << [ preference_one, preference_two ]
|
|
2132
2096
|
end
|
|
2133
2097
|
|
|
2134
|
-
context
|
|
2135
|
-
|
|
2136
|
-
|
|
2137
|
-
person.reload
|
|
2138
|
-
preference_one.reload
|
|
2139
|
-
preference_two.reload
|
|
2098
|
+
context 'when the document exists' do
|
|
2099
|
+
let!(:deleted) do
|
|
2100
|
+
person.preferences.send(method, preference_one)
|
|
2140
2101
|
end
|
|
2141
2102
|
|
|
2142
|
-
it
|
|
2103
|
+
it 'removes the document from the relation' do
|
|
2143
2104
|
expect(person.preferences).to eq([ preference_two ])
|
|
2144
2105
|
end
|
|
2145
2106
|
|
|
2146
|
-
it
|
|
2147
|
-
expect(
|
|
2107
|
+
it 'returns the document' do
|
|
2108
|
+
expect(deleted).to eq(preference_one)
|
|
2148
2109
|
end
|
|
2149
|
-
end
|
|
2150
|
-
end
|
|
2151
|
-
|
|
2152
|
-
context "when the document does not exist" do
|
|
2153
|
-
|
|
2154
|
-
let!(:deleted) do
|
|
2155
|
-
person.preferences.delete(Preference.new)
|
|
2156
|
-
end
|
|
2157
2110
|
|
|
2158
|
-
|
|
2159
|
-
|
|
2160
|
-
end
|
|
2161
|
-
|
|
2162
|
-
it "does not modify the relation" do
|
|
2163
|
-
expect(person.preferences).to eq([ preference_one, preference_two ])
|
|
2164
|
-
end
|
|
2165
|
-
|
|
2166
|
-
it "does not modify the keys" do
|
|
2167
|
-
expect(person.preference_ids).to eq([ preference_one.id, preference_two.id ])
|
|
2168
|
-
end
|
|
2169
|
-
end
|
|
2170
|
-
|
|
2171
|
-
context "when :dependent => :nullify is set" do
|
|
2172
|
-
|
|
2173
|
-
context "when :inverse_of is set" do
|
|
2174
|
-
|
|
2175
|
-
let(:event) do
|
|
2176
|
-
Event.create!
|
|
2111
|
+
it 'removes the document key from the foreign key' do
|
|
2112
|
+
expect(person.preference_ids).to eq([ preference_two.id ])
|
|
2177
2113
|
end
|
|
2178
2114
|
|
|
2179
|
-
|
|
2180
|
-
|
|
2115
|
+
it 'removes the inverse reference' do
|
|
2116
|
+
expect(deleted.reload.people).to be_empty
|
|
2181
2117
|
end
|
|
2182
2118
|
|
|
2183
|
-
it
|
|
2184
|
-
expect(
|
|
2119
|
+
it 'removes the base id from the inverse keys' do
|
|
2120
|
+
expect(deleted.reload.person_ids).to be_empty
|
|
2185
2121
|
end
|
|
2186
|
-
end
|
|
2187
|
-
end
|
|
2188
|
-
|
|
2189
|
-
context "when the relationships are self referencing" do
|
|
2190
2122
|
|
|
2191
|
-
|
|
2192
|
-
|
|
2193
|
-
|
|
2123
|
+
context 'and person and preferences are reloaded' do
|
|
2124
|
+
before do
|
|
2125
|
+
person.reload
|
|
2126
|
+
preference_one.reload
|
|
2127
|
+
preference_two.reload
|
|
2128
|
+
end
|
|
2194
2129
|
|
|
2195
|
-
|
|
2196
|
-
|
|
2197
|
-
|
|
2130
|
+
it 'nullifies the deleted preference' do
|
|
2131
|
+
expect(person.preferences).to eq([ preference_two ])
|
|
2132
|
+
end
|
|
2198
2133
|
|
|
2199
|
-
|
|
2200
|
-
|
|
2134
|
+
it 'retains the ids for one preference' do
|
|
2135
|
+
expect(person.preference_ids).to eq([ preference_two.id ])
|
|
2136
|
+
end
|
|
2137
|
+
end
|
|
2201
2138
|
end
|
|
2202
2139
|
|
|
2203
|
-
context
|
|
2204
|
-
|
|
2140
|
+
context 'when the document does not exist' do
|
|
2205
2141
|
let!(:deleted) do
|
|
2206
|
-
|
|
2142
|
+
person.preferences.send(method, Preference.new)
|
|
2207
2143
|
end
|
|
2208
2144
|
|
|
2209
|
-
it
|
|
2210
|
-
expect(
|
|
2145
|
+
it 'returns nil' do
|
|
2146
|
+
expect(deleted).to be_nil
|
|
2211
2147
|
end
|
|
2212
2148
|
|
|
2213
|
-
it
|
|
2214
|
-
expect(
|
|
2149
|
+
it 'does not modify the relation' do
|
|
2150
|
+
expect(person.preferences).to eq([ preference_one, preference_two ])
|
|
2215
2151
|
end
|
|
2216
2152
|
|
|
2217
|
-
it
|
|
2218
|
-
expect(
|
|
2219
|
-
end
|
|
2220
|
-
|
|
2221
|
-
it "removes the foreign keys from the inverse" do
|
|
2222
|
-
expect(deleted.related_ids).to be_empty
|
|
2153
|
+
it 'does not modify the keys' do
|
|
2154
|
+
expect(person.preference_ids).to eq([ preference_one.id, preference_two.id ])
|
|
2223
2155
|
end
|
|
2224
2156
|
end
|
|
2225
2157
|
|
|
2226
|
-
context
|
|
2227
|
-
|
|
2228
|
-
|
|
2229
|
-
|
|
2230
|
-
let(:reloaded) do
|
|
2231
|
-
tag_one.reload
|
|
2232
|
-
end
|
|
2233
|
-
|
|
2234
|
-
let!(:deleted) do
|
|
2235
|
-
reloaded.related.delete(tag_two)
|
|
2236
|
-
end
|
|
2158
|
+
context 'when :dependent => :nullify is set' do
|
|
2159
|
+
context 'when :inverse_of is set' do
|
|
2160
|
+
let(:event) { Event.create! }
|
|
2237
2161
|
|
|
2238
|
-
|
|
2239
|
-
|
|
2162
|
+
before do
|
|
2163
|
+
person.administrated_events << [ event ]
|
|
2240
2164
|
end
|
|
2241
2165
|
|
|
2242
|
-
it
|
|
2243
|
-
expect(
|
|
2166
|
+
it 'deletes the document' do
|
|
2167
|
+
expect(event.delete).to be true
|
|
2244
2168
|
end
|
|
2169
|
+
end
|
|
2170
|
+
end
|
|
2245
2171
|
|
|
2246
|
-
|
|
2247
|
-
|
|
2248
|
-
|
|
2172
|
+
context 'when the relationships are self referencing' do
|
|
2173
|
+
let(:tag_one) { Tag.create!(text: "one") }
|
|
2174
|
+
let(:tag_two) { Tag.create!(text: "two") }
|
|
2249
2175
|
|
|
2250
|
-
|
|
2251
|
-
|
|
2252
|
-
end
|
|
2176
|
+
before do
|
|
2177
|
+
tag_one.related << tag_two
|
|
2253
2178
|
end
|
|
2254
2179
|
|
|
2255
|
-
context
|
|
2180
|
+
context 'when deleting without reloading' do
|
|
2181
|
+
let!(:deleted) { tag_one.related.send(method, tag_two) }
|
|
2256
2182
|
|
|
2257
|
-
|
|
2258
|
-
|
|
2259
|
-
end
|
|
2260
|
-
|
|
2261
|
-
let!(:deleted) do
|
|
2262
|
-
reloaded.related.delete(tag_one)
|
|
2183
|
+
it 'deletes the document from the relation' do
|
|
2184
|
+
expect(tag_one.related).to be_empty
|
|
2263
2185
|
end
|
|
2264
2186
|
|
|
2265
|
-
it
|
|
2266
|
-
expect(
|
|
2187
|
+
it 'deletes the foreign key from the relation' do
|
|
2188
|
+
expect(tag_one.related_ids).to be_empty
|
|
2267
2189
|
end
|
|
2268
2190
|
|
|
2269
|
-
it
|
|
2270
|
-
expect(
|
|
2191
|
+
it 'removes the reference from the inverse' do
|
|
2192
|
+
expect(deleted.related).to be_empty
|
|
2271
2193
|
end
|
|
2272
2194
|
|
|
2273
|
-
it
|
|
2195
|
+
it 'removes the foreign keys from the inverse' do
|
|
2274
2196
|
expect(deleted.related_ids).to be_empty
|
|
2275
2197
|
end
|
|
2276
2198
|
end
|
|
2277
|
-
end
|
|
2278
|
-
end
|
|
2279
2199
|
|
|
2280
|
-
|
|
2200
|
+
context 'when deleting with reloading' do
|
|
2201
|
+
context "when deleting from the front side" do
|
|
2202
|
+
let(:reloaded) { tag_one.reload }
|
|
2203
|
+
let!(:deleted) { reloaded.related.send(method, tag_two) }
|
|
2281
2204
|
|
|
2282
|
-
|
|
2283
|
-
|
|
2284
|
-
|
|
2205
|
+
it 'deletes the document from the relation' do
|
|
2206
|
+
expect(reloaded.related).to be_empty
|
|
2207
|
+
end
|
|
2285
2208
|
|
|
2286
|
-
|
|
2287
|
-
|
|
2288
|
-
|
|
2209
|
+
it 'deletes the foreign key from the relation' do
|
|
2210
|
+
expect(reloaded.related_ids).to be_empty
|
|
2211
|
+
end
|
|
2289
2212
|
|
|
2290
|
-
|
|
2291
|
-
|
|
2292
|
-
|
|
2213
|
+
it 'removes the reference from the inverse' do
|
|
2214
|
+
expect(deleted.related).to be_empty
|
|
2215
|
+
end
|
|
2293
2216
|
|
|
2294
|
-
|
|
2217
|
+
it 'removes the foreign keys from the inverse' do
|
|
2218
|
+
expect(deleted.related_ids).to be_empty
|
|
2219
|
+
end
|
|
2220
|
+
end
|
|
2295
2221
|
|
|
2296
|
-
|
|
2222
|
+
context 'when deleting from the inverse side' do
|
|
2223
|
+
let(:reloaded) { tag_two.reload }
|
|
2224
|
+
let!(:deleted) { reloaded.related.send(method, tag_one) }
|
|
2297
2225
|
|
|
2298
|
-
|
|
2299
|
-
|
|
2300
|
-
|
|
2226
|
+
it 'deletes the document from the relation' do
|
|
2227
|
+
expect(reloaded.related).to be_empty
|
|
2228
|
+
end
|
|
2301
2229
|
|
|
2302
|
-
|
|
2303
|
-
|
|
2304
|
-
|
|
2230
|
+
it 'deletes the foreign key from the relation' do
|
|
2231
|
+
expect(reloaded.related_ids).to be_empty
|
|
2232
|
+
end
|
|
2305
2233
|
|
|
2306
|
-
|
|
2307
|
-
|
|
2234
|
+
it 'removes the foreign keys from the inverse' do
|
|
2235
|
+
expect(deleted.related_ids).to be_empty
|
|
2236
|
+
end
|
|
2308
2237
|
end
|
|
2309
2238
|
end
|
|
2239
|
+
end
|
|
2310
2240
|
|
|
2311
|
-
|
|
2241
|
+
context 'when the association has callbacks' do
|
|
2242
|
+
let(:post) { Post.new }
|
|
2243
|
+
let(:tag) { Tag.new }
|
|
2312
2244
|
|
|
2313
|
-
|
|
2314
|
-
|
|
2315
|
-
begin; post.tags.delete(tag); rescue; end
|
|
2316
|
-
end
|
|
2317
|
-
|
|
2318
|
-
it "does not remove the document from the relation" do
|
|
2319
|
-
expect(post.tags).to eq([ tag ])
|
|
2320
|
-
end
|
|
2245
|
+
before do
|
|
2246
|
+
post.tags << tag
|
|
2321
2247
|
end
|
|
2322
|
-
end
|
|
2323
2248
|
|
|
2324
|
-
|
|
2249
|
+
context 'when the callback is a before_remove' do
|
|
2250
|
+
context 'when there are no errors' do
|
|
2251
|
+
before do
|
|
2252
|
+
post.tags.send(method, tag)
|
|
2253
|
+
end
|
|
2325
2254
|
|
|
2326
|
-
|
|
2255
|
+
it 'executes the callback' do
|
|
2256
|
+
expect(post.before_remove_called).to be true
|
|
2257
|
+
end
|
|
2327
2258
|
|
|
2328
|
-
|
|
2329
|
-
|
|
2259
|
+
it 'removes the document from the relation' do
|
|
2260
|
+
expect(post.tags).to be_empty
|
|
2261
|
+
end
|
|
2330
2262
|
end
|
|
2331
2263
|
|
|
2332
|
-
|
|
2333
|
-
|
|
2334
|
-
|
|
2264
|
+
context "when errors are raised" do
|
|
2265
|
+
before do
|
|
2266
|
+
expect(post).to receive(:before_remove_tag).and_raise
|
|
2267
|
+
begin; post.tags.send(method, tag); rescue; end
|
|
2268
|
+
end
|
|
2335
2269
|
|
|
2336
|
-
|
|
2337
|
-
|
|
2270
|
+
it 'does not remove the document from the relation' do
|
|
2271
|
+
expect(post.tags).to eq([ tag ])
|
|
2272
|
+
end
|
|
2338
2273
|
end
|
|
2339
2274
|
end
|
|
2340
2275
|
|
|
2341
|
-
context
|
|
2276
|
+
context 'when the callback is an after_remove' do
|
|
2277
|
+
context 'when no errors are raised' do
|
|
2278
|
+
before do
|
|
2279
|
+
post.tags.send(method, tag)
|
|
2280
|
+
end
|
|
2342
2281
|
|
|
2343
|
-
|
|
2344
|
-
|
|
2345
|
-
|
|
2282
|
+
it 'executes the callback' do
|
|
2283
|
+
expect(post.after_remove_called).to be true
|
|
2284
|
+
end
|
|
2285
|
+
|
|
2286
|
+
it 'removes the document from the relation' do
|
|
2287
|
+
expect(post.tags).to be_empty
|
|
2288
|
+
end
|
|
2346
2289
|
end
|
|
2347
2290
|
|
|
2348
|
-
|
|
2349
|
-
|
|
2291
|
+
context 'when errors are raised' do
|
|
2292
|
+
before do
|
|
2293
|
+
expect(post).to receive(:after_remove_tag).and_raise
|
|
2294
|
+
begin; post.tags.send(method, tag); rescue; end
|
|
2295
|
+
end
|
|
2296
|
+
|
|
2297
|
+
it 'removes the document from the relation' do
|
|
2298
|
+
expect(post.tags).to be_empty
|
|
2299
|
+
end
|
|
2350
2300
|
end
|
|
2351
2301
|
end
|
|
2352
2302
|
end
|
|
2353
2303
|
end
|
|
2354
2304
|
end
|
|
2355
2305
|
|
|
2356
|
-
[
|
|
2357
|
-
|
|
2358
|
-
|
|
2359
|
-
|
|
2360
|
-
|
|
2361
|
-
|
|
2362
|
-
context "when conditions are provided" do
|
|
2363
|
-
|
|
2364
|
-
let(:person) do
|
|
2365
|
-
Person.create!
|
|
2366
|
-
end
|
|
2306
|
+
%i[ delete_all destroy_all ].each do |method|
|
|
2307
|
+
describe "\##{method}" do
|
|
2308
|
+
context 'when the relation is not polymorphic' do
|
|
2309
|
+
context 'when conditions are provided' do
|
|
2310
|
+
let(:person) { Person.create! }
|
|
2367
2311
|
|
|
2368
2312
|
let!(:preference_one) do
|
|
2369
2313
|
person.preferences.create!(name: "Testing")
|
|
@@ -2523,10 +2467,7 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
|
|
|
2523
2467
|
context "when the id does not match" do
|
|
2524
2468
|
|
|
2525
2469
|
context "when config set to raise error" do
|
|
2526
|
-
|
|
2527
|
-
before do
|
|
2528
|
-
Mongoid.raise_not_found_error = true
|
|
2529
|
-
end
|
|
2470
|
+
config_override :raise_not_found_error, true
|
|
2530
2471
|
|
|
2531
2472
|
it "raises an error" do
|
|
2532
2473
|
expect {
|
|
@@ -2536,19 +2477,12 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
|
|
|
2536
2477
|
end
|
|
2537
2478
|
|
|
2538
2479
|
context "when config set not to raise error" do
|
|
2480
|
+
config_override :raise_not_found_error, false
|
|
2539
2481
|
|
|
2540
2482
|
let(:preference) do
|
|
2541
2483
|
person.preferences.find(BSON::ObjectId.new)
|
|
2542
2484
|
end
|
|
2543
2485
|
|
|
2544
|
-
before do
|
|
2545
|
-
Mongoid.raise_not_found_error = false
|
|
2546
|
-
end
|
|
2547
|
-
|
|
2548
|
-
after do
|
|
2549
|
-
Mongoid.raise_not_found_error = true
|
|
2550
|
-
end
|
|
2551
|
-
|
|
2552
2486
|
it "returns nil" do
|
|
2553
2487
|
expect(preference).to be_nil
|
|
2554
2488
|
end
|
|
@@ -2587,10 +2521,7 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
|
|
|
2587
2521
|
context "when the ids do not match" do
|
|
2588
2522
|
|
|
2589
2523
|
context "when config set to raise error" do
|
|
2590
|
-
|
|
2591
|
-
before do
|
|
2592
|
-
Mongoid.raise_not_found_error = true
|
|
2593
|
-
end
|
|
2524
|
+
config_override :raise_not_found_error, true
|
|
2594
2525
|
|
|
2595
2526
|
it "raises an error" do
|
|
2596
2527
|
expect {
|
|
@@ -2600,19 +2531,12 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
|
|
|
2600
2531
|
end
|
|
2601
2532
|
|
|
2602
2533
|
context "when config set not to raise error" do
|
|
2534
|
+
config_override :raise_not_found_error, false
|
|
2603
2535
|
|
|
2604
2536
|
let(:preferences) do
|
|
2605
2537
|
person.preferences.find([ BSON::ObjectId.new ])
|
|
2606
2538
|
end
|
|
2607
2539
|
|
|
2608
|
-
before do
|
|
2609
|
-
Mongoid.raise_not_found_error = false
|
|
2610
|
-
end
|
|
2611
|
-
|
|
2612
|
-
after do
|
|
2613
|
-
Mongoid.raise_not_found_error = true
|
|
2614
|
-
end
|
|
2615
|
-
|
|
2616
2540
|
it "returns an empty array" do
|
|
2617
2541
|
expect(preferences).to be_empty
|
|
2618
2542
|
end
|