mongoid 6.4.8 → 7.0.13

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.
Files changed (376) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/LICENSE +1 -0
  4. data/README.md +4 -3
  5. data/Rakefile +33 -7
  6. data/lib/config/locales/en.yml +17 -0
  7. data/lib/mongoid/association/accessors.rb +339 -0
  8. data/lib/mongoid/{relations/binding.rb → association/bindable.rb} +32 -52
  9. data/lib/mongoid/association/builders.rb +92 -0
  10. data/lib/mongoid/{relations/constraint.rb → association/constrainable.rb} +11 -22
  11. data/lib/mongoid/association/depending.rb +137 -0
  12. data/lib/mongoid/{relations/eager.rb → association/eager_loadable.rb} +11 -11
  13. data/lib/mongoid/{relations → association}/embedded/batchable.rb +19 -19
  14. data/lib/mongoid/association/embedded/cyclic.rb +109 -0
  15. data/lib/mongoid/association/embedded/embedded_in/binding.rb +56 -0
  16. data/lib/mongoid/{relations/builders/embedded/in.rb → association/embedded/embedded_in/buildable.rb} +12 -6
  17. data/lib/mongoid/association/embedded/embedded_in/proxy.rb +121 -0
  18. data/lib/mongoid/association/embedded/embedded_in.rb +154 -0
  19. data/lib/mongoid/{relations/bindings/embedded/many.rb → association/embedded/embeds_many/binding.rb} +11 -9
  20. data/lib/mongoid/{relations/builders/embedded/many.rb → association/embedded/embeds_many/buildable.rb} +13 -7
  21. data/lib/mongoid/association/embedded/embeds_many/proxy.rb +552 -0
  22. data/lib/mongoid/association/embedded/embeds_many.rb +211 -0
  23. data/lib/mongoid/{relations/bindings/embedded/one.rb → association/embedded/embeds_one/binding.rb} +12 -10
  24. data/lib/mongoid/{relations/builders/embedded/one.rb → association/embedded/embeds_one/buildable.rb} +13 -7
  25. data/lib/mongoid/association/embedded/embeds_one/proxy.rb +130 -0
  26. data/lib/mongoid/association/embedded/embeds_one.rb +174 -0
  27. data/lib/mongoid/association/embedded.rb +4 -0
  28. data/lib/mongoid/association/macros.rb +204 -0
  29. data/lib/mongoid/{relations → association}/many.rb +19 -49
  30. data/lib/mongoid/{relations → association}/marshalable.rb +6 -4
  31. data/lib/mongoid/association/nested/many.rb +200 -0
  32. data/lib/mongoid/association/nested/nested_buildable.rb +72 -0
  33. data/lib/mongoid/association/nested/one.rb +127 -0
  34. data/lib/mongoid/association/nested.rb +15 -0
  35. data/lib/mongoid/{relations → association}/one.rb +6 -6
  36. data/lib/mongoid/association/options.rb +152 -0
  37. data/lib/mongoid/{relations → association}/proxy.rb +45 -59
  38. data/lib/mongoid/association/referenced/auto_save.rb +79 -0
  39. data/lib/mongoid/association/referenced/belongs_to/binding.rb +87 -0
  40. data/lib/mongoid/association/referenced/belongs_to/buildable.rb +46 -0
  41. data/lib/mongoid/association/referenced/belongs_to/eager.rb +36 -0
  42. data/lib/mongoid/association/referenced/belongs_to/proxy.rb +136 -0
  43. data/lib/mongoid/association/referenced/belongs_to.rb +248 -0
  44. data/lib/mongoid/association/referenced/counter_cache.rb +163 -0
  45. data/lib/mongoid/association/referenced/eager.rb +162 -0
  46. data/lib/mongoid/association/referenced/has_and_belongs_to_many/binding.rb +71 -0
  47. data/lib/mongoid/association/referenced/has_and_belongs_to_many/buildable.rb +40 -0
  48. data/lib/mongoid/association/referenced/has_and_belongs_to_many/eager.rb +52 -0
  49. data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +312 -0
  50. data/lib/mongoid/association/referenced/has_and_belongs_to_many.rb +290 -0
  51. data/lib/mongoid/{relations/bindings/referenced/many.rb → association/referenced/has_many/binding.rb} +6 -5
  52. data/lib/mongoid/association/referenced/has_many/buildable.rb +38 -0
  53. data/lib/mongoid/association/referenced/has_many/eager.rb +43 -0
  54. data/lib/mongoid/association/referenced/has_many/enumerable.rb +510 -0
  55. data/lib/mongoid/association/referenced/has_many/proxy.rb +578 -0
  56. data/lib/mongoid/association/referenced/has_many.rb +275 -0
  57. data/lib/mongoid/{relations/bindings/referenced/one.rb → association/referenced/has_one/binding.rb} +11 -8
  58. data/lib/mongoid/association/referenced/has_one/buildable.rb +60 -0
  59. data/lib/mongoid/association/referenced/has_one/eager.rb +35 -0
  60. data/lib/mongoid/{relations/builders/nested_attributes/one.rb → association/referenced/has_one/nested_builder.rb} +9 -9
  61. data/lib/mongoid/association/referenced/has_one/proxy.rb +113 -0
  62. data/lib/mongoid/association/referenced/has_one.rb +204 -0
  63. data/lib/mongoid/association/referenced/syncable.rb +170 -0
  64. data/lib/mongoid/association/referenced.rb +7 -0
  65. data/lib/mongoid/{relations → association}/reflections.rb +21 -17
  66. data/lib/mongoid/association/relatable.rb +511 -0
  67. data/lib/mongoid/{relations.rb → association.rb} +57 -56
  68. data/lib/mongoid/atomic/paths/embedded/many.rb +1 -1
  69. data/lib/mongoid/atomic/paths/embedded/one.rb +1 -1
  70. data/lib/mongoid/atomic/paths/embedded.rb +1 -1
  71. data/lib/mongoid/atomic.rb +14 -4
  72. data/lib/mongoid/attributes/dynamic.rb +16 -15
  73. data/lib/mongoid/attributes/nested.rb +22 -11
  74. data/lib/mongoid/attributes/processing.rb +2 -2
  75. data/lib/mongoid/attributes/readonly.rb +2 -4
  76. data/lib/mongoid/attributes.rb +55 -31
  77. data/lib/mongoid/changeable.rb +1 -1
  78. data/lib/mongoid/clients/options.rb +7 -5
  79. data/lib/mongoid/clients/sessions.rb +20 -4
  80. data/lib/mongoid/composable.rb +4 -4
  81. data/lib/mongoid/config/environment.rb +21 -8
  82. data/lib/mongoid/config.rb +1 -0
  83. data/lib/mongoid/contextual/atomic.rb +1 -1
  84. data/lib/mongoid/contextual/geo_near.rb +1 -1
  85. data/lib/mongoid/contextual/memory.rb +21 -3
  86. data/lib/mongoid/contextual/mongo.rb +10 -8
  87. data/lib/mongoid/copyable.rb +11 -6
  88. data/lib/mongoid/criteria/includable.rb +14 -14
  89. data/lib/mongoid/criteria/modifiable.rb +8 -3
  90. data/lib/mongoid/criteria/options.rb +2 -2
  91. data/lib/mongoid/criteria/queryable/extensions/numeric.rb +1 -1
  92. data/lib/mongoid/criteria/queryable/extensions/regexp.rb +3 -3
  93. data/lib/mongoid/criteria/queryable/extensions/string.rb +1 -1
  94. data/lib/mongoid/criteria/queryable/extensions/time.rb +1 -1
  95. data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +12 -0
  96. data/lib/mongoid/criteria/queryable/key.rb +67 -8
  97. data/lib/mongoid/criteria/queryable/mergeable.rb +5 -4
  98. data/lib/mongoid/criteria/queryable/pipeline.rb +10 -5
  99. data/lib/mongoid/criteria/queryable/selectable.rb +5 -3
  100. data/lib/mongoid/criteria/queryable/selector.rb +9 -31
  101. data/lib/mongoid/criteria.rb +9 -3
  102. data/lib/mongoid/document.rb +14 -4
  103. data/lib/mongoid/errors/invalid_dependent_strategy.rb +32 -0
  104. data/lib/mongoid/errors/invalid_relation_option.rb +29 -0
  105. data/lib/mongoid/errors/unknown_model.rb +25 -0
  106. data/lib/mongoid/errors.rb +3 -0
  107. data/lib/mongoid/extensions/array.rb +5 -5
  108. data/lib/mongoid/extensions/hash.rb +9 -4
  109. data/lib/mongoid/extensions/object.rb +4 -4
  110. data/lib/mongoid/extensions/range.rb +1 -0
  111. data/lib/mongoid/extensions/regexp.rb +1 -1
  112. data/lib/mongoid/extensions/string.rb +2 -2
  113. data/lib/mongoid/extensions.rb +0 -4
  114. data/lib/mongoid/factory.rb +13 -3
  115. data/lib/mongoid/fields/foreign_key.rb +5 -5
  116. data/lib/mongoid/fields/standard.rb +2 -14
  117. data/lib/mongoid/fields/validators/macro.rb +1 -1
  118. data/lib/mongoid/fields.rb +5 -4
  119. data/lib/mongoid/indexable.rb +4 -1
  120. data/lib/mongoid/interceptable.rb +8 -6
  121. data/lib/mongoid/matchable/all.rb +4 -3
  122. data/lib/mongoid/matchable/and.rb +1 -1
  123. data/lib/mongoid/matchable/default.rb +71 -24
  124. data/lib/mongoid/matchable/elem_match.rb +9 -3
  125. data/lib/mongoid/matchable/eq.rb +22 -0
  126. data/lib/mongoid/matchable/ne.rb +1 -1
  127. data/lib/mongoid/matchable/regexp.rb +2 -2
  128. data/lib/mongoid/matchable.rb +17 -16
  129. data/lib/mongoid/persistable/deletable.rb +7 -6
  130. data/lib/mongoid/persistable/incrementable.rb +1 -1
  131. data/lib/mongoid/persistable/logical.rb +1 -1
  132. data/lib/mongoid/persistable/pushable.rb +11 -2
  133. data/lib/mongoid/persistable/settable.rb +57 -12
  134. data/lib/mongoid/persistable.rb +4 -5
  135. data/lib/mongoid/persistence_context.rb +26 -11
  136. data/lib/mongoid/positional.rb +1 -1
  137. data/lib/mongoid/query_cache.rb +4 -2
  138. data/lib/mongoid/serializable.rb +4 -4
  139. data/lib/mongoid/shardable.rb +1 -1
  140. data/lib/mongoid/touchable.rb +102 -0
  141. data/lib/mongoid/traversable.rb +3 -3
  142. data/lib/mongoid/validatable/macros.rb +1 -1
  143. data/lib/mongoid/validatable/presence.rb +2 -2
  144. data/lib/mongoid/validatable/uniqueness.rb +5 -5
  145. data/lib/mongoid/validatable.rb +8 -8
  146. data/lib/mongoid/version.rb +2 -1
  147. data/lib/mongoid.rb +1 -0
  148. data/lib/rails/generators/mongoid/config/config_generator.rb +8 -1
  149. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +3 -0
  150. data/lib/rails/generators/mongoid/model/templates/model.rb.tt +1 -1
  151. data/spec/README.md +18 -0
  152. data/spec/app/models/animal.rb +2 -1
  153. data/spec/app/models/bomb.rb +1 -1
  154. data/spec/app/models/customer.rb +11 -0
  155. data/spec/app/models/customer_address.rb +12 -0
  156. data/spec/app/models/message.rb +1 -1
  157. data/spec/app/models/minim.rb +7 -0
  158. data/spec/app/models/other_owner_object.rb +2 -0
  159. data/spec/app/models/person.rb +5 -2
  160. data/spec/app/models/shipment_address.rb +1 -0
  161. data/spec/app/models/store_as_dup_test3.rb +7 -0
  162. data/spec/app/models/store_as_dup_test4.rb +7 -0
  163. data/spec/app/models/updatable.rb +7 -0
  164. data/spec/app/models/vertex.rb +6 -0
  165. data/spec/app/models/wiki_page.rb +1 -1
  166. data/spec/config/mongoid.yml +13 -3
  167. data/spec/integration/app_spec.rb +341 -0
  168. data/spec/integration/associations/belongs_to_spec.rb +13 -0
  169. data/spec/integration/associations/embedded_spec.rb +176 -0
  170. data/spec/integration/callbacks_models.rb +49 -0
  171. data/spec/integration/callbacks_spec.rb +216 -0
  172. data/spec/integration/criteria/date_field_spec.rb +41 -0
  173. data/spec/integration/criteria/time_with_zone_spec.rb +32 -0
  174. data/spec/integration/matchable_spec.rb +680 -0
  175. data/spec/lite_spec_helper.rb +71 -0
  176. data/spec/mongoid/{relations → association}/accessors_spec.rb +40 -1
  177. data/spec/mongoid/{relations → association}/auto_save_spec.rb +60 -12
  178. data/spec/mongoid/{relations → association}/builders_spec.rb +1 -1
  179. data/spec/mongoid/association/constrainable_spec.rb +115 -0
  180. data/spec/mongoid/{relations → association}/counter_cache_spec.rb +1 -1
  181. data/spec/mongoid/association/depending_spec.rb +866 -0
  182. data/spec/mongoid/{relations → association}/eager_spec.rb +12 -12
  183. data/spec/mongoid/{relations → association/embedded}/cyclic_spec.rb +1 -1
  184. data/spec/mongoid/{relations → association}/embedded/dirty_spec.rb +0 -0
  185. data/spec/mongoid/{relations/bindings/embedded/in_spec.rb → association/embedded/embedded_in/binding_spec.rb} +13 -13
  186. data/spec/mongoid/{relations/builders/embedded/in_spec.rb → association/embedded/embedded_in/buildable_spec.rb} +9 -9
  187. data/spec/mongoid/{relations/embedded/in_spec.rb → association/embedded/embedded_in/proxy_spec.rb} +55 -77
  188. data/spec/mongoid/association/embedded/embedded_in_spec.rb +901 -0
  189. data/spec/mongoid/{relations/bindings/embedded/many_spec.rb → association/embedded/embeds_many/binding_spec.rb} +3 -3
  190. data/spec/mongoid/{relations/builders/embedded/many_spec.rb → association/embedded/embeds_many/buildable_spec.rb} +17 -45
  191. data/spec/mongoid/{relations/embedded/many_spec.rb → association/embedded/embeds_many/proxy_spec.rb} +124 -182
  192. data/spec/mongoid/association/embedded/embeds_many_models.rb +53 -0
  193. data/spec/mongoid/association/embedded/embeds_many_spec.rb +862 -0
  194. data/spec/mongoid/{relations/bindings/embedded/one_spec.rb → association/embedded/embeds_one/binding_spec.rb} +4 -4
  195. data/spec/mongoid/{relations/builders/embedded/one_spec.rb → association/embedded/embeds_one/buildable_spec.rb} +14 -34
  196. data/spec/mongoid/{relations/embedded/one_spec.rb → association/embedded/embeds_one/proxy_spec.rb} +39 -84
  197. data/spec/mongoid/association/embedded/embeds_one_dnl_models.rb +6 -0
  198. data/spec/mongoid/association/embedded/embeds_one_models.rb +51 -0
  199. data/spec/mongoid/association/embedded/embeds_one_spec.rb +954 -0
  200. data/spec/mongoid/{relations → association}/macros_spec.rb +148 -73
  201. data/spec/mongoid/{relations/builders/nested_attributes → association/nested}/many_spec.rb +16 -19
  202. data/spec/mongoid/{relations/builders/nested_attributes → association/nested}/one_spec.rb +17 -20
  203. data/spec/mongoid/association/options_spec.rb +1321 -0
  204. data/spec/mongoid/{relations → association}/polymorphic_spec.rb +66 -34
  205. data/spec/mongoid/{relations/bindings/referenced/in_spec.rb → association/referenced/belongs_to/binding_spec.rb} +7 -7
  206. data/spec/mongoid/{relations/builders/referenced/in_spec.rb → association/referenced/belongs_to/buildable_spec.rb} +46 -79
  207. data/spec/mongoid/{relations/eager/belongs_to_spec.rb → association/referenced/belongs_to/eager_spec.rb} +33 -14
  208. data/spec/mongoid/{relations/referenced/in_spec.rb → association/referenced/belongs_to/proxy_spec.rb} +57 -91
  209. data/spec/mongoid/association/referenced/belongs_to_spec.rb +2023 -0
  210. data/spec/mongoid/{relations/bindings/referenced/many_to_many_spec.rb → association/referenced/has_and_belongs_to_many/binding_spec.rb} +5 -5
  211. data/spec/mongoid/association/referenced/has_and_belongs_to_many/buildable_spec.rb +121 -0
  212. data/spec/mongoid/{relations/eager/has_and_belongs_to_many_spec.rb → association/referenced/has_and_belongs_to_many/eager_spec.rb} +26 -7
  213. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_persistence_spec.rb +56 -0
  214. data/spec/mongoid/{relations/referenced/many_to_many_spec.rb → association/referenced/has_and_belongs_to_many/proxy_spec.rb} +247 -99
  215. data/spec/mongoid/association/referenced/has_and_belongs_to_many_models.rb +26 -0
  216. data/spec/mongoid/association/referenced/has_and_belongs_to_many_spec.rb +1027 -0
  217. data/spec/mongoid/{relations/bindings/referenced/many_spec.rb → association/referenced/has_many/binding_spec.rb} +5 -5
  218. data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +119 -0
  219. data/spec/mongoid/{relations/eager/has_many_spec.rb → association/referenced/has_many/eager_spec.rb} +26 -11
  220. data/spec/mongoid/{relations/targets → association/referenced/has_many}/enumerable_spec.rb +227 -1
  221. data/spec/mongoid/association/referenced/has_many/proxy_query_spec.rb +23 -0
  222. data/spec/mongoid/{relations/referenced/many_spec.rb → association/referenced/has_many/proxy_spec.rb} +30 -94
  223. data/spec/mongoid/association/referenced/has_many_models.rb +37 -0
  224. data/spec/mongoid/association/referenced/has_many_spec.rb +1225 -0
  225. data/spec/mongoid/{relations/bindings/referenced/one_spec.rb → association/referenced/has_one/binding_spec.rb} +4 -4
  226. data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +113 -0
  227. data/spec/mongoid/{relations/eager/has_one_spec.rb → association/referenced/has_one/eager_spec.rb} +10 -10
  228. data/spec/mongoid/{relations/referenced/one_spec.rb → association/referenced/has_one/proxy_spec.rb} +9 -109
  229. data/spec/mongoid/association/referenced/has_one_models.rb +48 -0
  230. data/spec/mongoid/association/referenced/has_one_spec.rb +1360 -0
  231. data/spec/mongoid/{relations → association}/reflections_spec.rb +1 -12
  232. data/spec/mongoid/{relations/synchronization_spec.rb → association/syncable_spec.rb} +4 -2
  233. data/spec/mongoid/{relations_spec.rb → association_spec.rb} +1 -1
  234. data/spec/mongoid/atomic/modifiers_spec.rb +2 -2
  235. data/spec/mongoid/atomic/paths_spec.rb +41 -0
  236. data/spec/mongoid/atomic_spec.rb +4 -4
  237. data/spec/mongoid/attributes/dynamic_spec.rb +153 -0
  238. data/spec/mongoid/attributes/nested_spec.rb +29 -11
  239. data/spec/mongoid/attributes/readonly_spec.rb +80 -125
  240. data/spec/mongoid/attributes_spec.rb +298 -9
  241. data/spec/mongoid/clients/factory_spec.rb +20 -38
  242. data/spec/mongoid/clients/options_spec.rb +64 -50
  243. data/spec/mongoid/clients/sessions_spec.rb +9 -5
  244. data/spec/mongoid/clients/transactions_spec.rb +390 -0
  245. data/spec/mongoid/clients_spec.rb +70 -10
  246. data/spec/mongoid/config_spec.rb +27 -1
  247. data/spec/mongoid/contextual/atomic_spec.rb +37 -14
  248. data/spec/mongoid/contextual/geo_near_spec.rb +11 -2
  249. data/spec/mongoid/contextual/map_reduce_spec.rb +20 -5
  250. data/spec/mongoid/contextual/memory_spec.rb +19 -0
  251. data/spec/mongoid/contextual/mongo_spec.rb +107 -56
  252. data/spec/mongoid/copyable_spec.rb +90 -6
  253. data/spec/mongoid/copyable_spec_models.rb +17 -0
  254. data/spec/mongoid/criteria/modifiable_spec.rb +173 -1
  255. data/spec/mongoid/criteria/queryable/extensions/numeric_spec.rb +54 -0
  256. data/spec/mongoid/criteria/queryable/extensions/regexp_spec.rb +7 -7
  257. data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +44 -1
  258. data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +19 -7
  259. data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +28 -1
  260. data/spec/mongoid/criteria/queryable/key_spec.rb +48 -6
  261. data/spec/mongoid/criteria/queryable/pipeline_spec.rb +12 -0
  262. data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +762 -0
  263. data/spec/mongoid/criteria/queryable/selectable_spec.rb +5 -224
  264. data/spec/mongoid/criteria/queryable/selector_spec.rb +37 -0
  265. data/spec/mongoid/criteria_spec.rb +36 -19
  266. data/spec/mongoid/document_fields_spec.rb +88 -0
  267. data/spec/mongoid/document_persistence_context_spec.rb +33 -0
  268. data/spec/mongoid/document_spec.rb +29 -4
  269. data/spec/mongoid/extensions/array_spec.rb +11 -15
  270. data/spec/mongoid/extensions/hash_spec.rb +18 -1
  271. data/spec/mongoid/extensions/object_spec.rb +7 -11
  272. data/spec/mongoid/extensions/range_spec.rb +7 -0
  273. data/spec/mongoid/factory_spec.rb +21 -3
  274. data/spec/mongoid/fields/foreign_key_spec.rb +24 -32
  275. data/spec/mongoid/fields_spec.rb +1 -1
  276. data/spec/mongoid/indexable_spec.rb +24 -12
  277. data/spec/mongoid/interceptable_spec.rb +22 -1
  278. data/spec/mongoid/matchable/default_spec.rb +10 -3
  279. data/spec/mongoid/matchable/elem_match_spec.rb +20 -0
  280. data/spec/mongoid/matchable/eq_spec.rb +48 -0
  281. data/spec/mongoid/matchable/regexp_spec.rb +2 -2
  282. data/spec/mongoid/matchable_spec.rb +2 -2
  283. data/spec/mongoid/persistable/pushable_spec.rb +55 -1
  284. data/spec/mongoid/persistable/savable_spec.rb +5 -5
  285. data/spec/mongoid/persistable/settable_spec.rb +125 -10
  286. data/spec/mongoid/persistable_spec.rb +21 -6
  287. data/spec/mongoid/persistence_context_spec.rb +1 -1
  288. data/spec/mongoid/query_cache_spec.rb +65 -27
  289. data/spec/mongoid/relations/proxy_spec.rb +124 -124
  290. data/spec/mongoid/scopable_spec.rb +2 -1
  291. data/spec/mongoid/shardable_spec.rb +32 -12
  292. data/spec/mongoid/tasks/database_rake_spec.rb +13 -13
  293. data/spec/mongoid/tasks/database_spec.rb +1 -1
  294. data/spec/mongoid/{relations/touchable_spec.rb → touchable_spec.rb} +40 -1
  295. data/spec/mongoid/validatable/associated_spec.rb +1 -1
  296. data/spec/mongoid/validatable/presence_spec.rb +7 -6
  297. data/spec/mongoid/validatable/uniqueness_spec.rb +33 -6
  298. data/spec/mongoid/validatable_spec.rb +1 -1
  299. data/spec/shared/LICENSE +20 -0
  300. data/spec/shared/bin/get-mongodb-download-url +17 -0
  301. data/spec/shared/lib/mrss/child_process_helper.rb +80 -0
  302. data/spec/shared/lib/mrss/cluster_config.rb +221 -0
  303. data/spec/shared/lib/mrss/constraints.rb +354 -0
  304. data/spec/shared/lib/mrss/docker_runner.rb +265 -0
  305. data/spec/shared/lib/mrss/lite_constraints.rb +191 -0
  306. data/spec/shared/lib/mrss/server_version_registry.rb +115 -0
  307. data/spec/shared/lib/mrss/spec_organizer.rb +162 -0
  308. data/spec/shared/lib/mrss/utils.rb +15 -0
  309. data/spec/shared/share/Dockerfile.erb +231 -0
  310. data/spec/shared/shlib/distro.sh +73 -0
  311. data/spec/shared/shlib/server.sh +290 -0
  312. data/spec/shared/shlib/set_env.sh +128 -0
  313. data/spec/spec_helper.rb +34 -49
  314. data/spec/support/cluster_config.rb +3 -3
  315. data/spec/support/constraints.rb +21 -76
  316. data/spec/support/expectations.rb +17 -3
  317. data/spec/support/spec_config.rb +20 -7
  318. data.tar.gz.sig +0 -0
  319. metadata +646 -541
  320. metadata.gz.sig +1 -5
  321. data/lib/mongoid/relations/accessors.rb +0 -267
  322. data/lib/mongoid/relations/auto_save.rb +0 -94
  323. data/lib/mongoid/relations/bindings/embedded/in.rb +0 -59
  324. data/lib/mongoid/relations/bindings/referenced/in.rb +0 -65
  325. data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +0 -70
  326. data/lib/mongoid/relations/bindings.rb +0 -9
  327. data/lib/mongoid/relations/builder.rb +0 -57
  328. data/lib/mongoid/relations/builders/nested_attributes/many.rb +0 -199
  329. data/lib/mongoid/relations/builders/referenced/in.rb +0 -26
  330. data/lib/mongoid/relations/builders/referenced/many.rb +0 -26
  331. data/lib/mongoid/relations/builders/referenced/many_to_many.rb +0 -39
  332. data/lib/mongoid/relations/builders/referenced/one.rb +0 -26
  333. data/lib/mongoid/relations/builders.rb +0 -106
  334. data/lib/mongoid/relations/cascading/delete.rb +0 -44
  335. data/lib/mongoid/relations/cascading/destroy.rb +0 -43
  336. data/lib/mongoid/relations/cascading/nullify.rb +0 -35
  337. data/lib/mongoid/relations/cascading/restrict.rb +0 -39
  338. data/lib/mongoid/relations/cascading.rb +0 -56
  339. data/lib/mongoid/relations/conversions.rb +0 -34
  340. data/lib/mongoid/relations/counter_cache.rb +0 -160
  341. data/lib/mongoid/relations/cyclic.rb +0 -107
  342. data/lib/mongoid/relations/eager/base.rb +0 -153
  343. data/lib/mongoid/relations/eager/belongs_to.rb +0 -31
  344. data/lib/mongoid/relations/eager/has_and_belongs_to_many.rb +0 -47
  345. data/lib/mongoid/relations/eager/has_many.rb +0 -38
  346. data/lib/mongoid/relations/eager/has_one.rb +0 -30
  347. data/lib/mongoid/relations/embedded/in.rb +0 -241
  348. data/lib/mongoid/relations/embedded/many.rb +0 -683
  349. data/lib/mongoid/relations/embedded/one.rb +0 -235
  350. data/lib/mongoid/relations/macros.rb +0 -367
  351. data/lib/mongoid/relations/metadata.rb +0 -1179
  352. data/lib/mongoid/relations/nested_builder.rb +0 -74
  353. data/lib/mongoid/relations/options.rb +0 -49
  354. data/lib/mongoid/relations/polymorphic.rb +0 -39
  355. data/lib/mongoid/relations/referenced/in.rb +0 -304
  356. data/lib/mongoid/relations/referenced/many.rb +0 -812
  357. data/lib/mongoid/relations/referenced/many_to_many.rb +0 -479
  358. data/lib/mongoid/relations/referenced/one.rb +0 -290
  359. data/lib/mongoid/relations/synchronization.rb +0 -169
  360. data/lib/mongoid/relations/targets/enumerable.rb +0 -493
  361. data/lib/mongoid/relations/targets.rb +0 -2
  362. data/lib/mongoid/relations/touchable.rb +0 -97
  363. data/spec/mongoid/fields/internal/foreign_keys/array_spec.rb +0 -184
  364. data/spec/mongoid/fields/internal/foreign_keys/object_spec.rb +0 -201
  365. data/spec/mongoid/relations/builders/referenced/many_spec.rb +0 -137
  366. data/spec/mongoid/relations/builders/referenced/many_to_many_spec.rb +0 -178
  367. data/spec/mongoid/relations/builders/referenced/one_spec.rb +0 -111
  368. data/spec/mongoid/relations/cascading/delete_spec.rb +0 -101
  369. data/spec/mongoid/relations/cascading/destroy_spec.rb +0 -47
  370. data/spec/mongoid/relations/cascading/nullify_spec.rb +0 -32
  371. data/spec/mongoid/relations/cascading/restrict_spec.rb +0 -68
  372. data/spec/mongoid/relations/cascading_spec.rb +0 -355
  373. data/spec/mongoid/relations/constraint_spec.rb +0 -75
  374. data/spec/mongoid/relations/conversions_spec.rb +0 -128
  375. data/spec/mongoid/relations/metadata_spec.rb +0 -1985
  376. data/spec/mongoid/relations/options_spec.rb +0 -35
