mongoid 7.5.0 → 8.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (286) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/README.md +3 -3
  4. data/lib/config/locales/en.yml +46 -30
  5. data/lib/mongoid/association/accessors.rb +32 -3
  6. data/lib/mongoid/association/bindable.rb +48 -0
  7. data/lib/mongoid/association/builders.rb +4 -2
  8. data/lib/mongoid/association/eager_loadable.rb +29 -7
  9. data/lib/mongoid/association/embedded/batchable.rb +48 -8
  10. data/lib/mongoid/association/embedded/embedded_in/binding.rb +24 -2
  11. data/lib/mongoid/association/embedded/embedded_in.rb +2 -1
  12. data/lib/mongoid/association/embedded/embeds_many/binding.rb +1 -0
  13. data/lib/mongoid/association/embedded/embeds_many/buildable.rb +1 -1
  14. data/lib/mongoid/association/embedded/embeds_many/proxy.rb +40 -18
  15. data/lib/mongoid/association/embedded/embeds_one/buildable.rb +18 -4
  16. data/lib/mongoid/association/embedded/embeds_one/proxy.rb +21 -2
  17. data/lib/mongoid/association/macros.rb +2 -1
  18. data/lib/mongoid/association/many.rb +5 -0
  19. data/lib/mongoid/association/nested/many.rb +2 -1
  20. data/lib/mongoid/association/proxy.rb +12 -0
  21. data/lib/mongoid/association/referenced/auto_save.rb +3 -2
  22. data/lib/mongoid/association/referenced/belongs_to/binding.rb +1 -0
  23. data/lib/mongoid/association/referenced/belongs_to/buildable.rb +1 -1
  24. data/lib/mongoid/association/referenced/belongs_to.rb +1 -1
  25. data/lib/mongoid/association/referenced/counter_cache.rb +8 -8
  26. data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +64 -11
  27. data/lib/mongoid/association/referenced/has_and_belongs_to_many.rb +4 -1
  28. data/lib/mongoid/association/referenced/has_many/enumerable.rb +10 -18
  29. data/lib/mongoid/association/referenced/has_many/proxy.rb +12 -9
  30. data/lib/mongoid/association/referenced/has_one/buildable.rb +1 -1
  31. data/lib/mongoid/association/referenced/has_one/proxy.rb +8 -11
  32. data/lib/mongoid/association/referenced/syncable.rb +2 -2
  33. data/lib/mongoid/association/relatable.rb +38 -4
  34. data/lib/mongoid/atomic/paths/embedded/many.rb +19 -0
  35. data/lib/mongoid/attributes/processing.rb +9 -2
  36. data/lib/mongoid/attributes.rb +30 -27
  37. data/lib/mongoid/changeable.rb +37 -2
  38. data/lib/mongoid/clients/options.rb +4 -0
  39. data/lib/mongoid/clients/sessions.rb +2 -14
  40. data/lib/mongoid/config.rb +20 -10
  41. data/lib/mongoid/contextual/aggregable/memory.rb +23 -15
  42. data/lib/mongoid/contextual/aggregable/mongo.rb +1 -1
  43. data/lib/mongoid/contextual/map_reduce.rb +2 -2
  44. data/lib/mongoid/contextual/memory.rb +55 -28
  45. data/lib/mongoid/contextual/mongo.rb +173 -245
  46. data/lib/mongoid/contextual/none.rb +33 -15
  47. data/lib/mongoid/copyable.rb +32 -8
  48. data/lib/mongoid/criteria/includable.rb +24 -20
  49. data/lib/mongoid/criteria/marshalable.rb +10 -2
  50. data/lib/mongoid/criteria/queryable/extensions/array.rb +2 -15
  51. data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +25 -4
  52. data/lib/mongoid/criteria/queryable/extensions/boolean.rb +1 -1
  53. data/lib/mongoid/criteria/queryable/extensions/date.rb +6 -1
  54. data/lib/mongoid/criteria/queryable/extensions/date_time.rb +6 -1
  55. data/lib/mongoid/criteria/queryable/extensions/hash.rb +0 -16
  56. data/lib/mongoid/criteria/queryable/extensions/numeric.rb +1 -1
  57. data/lib/mongoid/criteria/queryable/extensions/object.rb +2 -1
  58. data/lib/mongoid/criteria/queryable/extensions/range.rb +13 -5
  59. data/lib/mongoid/criteria/queryable/extensions/regexp.rb +1 -1
  60. data/lib/mongoid/criteria/queryable/extensions/symbol.rb +3 -1
  61. data/lib/mongoid/criteria/queryable/extensions/time.rb +6 -1
  62. data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +6 -1
  63. data/lib/mongoid/criteria/queryable/optional.rb +3 -9
  64. data/lib/mongoid/criteria/queryable/options.rb +1 -1
  65. data/lib/mongoid/criteria/queryable/selectable.rb +2 -24
  66. data/lib/mongoid/criteria/queryable/selector.rb +89 -4
  67. data/lib/mongoid/criteria/queryable/smash.rb +39 -6
  68. data/lib/mongoid/criteria/queryable.rb +11 -6
  69. data/lib/mongoid/criteria.rb +1 -28
  70. data/lib/mongoid/deprecable.rb +36 -0
  71. data/lib/mongoid/deprecation.rb +25 -0
  72. data/lib/mongoid/document.rb +96 -34
  73. data/lib/mongoid/errors/document_not_found.rb +6 -2
  74. data/lib/mongoid/errors/invalid_dot_dollar_assignment.rb +23 -0
  75. data/lib/mongoid/errors/invalid_field.rb +5 -1
  76. data/lib/mongoid/errors/invalid_field_type.rb +26 -0
  77. data/lib/mongoid/errors/too_many_nested_attribute_records.rb +1 -1
  78. data/lib/mongoid/errors.rb +2 -2
  79. data/lib/mongoid/extensions/array.rb +8 -6
  80. data/lib/mongoid/extensions/big_decimal.rb +29 -10
  81. data/lib/mongoid/extensions/binary.rb +42 -0
  82. data/lib/mongoid/extensions/boolean.rb +8 -2
  83. data/lib/mongoid/extensions/date.rb +26 -20
  84. data/lib/mongoid/extensions/date_time.rb +1 -1
  85. data/lib/mongoid/extensions/float.rb +4 -5
  86. data/lib/mongoid/extensions/hash.rb +12 -5
  87. data/lib/mongoid/extensions/integer.rb +4 -5
  88. data/lib/mongoid/extensions/object.rb +2 -0
  89. data/lib/mongoid/extensions/range.rb +41 -10
  90. data/lib/mongoid/extensions/regexp.rb +11 -4
  91. data/lib/mongoid/extensions/set.rb +11 -4
  92. data/lib/mongoid/extensions/string.rb +2 -13
  93. data/lib/mongoid/extensions/symbol.rb +3 -14
  94. data/lib/mongoid/extensions/time.rb +27 -16
  95. data/lib/mongoid/extensions/time_with_zone.rb +1 -2
  96. data/lib/mongoid/extensions.rb +1 -0
  97. data/lib/mongoid/factory.rb +42 -7
  98. data/lib/mongoid/fields/foreign_key.rb +7 -0
  99. data/lib/mongoid/fields/validators/macro.rb +3 -9
  100. data/lib/mongoid/fields.rb +49 -7
  101. data/lib/mongoid/findable.rb +21 -16
  102. data/lib/mongoid/indexable/specification.rb +1 -1
  103. data/lib/mongoid/indexable/validators/options.rb +4 -1
  104. data/lib/mongoid/interceptable.rb +69 -9
  105. data/lib/mongoid/persistable/creatable.rb +14 -5
  106. data/lib/mongoid/persistable/updatable.rb +12 -5
  107. data/lib/mongoid/persistence_context.rb +19 -2
  108. data/lib/mongoid/query_cache.rb +6 -258
  109. data/lib/mongoid/railties/controller_runtime.rb +1 -1
  110. data/lib/mongoid/reloadable.rb +7 -3
  111. data/lib/mongoid/selectable.rb +1 -2
  112. data/lib/mongoid/stateful.rb +27 -1
  113. data/lib/mongoid/timestamps/created.rb +1 -1
  114. data/lib/mongoid/timestamps/updated.rb +1 -1
  115. data/lib/mongoid/touchable.rb +2 -3
  116. data/lib/mongoid/traversable.rb +1 -0
  117. data/lib/mongoid/validatable/uniqueness.rb +2 -1
  118. data/lib/mongoid/version.rb +1 -1
  119. data/lib/mongoid/warnings.rb +3 -4
  120. data/lib/mongoid.rb +1 -0
  121. data/spec/config/mongoid.yml +16 -0
  122. data/spec/integration/app_spec.rb +8 -12
  123. data/spec/integration/associations/belongs_to_spec.rb +18 -0
  124. data/spec/integration/associations/embedded_spec.rb +15 -0
  125. data/spec/integration/associations/embeds_many_spec.rb +15 -2
  126. data/spec/integration/associations/embeds_one_spec.rb +18 -0
  127. data/spec/integration/associations/foreign_key_spec.rb +9 -0
  128. data/spec/integration/associations/has_and_belongs_to_many_spec.rb +21 -0
  129. data/spec/integration/associations/has_one_spec.rb +97 -1
  130. data/spec/integration/associations/scope_option_spec.rb +1 -1
  131. data/spec/integration/callbacks_models.rb +95 -1
  132. data/spec/integration/callbacks_spec.rb +226 -4
  133. data/spec/integration/criteria/range_spec.rb +95 -1
  134. data/spec/integration/discriminator_key_spec.rb +115 -76
  135. data/spec/integration/dots_and_dollars_spec.rb +277 -0
  136. data/spec/integration/i18n_fallbacks_spec.rb +1 -15
  137. data/spec/integration/matcher_examples_spec.rb +20 -13
  138. data/spec/integration/matcher_operator_data/type_decimal.yml +3 -2
  139. data/spec/integration/matcher_operator_spec.rb +3 -5
  140. data/spec/integration/persistence/range_field_spec.rb +350 -0
  141. data/spec/mongoid/association/counter_cache_spec.rb +1 -1
  142. data/spec/mongoid/association/depending_spec.rb +9 -9
  143. data/spec/mongoid/association/eager_spec.rb +2 -1
  144. data/spec/mongoid/association/embedded/embedded_in/binding_spec.rb +2 -1
  145. data/spec/mongoid/association/embedded/embedded_in/buildable_spec.rb +54 -0
  146. data/spec/mongoid/association/embedded/embedded_in/proxy_spec.rb +69 -9
  147. data/spec/mongoid/association/embedded/embeds_many/buildable_spec.rb +112 -0
  148. data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +219 -8
  149. data/spec/mongoid/association/embedded/embeds_many_models.rb +157 -0
  150. data/spec/mongoid/association/embedded/embeds_many_query_spec.rb +12 -0
  151. data/spec/mongoid/association/embedded/embeds_many_spec.rb +68 -0
  152. data/spec/mongoid/association/embedded/embeds_one/buildable_spec.rb +25 -0
  153. data/spec/mongoid/association/embedded/embeds_one_models.rb +19 -0
  154. data/spec/mongoid/association/embedded/embeds_one_spec.rb +28 -0
  155. data/spec/mongoid/association/referenced/belongs_to/binding_spec.rb +2 -1
  156. data/spec/mongoid/association/referenced/belongs_to/buildable_spec.rb +54 -0
  157. data/spec/mongoid/association/referenced/belongs_to/proxy_spec.rb +15 -0
  158. data/spec/mongoid/association/referenced/belongs_to_models.rb +11 -0
  159. data/spec/mongoid/association/referenced/belongs_to_spec.rb +2 -2
  160. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_spec.rb +67 -4
  161. data/spec/mongoid/association/referenced/has_and_belongs_to_many_models.rb +25 -0
  162. data/spec/mongoid/association/referenced/has_and_belongs_to_many_spec.rb +35 -2
  163. data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +109 -0
  164. data/spec/mongoid/association/referenced/has_many/enumerable_spec.rb +2 -56
  165. data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +82 -13
  166. data/spec/mongoid/association/referenced/has_many_models.rb +3 -1
  167. data/spec/mongoid/association/referenced/has_many_spec.rb +25 -0
  168. data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +2 -2
  169. data/spec/mongoid/association/referenced/has_one/proxy_spec.rb +107 -1
  170. data/spec/mongoid/association/referenced/has_one_models.rb +16 -0
  171. data/spec/mongoid/association/syncable_spec.rb +14 -0
  172. data/spec/mongoid/atomic/paths_spec.rb +0 -14
  173. data/spec/mongoid/attributes/nested_spec.rb +80 -11
  174. data/spec/mongoid/attributes/nested_spec_models.rb +48 -0
  175. data/spec/mongoid/attributes/projector_spec.rb +1 -5
  176. data/spec/mongoid/attributes_spec.rb +524 -27
  177. data/spec/mongoid/changeable_spec.rb +130 -13
  178. data/spec/mongoid/clients/factory_spec.rb +23 -30
  179. data/spec/mongoid/clients/sessions_spec.rb +0 -38
  180. data/spec/mongoid/clients_spec.rb +32 -2
  181. data/spec/mongoid/config_spec.rb +58 -13
  182. data/spec/mongoid/contextual/aggregable/memory_spec.rb +396 -158
  183. data/spec/mongoid/contextual/aggregable/memory_table.yml +88 -0
  184. data/spec/mongoid/contextual/aggregable/memory_table_spec.rb +62 -0
  185. data/spec/mongoid/contextual/map_reduce_spec.rb +2 -16
  186. data/spec/mongoid/contextual/memory_spec.rb +521 -14
  187. data/spec/mongoid/contextual/mongo_spec.rb +564 -394
  188. data/spec/mongoid/contextual/none_spec.rb +11 -19
  189. data/spec/mongoid/copyable_spec.rb +451 -1
  190. data/spec/mongoid/criteria/findable_spec.rb +86 -210
  191. data/spec/mongoid/criteria/includable_spec.rb +1492 -0
  192. data/spec/mongoid/criteria/includable_spec_models.rb +54 -0
  193. data/spec/mongoid/criteria/marshalable_spec.rb +18 -1
  194. data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +7 -19
  195. data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +134 -26
  196. data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +11 -0
  197. data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +11 -0
  198. data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +0 -15
  199. data/spec/mongoid/criteria/queryable/extensions/numeric_spec.rb +73 -7
  200. data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +11 -0
  201. data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +11 -0
  202. data/spec/mongoid/criteria/queryable/optional_spec.rb +0 -484
  203. data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +50 -0
  204. data/spec/mongoid/criteria/queryable/selectable_spec.rb +77 -85
  205. data/spec/mongoid/criteria/queryable/selector_spec.rb +14 -2
  206. data/spec/mongoid/criteria_spec.rb +469 -1201
  207. data/spec/mongoid/document_fields_spec.rb +173 -24
  208. data/spec/mongoid/document_spec.rb +32 -41
  209. data/spec/mongoid/errors/document_not_found_spec.rb +29 -2
  210. data/spec/mongoid/errors/invalid_field_spec.rb +1 -1
  211. data/spec/mongoid/errors/invalid_field_type_spec.rb +55 -0
  212. data/spec/mongoid/errors/mongoid_error_spec.rb +3 -1
  213. data/spec/mongoid/errors/no_environment_spec.rb +3 -3
  214. data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +1 -1
  215. data/spec/mongoid/extensions/array_spec.rb +16 -2
  216. data/spec/mongoid/extensions/big_decimal_spec.rb +697 -212
  217. data/spec/mongoid/extensions/binary_spec.rb +44 -9
  218. data/spec/mongoid/extensions/boolean_spec.rb +68 -82
  219. data/spec/mongoid/extensions/date_class_mongoize_spec.rb +7 -3
  220. data/spec/mongoid/extensions/date_spec.rb +71 -1
  221. data/spec/mongoid/extensions/date_time_spec.rb +15 -9
  222. data/spec/mongoid/extensions/float_spec.rb +48 -76
  223. data/spec/mongoid/extensions/hash_spec.rb +30 -0
  224. data/spec/mongoid/extensions/integer_spec.rb +45 -66
  225. data/spec/mongoid/extensions/range_spec.rb +255 -54
  226. data/spec/mongoid/extensions/regexp_spec.rb +58 -33
  227. data/spec/mongoid/extensions/set_spec.rb +106 -0
  228. data/spec/mongoid/extensions/string_spec.rb +53 -25
  229. data/spec/mongoid/extensions/symbol_spec.rb +18 -25
  230. data/spec/mongoid/extensions/time_spec.rb +634 -66
  231. data/spec/mongoid/extensions/time_with_zone_spec.rb +17 -31
  232. data/spec/mongoid/factory_spec.rb +61 -1
  233. data/spec/mongoid/fields_spec.rb +321 -50
  234. data/spec/mongoid/findable_spec.rb +64 -29
  235. data/spec/mongoid/indexable/specification_spec.rb +2 -2
  236. data/spec/mongoid/indexable_spec.rb +16 -19
  237. data/spec/mongoid/interceptable_spec.rb +584 -5
  238. data/spec/mongoid/interceptable_spec_models.rb +235 -4
  239. data/spec/mongoid/matcher/extract_attribute_spec.rb +1 -5
  240. data/spec/mongoid/mongoizable_spec.rb +285 -0
  241. data/spec/mongoid/persistable/creatable_spec.rb +2 -2
  242. data/spec/mongoid/persistable/deletable_spec.rb +2 -2
  243. data/spec/mongoid/persistable/destroyable_spec.rb +2 -2
  244. data/spec/mongoid/persistable/upsertable_spec.rb +14 -0
  245. data/spec/mongoid/persistence_context_spec.rb +50 -1
  246. data/spec/mongoid/query_cache_middleware_spec.rb +0 -18
  247. data/spec/mongoid/query_cache_spec.rb +0 -154
  248. data/spec/mongoid/reloadable_spec.rb +35 -2
  249. data/spec/mongoid/scopable_spec.rb +21 -1
  250. data/spec/mongoid/shardable_spec.rb +14 -0
  251. data/spec/mongoid/stateful_spec.rb +28 -0
  252. data/spec/mongoid/timestamps_spec.rb +390 -0
  253. data/spec/mongoid/timestamps_spec_models.rb +67 -0
  254. data/spec/mongoid/touchable_spec.rb +116 -0
  255. data/spec/mongoid/touchable_spec_models.rb +12 -8
  256. data/spec/mongoid/traversable_spec.rb +4 -11
  257. data/spec/mongoid/validatable/presence_spec.rb +1 -1
  258. data/spec/mongoid/validatable/uniqueness_spec.rb +60 -31
  259. data/spec/mongoid/warnings_spec.rb +35 -0
  260. data/spec/rails/controller_extension/controller_runtime_spec.rb +2 -2
  261. data/spec/rails/mongoid_spec.rb +4 -16
  262. data/spec/shared/lib/mrss/event_subscriber.rb +5 -15
  263. data/spec/support/constraints.rb +24 -0
  264. data/spec/support/macros.rb +30 -0
  265. data/spec/support/models/augmentation.rb +12 -0
  266. data/spec/support/models/band.rb +3 -0
  267. data/spec/support/models/catalog.rb +24 -0
  268. data/spec/support/models/circus.rb +3 -0
  269. data/spec/support/models/fanatic.rb +8 -0
  270. data/spec/support/models/implant.rb +9 -0
  271. data/spec/support/models/label.rb +2 -0
  272. data/spec/support/models/passport.rb +9 -0
  273. data/spec/support/models/person.rb +1 -0
  274. data/spec/support/models/player.rb +2 -0
  275. data/spec/support/models/powerup.rb +12 -0
  276. data/spec/support/models/registry.rb +1 -0
  277. data/spec/support/models/school.rb +14 -0
  278. data/spec/support/models/shield.rb +18 -0
  279. data/spec/support/models/student.rb +14 -0
  280. data/spec/support/models/weapon.rb +12 -0
  281. data.tar.gz.sig +0 -0
  282. metadata +48 -12
  283. metadata.gz.sig +0 -0
  284. data/lib/mongoid/errors/eager_load.rb +0 -23
  285. data/lib/mongoid/errors/invalid_value.rb +0 -17
  286. data/spec/mongoid/errors/eager_load_spec.rb +0 -31
