mongoid 5.4.1 → 6.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (260) hide show
  1. checksums.yaml +5 -5
  2. data/README.md +3 -3
  3. data/lib/config/locales/en.yml +19 -0
  4. data/lib/mongoid.rb +4 -4
  5. data/lib/mongoid/atomic.rb +2 -2
  6. data/lib/mongoid/atomic/modifiers.rb +8 -12
  7. data/lib/mongoid/attributes.rb +22 -21
  8. data/lib/mongoid/attributes/readonly.rb +22 -0
  9. data/lib/mongoid/cacheable.rb +36 -0
  10. data/lib/mongoid/changeable.rb +36 -0
  11. data/lib/mongoid/clients.rb +8 -63
  12. data/lib/mongoid/clients/options.rb +55 -250
  13. data/lib/mongoid/clients/storage_options.rb +1 -69
  14. data/lib/mongoid/composable.rb +29 -3
  15. data/lib/mongoid/config.rb +1 -0
  16. data/lib/mongoid/contextual/atomic.rb +5 -8
  17. data/lib/mongoid/contextual/map_reduce.rb +0 -4
  18. data/lib/mongoid/contextual/memory.rb +2 -2
  19. data/lib/mongoid/contextual/mongo.rb +40 -22
  20. data/lib/mongoid/contextual/none.rb +12 -0
  21. data/lib/mongoid/copyable.rb +13 -6
  22. data/lib/mongoid/criteria.rb +5 -2
  23. data/lib/mongoid/criteria/marshalable.rb +2 -2
  24. data/lib/mongoid/criteria/modifiable.rb +17 -1
  25. data/lib/mongoid/criteria/options.rb +25 -0
  26. data/lib/mongoid/criteria/queryable.rb +87 -0
  27. data/lib/mongoid/criteria/queryable/aggregable.rb +120 -0
  28. data/lib/mongoid/criteria/queryable/extensions.rb +28 -0
  29. data/lib/mongoid/criteria/queryable/extensions/array.rb +185 -0
  30. data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +37 -0
  31. data/lib/mongoid/criteria/queryable/extensions/boolean.rb +34 -0
  32. data/lib/mongoid/criteria/queryable/extensions/date.rb +63 -0
  33. data/lib/mongoid/criteria/queryable/extensions/date_time.rb +53 -0
  34. data/lib/mongoid/criteria/queryable/extensions/hash.rb +200 -0
  35. data/lib/mongoid/criteria/queryable/extensions/nil_class.rb +86 -0
  36. data/lib/mongoid/criteria/queryable/extensions/numeric.rb +90 -0
  37. data/lib/mongoid/criteria/queryable/extensions/object.rb +206 -0
  38. data/lib/mongoid/criteria/queryable/extensions/range.rb +70 -0
  39. data/lib/mongoid/criteria/queryable/extensions/regexp.rb +79 -0
  40. data/lib/mongoid/criteria/queryable/extensions/set.rb +34 -0
  41. data/lib/mongoid/criteria/queryable/extensions/string.rb +137 -0
  42. data/lib/mongoid/criteria/queryable/extensions/symbol.rb +79 -0
  43. data/lib/mongoid/criteria/queryable/extensions/time.rb +60 -0
  44. data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +54 -0
  45. data/lib/mongoid/criteria/queryable/forwardable.rb +65 -0
  46. data/lib/mongoid/criteria/queryable/key.rb +103 -0
  47. data/lib/mongoid/criteria/queryable/macroable.rb +27 -0
  48. data/lib/mongoid/criteria/queryable/mergeable.rb +271 -0
  49. data/lib/mongoid/criteria/queryable/optional.rb +429 -0
  50. data/lib/mongoid/criteria/queryable/options.rb +153 -0
  51. data/lib/mongoid/criteria/queryable/pipeline.rb +111 -0
  52. data/lib/mongoid/criteria/queryable/selectable.rb +662 -0
  53. data/lib/mongoid/criteria/queryable/selector.rb +212 -0
  54. data/lib/mongoid/criteria/queryable/smash.rb +104 -0
  55. data/lib/mongoid/document.rb +30 -37
  56. data/lib/mongoid/errors.rb +2 -0
  57. data/lib/mongoid/errors/ambiguous_relationship.rb +1 -1
  58. data/lib/mongoid/errors/in_memory_collation_not_supported.rb +1 -1
  59. data/lib/mongoid/errors/invalid_field.rb +2 -2
  60. data/lib/mongoid/errors/invalid_persistence_option.rb +29 -0
  61. data/lib/mongoid/errors/invalid_relation.rb +66 -0
  62. data/lib/mongoid/evolvable.rb +1 -1
  63. data/lib/mongoid/extensions.rb +0 -4
  64. data/lib/mongoid/extensions/big_decimal.rb +17 -8
  65. data/lib/mongoid/extensions/date.rb +4 -1
  66. data/lib/mongoid/extensions/decimal128.rb +3 -3
  67. data/lib/mongoid/extensions/hash.rb +1 -0
  68. data/lib/mongoid/extensions/string.rb +4 -3
  69. data/lib/mongoid/extensions/time.rb +4 -1
  70. data/lib/mongoid/fields/validators/macro.rb +18 -0
  71. data/lib/mongoid/findable.rb +2 -2
  72. data/lib/mongoid/indexable.rb +15 -13
  73. data/lib/mongoid/interceptable.rb +5 -22
  74. data/lib/mongoid/matchable.rb +13 -7
  75. data/lib/mongoid/matchable/all.rb +2 -2
  76. data/lib/mongoid/matchable/and.rb +3 -3
  77. data/lib/mongoid/matchable/default.rb +2 -2
  78. data/lib/mongoid/matchable/elem_match.rb +28 -0
  79. data/lib/mongoid/matchable/exists.rb +2 -2
  80. data/lib/mongoid/matchable/gt.rb +4 -2
  81. data/lib/mongoid/matchable/gte.rb +4 -2
  82. data/lib/mongoid/matchable/in.rb +2 -2
  83. data/lib/mongoid/matchable/lt.rb +4 -2
  84. data/lib/mongoid/matchable/lte.rb +4 -2
  85. data/lib/mongoid/matchable/ne.rb +2 -2
  86. data/lib/mongoid/matchable/nin.rb +2 -2
  87. data/lib/mongoid/matchable/or.rb +3 -3
  88. data/lib/mongoid/matchable/regexp.rb +3 -3
  89. data/lib/mongoid/matchable/size.rb +2 -2
  90. data/lib/mongoid/persistable.rb +3 -5
  91. data/lib/mongoid/persistable/creatable.rb +2 -2
  92. data/lib/mongoid/persistable/deletable.rb +1 -1
  93. data/lib/mongoid/persistable/settable.rb +1 -1
  94. data/lib/mongoid/persistable/updatable.rb +5 -12
  95. data/lib/mongoid/persistable/upsertable.rb +1 -1
  96. data/lib/mongoid/persistence_context.rb +215 -0
  97. data/lib/mongoid/query_cache.rb +3 -6
  98. data/lib/mongoid/relations/accessors.rb +3 -0
  99. data/lib/mongoid/relations/auto_save.rb +12 -4
  100. data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +4 -4
  101. data/lib/mongoid/relations/counter_cache.rb +15 -5
  102. data/lib/mongoid/relations/eager.rb +6 -11
  103. data/lib/mongoid/relations/eager/base.rb +3 -3
  104. data/lib/mongoid/relations/eager/has_and_belongs_to_many.rb +2 -2
  105. data/lib/mongoid/relations/eager/has_many.rb +1 -1
  106. data/lib/mongoid/relations/embedded/batchable.rb +12 -36
  107. data/lib/mongoid/relations/embedded/in.rb +13 -1
  108. data/lib/mongoid/relations/embedded/many.rb +28 -10
  109. data/lib/mongoid/relations/embedded/one.rb +14 -1
  110. data/lib/mongoid/relations/macros.rb +9 -1
  111. data/lib/mongoid/relations/metadata.rb +3 -3
  112. data/lib/mongoid/relations/options.rb +2 -2
  113. data/lib/mongoid/relations/proxy.rb +1 -31
  114. data/lib/mongoid/relations/referenced/in.rb +19 -10
  115. data/lib/mongoid/relations/referenced/many.rb +23 -17
  116. data/lib/mongoid/relations/referenced/many_to_many.rb +20 -13
  117. data/lib/mongoid/relations/referenced/one.rb +15 -1
  118. data/lib/mongoid/relations/synchronization.rb +11 -11
  119. data/lib/mongoid/relations/touchable.rb +6 -3
  120. data/lib/mongoid/reloadable.rb +1 -1
  121. data/lib/mongoid/serializable.rb +1 -1
  122. data/lib/mongoid/traversable.rb +1 -1
  123. data/lib/mongoid/validatable/uniqueness.rb +1 -2
  124. data/lib/mongoid/version.rb +1 -1
  125. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +14 -3
  126. data/spec/app/models/album.rb +5 -1
  127. data/spec/app/models/artist.rb +21 -0
  128. data/spec/app/models/book.rb +2 -1
  129. data/spec/app/models/dokument.rb +1 -0
  130. data/spec/app/models/ordered_post.rb +5 -0
  131. data/spec/app/models/oscar.rb +1 -2
  132. data/spec/app/models/page.rb +1 -1
  133. data/spec/app/models/person.rb +3 -3
  134. data/spec/app/models/princess.rb +2 -0
  135. data/spec/app/models/record.rb +1 -0
  136. data/spec/app/models/subscription.rb +1 -0
  137. data/spec/app/models/thing.rb +1 -1
  138. data/spec/config/mongoid.yml +15 -0
  139. data/spec/mongoid/atomic/modifiers_spec.rb +17 -17
  140. data/spec/mongoid/atomic_spec.rb +17 -17
  141. data/spec/mongoid/attributes/nested_spec.rb +14 -14
  142. data/spec/mongoid/attributes/readonly_spec.rb +87 -44
  143. data/spec/mongoid/attributes_spec.rb +90 -5
  144. data/spec/mongoid/cacheable_spec.rb +112 -0
  145. data/spec/mongoid/changeable_spec.rb +58 -0
  146. data/spec/mongoid/clients/factory_spec.rb +31 -3
  147. data/spec/mongoid/clients/options_spec.rb +382 -96
  148. data/spec/mongoid/clients_spec.rb +243 -101
  149. data/spec/mongoid/composable_spec.rb +7 -0
  150. data/spec/mongoid/config_spec.rb +67 -11
  151. data/spec/mongoid/contextual/atomic_spec.rb +3 -3
  152. data/spec/mongoid/contextual/mongo_spec.rb +165 -20
  153. data/spec/mongoid/contextual/none_spec.rb +15 -0
  154. data/spec/mongoid/copyable_spec.rb +13 -4
  155. data/spec/mongoid/criteria/modifiable_spec.rb +239 -7
  156. data/spec/mongoid/criteria/options_spec.rb +29 -0
  157. data/spec/mongoid/criteria/queryable/aggregable_spec.rb +370 -0
  158. data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +523 -0
  159. data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +59 -0
  160. data/spec/mongoid/criteria/queryable/extensions/bignum_spec.rb +58 -0
  161. data/spec/mongoid/criteria/queryable/extensions/boolean_spec.rb +213 -0
  162. data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +330 -0
  163. data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +405 -0
  164. data/spec/mongoid/criteria/queryable/extensions/fixnum_spec.rb +58 -0
  165. data/spec/mongoid/criteria/queryable/extensions/float_spec.rb +65 -0
  166. data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +327 -0
  167. data/spec/mongoid/criteria/queryable/extensions/integer_spec.rb +65 -0
  168. data/spec/mongoid/criteria/queryable/extensions/nil_class_spec.rb +77 -0
  169. data/spec/mongoid/criteria/queryable/extensions/object_spec.rb +108 -0
  170. data/spec/mongoid/criteria/queryable/extensions/range_spec.rb +309 -0
  171. data/spec/mongoid/{extensions/origin → criteria/queryable/extensions}/regexp_raw_spec.rb +2 -2
  172. data/spec/mongoid/criteria/queryable/extensions/regexp_spec.rb +90 -0
  173. data/spec/mongoid/criteria/queryable/extensions/set_spec.rb +39 -0
  174. data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +302 -0
  175. data/spec/mongoid/criteria/queryable/extensions/symbol_spec.rb +167 -0
  176. data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +376 -0
  177. data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +347 -0
  178. data/spec/mongoid/criteria/queryable/forwardable_spec.rb +87 -0
  179. data/spec/mongoid/criteria/queryable/key_spec.rb +52 -0
  180. data/spec/mongoid/criteria/queryable/mergeable_spec.rb +49 -0
  181. data/spec/mongoid/criteria/queryable/optional_spec.rb +1799 -0
  182. data/spec/mongoid/criteria/queryable/options_spec.rb +360 -0
  183. data/spec/mongoid/criteria/queryable/pipeline_spec.rb +200 -0
  184. data/spec/mongoid/criteria/queryable/queryable_spec.rb +137 -0
  185. data/spec/mongoid/criteria/queryable/selectable_spec.rb +4174 -0
  186. data/spec/mongoid/criteria/queryable/selector_spec.rb +844 -0
  187. data/spec/mongoid/criteria/queryable/smash_spec.rb +30 -0
  188. data/spec/mongoid/criteria_spec.rb +152 -21
  189. data/spec/mongoid/document_spec.rb +37 -88
  190. data/spec/mongoid/errors/invalid_relation_spec.rb +37 -0
  191. data/spec/mongoid/errors/mongoid_error_spec.rb +6 -3
  192. data/spec/mongoid/extensions/big_decimal_spec.rb +320 -18
  193. data/spec/mongoid/extensions/boolean_spec.rb +14 -0
  194. data/spec/mongoid/extensions/date_spec.rb +2 -6
  195. data/spec/mongoid/extensions/date_time_spec.rb +2 -6
  196. data/spec/mongoid/extensions/decimal128_spec.rb +1 -1
  197. data/spec/mongoid/extensions/float_spec.rb +8 -1
  198. data/spec/mongoid/extensions/hash_spec.rb +15 -0
  199. data/spec/mongoid/extensions/integer_spec.rb +8 -1
  200. data/spec/mongoid/extensions/object_spec.rb +11 -0
  201. data/spec/mongoid/extensions/string_spec.rb +21 -0
  202. data/spec/mongoid/extensions/time_spec.rb +2 -6
  203. data/spec/mongoid/extensions/time_with_zone_spec.rb +2 -6
  204. data/spec/mongoid/findable_spec.rb +46 -1
  205. data/spec/mongoid/indexable_spec.rb +15 -3
  206. data/spec/mongoid/interceptable_spec.rb +68 -10
  207. data/spec/mongoid/matchable/all_spec.rb +4 -4
  208. data/spec/mongoid/matchable/and_spec.rb +10 -10
  209. data/spec/mongoid/matchable/default_spec.rb +12 -12
  210. data/spec/mongoid/matchable/elem_match_spec.rb +86 -0
  211. data/spec/mongoid/matchable/exists_spec.rb +5 -5
  212. data/spec/mongoid/matchable/gt_spec.rb +18 -7
  213. data/spec/mongoid/matchable/gte_spec.rb +17 -7
  214. data/spec/mongoid/matchable/in_spec.rb +5 -5
  215. data/spec/mongoid/matchable/lt_spec.rb +18 -7
  216. data/spec/mongoid/matchable/lte_spec.rb +18 -7
  217. data/spec/mongoid/matchable/ne_spec.rb +5 -5
  218. data/spec/mongoid/matchable/nin_spec.rb +5 -5
  219. data/spec/mongoid/matchable/or_spec.rb +7 -7
  220. data/spec/mongoid/matchable/regexp_spec.rb +5 -5
  221. data/spec/mongoid/matchable/size_spec.rb +3 -3
  222. data/spec/mongoid/matchable_spec.rb +173 -53
  223. data/spec/mongoid/persistable/creatable_spec.rb +7 -2
  224. data/spec/mongoid/persistable/deletable_spec.rb +16 -1
  225. data/spec/mongoid/persistable/destroyable_spec.rb +6 -2
  226. data/spec/mongoid/persistable/savable_spec.rb +35 -30
  227. data/spec/mongoid/persistable/settable_spec.rb +45 -29
  228. data/spec/mongoid/persistable/updatable_spec.rb +184 -5
  229. data/spec/mongoid/persistence_context_spec.rb +680 -0
  230. data/spec/mongoid/positional_spec.rb +10 -10
  231. data/spec/mongoid/query_cache_spec.rb +89 -0
  232. data/spec/mongoid/relations/accessors_spec.rb +1 -1
  233. data/spec/mongoid/relations/auto_save_spec.rb +39 -6
  234. data/spec/mongoid/relations/bindings/referenced/many_to_many_spec.rb +4 -4
  235. data/spec/mongoid/relations/builders_spec.rb +37 -10
  236. data/spec/mongoid/relations/counter_cache_spec.rb +64 -3
  237. data/spec/mongoid/relations/eager/has_and_belongs_to_many_spec.rb +16 -0
  238. data/spec/mongoid/relations/eager_spec.rb +40 -0
  239. data/spec/mongoid/relations/embedded/many_spec.rb +63 -47
  240. data/spec/mongoid/relations/embedded/one_spec.rb +2 -1
  241. data/spec/mongoid/relations/macros_spec.rb +395 -7
  242. data/spec/mongoid/relations/metadata_spec.rb +15 -1
  243. data/spec/mongoid/relations/proxy_spec.rb +27 -1
  244. data/spec/mongoid/relations/referenced/in_spec.rb +41 -1
  245. data/spec/mongoid/relations/referenced/many_spec.rb +13 -25
  246. data/spec/mongoid/relations/referenced/many_to_many_spec.rb +14 -26
  247. data/spec/mongoid/relations/synchronization_spec.rb +48 -2
  248. data/spec/mongoid/relations/touchable_spec.rb +40 -0
  249. data/spec/mongoid/reloadable_spec.rb +51 -0
  250. data/spec/mongoid/serializable_spec.rb +0 -50
  251. data/spec/mongoid/validatable/presence_spec.rb +1 -1
  252. data/spec/mongoid/validatable/uniqueness_spec.rb +18 -9
  253. data/spec/mongoid/validatable_spec.rb +16 -0
  254. data/spec/spec_helper.rb +20 -11
  255. metadata +524 -469
  256. checksums.yaml.gz.sig +0 -0
  257. data.tar.gz.sig +0 -0
  258. data/lib/mongoid/clients/thread_options.rb +0 -19
  259. data/lib/mongoid/extensions/origin/regexp_raw.rb +0 -43
  260. metadata.gz.sig +0 -0