@@ -204,14 +204,10 @@ describe Mongoid::Extensions::Array do
204
204
 
205
205
  context "when the related model uses object ids" do
206
206
 
207
- let(:metadata) do
207
+ let(:association) do
208
208
  Person.relations["preferences"]
209
209
  end
210
210
 
211
- let(:constraint) do
212
- metadata.constraint
213
- end
214
-
215
211
  context "when provided an object id" do
216
212
 
217
213
  let(:object_id) do
@@ -219,7 +215,7 @@ describe Mongoid::Extensions::Array do
219
215
  end
220
216
 
221
217
  let(:fk) do
222
- Array.__mongoize_fk__(constraint, object_id)
218
+ Array.__mongoize_fk__(association, object_id)
223
219
  end
224
220
 
225
221
  it "returns the object id as an array" do
@@ -234,7 +230,7 @@ describe Mongoid::Extensions::Array do
234
230
  end
235
231
 
236
232
  let(:fk) do
237
- Array.__mongoize_fk__(constraint, [ object_id ])
233
+ Array.__mongoize_fk__(association, [ object_id ])
238
234
  end
239
235
 
240
236
  it "returns the object ids" do
@@ -251,7 +247,7 @@ describe Mongoid::Extensions::Array do
251
247
  end
252
248
 