@@ -120,7 +120,7 @@ describe Mongoid::Validatable::UniquenessValidator do
120
120
  it "adds the uniqueness error to the aliased field name" do
121
121
  dictionary.valid?
122
122
  expect(dictionary.errors).to have_key(:language)
123
- expect(dictionary.errors[:language]).to eq([ "is already taken" ])
123
+ expect(dictionary.errors[:language]).to eq([ "has already been taken" ])
124
124
  end
125
125
  end
126
126
 
@@ -137,7 +137,7 @@ describe Mongoid::Validatable::UniquenessValidator do
137
137
  it "adds the uniqueness error to the underlying field name" do
138
138
  dictionary.valid?
139
139
  expect(dictionary.errors).to have_key(:l)
140
- expect(dictionary.errors[:l]).to eq([ "is already taken" ])
140
+ expect(dictionary.errors[:l]).to eq([ "has already been taken" ])
141
141
  end
142
142
  end
143
143
  end
@@ -239,7 +239,7 @@ describe Mongoid::Validatable::UniquenessValidator do
239
239
 
240
240
  it "adds the uniqueness error" do
241
241
  dictionary.valid?
242
- expect(dictionary.errors[:description]).to eq([ "is already taken" ])
242
+ expect(dictionary.errors[:description]).to eq([ "has already been taken" ])
243
243
  end