@@ -0,0 +1,30 @@
1
+ require "spec_helper"
2
+
3
+ describe Mongoid::Criteria::Queryable::Smash do
4
+
5
+ let(:smash) do
6
+ described_class.new(ns: :namespace)
7
+ end
8
+
9
+ describe "#[]" do
10
+
11
+ before do
12
+ smash.store(:namespace, :default)
13
+ smash.store(:some_field, 42)
14
+ end
15
+
16
+ context "when accessing aliased field" do
17
+
18
+ it "returns value for original field" do
19
+ expect(smash[:ns]).to eq(:default)
20
+ end
21
+ end
22
+
23
+ context "when accessing non-aliased field" do
24
+
25
+ it "returns value for the field" do
26
+ expect(smash[:some_field]).to eq(42)
27
+ end
28
+ end
29
+ end
30
+ end
@@ -412,7 +412,7 @@ describe Mongoid::Criteria do
412
412
  end
413
413
 
414
414
  let(:criteria) do
415
- Band.where(name: "Depeche Mode").asc(:name).includes(:records)
415
+ Band.where(name: "Depeche Mode").asc(:name).includes(:records).read(mode: :secondary)
416
416
  end
417
417
 
418
418
  before do
@@ -433,7 +433,7 @@ describe Mongoid::Criteria do
433
433
  end