253
249
  let(:fk) do
254
- Array.__mongoize_fk__(constraint, object_id.to_s)
250
+ Array.__mongoize_fk__(association, object_id.to_s)
255
251
  end
256
252
 
257
253
  it "returns the object id in an array" do
@@ -266,7 +262,7 @@ describe Mongoid::Extensions::Array do
266
262
  end
267
263
 
268
264
  let(:fk) do
269
- Array.__mongoize_fk__(constraint, string)
265
+ Array.__mongoize_fk__(association, string)
270
266
  end
271
267
 
272
268
  it "returns the string in an array" do
@@ -277,7 +273,7 @@ describe Mongoid::Extensions::Array do
277
273
  context "when the string is blank" do
278
274
 
279
275
  let(:fk) do
280
- Array.__mongoize_fk__(constraint, "")
276
+ Array.__mongoize_fk__(association, "")
281
277
  end
282
278
 
283
279
  it "returns an empty array" do
@@ -289,7 +285,7 @@ describe Mongoid::Extensions::Array do
289
285
  context "when provided nil" do
290
286
 
291
287
  let(:fk) do
292
- Array.__mongoize_fk__(constraint, nil)
288
+ Array.__mongoize_fk__(association, nil)
293
289
  end
294
290
 
295
291
  it "returns an empty array" do