244
244
  end
245
245
 
@@ -260,7 +260,7 @@ describe Mongoid::Validatable::UniquenessValidator do
260
260
 
261
261
  it "adds the uniqueness error" do
262
262
  dictionary.valid?
263
- expect(dictionary.errors[:description]).to eq([ "is already taken" ])
263
+ expect(dictionary.errors[:description]).to eq([ "has already been taken" ])
264
264
  end
265
265
  end
266
266
  end
@@ -330,7 +330,7 @@ describe Mongoid::Validatable::UniquenessValidator do
330
330
 
331
331
  it "adds the uniqueness error" do
332
332
  dictionary.valid?
333
- expect(dictionary.errors[:description]).to eq([ "is already taken" ])
333
+ expect(dictionary.errors[:description]).to eq([ "has already been taken" ])
334
334
  end
335
335
  end
336
336
 
@@ -351,7 +351,7 @@ describe Mongoid::Validatable::UniquenessValidator do
351
351
 
352
352
  it "adds the uniqueness error" do
353
353
  dictionary.valid?
354
- expect(dictionary.errors[:description]).to eq([ "is already taken" ])
354
+ expect(dictionary.errors[:description]).to eq([ "has already been taken" ])
355
355
  end
356
356
  end
357
357
  end
@@ -399,7 +399,7 @@ describe Mongoid::Validatable::UniquenessValidator do
399
399
 