434
434
 
435
435
  it "contains equal options" do
436
- expect(clone.options).to eq({ sort: { "name" => 1 }})
436
+ expect(clone.options).to eq({ sort: { "name" => 1 }, read: { mode: :secondary } })
437
437
  end
438
438
 
439
439
  it "clones the options" do
@@ -467,6 +467,10 @@ describe Mongoid::Criteria do
467
467
  it "sets the context to nil" do
468
468
  expect(clone.instance_variable_get(:@context)).to be_nil
469
469
  end
470
+
471
+ it 'does not convert the option keys to string from symbols' do
472
+ expect(clone.options[:read][:mode]).to eq(:secondary)
473
+ end
470
474
  end
471
475
  end
472
476
 
@@ -590,7 +594,8 @@ describe Mongoid::Criteria do
590
594
 
591
595
  let!(:match) do
592
596
  Band.create(name: "Depeche Mode").tap do |band|
593
- band.records.create(name: "101")
597
+ r = band.records
598
+ r.create(name: "101")
594
599
  end
595
600
  end
596
601
 
@@ -2803,6 +2808,93 @@ describe Mongoid::Criteria do
2803
2808
  end
2804
2809
  end
2805
2810
  end
2811
+
2812
+ context 'when the field is localized' do
2813
+
2814
+ before do
2815
+ I18n.locale = :en
2816
+ d = Dictionary.create(description: 'english-text')
2817
+ I18n.locale = :de
2818
+ d.description = 'deutsch-text'
2819
+ d.save
2820
+ end
2821
+
2822
+ after do
2823
+ I18n.locale = :en
2824
+ end
2825
+
2826
+ context 'when entire field is included' do
2827
+
2828
+ let(:dictionary) do
2829
+ Dictionary.only(:description).first
2830
+
2831
+ end
2832
+
2833
+ it 'loads all translations' do
2834
+ expect(dictionary.description_translations.keys).to include('de', 'en')
2835
+ end
2836
+
2837
+ it 'returns the field value for the current locale' do
2838
+ I18n.locale = :en
2839
+ expect(dictionary.description).to eq('english-text')
2840
+ I18n.locale = :de
2841
+ expect(dictionary.description).to eq('deutsch-text')
2842
+ end
2843
+ end
2844
+
2845
+ context 'when a specific locale is included' do
2846
+
2847
+ let(:dictionary) do
2848
+ Dictionary.only(:'description.de').first
2849
+ end
2850
+
2851
+ it 'loads translations only for the included locale' do
2852
+ expect(dictionary.description_translations.keys).to include('de')
2853
+ expect(dictionary.description_translations.keys).to_not include('en')
2854
+ end
2855
+
2856
+ it 'returns the field value for the included locale' do
2857
+ I18n.locale = :en
2858
+ expect(dictionary.description).to be_nil
2859
+ I18n.locale = :de
2860
+ expect(dictionary.description).to eq('deutsch-text')
2861
+ end
2862
+ end
2863
+
2864
+ context 'when entire field is excluded' do
2865
+
2866
+ let(:dictionary) do
2867
+ Dictionary.without(:description).first
2868
+ end
2869
+
2870
+ it 'does not load all translations' do
2871
+ expect(dictionary.description_translations.keys).to_not include('de', 'en')
2872
+ end
2873
+
2874
+ it 'raises an ActiveModel::MissingAttributeError when attempting to access the field' do
2875
+ expect{dictionary.description}.to raise_error ActiveModel::MissingAttributeError
2876
+ end
2877
+ end
2878
+
2879
+ context 'when a specific locale is excluded' do
2880
+
2881
+ let(:dictionary) do
2882
+ Dictionary.without(:'description.de').first
2883
+ end
2884
+
2885
+ it 'does not load excluded translations' do
2886
+ expect(dictionary.description_translations.keys).to_not include('de')
2887
+ expect(dictionary.description_translations.keys).to include('en')
2888
+ end
2889
+
2890
+ it 'returns nil for excluded translations' do
2891
+ I18n.locale = :en
2892
+ expect(dictionary.description).to eq('english-text')
2893
+ I18n.locale = :de
2894
+ expect(dictionary.description).to be_nil
2895
+ end
2896
+ end
2897
+ end
2806
2898
  end