@@ -306,7 +302,7 @@ describe Mongoid::Extensions::Array do
306
302
  end
307
303
 
308
304
  let(:fk) do
309
- Array.__mongoize_fk__(constraint, [ object_id.to_s ])
305
+ Array.__mongoize_fk__(association, [ object_id.to_s ])
310
306
  end
311
307
 
312
308
  it "returns the object id in an array" do
@@ -321,7 +317,7 @@ describe Mongoid::Extensions::Array do
321
317
  end
322
318
 
323
319
  let(:fk) do
324
- Array.__mongoize_fk__(constraint, [ string ])
320
+ Array.__mongoize_fk__(association, [ string ])
325
321
  end
326
322
 
327
323
  it "returns the string in an array" do
@@ -332,7 +328,7 @@ describe Mongoid::Extensions::Array do
332
328
  context "when the strings are blank" do
333
329
 
334
330
  let(:fk) do
335
- Array.__mongoize_fk__(constraint, [ "", "" ])
331
+ Array.__mongoize_fk__(association, [ "", "" ])
336
332
  end
337
333
 
338
334
  it "returns an empty array" do
@@ -344,7 +340,7 @@ describe Mongoid::Extensions::Array do
344
340
  context "when provided nils" do
345
341
 
346
342
  let(:fk) do