400
400
  it "adds the uniqueness error" do
401
401
  dictionary.valid?
402
- expect(dictionary.errors[:description]).to eq([ "is already taken" ])
402
+ expect(dictionary.errors[:description]).to eq([ "has already been taken" ])
403
403
  end
404
404
  end
405
405
  end
@@ -460,7 +460,7 @@ describe Mongoid::Validatable::UniquenessValidator do
460
460
 
461
461
  it "adds the uniqueness error" do
462
462
  dictionary.valid?
463
- expect(dictionary.errors[:name]).to eq([ "is already taken" ])
463
+ expect(dictionary.errors[:name]).to eq([ "has already been taken" ])
464
464
  end
465
465
  end
466
466
 
@@ -623,7 +623,7 @@ describe Mongoid::Validatable::UniquenessValidator do
623
623
 
624
624
  it "adds the uniqueness errors" do
625
625
  dictionary.valid?
626
- expect(dictionary.errors[:name]).to eq([ "is already taken" ])
626
+ expect(dictionary.errors[:name]).to eq([ "has already been taken" ])
627
627
  end
628
628
  end
629
629
 
@@ -701,7 +701,7 @@ describe Mongoid::Validatable::UniquenessValidator do
701
701
 
702
702
  it "should set an error for associated object not being unique" do