2807
2899
 
2808
2900
  [ :or, :any_of ].each do |method|
@@ -2890,7 +2982,7 @@ describe Mongoid::Criteria do
2890
2982
  end
2891
2983
 
2892
2984
  it "returns the values" do
2893
- expect(plucked).to eq([ "Depeche Mode", "Tool", "Photek" ])
2985
+ expect(plucked).to contain_exactly("Depeche Mode", "Tool", "Photek")
2894
2986
  end
2895
2987
 
2896
2988
  context "when subsequently executing the criteria without a pluck" do
@@ -2955,14 +3047,14 @@ describe Mongoid::Criteria do
2955
3047
  end
2956
3048
  end
2957
3049
 
2958
- context "when plucking mult-fields" do
3050
+ context "when plucking multi-fields" do
2959
3051
 
2960
3052
  let(:plucked) do
2961
3053
  Band.where(:name.exists => true).pluck(:name, :likes)
2962
3054
  end
2963
3055
 
2964
3056
  it "returns the values" do
2965
- expect(plucked).to eq([ ["Depeche Mode", 3], ["Tool", 3], ["Photek", 1] ])
3057
+ expect(plucked).to contain_exactly(["Depeche Mode", 3], ["Tool", 3], ["Photek", 1])
2966
3058
  end
