mongoid 8.0.8 → 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/Rakefile +0 -25
- 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 +6 -6
- 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/macros.rb +0 -6
- 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 +1 -1
- data/lib/mongoid/association/referenced/has_many/enumerable.rb +2 -2
- data/lib/mongoid/association/referenced/has_many/proxy.rb +3 -3
- data/lib/mongoid/association/reflections.rb +2 -2
- data/lib/mongoid/atomic.rb +7 -16
- data/lib/mongoid/attributes/dynamic.rb +1 -1
- data/lib/mongoid/attributes/nested.rb +2 -2
- data/lib/mongoid/attributes/processing.rb +5 -29
- 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 +107 -5
- 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/options.rb +0 -3
- data/lib/mongoid/config/validators/async_query_executor.rb +24 -0
- data/lib/mongoid/config/validators.rb +1 -0
- data/lib/mongoid/config.rb +99 -28
- 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 +370 -133
- 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/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/queryable/selector.rb +1 -1
- data/lib/mongoid/criteria/queryable/storable.rb +1 -1
- data/lib/mongoid/criteria.rb +6 -5
- data/lib/mongoid/deprecable.rb +1 -2
- data/lib/mongoid/deprecation.rb +3 -3
- 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/hash.rb +2 -24
- data/lib/mongoid/extensions/object.rb +2 -2
- data/lib/mongoid/extensions/time.rb +2 -0
- data/lib/mongoid/fields/localized.rb +10 -0
- data/lib/mongoid/fields/standard.rb +10 -0
- data/lib/mongoid/fields.rb +53 -24
- data/lib/mongoid/findable.rb +27 -3
- data/lib/mongoid/interceptable.rb +10 -118
- data/lib/mongoid/matcher/eq_impl.rb +1 -1
- data/lib/mongoid/matcher/type.rb +1 -1
- 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/reloadable.rb +5 -3
- 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/utils.rb +22 -0
- data/lib/mongoid/validatable/associated.rb +18 -96
- data/lib/mongoid/validatable/macros.rb +5 -5
- data/lib/mongoid/validatable.rb +4 -9
- 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/associations/has_and_belongs_to_many_spec.rb +0 -40
- data/spec/integration/callbacks_models.rb +37 -0
- data/spec/integration/callbacks_spec.rb +126 -12
- 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 +20 -25
- 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 +5 -27
- data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +9 -50
- data/spec/mongoid/association/syncable_spec.rb +1 -1
- data/spec/mongoid/attributes_spec.rb +3 -33
- 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 -27
- 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 +1009 -125
- data/spec/mongoid/contextual/none_spec.rb +49 -2
- data/spec/mongoid/copyable_spec.rb +2 -10
- data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +4 -10
- 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 +3 -76
- data/spec/mongoid/criteria/queryable/storable_spec.rb +0 -72
- 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/hash_spec.rb +3 -3
- 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 -77
- data/spec/mongoid/findable_spec.rb +391 -34
- data/spec/mongoid/indexable_spec.rb +16 -10
- data/spec/mongoid/interceptable_spec.rb +173 -362
- 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 -28
- data/spec/mongoid/scopable_spec.rb +70 -0
- data/spec/mongoid/serializable_spec.rb +9 -30
- 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/associated_spec.rb +30 -13
- data/spec/mongoid/validatable/uniqueness_spec.rb +2 -3
- data/spec/mongoid_spec.rb +36 -10
- 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/name.rb +0 -10
- data/spec/support/models/person.rb +0 -1
- data/spec/support/models/product.rb +1 -0
- data.tar.gz.sig +0 -0
- metadata +698 -664
- 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
- data/spec/support/models/purse.rb +0 -9
|
@@ -89,7 +89,7 @@ describe Mongoid::Touchable do
|
|
|
89
89
|
end
|
|
90
90
|
end
|
|
91
91
|
|
|
92
|
-
shared_examples 'updates the parent when :touch is
|
|
92
|
+
shared_examples 'updates the parent when :touch is false' do
|
|
93
93
|
it 'does not update updated_at on parent' do
|
|
94
94
|
entrance
|
|
95
95
|
update_time
|
|
@@ -130,7 +130,7 @@ describe Mongoid::Touchable do
|
|
|
130
130
|
|
|
131
131
|
include_examples 'updates the child'
|
|
132
132
|
include_examples 'updates the parent when :touch is true'
|
|
133
|
-
include_examples 'updates the parent when :touch is
|
|
133
|
+
include_examples 'updates the parent when :touch is false'
|
|
134
134
|
|
|
135
135
|
context 'when also updating an additional field' do
|
|
136
136
|
it 'persists the update to the additional field' do
|
|
@@ -587,7 +587,7 @@ describe Mongoid::Touchable do
|
|
|
587
587
|
|
|
588
588
|
context "when the touch option is true" do
|
|
589
589
|
|
|
590
|
-
shared_examples "updates the updated_at" do
|
|
590
|
+
shared_examples "updates the parent's updated_at" do
|
|
591
591
|
|
|
592
592
|
let!(:start_time) { Timecop.freeze(Time.at(Time.now.to_i)) }
|
|
593
593
|
|
|
@@ -624,19 +624,58 @@ describe Mongoid::Touchable do
|
|
|
624
624
|
end
|
|
625
625
|
end
|
|
626
626
|
|
|
627
|
+
shared_examples "updates the child's updated_at" do
|
|
628
|
+
|
|
629
|
+
let!(:start_time) { Timecop.freeze(Time.at(Time.now.to_i)) }
|
|
630
|
+
|
|
631
|
+
let(:update_time) do
|
|
632
|
+
Timecop.freeze(Time.at(Time.now.to_i) + 2)
|
|
633
|
+
end
|
|
634
|
+
|
|
635
|
+
after do
|
|
636
|
+
Timecop.return
|
|
637
|
+
end
|
|
638
|
+
|
|
639
|
+
let(:building) do
|
|
640
|
+
parent_cls.create!
|
|
641
|
+
end
|
|
642
|
+
|
|
643
|
+
let(:floor) do
|
|
644
|
+
building.floors.create!
|
|
645
|
+
end
|
|
646
|
+
|
|
647
|
+
before do
|
|
648
|
+
floor
|
|
649
|
+
update_time
|
|
650
|
+
floor.level = 9
|
|
651
|
+
floor.send(meth)
|
|
652
|
+
end
|
|
653
|
+
|
|
654
|
+
it "the parent is not nil" do
|
|
655
|
+
expect(floor.building).to_not be nil
|
|
656
|
+
end
|
|
657
|
+
|
|
658
|
+
it "updates the child's timestamp" do
|
|
659
|
+
floor.updated_at.should == update_time
|
|
660
|
+
floor.reload.updated_at.should == update_time
|
|
661
|
+
end
|
|
662
|
+
end
|
|
663
|
+
|
|
627
664
|
[ :save!, :destroy, :touch].each do |meth|
|
|
628
665
|
context "with #{meth} on referenced associations" do
|
|
629
666
|
let(:parent_cls) { TouchableSpec::Referenced::Building }
|
|
630
667
|
let(:meth) { meth }
|
|
631
668
|
|
|
632
|
-
include_examples "updates the updated_at"
|
|
669
|
+
include_examples "updates the child's updated_at" unless meth == :destroy
|
|
670
|
+
include_examples "updates the parent's updated_at"
|
|
633
671
|
end
|
|
634
672
|
|
|
635
673
|
context "with #{meth} on embedded associations" do
|
|
636
674
|
let(:parent_cls) { TouchableSpec::Embedded::Building }
|
|
637
675
|
let(:meth) { meth }
|
|
638
676
|
|
|
639
|
-
include_examples "updates the updated_at"
|
|
677
|
+
include_examples "updates the child's updated_at" unless meth == :destroy
|
|
678
|
+
include_examples "updates the parent's updated_at"
|
|
640
679
|
end
|
|
641
680
|
end
|
|
642
681
|
end
|
|
@@ -701,4 +740,237 @@ describe Mongoid::Touchable do
|
|
|
701
740
|
end
|
|
702
741
|
end
|
|
703
742
|
end
|
|
743
|
+
|
|
744
|
+
describe "when saving a document" do
|
|
745
|
+
|
|
746
|
+
let!(:start_time) { Timecop.freeze(Time.at(Time.now.to_i)) }
|
|
747
|
+
|
|
748
|
+
let(:update_time) do
|
|
749
|
+
Timecop.freeze(Time.at(Time.now.to_i) + 2)
|
|
750
|
+
end
|
|
751
|
+
|
|
752
|
+
after do
|
|
753
|
+
Timecop.return
|
|
754
|
+
end
|
|
755
|
+
|
|
756
|
+
context "when only using the root document" do
|
|
757
|
+
|
|
758
|
+
shared_examples "timeless is cleared" do
|
|
759
|
+
it "clears the timeless option" do
|
|
760
|
+
expect(doc.timeless?).to be false
|
|
761
|
+
end
|
|
762
|
+
end
|
|
763
|
+
|
|
764
|
+
shared_examples "touches the document" do
|
|
765
|
+
it "touches the document" do
|
|
766
|
+
expect(doc.created_at).to eq(start_time)
|
|
767
|
+
expect(doc.updated_at).to eq(start_time)
|
|
768
|
+
end
|
|
769
|
+
end
|
|
770
|
+
|
|
771
|
+
shared_examples "updates the document" do
|
|
772
|
+
it "updates the document" do
|
|
773
|
+
expect(doc.created_at).to eq(start_time)
|
|
774
|
+
expect(doc.updated_at).to eq(update_time)
|
|
775
|
+
end
|
|
776
|
+
end
|
|
777
|
+
|
|
778
|
+
let(:doc) { Dokument.new }
|
|
779
|
+
|
|
780
|
+
context "when saving a new document" do
|
|
781
|
+
|
|
782
|
+
context "when not passing a touch option" do
|
|
783
|
+
|
|
784
|
+
before do
|
|
785
|
+
doc.save!
|
|
786
|
+
end
|
|
787
|
+
|
|
788
|
+
include_examples "touches the document"
|
|
789
|
+
include_examples "timeless is cleared"
|
|
790
|
+
end
|
|
791
|
+
|
|
792
|
+
context "when passing touch: true" do
|
|
793
|
+
|
|
794
|
+
before do
|
|
795
|
+
doc.save!(touch: true)
|
|
796
|
+
end
|
|
797
|
+
|
|
798
|
+
include_examples "touches the document"
|
|
799
|
+
include_examples "timeless is cleared"
|
|
800
|
+
end
|
|
801
|
+
|
|
802
|
+
context "when passing touch: false" do
|
|
803
|
+
|
|
804
|
+
before do
|
|
805
|
+
doc.save!(touch: false)
|
|
806
|
+
end
|
|
807
|
+
|
|
808
|
+
include_examples "touches the document"
|
|
809
|
+
include_examples "timeless is cleared"
|
|
810
|
+
end
|
|
811
|
+
end
|
|
812
|
+
|
|
813
|
+
context "when updating a document" do
|
|
814
|
+
before do
|
|
815
|
+
doc.save!
|
|
816
|
+
doc.title = "title"
|
|
817
|
+
update_time
|
|
818
|
+
end
|
|
819
|
+
|
|
820
|
+
context "when not passing a touch option" do
|
|
821
|
+
|
|
822
|
+
before do
|
|
823
|
+
doc.save!
|
|
824
|
+
end
|
|
825
|
+
|
|
826
|
+
include_examples "updates the document"
|
|
827
|
+
include_examples "timeless is cleared"
|
|
828
|
+
end
|
|
829
|
+
|
|
830
|
+
context "when passing touch: true" do
|
|
831
|
+
|
|
832
|
+
before do
|
|
833
|
+
doc.save!(touch: true)
|
|
834
|
+
end
|
|
835
|
+
|
|
836
|
+
include_examples "updates the document"
|
|
837
|
+
include_examples "timeless is cleared"
|
|
838
|
+
end
|
|
839
|
+
|
|
840
|
+
context "when passing touch: false" do
|
|
841
|
+
|
|
842
|
+
before do
|
|
843
|
+
doc.save!(touch: false)
|
|
844
|
+
end
|
|
845
|
+
|
|
846
|
+
include_examples "touches the document"
|
|
847
|
+
include_examples "timeless is cleared"
|
|
848
|
+
end
|
|
849
|
+
end
|
|
850
|
+
end
|
|
851
|
+
|
|
852
|
+
context "when saving embedded associations with cascadable callbacks" do
|
|
853
|
+
|
|
854
|
+
shared_examples "timeless is cleared" do
|
|
855
|
+
it "clears the timeless option" do
|
|
856
|
+
expect(book.timeless?).to be false
|
|
857
|
+
expect(book.covers.first.timeless?).to be false
|
|
858
|
+
end
|
|
859
|
+
end
|
|
860
|
+
|
|
861
|
+
shared_examples "touches the document" do
|
|
862
|
+
it "touches the document" do
|
|
863
|
+
expect(book.created_at).to eq(start_time)
|
|
864
|
+
expect(book.updated_at).to eq(start_time)
|
|
865
|
+
end
|
|
866
|
+
end
|
|
867
|
+
|
|
868
|
+
shared_examples "updates the document" do
|
|
869
|
+
it "updates the document" do
|
|
870
|
+
expect(book.created_at).to eq(start_time)
|
|
871
|
+
expect(book.updated_at).to eq(update_time)
|
|
872
|
+
end
|
|
873
|
+
end
|
|
874
|
+
|
|
875
|
+
shared_examples "touches the children" do
|
|
876
|
+
it "touches the children" do
|
|
877
|
+
expect(book.covers.first.created_at).to eq(start_time)
|
|
878
|
+
expect(book.covers.first.updated_at).to eq(start_time)
|
|
879
|
+
end
|
|
880
|
+
end
|
|
881
|
+
|
|
882
|
+
shared_examples "updates the children" do
|
|
883
|
+
it "updates the children" do
|
|
884
|
+
expect(book.covers.first.created_at).to eq(start_time)
|
|
885
|
+
expect(book.covers.first.updated_at).to eq(update_time)
|
|
886
|
+
end
|
|
887
|
+
end
|
|
888
|
+
|
|
889
|
+
let(:book) do
|
|
890
|
+
Book.new(covers: [ cover ])
|
|
891
|
+
end
|
|
892
|
+
|
|
893
|
+
let(:cover) do
|
|
894
|
+
Cover.new
|
|
895
|
+
end
|
|
896
|
+
|
|
897
|
+
context "when saving a new document" do
|
|
898
|
+
|
|
899
|
+
context "when not passing a touch option" do
|
|
900
|
+
|
|
901
|
+
before do
|
|
902
|
+
book.save!
|
|
903
|
+
end
|
|
904
|
+
|
|
905
|
+
include_examples "touches the document"
|
|
906
|
+
include_examples "touches the children"
|
|
907
|
+
include_examples "timeless is cleared"
|
|
908
|
+
end
|
|
909
|
+
|
|
910
|
+
context "when passing touch: true" do
|
|
911
|
+
|
|
912
|
+
before do
|
|
913
|
+
book.save!(touch: true)
|
|
914
|
+
end
|
|
915
|
+
|
|
916
|
+
include_examples "touches the document"
|
|
917
|
+
include_examples "touches the children"
|
|
918
|
+
include_examples "timeless is cleared"
|
|
919
|
+
end
|
|
920
|
+
|
|
921
|
+
context "when passing touch: false" do
|
|
922
|
+
|
|
923
|
+
before do
|
|
924
|
+
book.save!(touch: false)
|
|
925
|
+
end
|
|
926
|
+
|
|
927
|
+
include_examples "touches the document"
|
|
928
|
+
include_examples "touches the children"
|
|
929
|
+
include_examples "timeless is cleared"
|
|
930
|
+
end
|
|
931
|
+
end
|
|
932
|
+
|
|
933
|
+
context "when updating a document" do
|
|
934
|
+
before do
|
|
935
|
+
book.save!
|
|
936
|
+
book.title = "title"
|
|
937
|
+
book.covers.first.title = "title"
|
|
938
|
+
update_time
|
|
939
|
+
end
|
|
940
|
+
|
|
941
|
+
context "when not passing a touch option" do
|
|
942
|
+
|
|
943
|
+
before do
|
|
944
|
+
book.save!
|
|
945
|
+
end
|
|
946
|
+
|
|
947
|
+
include_examples "updates the document"
|
|
948
|
+
include_examples "updates the children"
|
|
949
|
+
include_examples "timeless is cleared"
|
|
950
|
+
end
|
|
951
|
+
|
|
952
|
+
context "when passing touch: true" do
|
|
953
|
+
|
|
954
|
+
before do
|
|
955
|
+
book.save!(touch: true)
|
|
956
|
+
end
|
|
957
|
+
|
|
958
|
+
include_examples "updates the document"
|
|
959
|
+
include_examples "updates the children"
|
|
960
|
+
include_examples "timeless is cleared"
|
|
961
|
+
end
|
|
962
|
+
|
|
963
|
+
context "when passing touch: false" do
|
|
964
|
+
|
|
965
|
+
before do
|
|
966
|
+
book.save!(touch: false)
|
|
967
|
+
end
|
|
968
|
+
|
|
969
|
+
include_examples "touches the document"
|
|
970
|
+
include_examples "touches the children"
|
|
971
|
+
include_examples "timeless is cleared"
|
|
972
|
+
end
|
|
973
|
+
end
|
|
974
|
+
end
|
|
975
|
+
end
|
|
704
976
|
end
|
|
@@ -6,6 +6,8 @@ module TouchableSpec
|
|
|
6
6
|
include Mongoid::Document
|
|
7
7
|
include Mongoid::Timestamps
|
|
8
8
|
|
|
9
|
+
field :title, type: String
|
|
10
|
+
|
|
9
11
|
embeds_many :entrances, class_name: "TouchableSpec::Embedded::Entrance"
|
|
10
12
|
embeds_many :floors, class_name: "TouchableSpec::Embedded::Floor"
|
|
11
13
|
end
|
|
@@ -14,7 +16,7 @@ module TouchableSpec
|
|
|
14
16
|
include Mongoid::Document
|
|
15
17
|
include Mongoid::Timestamps
|
|
16
18
|
|
|
17
|
-
embedded_in :building, class_name: "TouchableSpec::Embedded::Building"
|
|
19
|
+
embedded_in :building, touch: false, class_name: "TouchableSpec::Embedded::Building"
|
|
18
20
|
|
|
19
21
|
field :last_used_at, type: Time
|
|
20
22
|
end
|
|
@@ -531,9 +531,9 @@ describe Mongoid::Traversable do
|
|
|
531
531
|
end
|
|
532
532
|
|
|
533
533
|
context "before class creation" do
|
|
534
|
-
|
|
535
|
-
Mongoid.discriminator_key = "test"
|
|
534
|
+
config_override :discriminator_key, "test"
|
|
536
535
|
|
|
536
|
+
before do
|
|
537
537
|
class PreGlobalDiscriminatorParent
|
|
538
538
|
include Mongoid::Document
|
|
539
539
|
end
|
|
@@ -542,10 +542,6 @@ describe Mongoid::Traversable do
|
|
|
542
542
|
end
|
|
543
543
|
end
|
|
544
544
|
|
|
545
|
-
after do
|
|
546
|
-
Mongoid.discriminator_key = "_type"
|
|
547
|
-
end
|
|
548
|
-
|
|
549
545
|
it "creates a field with new discriminator key in the parent" do
|
|
550
546
|
expect(PreGlobalDiscriminatorParent.fields.keys).to include("test")
|
|
551
547
|
end
|
|
@@ -677,9 +673,9 @@ describe Mongoid::Traversable do
|
|
|
677
673
|
end
|
|
678
674
|
|
|
679
675
|
context "before class creation" do
|
|
680
|
-
|
|
681
|
-
Mongoid.discriminator_key = :test
|
|
676
|
+
config_override :discriminator_key, :test
|
|
682
677
|
|
|
678
|
+
before do
|
|
683
679
|
class PreGlobalSymDiscriminatorParent
|
|
684
680
|
include Mongoid::Document
|
|
685
681
|
end
|
|
@@ -688,10 +684,6 @@ describe Mongoid::Traversable do
|
|
|
688
684
|
end
|
|
689
685
|
end
|
|
690
686
|
|
|
691
|
-
after do
|
|
692
|
-
Mongoid.discriminator_key = "_type"
|
|
693
|
-
end
|
|
694
|
-
|
|
695
687
|
it "creates a field with new discriminator key as a string in the parent" do
|
|
696
688
|
expect(PreGlobalSymDiscriminatorParent.fields.keys).to include("test")
|
|
697
689
|
end
|
|
@@ -829,8 +821,9 @@ describe Mongoid::Traversable do
|
|
|
829
821
|
end
|
|
830
822
|
|
|
831
823
|
context "when setting a field equal to discriminator key and duplicate_fields_exception is true" do
|
|
824
|
+
config_override :duplicate_fields_exception, true
|
|
825
|
+
|
|
832
826
|
before do
|
|
833
|
-
Mongoid.duplicate_fields_exception = true
|
|
834
827
|
|
|
835
828
|
class DuplicateDiscriminatorKeyParent
|
|
836
829
|
include Mongoid::Document
|
|
@@ -841,10 +834,6 @@ describe Mongoid::Traversable do
|
|
|
841
834
|
end
|
|
842
835
|
end
|
|
843
836
|
|
|
844
|
-
after do
|
|
845
|
-
Mongoid.duplicate_fields_exception = false
|
|
846
|
-
end
|
|
847
|
-
|
|
848
837
|
it "does not raise an error" do
|
|
849
838
|
expect do
|
|
850
839
|
DuplicateDiscriminatorKeyParent.discriminator_key = "dkey"
|
|
@@ -871,9 +860,10 @@ describe Mongoid::Traversable do
|
|
|
871
860
|
end
|
|
872
861
|
|
|
873
862
|
context "when setting a field equal to global discriminator key and duplicate_fields_exception is true" do
|
|
863
|
+
config_override :duplicate_fields_exception, true
|
|
864
|
+
config_override :discriminator_key, "dkey"
|
|
865
|
+
|
|
874
866
|
before do
|
|
875
|
-
Mongoid.duplicate_fields_exception = true
|
|
876
|
-
Mongoid.discriminator_key = "dkey"
|
|
877
867
|
|
|
878
868
|
class GlobalDuplicateDiscriminatorKeyParent
|
|
879
869
|
include Mongoid::Document
|
|
@@ -883,11 +873,6 @@ describe Mongoid::Traversable do
|
|
|
883
873
|
end
|
|
884
874
|
end
|
|
885
875
|
|
|
886
|
-
after do
|
|
887
|
-
Mongoid.duplicate_fields_exception = false
|
|
888
|
-
Mongoid.discriminator_key = "_type"
|
|
889
|
-
end
|
|
890
|
-
|
|
891
876
|
it "raises an error" do
|
|
892
877
|
expect do
|
|
893
878
|
GlobalDuplicateDiscriminatorKeyParent.class_eval do
|
|
@@ -75,6 +75,7 @@ describe Mongoid::Validatable::AssociatedValidator do
|
|
|
75
75
|
end
|
|
76
76
|
|
|
77
77
|
it "does not run validation on them" do
|
|
78
|
+
expect(description).to receive(:valid?).never
|
|
78
79
|
expect(user).to be_valid
|
|
79
80
|
end
|
|
80
81
|
|
|
@@ -83,14 +84,14 @@ describe Mongoid::Validatable::AssociatedValidator do
|
|
|
83
84
|
end
|
|
84
85
|
end
|
|
85
86
|
|
|
86
|
-
describe "#
|
|
87
|
+
describe "#validate_each" do
|
|
87
88
|
|
|
88
89
|
let(:person) do
|
|
89
90
|
Person.new
|
|
90
91
|
end
|
|
91
92
|
|
|
92
93
|
let(:validator) do
|
|
93
|
-
described_class.new(attributes: person.
|
|
94
|
+
described_class.new(attributes: person.attributes)
|
|
94
95
|
end
|
|
95
96
|
|
|
96
97
|
context "when the association is a one to one" do
|
|
@@ -98,7 +99,7 @@ describe Mongoid::Validatable::AssociatedValidator do
|
|
|
98
99
|
context "when the association is nil" do
|
|
99
100
|
|
|
100
101
|
before do
|
|
101
|
-
validator.
|
|
102
|
+
validator.validate_each(person, :name, nil)
|
|
102
103
|
end
|
|
103
104
|
|
|
104
105
|
it "adds no errors" do
|
|
@@ -107,9 +108,14 @@ describe Mongoid::Validatable::AssociatedValidator do
|
|
|
107
108
|
end
|
|
108
109
|
|
|
109
110
|
context "when the association is valid" do
|
|
111
|
+
|
|
112
|
+
let(:associated) do
|
|
113
|
+
double(valid?: true, flagged_for_destroy?: false)
|
|
114
|
+
end
|
|
115
|
+
|
|
110
116
|
before do
|
|
111
|
-
|
|
112
|
-
validator.
|
|
117
|
+
expect(associated).to receive(:validated?).and_return(false)
|
|
118
|
+
validator.validate_each(person, :name, associated)
|
|
113
119
|
end
|
|
114
120
|
|
|
115
121
|
it "adds no errors" do
|
|
@@ -119,9 +125,13 @@ describe Mongoid::Validatable::AssociatedValidator do
|
|
|
119
125
|
|
|
120
126
|
context "when the association is invalid" do
|
|
121
127
|
|
|
128
|
+
let(:associated) do
|
|
129
|
+
double(valid?: false, flagged_for_destroy?: false)
|
|
130
|
+
end
|
|
131
|
+
|
|
122
132
|
before do
|
|
123
|
-
|
|
124
|
-
validator.
|
|
133
|
+
expect(associated).to receive(:validated?).and_return(false)
|
|
134
|
+
validator.validate_each(person, :name, associated)
|
|
125
135
|
end
|
|
126
136
|
|
|
127
137
|
it "adds errors to the parent document" do
|
|
@@ -139,7 +149,7 @@ describe Mongoid::Validatable::AssociatedValidator do
|
|
|
139
149
|
context "when the association is empty" do
|
|
140
150
|
|
|
141
151
|
before do
|
|
142
|
-
validator.
|
|
152
|
+
validator.validate_each(person, :addresses, [])
|
|
143
153
|
end
|
|
144
154
|
|
|
145
155
|
it "adds no errors" do
|
|
@@ -149,9 +159,13 @@ describe Mongoid::Validatable::AssociatedValidator do
|
|
|
149
159
|
|
|
150
160
|
context "when the association has invalid documents" do
|
|
151
161
|
|
|
162
|
+
let(:associated) do
|
|
163
|
+
double(valid?: false, flagged_for_destroy?: false)
|
|
164
|
+
end
|
|
165
|
+
|
|
152
166
|
before do
|
|
153
|
-
|
|
154
|
-
validator.
|
|
167
|
+
expect(associated).to receive(:validated?).and_return(false)
|
|
168
|
+
validator.validate_each(person, :addresses, [ associated ])
|
|
155
169
|
end
|
|
156
170
|
|
|
157
171
|
it "adds errors to the parent document" do
|
|
@@ -161,10 +175,13 @@ describe Mongoid::Validatable::AssociatedValidator do
|
|
|
161
175
|
|
|
162
176
|
context "when the association has all valid documents" do
|
|
163
177
|
|
|
178
|
+
let(:associated) do
|
|
179
|
+
double(valid?: true, flagged_for_destroy?: false)
|
|
180
|
+
end
|
|
181
|
+
|
|
164
182
|
before do
|
|
165
|
-
|
|
166
|
-
person
|
|
167
|
-
validator.validate(person)
|
|
183
|
+
expect(associated).to receive(:validated?).and_return(false)
|
|
184
|
+
validator.validate_each(person, :addresses, [ associated ])
|
|
168
185
|
end
|
|
169
186
|
|
|
170
187
|
it "adds no errors" do
|
|
@@ -2476,11 +2476,10 @@ describe Mongoid::Validatable::UniquenessValidator do
|
|
|
2476
2476
|
describe "i18n" do
|
|
2477
2477
|
|
|
2478
2478
|
context 'when using a different locale' do
|
|
2479
|
-
|
|
2480
|
-
I18n.with_locale(:fr) { example.run }
|
|
2481
|
-
end
|
|
2479
|
+
with_default_i18n_configs
|
|
2482
2480
|
|
|
2483
2481
|
before do
|
|
2482
|
+
I18n.locale = :fr
|
|
2484
2483
|
# Translation key location is as per rails-i18n gem.
|
|
2485
2484
|
# See: https://github.com/svenfuchs/rails-i18n/blob/master/rails/locale/en.yml
|
|
2486
2485
|
I18n.backend.store_translations(:fr, { errors: { messages: { taken: 'est déjà utilisé(e)' } } })
|
data/spec/mongoid_spec.rb
CHANGED
|
@@ -13,22 +13,46 @@ describe Mongoid do
|
|
|
13
13
|
end
|
|
14
14
|
end
|
|
15
15
|
|
|
16
|
-
context "when a block is
|
|
16
|
+
context "when a block is given" do
|
|
17
|
+
config_override :preload_models, false
|
|
17
18
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
19
|
+
context "with arity 0" do
|
|
20
|
+
|
|
21
|
+
before do
|
|
22
|
+
Mongoid.configure do
|
|
23
|
+
config.preload_models = true
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
it "sets the values on the config instance" do
|
|
28
|
+
expect(Mongoid.preload_models).to be true
|
|
21
29
|
end
|
|
22
30
|
end
|
|
23
31
|
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
32
|
+
context "with arity 1" do
|
|
33
|
+
|
|
34
|
+
before do
|
|
35
|
+
Mongoid.configure do |config|
|
|
36
|
+
config.preload_models = true
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
it "sets the values on the config instance" do
|
|
41
|
+
expect(Mongoid.preload_models).to be true
|
|
27
42
|
end
|
|
28
43
|
end
|
|
29
44
|
|
|
30
|
-
|
|
31
|
-
|
|
45
|
+
context "with arity 2" do
|
|
46
|
+
|
|
47
|
+
before do
|
|
48
|
+
Mongoid.configure do |config, _other|
|
|
49
|
+
config.preload_models = true
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
it "sets the values on the config instance" do
|
|
54
|
+
expect(Mongoid.preload_models).to be true
|
|
55
|
+
end
|
|
32
56
|
end
|
|
33
57
|
end
|
|
34
58
|
end
|
|
@@ -51,8 +75,10 @@ describe Mongoid do
|
|
|
51
75
|
end
|
|
52
76
|
|
|
53
77
|
it "disconnects from all active clients" do
|
|
78
|
+
pending 'https://jira.mongodb.org/browse/MONGOID-5621'
|
|
79
|
+
|
|
54
80
|
clients.each do |client|
|
|
55
|
-
expect(client).to receive(:
|
|
81
|
+
expect(client.cluster).to receive(:disconnect!).and_call_original
|
|
56
82
|
end
|
|
57
83
|
Mongoid.disconnect_clients
|
|
58
84
|
end
|
data/spec/spec_helper.rb
CHANGED
|
@@ -124,6 +124,11 @@ end
|
|
|
124
124
|
|
|
125
125
|
I18n.config.enforce_available_locales = false
|
|
126
126
|
|
|
127
|
+
|
|
128
|
+
if %w(yes true 1).include?((ENV['TEST_I18N_FALLBACKS'] || '').downcase)
|
|
129
|
+
require "i18n/backend/fallbacks"
|
|
130
|
+
end
|
|
131
|
+
|
|
127
132
|
# The user must be created before any of the tests are loaded, until
|
|
128
133
|
# https://jira.mongodb.org/browse/MONGOID-4827 is implemented.
|
|
129
134
|
client = Mongo::Client.new(SpecConfig.instance.addresses, server_selection_timeout: 3.03)
|