mongoid 5.4.1 → 6.1.1
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 +5 -5
- data/README.md +3 -3
- data/lib/config/locales/en.yml +19 -0
- data/lib/mongoid.rb +4 -4
- data/lib/mongoid/atomic.rb +2 -2
- data/lib/mongoid/atomic/modifiers.rb +8 -12
- data/lib/mongoid/attributes.rb +22 -21
- data/lib/mongoid/attributes/readonly.rb +22 -0
- data/lib/mongoid/cacheable.rb +36 -0
- data/lib/mongoid/changeable.rb +36 -0
- data/lib/mongoid/clients.rb +8 -63
- data/lib/mongoid/clients/options.rb +55 -250
- data/lib/mongoid/clients/storage_options.rb +1 -69
- data/lib/mongoid/composable.rb +29 -3
- data/lib/mongoid/config.rb +1 -0
- data/lib/mongoid/contextual/atomic.rb +5 -8
- data/lib/mongoid/contextual/map_reduce.rb +0 -4
- data/lib/mongoid/contextual/memory.rb +2 -2
- data/lib/mongoid/contextual/mongo.rb +40 -22
- data/lib/mongoid/contextual/none.rb +12 -0
- data/lib/mongoid/copyable.rb +13 -6
- data/lib/mongoid/criteria.rb +5 -2
- data/lib/mongoid/criteria/marshalable.rb +2 -2
- data/lib/mongoid/criteria/modifiable.rb +17 -1
- data/lib/mongoid/criteria/options.rb +25 -0
- data/lib/mongoid/criteria/queryable.rb +87 -0
- data/lib/mongoid/criteria/queryable/aggregable.rb +120 -0
- data/lib/mongoid/criteria/queryable/extensions.rb +28 -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/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 +271 -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 +662 -0
- data/lib/mongoid/criteria/queryable/selector.rb +212 -0
- data/lib/mongoid/criteria/queryable/smash.rb +104 -0
- data/lib/mongoid/document.rb +30 -37
- data/lib/mongoid/errors.rb +2 -0
- 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/evolvable.rb +1 -1
- data/lib/mongoid/extensions.rb +0 -4
- 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/string.rb +4 -3
- data/lib/mongoid/extensions/time.rb +4 -1
- data/lib/mongoid/fields/validators/macro.rb +18 -0
- data/lib/mongoid/findable.rb +2 -2
- data/lib/mongoid/indexable.rb +15 -13
- data/lib/mongoid/interceptable.rb +5 -22
- data/lib/mongoid/matchable.rb +13 -7
- 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/or.rb +3 -3
- data/lib/mongoid/matchable/regexp.rb +3 -3
- data/lib/mongoid/matchable/size.rb +2 -2
- data/lib/mongoid/persistable.rb +3 -5
- data/lib/mongoid/persistable/creatable.rb +2 -2
- data/lib/mongoid/persistable/deletable.rb +1 -1
- data/lib/mongoid/persistable/settable.rb +1 -1
- data/lib/mongoid/persistable/updatable.rb +5 -12
- data/lib/mongoid/persistable/upsertable.rb +1 -1
- data/lib/mongoid/persistence_context.rb +215 -0
- data/lib/mongoid/query_cache.rb +3 -6
- 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.rb +6 -11
- 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/embedded/batchable.rb +12 -36
- data/lib/mongoid/relations/embedded/in.rb +13 -1
- data/lib/mongoid/relations/embedded/many.rb +28 -10
- data/lib/mongoid/relations/embedded/one.rb +14 -1
- data/lib/mongoid/relations/macros.rb +9 -1
- 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 +23 -17
- 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 +11 -11
- data/lib/mongoid/relations/touchable.rb +6 -3
- data/lib/mongoid/reloadable.rb +1 -1
- data/lib/mongoid/serializable.rb +1 -1
- data/lib/mongoid/traversable.rb +1 -1
- data/lib/mongoid/validatable/uniqueness.rb +1 -2
- data/lib/mongoid/version.rb +1 -1
- data/lib/rails/generators/mongoid/config/templates/mongoid.yml +14 -3
- data/spec/app/models/album.rb +5 -1
- data/spec/app/models/artist.rb +21 -0
- data/spec/app/models/book.rb +2 -1
- 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/mongoid/atomic/modifiers_spec.rb +17 -17
- data/spec/mongoid/atomic_spec.rb +17 -17
- data/spec/mongoid/attributes/nested_spec.rb +14 -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 +31 -3
- data/spec/mongoid/clients/options_spec.rb +382 -96
- 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/mongo_spec.rb +165 -20
- data/spec/mongoid/contextual/none_spec.rb +15 -0
- data/spec/mongoid/copyable_spec.rb +13 -4
- data/spec/mongoid/criteria/modifiable_spec.rb +239 -7
- 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 +4174 -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_spec.rb +152 -21
- data/spec/mongoid/document_spec.rb +37 -88
- 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 +320 -18
- 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/string_spec.rb +21 -0
- data/spec/mongoid/extensions/time_spec.rb +2 -6
- data/spec/mongoid/extensions/time_with_zone_spec.rb +2 -6
- data/spec/mongoid/findable_spec.rb +46 -1
- data/spec/mongoid/indexable_spec.rb +15 -3
- data/spec/mongoid/interceptable_spec.rb +68 -10
- 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/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 +173 -53
- data/spec/mongoid/persistable/creatable_spec.rb +7 -2
- data/spec/mongoid/persistable/deletable_spec.rb +16 -1
- data/spec/mongoid/persistable/destroyable_spec.rb +6 -2
- data/spec/mongoid/persistable/savable_spec.rb +35 -30
- data/spec/mongoid/persistable/settable_spec.rb +45 -29
- data/spec/mongoid/persistable/updatable_spec.rb +184 -5
- data/spec/mongoid/persistence_context_spec.rb +680 -0
- data/spec/mongoid/positional_spec.rb +10 -10
- data/spec/mongoid/query_cache_spec.rb +89 -0
- 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 +63 -47
- data/spec/mongoid/relations/embedded/one_spec.rb +2 -1
- data/spec/mongoid/relations/macros_spec.rb +395 -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 +13 -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/touchable_spec.rb +40 -0
- data/spec/mongoid/reloadable_spec.rb +51 -0
- data/spec/mongoid/serializable_spec.rb +0 -50
- 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/spec_helper.rb +20 -11
- metadata +524 -469
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/lib/mongoid/clients/thread_options.rb +0 -19
- data/lib/mongoid/extensions/origin/regexp_raw.rb +0 -43
- metadata.gz.sig +0 -0
@@ -428,22 +428,40 @@ describe Mongoid::Relations::Embedded::Many do
|
|
428
428
|
context "when replacing an existing relation" do
|
429
429
|
|
430
430
|
let(:person) do
|
431
|
-
Person.create(addresses:
|
431
|
+
Person.create(addresses: addresses)
|
432
|
+
end
|
433
|
+
|
434
|
+
let(:addresses) do
|
435
|
+
[
|
432
436
|
Address.new(street: "1st St"),
|
433
437
|
Address.new(street: "2nd St")
|
434
|
-
]
|
438
|
+
]
|
435
439
|
end
|
436
440
|
|
437
441
|
let(:address) do
|
438
442
|
Address.new(street: "3rd St")
|
439
443
|
end
|
440
444
|
|
441
|
-
|
442
|
-
|
445
|
+
context "when the replaced relation is different from the existing relation" do
|
446
|
+
|
447
|
+
before do
|
448
|
+
person.addresses = [ address ]
|
449
|
+
end
|
450
|
+
|
451
|
+
it "deletes the old documents" do
|
452
|
+
expect(person.reload.addresses).to eq([ address ])
|
453
|
+
end
|
443
454
|
end
|
444
455
|
|
445
|
-
|
446
|
-
|
456
|
+
context "when the replaced relation is identical to the existing relation" do
|
457
|
+
|
458
|
+
before do
|
459
|
+
person.addresses = addresses
|
460
|
+
end
|
461
|
+
|
462
|
+
it "does nothing" do
|
463
|
+
expect(person.reload.addresses).to eq(addresses)
|
464
|
+
end
|
447
465
|
end
|
448
466
|
end
|
449
467
|
|
@@ -879,6 +897,36 @@ describe Mongoid::Relations::Embedded::Many do
|
|
879
897
|
Person.create
|
880
898
|
end
|
881
899
|
|
900
|
+
context 'when a string is used to access an attribute' do
|
901
|
+
|
902
|
+
let!(:address) do
|
903
|
+
person.addresses.create(street: "one")
|
904
|
+
end
|
905
|
+
|
906
|
+
let(:document) do
|
907
|
+
person.reload.addresses.as_document.first
|
908
|
+
end
|
909
|
+
|
910
|
+
it "returns the attribute value" do
|
911
|
+
expect(document['street']).to eq('one')
|
912
|
+
end
|
913
|
+
end
|
914
|
+
|
915
|
+
context 'when a symbol is used to access an attribute' do
|
916
|
+
|
917
|
+
let!(:address) do
|
918
|
+
person.addresses.create(street: "one")
|
919
|
+
end
|
920
|
+
|
921
|
+
let(:document) do
|
922
|
+
person.reload.addresses.as_document.first
|
923
|
+
end
|
924
|
+
|
925
|
+
it "returns the attribute value" do
|
926
|
+
expect(document[:street]).to eq('one')
|
927
|
+
end
|
928
|
+
end
|
929
|
+
|
882
930
|
context "when the relation has no default scope" do
|
883
931
|
|
884
932
|
let!(:address) do
|
@@ -3761,12 +3809,10 @@ describe Mongoid::Relations::Embedded::Many do
|
|
3761
3809
|
|
3762
3810
|
before do
|
3763
3811
|
expect(artist).to receive(:before_add_song).and_raise
|
3812
|
+
begin; artist.songs << song; rescue; end
|
3764
3813
|
end
|
3765
3814
|
|
3766
3815
|
it "does not add the document to the relation" do
|
3767
|
-
expect {
|
3768
|
-
artist.songs << song
|
3769
|
-
}.to raise_error
|
3770
3816
|
expect(artist.songs).to be_empty
|
3771
3817
|
end
|
3772
3818
|
end
|
@@ -3791,12 +3837,10 @@ describe Mongoid::Relations::Embedded::Many do
|
|
3791
3837
|
|
3792
3838
|
before do
|
3793
3839
|
expect(artist).to receive(:after_add_label).and_raise
|
3840
|
+
begin; artist.labels << label; rescue; end
|
3794
3841
|
end
|
3795
3842
|
|
3796
3843
|
it "adds the document to the relation" do
|
3797
|
-
expect {
|
3798
|
-
artist.labels << label
|
3799
|
-
}.to raise_error
|
3800
3844
|
expect(artist.labels).to eq([ label ])
|
3801
3845
|
end
|
3802
3846
|
end
|
@@ -3857,19 +3901,18 @@ describe Mongoid::Relations::Embedded::Many do
|
|
3857
3901
|
describe "#delete" do
|
3858
3902
|
|
3859
3903
|
it "does not remove the document from the relation" do
|
3860
|
-
|
3861
|
-
artist.songs.delete(song)
|
3862
|
-
}.to raise_error
|
3904
|
+
begin; artist.songs.delete(song); rescue; end
|
3863
3905
|
expect(artist.songs).to eq([ song ])
|
3864
3906
|
end
|
3865
3907
|
end
|
3866
3908
|
|
3867
3909
|
describe "#clear" do
|
3868
3910
|
|
3911
|
+
before do
|
3912
|
+
begin; artist.songs.clear; rescue; end
|
3913
|
+
end
|
3914
|
+
|
3869
3915
|
it "removes the documents from the relation" do
|
3870
|
-
expect {
|
3871
|
-
artist.songs.clear
|
3872
|
-
}.to raise_error
|
3873
3916
|
expect(artist.songs).to eq([ song ])
|
3874
3917
|
end
|
3875
3918
|
end
|
@@ -3925,9 +3968,7 @@ describe Mongoid::Relations::Embedded::Many do
|
|
3925
3968
|
describe "#delete" do
|
3926
3969
|
|
3927
3970
|
before do
|
3928
|
-
|
3929
|
-
artist.labels.delete(label)
|
3930
|
-
}.to raise_error
|
3971
|
+
begin; artist.labels.delete(label); rescue; end
|
3931
3972
|
end
|
3932
3973
|
|
3933
3974
|
it "removes the document from the relation" do
|
@@ -3938,9 +3979,7 @@ describe Mongoid::Relations::Embedded::Many do
|
|
3938
3979
|
describe "#clear" do
|
3939
3980
|
|
3940
3981
|
before do
|
3941
|
-
|
3942
|
-
artist.labels.clear
|
3943
|
-
}.to raise_error
|
3982
|
+
begin; artist.labels.clear; rescue; end
|
3944
3983
|
end
|
3945
3984
|
|
3946
3985
|
it "should remove from collection" do
|
@@ -4019,29 +4058,6 @@ describe Mongoid::Relations::Embedded::Many do
|
|
4019
4058
|
end
|
4020
4059
|
end
|
4021
4060
|
|
4022
|
-
context "when embedded documents get marshalled" do
|
4023
|
-
|
4024
|
-
let(:person) do
|
4025
|
-
Person.create
|
4026
|
-
end
|
4027
|
-
|
4028
|
-
let!(:addresses) do
|
4029
|
-
person.addresses
|
4030
|
-
end
|
4031
|
-
|
4032
|
-
let!(:dumped) do
|
4033
|
-
Marshal.dump(addresses)
|
4034
|
-
end
|
4035
|
-
|
4036
|
-
let!(:loaded) do
|
4037
|
-
Marshal.load(dumped)
|
4038
|
-
end
|
4039
|
-
|
4040
|
-
it "keeps the proxy extensions when remarshalling" do
|
4041
|
-
expect(loaded.extension).to eq("Testing")
|
4042
|
-
end
|
4043
|
-
end
|
4044
|
-
|
4045
4061
|
context "deleting embedded documents" do
|
4046
4062
|
|
4047
4063
|
it "able to delete embedded documents upon condition" do
|
@@ -70,7 +70,8 @@ describe Mongoid::Relations::Embedded::One do
|
|
70
70
|
name_without_default or (self.name = Name.new)
|
71
71
|
end
|
72
72
|
class << person
|
73
|
-
|
73
|
+
alias_method :name_without_default, :name
|
74
|
+
alias_method :name, :name_with_default
|
74
75
|
end
|
75
76
|
end
|
76
77
|
|
@@ -15,12 +15,30 @@ 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
|
+
|
18
23
|
describe ".embedded_in" do
|
19
24
|
|
20
25
|
it "defines the macro" do
|
21
26
|
expect(klass).to respond_to(:embedded_in)
|
22
27
|
end
|
23
28
|
|
29
|
+
context 'when the relation name is invalid' do
|
30
|
+
|
31
|
+
let(:relation) do
|
32
|
+
klass.embedded_in(:fields)
|
33
|
+
end
|
34
|
+
|
35
|
+
it 'raises an InvalidRelation exception' do
|
36
|
+
expect {
|
37
|
+
relation
|
38
|
+
}.to raise_exception(Mongoid::Errors::InvalidRelation)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
24
42
|
context "when defining the relation" do
|
25
43
|
|
26
44
|
before do
|
@@ -74,6 +92,19 @@ describe Mongoid::Relations::Macros do
|
|
74
92
|
|
75
93
|
context "when defining the relation" do
|
76
94
|
|
95
|
+
context 'when the relation name is invalid' do
|
96
|
+
|
97
|
+
let(:relation) do
|
98
|
+
klass.embeds_many(:fields)
|
99
|
+
end
|
100
|
+
|
101
|
+
it 'raises an InvalidRelation exception' do
|
102
|
+
expect {
|
103
|
+
relation
|
104
|
+
}.to raise_exception(Mongoid::Errors::InvalidRelation)
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
77
108
|
before do
|
78
109
|
klass.embeds_many(:addresses)
|
79
110
|
end
|
@@ -132,8 +163,8 @@ describe Mongoid::Relations::Macros do
|
|
132
163
|
expect(metadata.order).to_not be_nil
|
133
164
|
end
|
134
165
|
|
135
|
-
it "returns
|
136
|
-
expect(metadata.order).to be_kind_of(
|
166
|
+
it "returns Mongoid::Criteria::Queryable::Key" do
|
167
|
+
expect(metadata.order).to be_kind_of(Mongoid::Criteria::Queryable::Key)
|
137
168
|
end
|
138
169
|
end
|
139
170
|
|
@@ -157,6 +188,19 @@ describe Mongoid::Relations::Macros do
|
|
157
188
|
|
158
189
|
context "when defining the relation" do
|
159
190
|
|
191
|
+
context 'when the relation name is invalid' do
|
192
|
+
|
193
|
+
let(:relation) do
|
194
|
+
klass.embeds_one(:fields)
|
195
|
+
end
|
196
|
+
|
197
|
+
it 'raises an InvalidRelation exception' do
|
198
|
+
expect {
|
199
|
+
relation
|
200
|
+
}.to raise_exception(Mongoid::Errors::InvalidRelation)
|
201
|
+
end
|
202
|
+
end
|
203
|
+
|
160
204
|
before do
|
161
205
|
klass.embeds_one(:name)
|
162
206
|
end
|
@@ -223,8 +267,300 @@ describe Mongoid::Relations::Macros do
|
|
223
267
|
|
224
268
|
describe ".belongs_to" do
|
225
269
|
|
270
|
+
let(:_class) do
|
271
|
+
class RelationsTestClass
|
272
|
+
include Mongoid::Document
|
273
|
+
end
|
274
|
+
end
|
275
|
+
|
276
|
+
let(:conf) do
|
277
|
+
CONFIG.merge(options: { belongs_to_required_by_default: default_require })
|
278
|
+
end
|
279
|
+
|
280
|
+
let(:relation) do
|
281
|
+
_class.new
|
282
|
+
end
|
283
|
+
|
284
|
+
let(:relation_options) { {} }
|
285
|
+
|
286
|
+
let(:default_require) { Mongoid.belongs_to_required_by_default }
|
287
|
+
|
288
|
+
before do
|
289
|
+
Mongoid.configure do |config|
|
290
|
+
config.load_configuration(conf)
|
291
|
+
end
|
292
|
+
_class.belongs_to(:person, relation_options)
|
293
|
+
end
|
294
|
+
|
295
|
+
after do
|
296
|
+
Object.send(:remove_const, _class.name)
|
297
|
+
end
|
298
|
+
|
299
|
+
after(:all) do
|
300
|
+
Mongoid.configure do |config|
|
301
|
+
config.load_configuration(CONFIG)
|
302
|
+
end
|
303
|
+
end
|
304
|
+
|
226
305
|
it "defines the macro" do
|
227
|
-
expect(
|
306
|
+
expect(_class).to respond_to(:belongs_to)
|
307
|
+
end
|
308
|
+
|
309
|
+
context 'when the relation has options' do
|
310
|
+
|
311
|
+
context 'when the relation has the option :required' do
|
312
|
+
|
313
|
+
context 'when the relation does not have the :optional option' do
|
314
|
+
|
315
|
+
context 'when :required is true' do
|
316
|
+
|
317
|
+
let(:relation_options) do
|
318
|
+
{ required: true }
|
319
|
+
end
|
320
|
+
|
321
|
+
context 'when the default config is to require the association' do
|
322
|
+
|
323
|
+
let(:default_require) { true }
|
324
|
+
|
325
|
+
it 'requires the association' do
|
326
|
+
expect(relation.save).to be(false)
|
327
|
+
end
|
328
|
+
end
|
329
|
+
|
330
|
+
context 'when the default config is to not require the association' do
|
331
|
+
|
332
|
+
let(:default_require) { false }
|
333
|
+
|
334
|
+
it 'requires the association' do
|
335
|
+
expect(relation.save).to be(false)
|
336
|
+
end
|
337
|
+
end
|
338
|
+
end
|
339
|
+
|
340
|
+
context 'when :required is false' do
|
341
|
+
|
342
|
+
let(:relation_options) do
|
343
|
+
{ required: false }
|
344
|
+
end
|
345
|
+
|
346
|
+
context 'when the default config is to require the association' do
|
347
|
+
|
348
|
+
let(:default_require) { true }
|
349
|
+
|
350
|
+
it 'does not require the association' do
|
351
|
+
expect(relation.save).to be(true)
|
352
|
+
end
|
353
|
+
end
|
354
|
+
|
355
|
+
context 'when the default config is to not require the association' do
|
356
|
+
|
357
|
+
let(:default_require) { false }
|
358
|
+
|
359
|
+
it 'does not require the association' do
|
360
|
+
expect(relation.save).to be(true)
|
361
|
+
end
|
362
|
+
end
|
363
|
+
end
|
364
|
+
end
|
365
|
+
|
366
|
+
context 'when the relation has the option :optional' do
|
367
|
+
|
368
|
+
context 'when :required is true' do
|
369
|
+
|
370
|
+
context 'when :optional is true' do
|
371
|
+
|
372
|
+
let(:relation_options) do
|
373
|
+
{
|
374
|
+
required: true,
|
375
|
+
optional: true
|
376
|
+
}
|
377
|
+
end
|
378
|
+
|
379
|
+
context 'when the default config is to require the association' do
|
380
|
+
|
381
|
+
let(:default_require) { true }
|
382
|
+
|
383
|
+
it 'requires the association' do
|
384
|
+
expect(relation.save).to be(false)
|
385
|
+
end
|
386
|
+
end
|
387
|
+
|
388
|
+
context 'when the default config is to not require the association' do
|
389
|
+
|
390
|
+
let(:default_require) { false }
|
391
|
+
|
392
|
+
it 'requires the association' do
|
393
|
+
expect(relation.save).to be(false)
|
394
|
+
end
|
395
|
+
end
|
396
|
+
end
|
397
|
+
|
398
|
+
context 'when :optional is false' do
|
399
|
+
|
400
|
+
let(:relation_options) do
|
401
|
+
{
|
402
|
+
required: true,
|
403
|
+
optional: false
|
404
|
+
}
|
405
|
+
end
|
406
|
+
|
407
|
+
context 'when the default config is to require the association' do
|
408
|
+
|
409
|
+
let(:default_require) { true }
|
410
|
+
|
411
|
+
it 'requires the association' do
|
412
|
+
expect(relation.save).to be(false)
|
413
|
+
end
|
414
|
+
end
|
415
|
+
|
416
|
+
context 'when the default config is to not require the association' do
|
417
|
+
|
418
|
+
let(:default_require) { false }
|
419
|
+
|
420
|
+
it 'requires the association' do
|
421
|
+
expect(relation.save).to be(false)
|
422
|
+
end
|
423
|
+
end
|
424
|
+
end
|
425
|
+
end
|
426
|
+
|
427
|
+
context 'when :required is false' do
|
428
|
+
|
429
|
+
context 'when :optional is true' do
|
430
|
+
|
431
|
+
let(:relation_options) do
|
432
|
+
{
|
433
|
+
required: false,
|
434
|
+
optional: true
|
435
|
+
}
|
436
|
+
end
|
437
|
+
|
438
|
+
context 'when the default config is to require the association' do
|
439
|
+
|
440
|
+
let(:default_require) { true }
|
441
|
+
|
442
|
+
it 'does not require the association' do
|
443
|
+
expect(relation.save).to be(true)
|
444
|
+
end
|
445
|
+
end
|
446
|
+
|
447
|
+
context 'when the default config is to not require the association' do
|
448
|
+
|
449
|
+
let(:default_require) { true }
|
450
|
+
|
451
|
+
it 'does not require the association' do
|
452
|
+
expect(relation.save).to be(true)
|
453
|
+
end
|
454
|
+
end
|
455
|
+
end
|
456
|
+
|
457
|
+
context 'when :optional is false' do
|
458
|
+
|
459
|
+
let(:relation_options) do
|
460
|
+
{
|
461
|
+
required: false,
|
462
|
+
optional: false
|
463
|
+
}
|
464
|
+
end
|
465
|
+
|
466
|
+
context 'when the default config is to require the association' do
|
467
|
+
|
468
|
+
let(:default_require) { true }
|
469
|
+
|
470
|
+
it 'does not require the association' do
|
471
|
+
expect(relation.save).to be(true)
|
472
|
+
end
|
473
|
+
end
|
474
|
+
|
475
|
+
context 'when the default config is to not require the association' do
|
476
|
+
|
477
|
+
let(:default_require) { false }
|
478
|
+
|
479
|
+
it 'does not require the association' do
|
480
|
+
expect(relation.save).to be(true)
|
481
|
+
end
|
482
|
+
end
|
483
|
+
end
|
484
|
+
end
|
485
|
+
end
|
486
|
+
end
|
487
|
+
|
488
|
+
context 'when the relation does not have the option :required' do
|
489
|
+
|
490
|
+
context 'when the relation has the option :optional' do
|
491
|
+
|
492
|
+
context 'when :optional is true' do
|
493
|
+
|
494
|
+
let(:relation_options) do
|
495
|
+
{ optional: true }
|
496
|
+
end
|
497
|
+
|
498
|
+
context 'when the default config is to require the association' do
|
499
|
+
|
500
|
+
let(:default_require) { true }
|
501
|
+
|
502
|
+
it 'does not require the association' do
|
503
|
+
expect(relation.save).to be(true)
|
504
|
+
end
|
505
|
+
end
|
506
|
+
|
507
|
+
context 'when the default config is to not require the association' do
|
508
|
+
|
509
|
+
let(:default_require) { false }
|
510
|
+
|
511
|
+
it 'does not require the association' do
|
512
|
+
expect(relation.save).to be(true)
|
513
|
+
end
|
514
|
+
end
|
515
|
+
end
|
516
|
+
|
517
|
+
context 'when :optional is false' do
|
518
|
+
|
519
|
+
let(:relation_options) do
|
520
|
+
{ optional: false }
|
521
|
+
end
|
522
|
+
|
523
|
+
context 'when the default config is to require the association' do
|
524
|
+
|
525
|
+
let(:default_require) { true }
|
526
|
+
|
527
|
+
it 'requires the association' do
|
528
|
+
expect(relation.save).to be(false)
|
529
|
+
end
|
530
|
+
end
|
531
|
+
|
532
|
+
context 'when the default config is to not require the association' do
|
533
|
+
|
534
|
+
let(:default_require) { false }
|
535
|
+
|
536
|
+
it 'requires the association' do
|
537
|
+
expect(relation.save).to be(false)
|
538
|
+
end
|
539
|
+
end
|
540
|
+
end
|
541
|
+
end
|
542
|
+
end
|
543
|
+
end
|
544
|
+
|
545
|
+
context 'when the relation does not have options' do
|
546
|
+
|
547
|
+
context 'when the default config is to require the association' do
|
548
|
+
|
549
|
+
let(:default_require) { true }
|
550
|
+
|
551
|
+
it 'requires the association' do
|
552
|
+
expect(relation.save).to be(false)
|
553
|
+
end
|
554
|
+
end
|
555
|
+
|
556
|
+
context 'when the default config is to not require the association' do
|
557
|
+
|
558
|
+
let(:default_require) { false }
|
559
|
+
|
560
|
+
it 'does not require the association' do
|
561
|
+
expect(relation.save).to be(true)
|
562
|
+
end
|
563
|
+
end
|
228
564
|
end
|
229
565
|
|
230
566
|
context "when the relation is polymorphic" do
|
@@ -247,6 +583,19 @@ describe Mongoid::Relations::Macros do
|
|
247
583
|
|
248
584
|
context "when defining the relation" do
|
249
585
|
|
586
|
+
context 'when the relation name is invalid' do
|
587
|
+
|
588
|
+
let(:relation) do
|
589
|
+
klass.belongs_to(:fields)
|
590
|
+
end
|
591
|
+
|
592
|
+
it 'raises an InvalidRelation exception' do
|
593
|
+
expect {
|
594
|
+
relation
|
595
|
+
}.to raise_exception(Mongoid::Errors::InvalidRelation)
|
596
|
+
end
|
597
|
+
end
|
598
|
+
|
250
599
|
before do
|
251
600
|
klass.belongs_to(:person)
|
252
601
|
end
|
@@ -306,6 +655,19 @@ describe Mongoid::Relations::Macros do
|
|
306
655
|
|
307
656
|
context "when defining the relation" do
|
308
657
|
|
658
|
+
context 'when the relation name is invalid' do
|
659
|
+
|
660
|
+
let(:relation) do
|
661
|
+
klass.has_many(:fields)
|
662
|
+
end
|
663
|
+
|
664
|
+
it 'raises an InvalidRelation exception' do
|
665
|
+
expect {
|
666
|
+
relation
|
667
|
+
}.to raise_exception(Mongoid::Errors::InvalidRelation)
|
668
|
+
end
|
669
|
+
end
|
670
|
+
|
309
671
|
before do
|
310
672
|
klass.has_many(:posts)
|
311
673
|
end
|
@@ -364,8 +726,8 @@ describe Mongoid::Relations::Macros do
|
|
364
726
|
expect(metadata.order).to_not be_nil
|
365
727
|
end
|
366
728
|
|
367
|
-
it "returns
|
368
|
-
expect(metadata.order).to be_kind_of(
|
729
|
+
it "returns Mongoid::Criteria::Queryable::Key" do
|
730
|
+
expect(metadata.order).to be_kind_of(Mongoid::Criteria::Queryable::Key)
|
369
731
|
end
|
370
732
|
end
|
371
733
|
|
@@ -389,6 +751,19 @@ describe Mongoid::Relations::Macros do
|
|
389
751
|
|
390
752
|
context "when defining the relation" do
|
391
753
|
|
754
|
+
context 'when the relation name is invalid' do
|
755
|
+
|
756
|
+
let(:relation) do
|
757
|
+
klass.has_and_belongs_to_many(:fields)
|
758
|
+
end
|
759
|
+
|
760
|
+
it 'raises an InvalidRelation exception' do
|
761
|
+
expect {
|
762
|
+
relation
|
763
|
+
}.to raise_exception(Mongoid::Errors::InvalidRelation)
|
764
|
+
end
|
765
|
+
end
|
766
|
+
|
392
767
|
before do
|
393
768
|
klass.has_and_belongs_to_many(:preferences)
|
394
769
|
end
|
@@ -429,8 +804,8 @@ describe Mongoid::Relations::Macros do
|
|
429
804
|
expect(metadata.order).to_not be_nil
|
430
805
|
end
|
431
806
|
|
432
|
-
it "returns
|
433
|
-
expect(metadata.order).to be_kind_of(
|
807
|
+
it "returns Mongoid::Criteria::Queryable::Key" do
|
808
|
+
expect(metadata.order).to be_kind_of(Mongoid::Criteria::Queryable::Key)
|
434
809
|
end
|
435
810
|
end
|
436
811
|
|
@@ -459,6 +834,19 @@ describe Mongoid::Relations::Macros do
|
|
459
834
|
|
460
835
|
context "when defining the relation" do
|
461
836
|
|
837
|
+
context 'when the relation name is invalid' do
|
838
|
+
|
839
|
+
let(:relation) do
|
840
|
+
klass.has_one(:fields)
|
841
|
+
end
|
842
|
+
|
843
|
+
it 'raises an InvalidRelation exception' do
|
844
|
+
expect {
|
845
|
+
relation
|
846
|
+
}.to raise_exception(Mongoid::Errors::InvalidRelation)
|
847
|
+
end
|
848
|
+
end
|
849
|
+
|
462
850
|
before do
|
463
851
|
klass.has_one(:game)
|
464
852
|
end
|