347
- Array.__mongoize_fk__(constraint, [ nil, nil, nil ])
343
+ Array.__mongoize_fk__(association, [ nil, nil, nil ])
348
344
  end
349
345
 
350
346
  it "returns an empty array" do
@@ -230,10 +230,27 @@ describe Mongoid::Extensions::Hash do
230
230
  it "should retrieve a nested value under the provided key" do
231
231
  expect(nested).to eq "hundred"
232
232
  end
233
+
234
+ context 'and the value is falsey' do
235
+ let(:hash) do
236
+ { "100" => { "name" => false } }
237
+ end
238
+ it "should retrieve the falsey nested value under the provided key" do
239
+ expect(nested).to eq false
240
+ end
241
+ end
242
+
243
+ context 'and the value is nil' do
244
+ let(:hash) do
245
+ { "100" => { 0 => "Please don't return this value!" } }
246
+ end
247
+ it "should retrieve the nil nested value under the provided key" do
248
+ expect(nested).to eq nil
249
+ end
250
+ end
233
251
  end
234
252
 
235
253
  context "when the hash key is an integer" do
236
-
237
254
  let(:hash) do
238
255
  { 100 => { "name" => "hundred" } }
239
256
  end
@@ -39,14 +39,10 @@ describe Mongoid::Extensions::Object do
39
39
 