703
703
  item.update_attributes(folder_id: personal_folder.id)
704
- expect(item.errors.messages[:name].first).to eq("is already taken")
704
+ expect(item.errors.messages[:name].first).to eq("has already been taken")
705
705
  end
706
706
  end
707
707
 
@@ -753,7 +753,7 @@ describe Mongoid::Validatable::UniquenessValidator do
753
753
 
754
754
  it "adds the uniqueness errors" do
755
755
  dictionary.valid?
756
- expect(dictionary.errors[:name]).to eq([ "is already taken" ])
756
+ expect(dictionary.errors[:name]).to eq([ "has already been taken" ])
757
757
  end
758
758
  end
759
759
 
@@ -792,7 +792,7 @@ describe Mongoid::Validatable::UniquenessValidator do
792
792
 
793
793
  it "adds the uniqueness errors" do
794
794
  dictionary.valid?
795
- expect(dictionary.errors[:name]).to eq([ "is already taken" ])
795
+ expect(dictionary.errors[:name]).to eq([ "has already been taken" ])
796
796
  end
797
797
  end
798
798
  end
@@ -815,7 +815,7 @@ describe Mongoid::Validatable::UniquenessValidator do
815
815
 
816
816
  expect do
817
817
  Dictionary.create!(name: "French-English", year: 1960)
818
- end.to raise_error(Mongoid::Errors::Validations, /Name is already taken/)
818
+ end.to raise_error(Mongoid::Errors::Validations, /Name has already been taken/)
819
819
 
820
820
  expect(Dictionary.all.size).to eq(1)
821
821
  end
@@ -954,7 +954,7 @@ describe Mongoid::Validatable::UniquenessValidator do
954
954
 
955
955
  it "adds the uniqueness errors" do
956
956
  dictionary.valid?
957
- expect(dictionary.errors[:name]).to eq([ "is already taken" ])
957
+ expect(dictionary.errors[:name]).to eq([ "has already been taken" ])
958
958
  end
959
959
  end
960
960
 
@@ -1018,7 +1018,7 @@ describe Mongoid::Validatable::UniquenessValidator do
1018
1018
 
1019
1019
  it "adds the uniqueness error" do
1020
1020
  dictionary.valid?
1021
- expect(dictionary.errors[:name]).to eq([ "is already taken" ])
1021
+ expect(dictionary.errors[:name]).to eq([ "has already been taken" ])
1022
1022
  end
1023
1023
  end
1024
1024
 
@@ -1096,7 +1096,7 @@ describe Mongoid::Validatable::UniquenessValidator do
1096
1096
 
1097
1097
  it "adds the uniqueness error" do
1098
1098
  dictionary.valid?
1099
- expect(dictionary.errors[:name]).to eq([ "is already taken" ])
1099
+ expect(dictionary.errors[:name]).to eq([ "has already been taken" ])
1100
1100
  end
1101
1101
  end
1102
1102
 
@@ -1218,7 +1218,7 @@ describe Mongoid::Validatable::UniquenessValidator do
1218
1218
 
1219
1219
  it "adds the uniqueness error" do
1220
1220
  login.valid?
1221
- expect(login.errors[:username]).to eq([ "is already taken" ])
1221
+ expect(login.errors[:username]).to eq([ "has already been taken" ])
1222
1222
  end
1223
1223
  end
1224
1224
 
@@ -1323,7 +1323,7 @@ describe Mongoid::Validatable::UniquenessValidator do
1323
1323
 
1324
1324
  it "adds the uniqueness errors" do
1325
1325
  login.valid?
1326
- expect(login.errors[:username]).to eq([ "is already taken" ])
1326
+ expect(login.errors[:username]).to eq([ "has already been taken" ])
1327
1327
  end
1328
1328
  end
1329
1329
 
@@ -1383,7 +1383,7 @@ describe Mongoid::Validatable::UniquenessValidator do
1383
1383
 
1384
1384
  it "adds the uniqueness error" do
1385
1385
  login.valid?
1386
- expect(login.errors[:username]).to eq([ "is already taken" ])
1386
+ expect(login.errors[:username]).to eq([ "has already been taken" ])
1387
1387
  end
1388
1388
  end
1389
1389
 
@@ -1461,7 +1461,7 @@ describe Mongoid::Validatable::UniquenessValidator do
1461
1461
 
1462
1462
  it "adds the uniqueness error" do
1463
1463
  login.valid?
1464
- expect(login.errors[:username]).to eq([ "is already taken" ])
1464
+ expect(login.errors[:username]).to eq([ "has already been taken" ])
1465
1465
  end
1466
1466
  end
1467
1467
 
@@ -1710,7 +1710,7 @@ describe Mongoid::Validatable::UniquenessValidator do
1710
1710
 
1711
1711
  it "adds the uniqueness error" do
1712
1712
  definition.valid?
1713
- expect(definition.errors[:description]).to eq([ "is already taken" ])
1713
+ expect(definition.errors[:description]).to eq([ "has already been taken" ])
1714
1714
  end
1715
1715
  end
1716
1716
 
@@ -1838,7 +1838,7 @@ describe Mongoid::Validatable::UniquenessValidator do
1838
1838
 
1839
1839
  it "adds the uniqueness errors" do
1840
1840
  definition.valid?
1841
- expect(definition.errors[:description]).to eq([ "is already taken" ])
1841
+ expect(definition.errors[:description]).to eq([ "has already been taken" ])
1842
1842
  end
1843
1843
  end
1844
1844
 
@@ -1976,7 +1976,7 @@ describe Mongoid::Validatable::UniquenessValidator do
1976
1976
 