2967
3059
  end
2968
3060
 
@@ -2973,7 +3065,7 @@ describe Mongoid::Criteria do
2973
3065
  end
2974
3066
 
2975
3067
  it "returns the duplicates" do
2976
- expect(plucked).to eq([ 3, 3, 1 ])
3068
+ expect(plucked).to contain_exactly(3, 3, 1)
2977
3069
  end
2978
3070
  end
2979
3071
  end
@@ -3035,6 +3127,43 @@ describe Mongoid::Criteria do
3035
3127
  end
3036
3128
  end
3037
3129
  end
3130
+
3131
+ context 'when plucking a localized field' do
3132
+
3133
+ before do
3134
+ I18n.locale = :en
3135
+ d = Dictionary.create(description: 'english-text')
3136
+ I18n.locale = :de
3137
+ d.description = 'deutsch-text'
3138
+ d.save
3139
+ end
3140
+
3141
+ after do
3142
+ I18n.locale = :en
3143
+ end
3144
+
3145
+ context 'when plucking the entire field' do
3146
+
3147
+ let(:plucked) do
3148
+ Dictionary.all.pluck(:description)
3149
+ end
3150
+
3151
+ it 'returns all translations' do
3152
+ expect(plucked.first).to eq({'en' => 'english-text', 'de' => 'deutsch-text'})
3153
+ end
3154
+ end
3155
+
3156
+ context 'when plucking a specific locale' do
3157
+
3158
+ let(:plucked) do
3159
+ Dictionary.all.pluck(:'description.de')
3160
+ end
3161
+
3162
+ it 'returns the specific translations' do
3163
+ expect(plucked.first).to eq({'de' => 'deutsch-text'})
3164
+ end
3165
+ end
3166
+ end
3038
3167
  end