40
40
  context "when the related model uses object ids" do
41
41
 
42
- let(:metadata) do
42
+ let(:association) do
43
43
  Game.relations["person"]
44
44
  end
45
45
 
46
- let(:constraint) do
47
- metadata.constraint
48
- end
49
-
50
46
  context "when provided an object id" do
51
47
 
52
48
  let(:object_id) do
@@ -54,7 +50,7 @@ describe Mongoid::Extensions::Object do
54
50
  end
55
51
 
56
52
  let(:fk) do
57
- Object.__mongoize_fk__(constraint, object_id)
53
+ Object.__mongoize_fk__(association, object_id)
58
54
  end
59
55
 
60
56
  it "returns the object id" do
@@ -71,7 +67,7 @@ describe Mongoid::Extensions::Object do
71
67
  end
72
68
 
73
69
  let(:fk) do
74
- Object.__mongoize_fk__(constraint, object_id.to_s)
70
+ Object.__mongoize_fk__(association, object_id.to_s)
75
71
  end
76
72
 
77
73
  it "returns the object id" do
@@ -86,7 +82,7 @@ describe Mongoid::Extensions::Object do
86
82
  end
87
83
 
88
84
  let(:fk) do
89
- Object.__mongoize_fk__(constraint, string)
85
+ Object.__mongoize_fk__(association, string)
90
86
  end
91
87
 
92
88
  it "returns the string" do
@@ -97,7 +93,7 @@ describe Mongoid::Extensions::Object do
97
93
  context "when the string is blank" do
98
94
 
99
95
  let(:fk) do
100
- Object.__mongoize_fk__(constraint, "")
96
+ Object.__mongoize_fk__(association, "")
101
97
  end
102
98
 
103
99
  it "returns nil" do
@@ -109,7 +105,7 @@ describe Mongoid::Extensions::Object do
109
105
  context "when provided nil" do
110
106
 
111
107
  let(:fk) do
112
- Object.__mongoize_fk__(constraint, nil)
108
+ Object.__mongoize_fk__(association, nil)
113
109
  end
114
110
 
115
111
  it "returns nil" do
@@ -120,7 +116,7 @@ describe Mongoid::Extensions::Object do
120
116
  context "when provided an empty array" do
121
117
 
122
118
  let(:fk) do
123
- Object.__mongoize_fk__(constraint, [])
119
+ Object.__mongoize_fk__(association, [])
124
120
  end
125
121
 
126
122
  it "returns an empty array" do
@@ -139,6 +139,13 @@ describe Mongoid::Extensions::Range do
139
139
  expect(("a".."z").mongoize).to eq({ "min" => "a", "max" => "z" })
140
140
  end
141
141
  end
142
+
143
+ context 'when the value is a string' do
144
+
145
+ it 'returns a string' do
146
+ expect(Range.mongoize('3')).to eq('3')
147
+ end
148
+ end
142
149
  end
143
150
 
144
151
  describe "#resizable?" do
@@ -92,7 +92,7 @@ describe Mongoid::Factory do
92
92
  context "when the type is a symbol" do
93
93
 
94
94
  let(:person) do
95
- described_class.build(Person, {:_type => "Doctor"})
95
+ described_class.build(Person, { :_type => "Doctor" })
96
96
  end
97
97
 
98
98
  it "instantiates the subclass" do
@@ -106,11 +106,11 @@ describe Mongoid::Factory do
106
106
  context "when the attributes are nil" do
107
107
 
108
108
  let(:document) do
109
- described_class.from_db(Address, nil)
109
+ described_class.from_db(Animal, nil)
110
110
  end
111
111
 
112
112
  it "generates based on the provided class" do
113
- expect(document).to be_a(Address)
113
+ expect(document).to be_a(Animal)
114
114
  end
115
115
 
116
116
  it "sets the attributes to empty" do
@@ -192,5 +192,23 @@ describe Mongoid::Factory do
192
192
  expect(document.title).to eq("Sir")
193
193
  end
194
194
  end
195
+
196
+ context 'when type does not correspond to a Class name' do
197
+
198
+ let(:attributes) do
199
+ { "title" => "Sir", "_type" => "invalid_class_name" }
200
+ end
201
+
202
+ let(:person) do
203
+ described_class.from_db(Person, attributes)
204
+ end
205
+
206
+ it 'raises a exception' do
207
+ expect {
208
+ person
209
+ }.to raise_exception(Mongoid::Errors::UnknownModel)
210
+ end
211
+
212
+ end
195
213
  end
196
214
  end
@@ -7,7 +7,7 @@ describe Mongoid::Fields::ForeignKey do
7
7
  let(:field) do