1977
1977
  it "adds the uniqueness errors" do
1978
1978
  definition.valid?
1979
- expect(definition.errors[:description]).to eq([ "is already taken" ])
1979
+ expect(definition.errors[:description]).to eq([ "has already been taken" ])
1980
1980
  end
1981
1981
  end
1982
1982
 
@@ -2040,7 +2040,7 @@ describe Mongoid::Validatable::UniquenessValidator do
2040
2040
 
2041
2041
  it "adds the uniqueness error" do
2042
2042
  definition.valid?
2043
- expect(definition.errors[:description]).to eq([ "is already taken" ])
2043
+ expect(definition.errors[:description]).to eq([ "has already been taken" ])
2044
2044
  end
2045
2045
  end
2046
2046
 
@@ -2118,7 +2118,7 @@ describe Mongoid::Validatable::UniquenessValidator do
2118
2118
 
2119
2119
  it "adds the uniqueness error" do
2120
2120
  definition.valid?
2121
- expect(definition.errors[:description]).to eq([ "is already taken" ])
2121
+ expect(definition.errors[:description]).to eq([ "has already been taken" ])
2122
2122
  end
2123
2123
  end
2124
2124
 
@@ -2214,7 +2214,7 @@ describe Mongoid::Validatable::UniquenessValidator do
2214
2214
  it "adds the uniqueness error to the aliased field name" do
2215
2215
  definition.valid?
2216
2216
  expect(definition.errors).to have_key(:part)
2217
- expect(definition.errors[:part]).to eq([ "is already taken" ])
2217
+ expect(definition.errors[:part]).to eq([ "has already been taken" ])
2218
2218
  end
2219
2219
  end
2220
2220
 
@@ -2231,7 +2231,7 @@ describe Mongoid::Validatable::UniquenessValidator do
2231
2231
  it "adds the uniqueness error to the underlying field name" do
2232
2232
  definition.valid?
2233
2233
  expect(definition.errors).to have_key(:p)
2234
- expect(definition.errors[:p]).to eq([ "is already taken" ])
2234
+ expect(definition.errors[:p]).to eq([ "has already been taken" ])
2235
2235
  end
2236
2236
  end
2237
2237
 
@@ -2250,7 +2250,7 @@ describe Mongoid::Validatable::UniquenessValidator do
2250
2250
  it "adds the uniqueness error to the aliased field name" do
2251
2251
  definition.valid?
2252
2252
  expect(definition.errors).to have_key(:synonyms)
2253
- expect(definition.errors[:synonyms]).to eq([ "is already taken" ])
2253
+ expect(definition.errors[:synonyms]).to eq([ "has already been taken" ])
2254
2254
  end
2255
2255
  end
2256
2256
 
@@ -2267,7 +2267,7 @@ describe Mongoid::Validatable::UniquenessValidator do
2267
2267
  it "adds the uniqueness error to the aliased field name" do
2268
2268
  definition.valid?
2269
2269
  expect(definition.errors).to have_key(:syn)
2270
- expect(definition.errors[:syn]).to eq([ "is already taken" ])
2270
+ expect(definition.errors[:syn]).to eq([ "has already been taken" ])
2271
2271
  end
2272
2272
  end
2273
2273
  end
@@ -2319,7 +2319,7 @@ describe Mongoid::Validatable::UniquenessValidator do
2319
2319
 
2320
2320
  it "adds the uniqueness error" do
2321
2321
  word_origin.valid?
2322
- expect(word_origin.errors[:origin_id]).to eq([ "is already taken" ])
2322
+ expect(word_origin.errors[:origin_id]).to eq([ "has already been taken" ])
2323
2323
  end
2324
2324
  end
2325
2325
 
@@ -2444,7 +2444,7 @@ describe Mongoid::Validatable::UniquenessValidator do
2444
2444
  it "should be invalid" do
2445
2445
  subclass_document_with_duplicated_name.tap do |d|
2446
2446
  expect(d).to be_invalid
2447
- expect(d.errors[:name]).to eq([ "is already taken" ])
2447
+ expect(d.errors[:name]).to eq([ "has already been taken" ])
2448
2448
  end
2449
2449
  end
2450
2450
  end
@@ -2472,4 +2472,33 @@ describe Mongoid::Validatable::UniquenessValidator do
2472
2472
  }.to raise_error(Mongo::Error::OperationFailure)
2473
2473
  end
2474
2474
  end
2475
+
2476
+ describe "i18n" do
2477
+
2478
+ context 'when using a different locale' do
2479
+
2480
+ around do |example|
2481
+ I18n.with_locale(:fr) { example.run }
2482
+ end
2483
+
2484
+ before do
2485
+ # Translation key location is as per rails-i18n gem.
2486
+ # See: https://github.com/svenfuchs/rails-i18n/blob/master/rails/locale/en.yml
2487
+ I18n.backend.store_translations(:fr, { errors: { messages: { taken: 'est déjà utilisé(e)' } } })
2488
+ end
2489
+
2490
+ after do
2491
+ # i18n 1.0 requires +send+ because +translations+ aren't public.
2492
+ # Newer i18n versions have it as public.
2493
+ I18n.backend.send(:translations).delete(:fr)
2494
+ end
2495
+
2496
+ it "correctly translates the error message" do
2497
+ Circus.create!(slogan: 'The Greatest Show on Mars')
2498
+ dict = Circus.new(slogan: 'The Greatest Show on Mars')
2499
+ dict.valid?
2500
+ expect(dict.errors.messages[:slogan]).to eq(["est déjà utilisé(e)"])
2501
+ end
2502
+ end
2503
+ end
2475
2504
  end
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "spec_helper"
4
+
5
+ describe Mongoid::Warnings do
6
+
7
+ describe ".warn_*" do
8
+
9
+ context "when calling a warn_* method" do
10
+
11
+ let(:id) { :geo_haystack_deprecated }
12
+ let(:message) do
13
+ 'The geoHaystack type is deprecated.'
14
+ end
15
+
16
+ before do
17
+ warn_id = id
18
+ Mongoid::Warnings.class_eval do
19
+ instance_variable_set("@#{warn_id}", false)
20
+ end
21
+ end
22
+
23
+ it "logs the warning" do
24
+ expect_any_instance_of(Logger).to receive(:warn).once.with(message)
25
+ Mongoid::Warnings.send("warn_#{id}")
26
+ end
27
+
28
+ it "logs the warning only once" do
29
+ expect_any_instance_of(Logger).to receive(:warn).once.with(message)
30
+ Mongoid::Warnings.send("warn_#{id}")
31
+ Mongoid::Warnings.send("warn_#{id}")
32
+ end
33
+ end
34
+ end
35
+ end
@@ -30,11 +30,11 @@ describe "Mongoid::Railties::ControllerRuntime" do
30
30
 