3039
3168
 
3040
3169
  describe "#respond_to?" do
@@ -3314,17 +3443,6 @@ describe Mongoid::Criteria do
3314
3443
  end
3315
3444
  end
3316
3445
 
3317
- context 'when the criteria contains a BSON::Regexp::Raw' do
3318
-
3319
- let(:criteria) do
3320
- Band.where(name: BSON::Regexp::Raw.new("^Depeche"))
3321
- end
3322
-
3323
- it "returns the matching documents" do
3324
- expect(criteria).to eq([ match ])
3325
- end
3326
- end
3327
-
3328
3446
  context "when the criteria is an exact fk array match" do
3329
3447
 
3330
3448
  let(:id_one) do
@@ -3502,8 +3620,21 @@ describe Mongoid::Criteria do
3502
3620
 
3503
3621
  describe "#with" do
3504
3622
 
3505
- let!(:criteria) do
3506
- Band.where(name: "Depeche Mode").with(collection: "artists")
3623
+ let!(:criteria_and_collection) do
3624
+ collection = nil
3625
+ criteria = Band.where(name: "Depeche Mode").with(collection: "artists") do |crit|
3626
+ collection = crit.collection
3627
+ crit
3628
+ end
3629
+ [ criteria, collection ]
3630
+ end
3631
+
3632
+ let(:criteria) do
3633
+ criteria_and_collection[0]
3634
+ end
3635
+
3636
+ let(:collection) do
3637
+ criteria_and_collection[1]
3507
3638
  end