8
8
  described_class.new(
9
9
  :vals,
10
- metadata: Person.relations["preferences"],
10
+ association: Person.relations["preferences"],
11
11
  type: Array,
12
12
  default: [],
13
13
  identity: true
@@ -68,7 +68,7 @@ describe Mongoid::Fields::ForeignKey do
68
68
  let(:field) do
69
69
  described_class.new(
70
70
  :vals,
71
- metadata: Person.relations["posts"],
71
+ association: Person.relations["posts"],
72
72
  type: Array,
73
73
  default: default,
74
74
  identity: true
@@ -89,7 +89,7 @@ describe Mongoid::Fields::ForeignKey do
89
89
  let(:field) do
90
90
  described_class.new(
91
91
  :vals,
92
- metadata: Person.relations["posts"],
92
+ association: Person.relations["posts"],
93
93
  type: Array,
94
94
  default: [],
95
95
  identity: true
@@ -103,14 +103,14 @@ describe Mongoid::Fields::ForeignKey do
103
103
 
104
104
  describe "#evolve" do
105
105
 
106
- let(:metadata) do
106
+ let(:association) do
107
107
  Person.reflect_on_association(:preferences)
108
108
  end
109
109
 
110
110
  context "when provided a document" do
111
111
 
112
112
  let(:field) do
113
- described_class.new(:person_id, type: Object, metadata: metadata)
113
+ described_class.new(:person_id, type: Object, association: association)
114
114
  end
115
115
 
116
116
  let(:game) do
@@ -129,7 +129,7 @@ describe Mongoid::Fields::ForeignKey do
129
129
  context "when the type is an array" do
130
130
 
131
131
  let(:field) do
132
- described_class.new(:preference_ids, type: Array, default: [], metadata: metadata)
132
+ described_class.new(:preference_ids, type: Array, default: [], association: association)
133
133
  end
134
134
 
135
135
  context "when providing a single value" do
@@ -197,12 +197,12 @@ describe Mongoid::Fields::ForeignKey do
197
197
 
198
198
  context "when the relation stores ids as strings" do
199
199
 
200
- let!(:metadata) do
200
+ let!(:association) do
201
201
  Agent.reflect_on_association(:accounts)
202
202
  end
203
203
 
204
204
  let!(:field) do
205
- described_class.new(:account_ids, type: Array, default: [], metadata: metadata)
205
+ described_class.new(:account_ids, type: Array, default: [], association: association)
206
206
  end
207
207
 
208
208
  let(:id_one) do
@@ -260,12 +260,12 @@ describe Mongoid::Fields::ForeignKey do
260
260
 
261
261
  context "when the type is an object" do
262
262
 
263
- let(:metadata) do
263
+ let(:association) do
264
264
  Game.reflect_on_association(:person)
265
265
  end
266
266
 
267
267
  let(:field) do
268
- described_class.new(:person_id, type: Object, metadata: metadata)
268
+ described_class.new(:person_id, type: Object, association: association)
269
269
  end
270
270
 
271
271
  context "when providing a single value" do
@@ -312,12 +312,12 @@ describe Mongoid::Fields::ForeignKey do
312
312
 
313
313
  context "when the relation stores string ids" do
314
314
 
315
- let(:metadata) do
315
+ let(:association) do
316
316
  Comment.reflect_on_association(:account)
317
317
  end
318
318
 
319
319
  let(:field) do
320
- described_class.new(:person_id, type: Object, metadata: metadata)
320
+ described_class.new(:person_id, type: Object, association: association)
321
321
  end
322
322
 
323
323
  context "when the value is an id string" do
@@ -384,12 +384,12 @@ describe Mongoid::Fields::ForeignKey do
384
384
 
385
385
  context "when the relation stores ids as strings" do
386
386
 
387
- let(:metadata) do
387
+ let(:association) do
388
388
  Comment.reflect_on_association(:account)
389
389
  end
390
390
 
391
391
  let(:field) do
392
- described_class.new(:person_id, type: Object, metadata: metadata)
392
+ described_class.new(:person_id, type: Object, association: association)
393
393
  end
394
394
 
395
395
  let(:id_one) do
@@ -445,14 +445,14 @@ describe Mongoid::Fields::ForeignKey do
445
445
  end
446
446
  end
447
447
 
448
- context "when the metadata is polymoprhic" do
448
+ context "when the association is polymoprhic" do
449
449
 
450
- let(:metadata) do
450
+ let(:association) do
451
451
  Agent.reflect_on_association(:names)
452
452
  end
453
453
 
454
454
  let(:field) do
455
- described_class.new(:nameable_id, type: Object, metadata: metadata)
455
+ described_class.new(:nameable_id, type: Object, association: association)
456
456
  end
457
457
 
458
458
  let(:value) do
@@ -464,7 +464,7 @@ describe Mongoid::Fields::ForeignKey do
464
464
  end
465
465
 
466
466
  it "does not change the foreign key" do
467
- expect(evolved).to be(value)
467
+ expect(evolved).to eq(BSON::ObjectId.from_string(value))
468
468
  end
469
469
  end
470
470
  end
@@ -500,12 +500,8 @@ describe Mongoid::Fields::ForeignKey do
500
500
 
501
501
  context "when the array is object ids" do
502
502
 
503
- let(:metadata) do
504
- Mongoid::Relations::Metadata.new(
505
- inverse_class_name: "Game",
506
- name: :person,
507
- relation: Mongoid::Relations::Referenced::In
508
- )
503
+ let(:association) do
504
+ Game.relations["person"]
509
505
  end
510
506
 
511
507
  let(:field) do
@@ -514,7 +510,7 @@ describe Mongoid::Fields::ForeignKey do
514
510
  type: Array,
515
511
  default: [],
516
512
  identity: true,
517
- metadata: metadata,
513
+ association: association,
518
514
  overwrite: true
519
515
  )
520
516
  end
@@ -589,12 +585,8 @@ describe Mongoid::Fields::ForeignKey do
589
585
 
590
586
  context "when the array is object ids" do
591
587
 
592
- let(:metadata) do
593
- Mongoid::Relations::Metadata.new(
594
- inverse_class_name: "Game",
595
- name: :person,
596
- relation: Mongoid::Relations::Referenced::In
597
- )
588
+ let(:association) do
589
+ Game.relations['person']
598
590
  end
599
591
 
600
592
  let(:field) do
@@ -603,7 +595,7 @@ describe Mongoid::Fields::ForeignKey do
603
595
  type: Object,
604
596
  default: nil,
605
597
  identity: true,
606
- metadata: metadata,
598
+ association: association,
607
599
  overwrite: true
608
600
  )
609
601
  end
@@ -816,7 +816,7 @@ describe Mongoid::Fields do
816
816
 
817
817
  context "when the field name conflicts with mongoid's internals" do
818
818
 
819
- [:__metadata, :invalid].each do |meth|
819
+ [:_association, :invalid].each do |meth|
820
820
  context "when the field is named #{meth}" do
821
821
 
822
822
  it "raises an error" do
@@ -45,7 +45,7 @@ describe Mongoid::Indexable do
45
45
  end
46
46
  end
47
47
 
48
- context "when database specific options exist", if: non_legacy_server? do
48
+ context "when database specific options exist" do
49
49
 
50
50
  let(:klass) do
51
51
  Class.new do
@@ -89,12 +89,13 @@ describe Mongoid::Indexable do
89
89
  klass.create_indexes
90
90
  end
91
91
 
92
- it "creates the indexes" do
93
- expect(klass.collection.indexes.get(_type: 1)).to_not be_nil
92
+ it "creates the indexes by using specified background option" do
93
+ index = klass.collection.indexes.get(_type: 1)
94
+ expect(index[:background]).to eq(true)
94
95
  end
95
96
  end
96
97
 
97
- context "when database options are specified", if: non_legacy_server? do
98
+ context "when database options are specified" do
98
99
 
99
100
  let(:klass) do
100
101
  Class.new do
@@ -104,12 +105,9 @@ describe Mongoid::Indexable do
104
105
  end
105
106
  end
106
107
 
107
- before do
108
- klass.create_indexes
109
- end
110
-
111
108
  after do
112
109
  klass.remove_indexes
110
+ Mongoid::Config.background_indexing = false
113
111
  end
114
112
 
115
113
  let(:indexes) do
@@ -118,12 +116,25 @@ describe Mongoid::Indexable do
118
116
  end
119
117
  end
120
118
 
121
- it "creates the indexes" do
122
- expect(indexes.get(_type: 1)).to_not be_nil
119
+ it "creates the indexes by using default background_indexing option" do
120
+ klass.create_indexes
121
+
122
+ index = indexes.get(_type: 1)
123
+ expect(index[:background]).to eq(Mongoid::Config.background_indexing)
124
+ end
125
+
126
+ it "creates the indexes by using specified background_indexing option" do
127
+ Mongoid::Config.background_indexing = true
128
+
129
+ klass.create_indexes
130
+
131
+ index = indexes.get(_type: 1)
132
+ expect(index[:background]).to eq(true)
123
133
  end
124
134
  end
125
135
 
126
- context "when a collation option is specified", if: collation_supported? do
136
+ context "when a collation option is specified" do
137
+ min_server_version '3.4'
127
138
 
128
139
  let(:klass) do
129
140
  Class.new do
@@ -298,7 +309,8 @@ describe Mongoid::Indexable do
298
309
  end
299
310
  end
300
311
 
301
- context "when providing a collation option", if: collation_supported? do
312
+ context "when providing a collation option" do
313
+ min_server_version '3.4'
302
314
 
303
315
  before do
304
316
  klass.index({ name: 1 }, collation: { locale: 'en_US', strength: 2 })
@@ -526,6 +526,8 @@ describe Mongoid::Interceptable do
526
526
  end
527
527
 
528
528
  after(:all) do
529
+ # ActiveSupport may raise an error when trying to reset callbacks on all of Band's
530
+ # descendants, regardless of whether they have a particular callback defined.
529
531
  begin; Band.reset_callbacks(:rearrange); rescue; end
530
532
  end
531
533
 
@@ -597,7 +599,7 @@ describe Mongoid::Interceptable do
597
599
  it "raises an error" do
598
600
  expect {
599
601
  Band.has_and_belongs_to_many :tags, cascade_callbacks: true
600
- }.to raise_error(Mongoid::Errors::InvalidOptions)
602
+ }.to raise_error(Mongoid::Errors::InvalidRelationOption)
601
603
  end