31
31
  clear_metric!
32
32
  instance.succeeded event_payload
33
- expect(collector.runtime).to eq(42)
33
+ expect(collector.runtime).to eq(42000)
34
34
 
35
35
  clear_metric!
36
36
  instance.failed event_payload
37
- expect(collector.runtime).to eq(42)
37
+ expect(collector.runtime).to eq(42000)
38
38
  end
39
39
 
40
40
  it "resets the metric and returns the value" do
@@ -30,6 +30,7 @@ describe "Rails::Mongoid" do
30
30
  end
31
31
 
32
32
  context "when preload models config is false" do
33
+ config_override :preload_models, false
33
34
 
34
35
  let(:files) do
35
36
  [
@@ -38,10 +39,6 @@ describe "Rails::Mongoid" do
38
39
  ]
39
40
  end
40
41
 
41
- before(:all) do
42
- Mongoid.preload_models = false
43
- end
44
-
45
42
  it "does not load any models" do
46
43
  allow(Dir).to receive(:glob).with("/rails/root/app/models/**/*.rb").and_return(files)
47
44
  expect(Rails::Mongoid).to receive(:load_model).never
@@ -50,10 +47,7 @@ describe "Rails::Mongoid" do
50
47
  end
51
48
 
52
49
  context "when preload models config is true" do
53
-
54
- before(:all) do
55
- Mongoid.preload_models = true
56
- end
50
+ config_override :preload_models, true
57
51
 
58
52
  context "when all models are in the models directory" do
59
53
 
@@ -112,6 +106,7 @@ describe "Rails::Mongoid" do
112
106
  end
113
107
 
114
108
  context "even when preload models config is false" do
109
+ config_override :preload_models, false
115
110
 
116
111
  let(:files) do
117
112
  [
@@ -120,10 +115,6 @@ describe "Rails::Mongoid" do
120
115
  ]
121
116
  end
122
117
 
123
- before(:all) do
124
- Mongoid.preload_models = false
125
- end
126
-
127
118
  it "loads all models" do
128
119
  allow(Dir).to receive(:glob).with("/rails/root/app/models/**/*.rb").and_return(files)
129
120
  expect(Rails::Mongoid).to receive(:load_model).with("address")
@@ -133,6 +124,7 @@ describe "Rails::Mongoid" do
133
124
  end
134
125
 
135
126
  context "when list of models to load was configured" do
127
+ config_override :preload_models, %w(user AddressNumber)
136
128
 
137
129
  let(:files) do
138
130
  [
@@ -141,10 +133,6 @@ describe "Rails::Mongoid" do
141
133
  ]
142
134
  end
143
135
 
144
- before(:all) do
145
- Mongoid.preload_models = ["user", "AddressNumber"]
146
- end
147
-
148
136
  it "loads selected models only" do
149
137
  allow(Dir).to receive(:glob).with("/rails/root/app/models/**/*.rb").and_return(files)
150
138
  expect(Rails::Mongoid).to receive(:load_model).with("user")
@@ -84,32 +84,22 @@ module Mrss
84
84
 
85
85
  # Locates command stated events for the specified command name,
86
86
  # asserts that there is exactly one such event, and returns it.
87
- def single_command_started_event(command_name, include_auth: false, database_name: nil)
87
+ def single_command_started_event(command_name, include_auth: false)
88
88
  events = if include_auth
89
89
  started_events
90
90
  else
91
91
  non_auth_command_started_events
92
92
  end
93
- get_one_event(events, command_name, 'started', database_name: database_name)
94
- end
95
-
96
- # Locates command succeeded events for the specified command name,
97
- # asserts that there is exactly one such event, and returns it.
98
- def single_command_succeeded_event(command_name, database_name: nil)
99
- get_one_event(succeeded_events, command_name, 'succeeded', database_name: database_name)
100
- end
101
-
102
- def get_one_event(events, command_name, kind, database_name: nil)
103
- events = events.select do |event|
104
- event.command_name == command_name and
105
- database_name.nil? || database_name == event.database_name
93
+ events.select! do |event|
94
+ event.command[command_name]
106
95
  end
107
96
  if events.length != 1
108
- raise "Expected a single '#{command_name}' #{kind} event#{database_name ? " for '#{database_name}'" : ''} but we have #{events.length}"
97
+ raise "Expected a single #{command_name} event but we have #{events.length}"
109
98
  end
110
99
  events.first
111
100
  end
112
101
 
102
+
113
103
  # Get the first succeeded event published for the name, and then delete it.
114
104
  #
115
105
  # @param [ String ] name The event name.
@@ -27,6 +27,30 @@ module Constraints
27
27
  Mongo::VERSION.split('.')[0...precision].map(&:to_i)
28
28
  end
29
29
 
30
+ def min_bson_version(version)
31
+ required_version = version.split('.').map(&:to_i)
32
+ actual_version = bson_version(required_version.length)
33
+ before(:all) do
34
+ if (actual_version <=> required_version) < 0
35
+ skip "bson-ruby version #{version} or higher is required"
36
+ end
37
+ end
38
+ end
39
+
40
+ def max_bson_version(version)
41
+ required_version = version.split('.').map(&:to_i)
42
+ actual_version = bson_version(required_version.length)
43
+ before(:all) do
44
+ if (actual_version <=> required_version) > 0
45
+ skip "bson-ruby version #{version} or lower is required"
46
+ end
47
+ end
48
+ end
49
+
50
+ def bson_version(precision)
51
+ BSON::VERSION.split('.')[0...precision].map(&:to_i)
52
+ end
53
+
30
54
  def min_rails_version(version)