3508
3639
 
3509
3640
  it "retains the criteria selection" do
@@ -3511,7 +3642,7 @@ describe Mongoid::Criteria do
3511
3642
  end
3512
3643
 
3513
3644
  it "sets the persistence options" do
3514
- expect(criteria.persistence_options).to eq(collection: "artists")
3645
+ expect(collection.name).to eq("artists")
3515
3646
  end
3516
3647
  end
3517
3648
 
@@ -122,75 +122,6 @@ describe Mongoid::Document do
122
122
  end
123
123
  end
124
124
 
125
- describe "#cache_key" do
126
-
127
- let(:document) do
128
- Dokument.new
129
- end
130
-
131
- context "when the document is new" do
132
-
133
- it "has a new key name" do
134
- expect(document.cache_key).to eq("dokuments/new")
135
- end
136
- end
137
-
138
- context "when persisted" do
139
-
140
- before do
141
- document.save
142
- end
143
-
144
- context "with updated_at" do
145
-
146
- let!(:updated_at) do
147
- document.updated_at.utc.to_s(:nsec)
148
- end
149
-
150
- it "has the id and updated_at key name" do
151
- expect(document.cache_key).to eq("dokuments/#{document.id}-#{updated_at}")
152
- end
153
- end
154
-
155
- context "without updated_at, with Timestamps" do
156
-
157
- before do
158
- document.updated_at = nil
159
- end
160
-
161
- it "has the id key name" do
162
- expect(document.cache_key).to eq("dokuments/#{document.id}")
163
- end
164
- end
165
- end
166
-
167
- context "when model dont have Timestamps" do
168
-
169
- let(:artist) do
170
- Artist.create!
171
- end
172
-
173
- it "should have the id key name" do
174
- expect(artist.cache_key).to eq("artists/#{artist.id}")
175
- end
176
- end
177
-
178
- context "when model has Short Timestamps" do
179
-
180
- let(:agent) do
181
- ShortAgent.create!
182
- end
183
-
184
- let!(:updated_at) do
185
- agent.updated_at.utc.to_s(:nsec)
186
- end
187
-
188
- it "has the id and updated_at key name" do
189
- expect(agent.cache_key).to eq("short_agents/#{agent.id}-#{updated_at}")
190
- end
191
- end
192
- end
193
-
194
125
  describe "#identity" do
195
126
 
196
127
  let(:person) do
@@ -519,14 +450,26 @@ describe Mongoid::Document do
519
450
  expect(person.as_document).to have_key("name")
520
451
  end
521
452
 
453
+ it "includes embeds one attributes as a symbol" do
454
+ expect(person.as_document).to have_key(:name)
455
+ end
456
+
522
457
  it "includes embeds many attributes" do