602
604
  end
603
605
 
@@ -1181,6 +1183,25 @@ describe Mongoid::Interceptable do
1181
1183
  end
1182
1184
  end
1183
1185
 
1186
+ context 'when the parent is updated' do
1187
+
1188
+ let(:band) do
1189
+ Band.create(name: "Moderat")
1190
+ end
1191
+
1192
+ before do
1193
+ band.update(records: [ { name: 'Black on Both Sides' }])
1194
+ end
1195
+
1196
+ it 'executes the callback' do
1197
+ expect(band.records.first.before_validation_called).to be true
1198
+ end
1199
+
1200
+ it 'persists the change' do
1201
+ expect(band.reload.records.first.before_validation_called).to be true
1202
+ end
1203
+ end
1204
+
1184
1205
  context "when the child is persisted" do
1185
1206
 
1186
1207
  let(:band) do
@@ -68,7 +68,7 @@ describe Mongoid::Matchable::Default do
68
68
  context "when the value is a regexp" do
69
69
 
70
70
  it "returns true" do
71
- expect(matcher._matches?(/^Test[3-5]$/)).to be true
71
+ expect(matcher._matches?(/\ATest[3-5]\z/)).to be true
72
72
  end
73
73
  end
74
74
  end
@@ -112,14 +112,21 @@ describe Mongoid::Matchable::Default do
112
112
  described_class.new(["Test1", "Test2", "Test3"])
113
113
  end
114
114
 
115
- context "when the attribute contains the value" do
115
+ context "when the attribute equals the value" do
116
116
 
117
117
  it "returns true" do
118
118
  expect(matcher._matches?(["Test1", "Test2", "Test3"])).to be true
119
119
  end
120
120
  end
121
121
 
122
- context "when the attribute does not contain the value" do
122
+ context "when the value contains same items as attribute but in different order" do
123
+
124
+ it "returns false" do
125
+ expect(matcher._matches?(["Test1", "Test3", "Test2"])).to be false
126
+ end
127
+ end
128
+
129
+ context "when the value is a subset of attribute" do
123
130
 
124
131
  it "returns false" do
125
132
  expect(matcher._matches?(["Test1", "Test2"])).to be false
@@ -53,6 +53,19 @@ describe Mongoid::Matchable::ElemMatch do
53
53
  expect(matcher._matches?("$elemMatch" => {"a" => {"$in" => [1]}, "b" => {"$gt" => 1}})).to be true
54
54
  end
55
55
  end
56
+
57
+ context "when using a $not operator that matches" do
58
+
59
+ it "returns true" do
60
+ expect(matcher._matches?("$elemMatch" => {"a" => {"$not" => 4}})).to be true
61
+ end
62
+ end
63
+ end
64
+
65
+ context "when using symbols and a :$not operator that matches" do
66
+ it "returns true" do
67
+ expect(matcher._matches?(:$elemMatch => {"a" => {:$not => 4}})).to be true
68
+ end
56
69
  end
57
70
 
58
71
  context "when there is not a sub document that matches the criteria" do
@@ -74,6 +87,13 @@ describe Mongoid::Matchable::ElemMatch do
74
87
  expect(matcher._matches?("$elemMatch" => {"a" => {"$in" => [1]}, "b" => {"$gt" => 10}})).to be false
75
88
  end
76
89
  end
90
+
91
+ context "when using a $not operator that does not match" do
92
+
93
+ it "returns true" do
94
+ expect(matcher._matches?("$elemMatch" => {"a" => {"$not" => 1}})).to be true
95
+ end
96
+ end
77
97
  end
78
98
 
79
99
  context "when using a criteria that matches partially but not a single sub document" do