31
55
  unless version =~ /\A\d+\.\d+\z/
32
56
  raise ArgumentError, "Version can only be major.minor: #{version}"
@@ -39,6 +39,28 @@ module Mongoid
39
39
  end
40
40
  end
41
41
 
42
+ def driver_config_override(key, value)
43
+ around do |example|
44
+ existing = Mongo.send(key)
45
+
46
+ Mongo.send("#{key}=", value)
47
+
48
+ example.run
49
+
50
+ Mongo.send("#{key}=", existing)
51
+ end
52
+ end
53
+
54
+ def with_driver_config_values(key, *values, &block)
55
+ values.each do |value|
56
+ context "when #{key} is #{value}" do
57
+ driver_config_override key, value
58
+
59
+ class_exec(value, &block)
60
+ end
61
+ end
62
+ end
63
+
42
64
  def restore_config_clients
43
65
  around do |example|
44
66
  # Duplicate the config because some tests mutate it.
@@ -47,5 +69,13 @@ module Mongoid
47
69
  Mongoid::Config.send(:clients=, old_config)
48
70
  end
49
71
  end
72
+
73
+ def query_cache_enabled
74
+ around do |example|
75
+ Mongoid::QueryCache.cache do
76
+ example.run
77
+ end
78
+ end
79
+ end
50
80
  end
51
81
  end
@@ -10,4 +10,16 @@ class Augmentation
10
10
  after_build do
11
11
  self.name = "Infolink (#{player.frags})"
12
12
  end
13
+
14
+ field :after_find_player
15
+ field :after_initialize_player
16
+ field :after_default_player, default: ->{ self.player&._id }
17
+
18
+ after_find do |doc|
19
+ doc.after_find_player = player&._id
20
+ end
21
+
22
+ after_initialize do |doc|
23
+ doc.after_initialize_player = player&._id
24
+ end
13
25
  end
@@ -20,10 +20,13 @@ class Band
20
20
  field :y, as: :years, type: Integer
21
21
  field :founded, type: Date
22
22
  field :deleted, type: Boolean
23
+ field :mojo, type: Object
24
+ field :fans
23
25
 
24
26
  embeds_many :records, cascade_callbacks: true
25
27
  embeds_many :notes, as: :noteable, cascade_callbacks: true, validate: false
26
28
  embeds_many :labels
29
+ embeds_many :fanatics
27
30
  embeds_one :label, cascade_callbacks: true
28
31
 
29
32
  scope :highly_rated, -> { gte(rating: 7) }
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Catalog
4
+ include Mongoid::Document
5
+
6
+ field :array_field, type: Array
7
+ field :big_decimal_field, type: BigDecimal
8
+ field :boolean_field, type: Boolean
9
+ field :date_field, type: Date
10
+ field :date_time_field, type: DateTime
11
+ field :float_field, type: Float
12
+ field :hash_field, type: Hash
13
+ field :integer_field, type: Integer
14
+ field :object_id_field, type: BSON::ObjectId
15
+ field :binary_field, type: BSON::Binary
16
+ field :range_field, type: Range
17
+ field :regexp_field, type: Regexp
18
+ field :set_field, type: Set
19
+ field :string_field, type: String
20
+ field :stringified_symbol_field, type: StringifiedSymbol
21
+ field :symbol_field, type: Symbol
22
+ field :time_field, type: Time
23
+ field :time_with_zone_field, type: ActiveSupport::TimeWithZone
24
+ end
@@ -4,6 +4,9 @@ class Circus
4
4
  include Mongoid::Document
5
5
 
6
6
  field :name
7
+ field :slogan
8
+
9
+ validates_uniqueness_of :slogan, allow_blank: true
7
10
 
8
11
  embeds_many :animals
9
12
  end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Fanatic
4
+ include Mongoid::Document
5
+ field :age, type: Integer
6
+
7
+ embedded_in :band
8
+ end
@@ -12,7 +12,16 @@ class Implant
12
12
  doc.name = "Cochlear Implant (#{player.frags})"
13
13
  end
14
14
 
15
+ field :after_find_player
16
+ field :after_initialize_player
17
+ field :after_default_player, default: ->{ self.player&._id }
18
+
15
19
  after_find do |doc|
16
20
  doc.impressions += 1
21
+ doc.after_find_player = player&._id
22
+ end
23
+
24
+ after_initialize do |doc|
25
+ doc.after_initialize_player = player&._id
17
26
  end
18
27
  end
@@ -6,6 +6,8 @@ class Label
6
6
 
7
7
  field :name, type: String
8
8
  field :sales, type: BigDecimal
9
+ field :age, type: Integer
10
+
9
11
  field :after_create_called, type: Mongoid::Boolean, default: false
10
12
  field :after_save_called, type: Mongoid::Boolean, default: false
11
13
  field :after_update_called, type: Mongoid::Boolean, default: false
@@ -10,4 +10,13 @@ class Passport
10
10
  field :localized_translations, localize: true
11
11
 
12
12
  embedded_in :person, autobuild: true
13
+
14
+ embeds_many :passport_pages
15
+ end
16
+
17
+ class PassportPage
18
+ include Mongoid::Document
19
+
20
+ field :num_stamps, type: Integer
21
+ embedded_in :passport
13
22
  end
@@ -40,6 +40,7 @@ class Person
40
40
  field :arrays, type: Array
41
41
  field :range, type: Range
42
42
  field :species, type: Symbol
43
+ field :posts_count, type: Integer, default: 0
43
44
 
44
45
  index age: 1
45
46
  index addresses: 1
@@ -25,6 +25,8 @@ class Player
25
25
  embeds_many :implants
26
26
  embeds_one :augmentation
27
27
 
28
+ has_and_belongs_to_many :shields
29
+
28
30
  after_find do |doc|
29
31
  doc.impressions += 1
30
32
  end