523
458
  expect(person.as_document).to have_key("addresses")
524
459
  end
525
460
 
461
+ it "includes embeds many attributes as a symbol" do
462
+ expect(person.as_document).to have_key(:addresses)
463
+ end
464
+
526
465
  it "includes second level embeds many attributes" do
527
466
  expect(person.as_document["addresses"].first).to have_key("locations")
528
467
  end
529
468
 
469
+ it "includes second level embeds many attributes as a symbol" do
470
+ expect(person.as_document["addresses"].first).to have_key(:locations)
471
+ end
472
+
530
473
  context "with relation define store_as option in embeded_many" do
531
474
 
532
475
  let!(:phone) do
@@ -537,6 +480,10 @@ describe Mongoid::Document do
537
480
  expect(person.as_document).to have_key("mobile_phones")
538
481
  end
539
482
 
483
+ it 'includes the store_as key association as a symbol' do
484
+ expect(person.as_document).to have_key(:mobile_phones)
485
+ end
486
+
540
487
  it 'should not include the key of association' do
541
488
  expect(person.as_document).to_not have_key("phones")
542
489
  end
@@ -675,7 +622,7 @@ describe Mongoid::Document do
675
622
 
676
623
  it "freezes attributes" do
677
624
  expect(person.freeze).to eq(person)
678
- expect { person.title = "something" }.to raise_error
625
+ expect { person.title = "something" }.to raise_error(RuntimeError)
679
626
  end
680
627
  end
681
628
 
@@ -689,7 +636,7 @@ describe Mongoid::Document do
689
636
  person.freeze
690
637
  expect {
691
638
  person.title = "something"
692
- }.to raise_error
639
+ }.to raise_error(RuntimeError)
693
640
  end
694
641
  end
695
642
  end
@@ -1215,22 +1162,20 @@ describe Mongoid::Document do
1215
1162
 
1216
1163
  context "when marshalling the document" do
1217
1164
 
1218
- let(:person) do
1219
- Person.new.tap do |person|
1220
- person.addresses.extension
1221
- end
1165
+ let(:agency) do
1166
+ Agency.new
1222
1167
  end
1223
1168
 
1224
- let!(:account) do
1225
- person.create_account(name: "savings")
1169
+ let!(:agent) do
1170
+ agency.agents.build(title: "VIP")
1226
1171
  end
1227
1172
 
1228
1173
  describe Marshal, ".dump" do
1229
1174
 
1230
1175
  it "successfully dumps the document" do
1231
1176
  expect {
1232
- Marshal.dump(person)
1233
- Marshal.dump(account)
1177
+ Marshal.dump(agency)
1178
+ Marshal.dump(agent)
1234
1179
  }.not_to raise_error
1235
1180
  end
1236
1181
  end
@@ -1238,7 +1183,7 @@ describe Mongoid::Document do
1238
1183
  describe Marshal, ".load" do
1239
1184
 
1240
1185
  it "successfully loads the document" do
1241
- expect { Marshal.load(Marshal.dump(person)) }.not_to raise_error
1186
+ expect(Marshal.load(Marshal.dump(agency))).to eq(agency)
1242
1187
  end
1243
1188
  end
1244
1189
  end
@@ -1253,22 +1198,26 @@ describe Mongoid::Document do
1253
1198
 
1254
1199
  describe "#fetch" do
1255
1200
 
1256
- let!(:person) do
1257
- Person.new
1201
+ let(:agency) do
1202
+ Agency.new
1203
+ end
1204
+
1205
+ let(:agent) do
1206
+ agency.agents.build(title: "VIP", address: address)
1258
1207
  end
1259
1208
 
1260
- let!(:account) do
1261
- person.create_account(name: "savings")
1209
+ let(:address) do
1210
+ Address.new(city: 'Berlin')
1262
1211
  end
1263
1212
 
1264
1213
  it "stores the parent object" do
1265
- expect(cache.fetch("key") { person }).to eq(person)
1266
- expect(cache.fetch("key")).to eq(person)
1214
+ expect(cache.fetch("key") { agency }).to eq(agency)
1215
+ expect(cache.fetch("key")).to eq(agency)
1267
1216
  end
1268
1217
 
1269
1218
  it "stores the embedded object" do
1270
- expect(cache.fetch("key") { account }).to eq(account)
1271
- expect(cache.fetch("key")).to eq(account)
1219
+ expect(cache.fetch("key") { agent }).to eq(agent)
1220
+ expect(cache.fetch("key").address).to eq(agent.address)
1272
1221
  end
1273
1222
  end
1274
1223
  end