mongoid 5.4.1 → 7.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1354) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/CHANGELOG.md +30 -30
  4. data/LICENSE +1 -0
  5. data/README.md +33 -19
  6. data/Rakefile +75 -5
  7. data/lib/config/locales/en.yml +180 -64
  8. data/lib/mongoid/association/accessors.rb +402 -0
  9. data/lib/mongoid/association/bindable.rb +179 -0
  10. data/lib/mongoid/association/builders.rb +84 -0
  11. data/lib/mongoid/association/constrainable.rb +43 -0
  12. data/lib/mongoid/association/depending.rb +128 -0
  13. data/lib/mongoid/association/eager_loadable.rb +35 -0
  14. data/lib/mongoid/association/embedded/batchable.rb +358 -0
  15. data/lib/mongoid/association/embedded/cyclic.rb +102 -0
  16. data/lib/mongoid/association/embedded/embedded_in/binding.rb +52 -0
  17. data/lib/mongoid/association/embedded/embedded_in/buildable.rb +38 -0
  18. data/lib/mongoid/association/embedded/embedded_in/proxy.rb +111 -0
  19. data/lib/mongoid/association/embedded/embedded_in.rb +134 -0
  20. data/lib/mongoid/association/embedded/embeds_many/binding.rb +41 -0
  21. data/lib/mongoid/association/embedded/embeds_many/buildable.rb +45 -0
  22. data/lib/mongoid/association/embedded/embeds_many/proxy.rb +549 -0
  23. data/lib/mongoid/association/embedded/embeds_many.rb +183 -0
  24. data/lib/mongoid/association/embedded/embeds_one/binding.rb +43 -0
  25. data/lib/mongoid/association/embedded/embeds_one/buildable.rb +39 -0
  26. data/lib/mongoid/association/embedded/embeds_one/proxy.rb +145 -0
  27. data/lib/mongoid/association/embedded/embeds_one.rb +150 -0
  28. data/lib/mongoid/association/embedded.rb +6 -0
  29. data/lib/mongoid/association/macros.rb +207 -0
  30. data/lib/mongoid/association/many.rb +198 -0
  31. data/lib/mongoid/association/marshalable.rb +31 -0
  32. data/lib/mongoid/association/nested/many.rb +191 -0
  33. data/lib/mongoid/association/nested/nested_buildable.rb +66 -0
  34. data/lib/mongoid/association/nested/one.rb +116 -0
  35. data/lib/mongoid/association/nested.rb +15 -0
  36. data/lib/mongoid/association/one.rb +53 -0
  37. data/lib/mongoid/association/options.rb +122 -0
  38. data/lib/mongoid/association/proxy.rb +189 -0
  39. data/lib/mongoid/association/referenced/auto_save.rb +73 -0
  40. data/lib/mongoid/association/referenced/belongs_to/binding.rb +82 -0
  41. data/lib/mongoid/association/referenced/belongs_to/buildable.rb +48 -0
  42. data/lib/mongoid/association/referenced/belongs_to/eager.rb +73 -0
  43. data/lib/mongoid/association/referenced/belongs_to/proxy.rb +125 -0
  44. data/lib/mongoid/association/referenced/belongs_to.rb +226 -0
  45. data/lib/mongoid/association/referenced/counter_cache.rb +152 -0
  46. data/lib/mongoid/association/referenced/eager.rb +163 -0
  47. data/lib/mongoid/association/referenced/has_and_belongs_to_many/binding.rb +72 -0
  48. data/lib/mongoid/association/referenced/has_and_belongs_to_many/buildable.rb +40 -0
  49. data/lib/mongoid/association/referenced/has_and_belongs_to_many/eager.rb +53 -0
  50. data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +292 -0
  51. data/lib/mongoid/association/referenced/has_and_belongs_to_many.rb +270 -0
  52. data/lib/mongoid/association/referenced/has_many/binding.rb +36 -0
  53. data/lib/mongoid/association/referenced/has_many/buildable.rb +38 -0
  54. data/lib/mongoid/association/referenced/has_many/eager.rb +44 -0
  55. data/lib/mongoid/association/referenced/has_many/enumerable.rb +498 -0
  56. data/lib/mongoid/association/referenced/has_many/proxy.rb +545 -0
  57. data/lib/mongoid/association/referenced/has_many.rb +251 -0
  58. data/lib/mongoid/association/referenced/has_one/binding.rb +42 -0
  59. data/lib/mongoid/association/referenced/has_one/buildable.rb +74 -0
  60. data/lib/mongoid/association/referenced/has_one/eager.rb +36 -0
  61. data/lib/mongoid/association/referenced/has_one/nested_builder.rb +113 -0
  62. data/lib/mongoid/association/referenced/has_one/proxy.rb +111 -0
  63. data/lib/mongoid/association/referenced/has_one.rb +184 -0
  64. data/lib/mongoid/association/referenced/syncable.rb +155 -0
  65. data/lib/mongoid/association/referenced.rb +9 -0
  66. data/lib/mongoid/association/reflections.rb +69 -0
  67. data/lib/mongoid/association/relatable.rb +455 -0
  68. data/lib/mongoid/association.rb +135 -0
  69. data/lib/mongoid/atomic/modifiers.rb +29 -53
  70. data/lib/mongoid/atomic/paths/embedded/many.rb +5 -8
  71. data/lib/mongoid/atomic/paths/embedded/one.rb +5 -8
  72. data/lib/mongoid/atomic/paths/embedded.rb +3 -4
  73. data/lib/mongoid/atomic/paths/root.rb +4 -7
  74. data/lib/mongoid/atomic/paths.rb +2 -1
  75. data/lib/mongoid/atomic.rb +47 -52
  76. data/lib/mongoid/attributes/dynamic.rb +19 -33
  77. data/lib/mongoid/attributes/nested.rb +29 -21
  78. data/lib/mongoid/attributes/processing.rb +11 -26
  79. data/lib/mongoid/attributes/projector.rb +119 -0
  80. data/lib/mongoid/attributes/readonly.rb +24 -7
  81. data/lib/mongoid/attributes.rb +110 -106
  82. data/lib/mongoid/cacheable.rb +33 -0
  83. data/lib/mongoid/changeable.rb +39 -57
  84. data/lib/mongoid/clients/factory.rb +42 -17
  85. data/lib/mongoid/clients/options.rb +62 -258
  86. data/lib/mongoid/clients/sessions.rb +125 -0
  87. data/lib/mongoid/clients/storage_options.rb +9 -81
  88. data/lib/mongoid/clients/validators/storage.rb +2 -9
  89. data/lib/mongoid/clients/validators.rb +2 -1
  90. data/lib/mongoid/clients.rb +13 -73
  91. data/lib/mongoid/composable.rb +33 -10
  92. data/lib/mongoid/config/environment.rb +36 -14
  93. data/lib/mongoid/config/options.rb +20 -23
  94. data/lib/mongoid/config/validators/client.rb +2 -17
  95. data/lib/mongoid/config/validators/option.rb +2 -3
  96. data/lib/mongoid/config/validators.rb +2 -1
  97. data/lib/mongoid/config.rb +112 -39
  98. data/lib/mongoid/contextual/aggregable/memory.rb +17 -12
  99. data/lib/mongoid/contextual/aggregable/mongo.rb +26 -27
  100. data/lib/mongoid/contextual/aggregable/none.rb +65 -0
  101. data/lib/mongoid/contextual/aggregable.rb +17 -0
  102. data/lib/mongoid/contextual/atomic.rb +31 -33
  103. data/lib/mongoid/contextual/command.rb +2 -5
  104. data/lib/mongoid/contextual/geo_near.rb +7 -38
  105. data/lib/mongoid/contextual/map_reduce.rb +12 -36
  106. data/lib/mongoid/contextual/memory.rb +34 -64
  107. data/lib/mongoid/contextual/mongo.rb +228 -113
  108. data/lib/mongoid/contextual/none.rb +51 -23
  109. data/lib/mongoid/contextual/queryable.rb +2 -3
  110. data/lib/mongoid/contextual.rb +7 -9
  111. data/lib/mongoid/copyable.rb +32 -19
  112. data/lib/mongoid/criteria/findable.rb +12 -15
  113. data/lib/mongoid/criteria/includable.rb +21 -28
  114. data/lib/mongoid/criteria/inspectable.rb +2 -3
  115. data/lib/mongoid/criteria/marshalable.rb +4 -7
  116. data/lib/mongoid/criteria/modifiable.rb +38 -24
  117. data/lib/mongoid/criteria/options.rb +24 -0
  118. data/lib/mongoid/criteria/permission.rb +2 -1
  119. data/lib/mongoid/criteria/queryable/aggregable.rb +109 -0
  120. data/lib/mongoid/criteria/queryable/expandable.rb +68 -0
  121. data/lib/mongoid/criteria/queryable/extensions/array.rb +162 -0
  122. data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +36 -0
  123. data/lib/mongoid/criteria/queryable/extensions/boolean.rb +33 -0
  124. data/lib/mongoid/criteria/queryable/extensions/date.rb +58 -0
  125. data/lib/mongoid/criteria/queryable/extensions/date_time.rb +47 -0
  126. data/lib/mongoid/criteria/queryable/extensions/hash.rb +177 -0
  127. data/lib/mongoid/criteria/queryable/extensions/nil_class.rb +75 -0
  128. data/lib/mongoid/criteria/queryable/extensions/numeric.rb +81 -0
  129. data/lib/mongoid/criteria/queryable/extensions/object.rb +181 -0
  130. data/lib/mongoid/criteria/queryable/extensions/range.rb +94 -0
  131. data/lib/mongoid/criteria/queryable/extensions/regexp.rb +72 -0
  132. data/lib/mongoid/criteria/queryable/extensions/set.rb +33 -0
  133. data/lib/mongoid/criteria/queryable/extensions/string.rb +122 -0
  134. data/lib/mongoid/criteria/queryable/extensions/symbol.rb +72 -0
  135. data/lib/mongoid/criteria/queryable/extensions/time.rb +55 -0
  136. data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +61 -0
  137. data/lib/mongoid/criteria/queryable/extensions.rb +25 -0
  138. data/lib/mongoid/criteria/queryable/key.rb +177 -0
  139. data/lib/mongoid/criteria/queryable/macroable.rb +26 -0
  140. data/lib/mongoid/criteria/queryable/mergeable.rb +413 -0
  141. data/lib/mongoid/criteria/queryable/optional.rb +386 -0
  142. data/lib/mongoid/criteria/queryable/options.rb +136 -0
  143. data/lib/mongoid/criteria/queryable/pipeline.rb +106 -0
  144. data/lib/mongoid/criteria/queryable/selectable.rb +943 -0
  145. data/lib/mongoid/criteria/queryable/selector.rb +202 -0
  146. data/lib/mongoid/criteria/queryable/smash.rb +95 -0
  147. data/lib/mongoid/criteria/queryable/storable.rb +237 -0
  148. data/lib/mongoid/criteria/queryable.rb +85 -0
  149. data/lib/mongoid/criteria/scopable.rb +27 -19
  150. data/lib/mongoid/criteria.rb +93 -76
  151. data/lib/mongoid/document.rb +62 -109
  152. data/lib/mongoid/equality.rb +29 -12
  153. data/lib/mongoid/errors/ambiguous_relationship.rb +5 -6
  154. data/lib/mongoid/errors/callback.rb +2 -3
  155. data/lib/mongoid/errors/criteria_argument_required.rb +18 -0
  156. data/lib/mongoid/errors/delete_restriction.rb +10 -13
  157. data/lib/mongoid/errors/document_not_destroyed.rb +4 -7
  158. data/lib/mongoid/errors/document_not_found.rb +2 -9
  159. data/lib/mongoid/errors/eager_load.rb +6 -5
  160. data/lib/mongoid/errors/empty_config_file.rb +25 -0
  161. data/lib/mongoid/errors/in_memory_collation_not_supported.rb +2 -3
  162. data/lib/mongoid/errors/invalid_collection.rb +2 -1
  163. data/lib/mongoid/errors/invalid_config_file.rb +25 -0
  164. data/lib/mongoid/errors/invalid_config_option.rb +2 -3
  165. data/lib/mongoid/errors/invalid_dependent_strategy.rb +31 -0
  166. data/lib/mongoid/errors/invalid_discriminator_key_target.rb +24 -0
  167. data/lib/mongoid/errors/invalid_elem_match_operator.rb +32 -0
  168. data/lib/mongoid/errors/invalid_estimated_count_criteria.rb +25 -0
  169. data/lib/mongoid/errors/invalid_expression_operator.rb +27 -0
  170. data/lib/mongoid/errors/invalid_field.rb +4 -7
  171. data/lib/mongoid/errors/invalid_field_operator.rb +32 -0
  172. data/lib/mongoid/errors/invalid_field_option.rb +2 -3
  173. data/lib/mongoid/errors/invalid_find.rb +2 -3
  174. data/lib/mongoid/errors/invalid_includes.rb +2 -3
  175. data/lib/mongoid/errors/invalid_index.rb +2 -3
  176. data/lib/mongoid/errors/invalid_options.rb +4 -5
  177. data/lib/mongoid/errors/invalid_path.rb +2 -3
  178. data/lib/mongoid/errors/invalid_persistence_option.rb +26 -0
  179. data/lib/mongoid/errors/invalid_query.rb +40 -0
  180. data/lib/mongoid/errors/invalid_relation.rb +61 -0
  181. data/lib/mongoid/errors/invalid_relation_option.rb +28 -0
  182. data/lib/mongoid/errors/invalid_scope.rb +2 -3
  183. data/lib/mongoid/errors/invalid_session_use.rb +21 -0
  184. data/lib/mongoid/errors/invalid_set_polymorphic_relation.rb +6 -5
  185. data/lib/mongoid/errors/invalid_storage_options.rb +2 -3
  186. data/lib/mongoid/errors/invalid_storage_parent.rb +2 -3
  187. data/lib/mongoid/errors/invalid_time.rb +2 -3
  188. data/lib/mongoid/errors/invalid_value.rb +2 -1
  189. data/lib/mongoid/errors/inverse_not_found.rb +3 -4
  190. data/lib/mongoid/errors/mixed_client_configuration.rb +2 -3
  191. data/lib/mongoid/errors/mixed_relations.rb +2 -3
  192. data/lib/mongoid/errors/mongoid_error.rb +3 -10
  193. data/lib/mongoid/errors/nested_attributes_metadata_not_found.rb +3 -4
  194. data/lib/mongoid/errors/no_client_config.rb +4 -5
  195. data/lib/mongoid/errors/no_client_database.rb +2 -3
  196. data/lib/mongoid/errors/no_client_hosts.rb +2 -3
  197. data/lib/mongoid/errors/no_clients_config.rb +2 -3
  198. data/lib/mongoid/errors/no_default_client.rb +3 -4
  199. data/lib/mongoid/errors/no_environment.rb +2 -3
  200. data/lib/mongoid/errors/no_map_reduce_output.rb +2 -3
  201. data/lib/mongoid/errors/no_metadata.rb +2 -3
  202. data/lib/mongoid/errors/no_parent.rb +2 -3
  203. data/lib/mongoid/errors/readonly_attribute.rb +2 -3
  204. data/lib/mongoid/errors/readonly_document.rb +3 -6
  205. data/lib/mongoid/errors/scope_overwrite.rb +2 -1
  206. data/lib/mongoid/errors/too_many_nested_attribute_records.rb +2 -0
  207. data/lib/mongoid/errors/unknown_attribute.rb +2 -3
  208. data/lib/mongoid/errors/unknown_model.rb +24 -0
  209. data/lib/mongoid/errors/unsaved_document.rb +3 -2
  210. data/lib/mongoid/errors/unsupported_javascript.rb +2 -3
  211. data/lib/mongoid/errors/validations.rb +2 -1
  212. data/lib/mongoid/errors.rb +18 -1
  213. data/lib/mongoid/evolvable.rb +4 -5
  214. data/lib/mongoid/extensions/array.rb +33 -42
  215. data/lib/mongoid/extensions/big_decimal.rb +17 -17
  216. data/lib/mongoid/extensions/boolean.rb +3 -5
  217. data/lib/mongoid/extensions/date.rb +17 -13
  218. data/lib/mongoid/extensions/date_time.rb +4 -12
  219. data/lib/mongoid/extensions/decimal128.rb +3 -6
  220. data/lib/mongoid/extensions/false_class.rb +4 -7
  221. data/lib/mongoid/extensions/float.rb +5 -10
  222. data/lib/mongoid/extensions/hash.rb +57 -38
  223. data/lib/mongoid/extensions/integer.rb +5 -12
  224. data/lib/mongoid/extensions/module.rb +2 -3
  225. data/lib/mongoid/extensions/nil_class.rb +2 -5
  226. data/lib/mongoid/extensions/object.rb +21 -48
  227. data/lib/mongoid/extensions/object_id.rb +2 -7
  228. data/lib/mongoid/extensions/range.rb +3 -11
  229. data/lib/mongoid/extensions/regexp.rb +4 -4
  230. data/lib/mongoid/extensions/set.rb +2 -7
  231. data/lib/mongoid/extensions/string.rb +27 -44
  232. data/lib/mongoid/extensions/symbol.rb +2 -7
  233. data/lib/mongoid/extensions/time.rb +16 -10
  234. data/lib/mongoid/extensions/time_with_zone.rb +25 -7
  235. data/lib/mongoid/extensions/true_class.rb +4 -7
  236. data/lib/mongoid/extensions.rb +18 -11
  237. data/lib/mongoid/factory.rb +60 -10
  238. data/lib/mongoid/fields/foreign_key.rb +8 -27
  239. data/lib/mongoid/fields/localized.rb +2 -11
  240. data/lib/mongoid/fields/standard.rb +8 -50
  241. data/lib/mongoid/fields/validators/macro.rb +50 -14
  242. data/lib/mongoid/fields/validators.rb +2 -1
  243. data/lib/mongoid/fields.rb +118 -67
  244. data/lib/mongoid/findable.rb +60 -24
  245. data/lib/mongoid/indexable/specification.rb +3 -16
  246. data/lib/mongoid/indexable/validators/options.rb +2 -7
  247. data/lib/mongoid/indexable.rb +26 -36
  248. data/lib/mongoid/inspectable.rb +4 -11
  249. data/lib/mongoid/interceptable.rb +27 -57
  250. data/lib/mongoid/loggable.rb +13 -16
  251. data/lib/mongoid/matchable.rb +5 -146
  252. data/lib/mongoid/matcher/all.rb +22 -0
  253. data/lib/mongoid/matcher/and.rb +21 -0
  254. data/lib/mongoid/matcher/bits.rb +41 -0
  255. data/lib/mongoid/matcher/bits_all_clear.rb +20 -0
  256. data/lib/mongoid/matcher/bits_all_set.rb +20 -0
  257. data/lib/mongoid/matcher/bits_any_clear.rb +20 -0
  258. data/lib/mongoid/matcher/bits_any_set.rb +20 -0
  259. data/lib/mongoid/matcher/elem_match.rb +36 -0
  260. data/lib/mongoid/matcher/elem_match_expression.rb +20 -0
  261. data/lib/mongoid/matcher/eq.rb +11 -0
  262. data/lib/mongoid/matcher/eq_impl.rb +67 -0
  263. data/lib/mongoid/matcher/eq_impl_with_regexp.rb +26 -0
  264. data/lib/mongoid/matcher/exists.rb +15 -0
  265. data/lib/mongoid/matcher/expression.rb +35 -0
  266. data/lib/mongoid/matcher/expression_operator.rb +19 -0
  267. data/lib/mongoid/matcher/field_expression.rb +62 -0
  268. data/lib/mongoid/matcher/field_operator.rb +54 -0
  269. data/lib/mongoid/matcher/gt.rb +17 -0
  270. data/lib/mongoid/matcher/gte.rb +17 -0
  271. data/lib/mongoid/matcher/in.rb +25 -0
  272. data/lib/mongoid/matcher/lt.rb +17 -0
  273. data/lib/mongoid/matcher/lte.rb +17 -0
  274. data/lib/mongoid/matcher/mod.rb +17 -0
  275. data/lib/mongoid/matcher/ne.rb +16 -0
  276. data/lib/mongoid/matcher/nin.rb +11 -0
  277. data/lib/mongoid/matcher/nor.rb +25 -0
  278. data/lib/mongoid/matcher/not.rb +29 -0
  279. data/lib/mongoid/matcher/or.rb +21 -0
  280. data/lib/mongoid/matcher/regex.rb +41 -0
  281. data/lib/mongoid/matcher/size.rb +26 -0
  282. data/lib/mongoid/matcher/type.rb +99 -0
  283. data/lib/mongoid/matcher.rb +110 -0
  284. data/lib/mongoid/persistable/creatable.rb +9 -24
  285. data/lib/mongoid/persistable/deletable.rb +16 -29
  286. data/lib/mongoid/persistable/destroyable.rb +12 -15
  287. data/lib/mongoid/persistable/incrementable.rb +7 -8
  288. data/lib/mongoid/persistable/logical.rb +5 -7
  289. data/lib/mongoid/persistable/poppable.rb +3 -6
  290. data/lib/mongoid/persistable/pullable.rb +3 -8
  291. data/lib/mongoid/persistable/pushable.rb +14 -10
  292. data/lib/mongoid/persistable/renamable.rb +10 -8
  293. data/lib/mongoid/persistable/savable.rb +3 -8
  294. data/lib/mongoid/persistable/settable.rb +61 -19
  295. data/lib/mongoid/persistable/unsettable.rb +8 -8
  296. data/lib/mongoid/persistable/updatable.rb +38 -33
  297. data/lib/mongoid/persistable/upsertable.rb +5 -9
  298. data/lib/mongoid/persistable.rb +137 -45
  299. data/lib/mongoid/persistence_context.rb +222 -0
  300. data/lib/mongoid/positional.rb +3 -6
  301. data/lib/mongoid/query_cache.rb +141 -110
  302. data/lib/mongoid/railtie.rb +20 -17
  303. data/lib/mongoid/railties/controller_runtime.rb +88 -0
  304. data/lib/mongoid/railties/database.rake +9 -0
  305. data/lib/mongoid/reloadable.rb +14 -19
  306. data/lib/mongoid/scopable.rb +11 -38
  307. data/lib/mongoid/selectable.rb +8 -17
  308. data/lib/mongoid/serializable.rb +29 -34
  309. data/lib/mongoid/shardable.rb +80 -17
  310. data/lib/mongoid/stateful.rb +4 -10
  311. data/lib/mongoid/stringified_symbol.rb +52 -0
  312. data/lib/mongoid/tasks/database.rake +12 -5
  313. data/lib/mongoid/tasks/database.rb +88 -7
  314. data/lib/mongoid/threaded/lifecycle.rb +2 -21
  315. data/lib/mongoid/threaded.rb +70 -49
  316. data/lib/mongoid/timestamps/created/short.rb +2 -1
  317. data/lib/mongoid/timestamps/created.rb +3 -2
  318. data/lib/mongoid/timestamps/short.rb +2 -1
  319. data/lib/mongoid/timestamps/timeless.rb +6 -9
  320. data/lib/mongoid/timestamps/updated/short.rb +2 -1
  321. data/lib/mongoid/timestamps/updated.rb +3 -4
  322. data/lib/mongoid/timestamps.rb +3 -2
  323. data/lib/mongoid/touchable.rb +132 -0
  324. data/lib/mongoid/traversable.rb +181 -61
  325. data/lib/mongoid/validatable/associated.rb +5 -6
  326. data/lib/mongoid/validatable/format.rb +2 -1
  327. data/lib/mongoid/validatable/length.rb +2 -1
  328. data/lib/mongoid/validatable/localizable.rb +2 -3
  329. data/lib/mongoid/validatable/macros.rb +3 -8
  330. data/lib/mongoid/validatable/presence.rb +10 -15
  331. data/lib/mongoid/validatable/queryable.rb +2 -3
  332. data/lib/mongoid/validatable/uniqueness.rb +26 -40
  333. data/lib/mongoid/validatable.rb +16 -35
  334. data/lib/mongoid/version.rb +3 -2
  335. data/lib/mongoid.rb +35 -17
  336. data/lib/rails/generators/mongoid/config/config_generator.rb +10 -2
  337. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +54 -21
  338. data/lib/rails/generators/mongoid/model/model_generator.rb +3 -2
  339. data/lib/rails/generators/mongoid/model/templates/model.rb.tt +1 -1
  340. data/lib/rails/generators/mongoid_generator.rb +2 -1
  341. data/lib/rails/mongoid.rb +4 -5
  342. data/spec/README.md +33 -0
  343. data/spec/config/mongoid.yml +28 -2
  344. data/spec/integration/app_spec.rb +343 -0
  345. data/spec/integration/associations/belongs_to_spec.rb +15 -0
  346. data/spec/integration/associations/embedded_dirty_spec.rb +29 -0
  347. data/spec/integration/associations/embedded_spec.rb +268 -0
  348. data/spec/integration/associations/embeds_many_spec.rb +206 -0
  349. data/spec/integration/associations/embeds_one_spec.rb +23 -0
  350. data/spec/integration/associations/foreign_key_spec.rb +98 -0
  351. data/spec/integration/associations/foreign_key_spec_models.rb +64 -0
  352. data/spec/integration/associations/has_many_spec.rb +128 -0
  353. data/spec/integration/associations/has_one_spec.rb +176 -0
  354. data/spec/integration/associations/nested_attributes_assignment_spec.rb +115 -0
  355. data/spec/integration/associations/reverse_population_spec.rb +34 -0
  356. data/spec/integration/associations/reverse_population_spec_models.rb +36 -0
  357. data/spec/integration/associations/scope_option_spec.rb +101 -0
  358. data/spec/integration/atomic/modifiers_spec.rb +116 -0
  359. data/spec/integration/bson_regexp_raw_spec.rb +19 -0
  360. data/spec/integration/callbacks_models.rb +61 -0
  361. data/spec/integration/callbacks_spec.rb +228 -0
  362. data/spec/integration/contextual/empty_spec.rb +141 -0
  363. data/spec/integration/criteria/alias_query_spec.rb +161 -0
  364. data/spec/integration/criteria/date_field_spec.rb +40 -0
  365. data/spec/integration/criteria/default_scope_spec.rb +72 -0
  366. data/spec/integration/criteria/logical_spec.rb +124 -0
  367. data/spec/integration/criteria/range_spec.rb +265 -0
  368. data/spec/integration/criteria/time_with_zone_spec.rb +142 -0
  369. data/spec/integration/discriminator_key_spec.rb +353 -0
  370. data/spec/integration/discriminator_value_spec.rb +206 -0
  371. data/spec/integration/document_spec.rb +51 -0
  372. data/spec/integration/i18n_fallbacks_spec.rb +89 -0
  373. data/spec/integration/matcher_examples_spec.rb +758 -0
  374. data/spec/integration/matcher_operator_data/all.yml +140 -0
  375. data/spec/integration/matcher_operator_data/and.yml +93 -0
  376. data/spec/integration/matcher_operator_data/bits_all_clear.yml +159 -0
  377. data/spec/integration/matcher_operator_data/bits_all_set.yml +159 -0
  378. data/spec/integration/matcher_operator_data/bits_any_clear.yml +159 -0
  379. data/spec/integration/matcher_operator_data/bits_any_set.yml +159 -0
  380. data/spec/integration/matcher_operator_data/comment.yml +22 -0
  381. data/spec/integration/matcher_operator_data/elem_match.yml +409 -0
  382. data/spec/integration/matcher_operator_data/elem_match_expr.yml +213 -0
  383. data/spec/integration/matcher_operator_data/eq.yml +191 -0
  384. data/spec/integration/matcher_operator_data/exists.yml +213 -0
  385. data/spec/integration/matcher_operator_data/generic_op.yml +17 -0
  386. data/spec/integration/matcher_operator_data/gt.yml +132 -0
  387. data/spec/integration/matcher_operator_data/gt_types.yml +63 -0
  388. data/spec/integration/matcher_operator_data/gte.yml +132 -0
  389. data/spec/integration/matcher_operator_data/gte_types.yml +15 -0
  390. data/spec/integration/matcher_operator_data/implicit.yml +331 -0
  391. data/spec/integration/matcher_operator_data/implicit_traversal.yml +112 -0
  392. data/spec/integration/matcher_operator_data/in.yml +210 -0
  393. data/spec/integration/matcher_operator_data/invalid_op.yml +59 -0
  394. data/spec/integration/matcher_operator_data/invalid_syntax.yml +39 -0
  395. data/spec/integration/matcher_operator_data/lt.yml +132 -0
  396. data/spec/integration/matcher_operator_data/lt_types.yml +15 -0
  397. data/spec/integration/matcher_operator_data/lte.yml +132 -0
  398. data/spec/integration/matcher_operator_data/lte_types.yml +15 -0
  399. data/spec/integration/matcher_operator_data/mod.yml +55 -0
  400. data/spec/integration/matcher_operator_data/multiple.yml +29 -0
  401. data/spec/integration/matcher_operator_data/ne.yml +150 -0
  402. data/spec/integration/matcher_operator_data/ne_types.yml +15 -0
  403. data/spec/integration/matcher_operator_data/nin.yml +114 -0
  404. data/spec/integration/matcher_operator_data/nor.yml +126 -0
  405. data/spec/integration/matcher_operator_data/not.yml +196 -0
  406. data/spec/integration/matcher_operator_data/or.yml +137 -0
  407. data/spec/integration/matcher_operator_data/regex.yml +174 -0
  408. data/spec/integration/matcher_operator_data/regex_options.yml +72 -0
  409. data/spec/integration/matcher_operator_data/size.yml +174 -0
  410. data/spec/integration/matcher_operator_data/type.yml +70 -0
  411. data/spec/integration/matcher_operator_data/type_array.yml +16 -0
  412. data/spec/integration/matcher_operator_data/type_binary.yml +18 -0
  413. data/spec/integration/matcher_operator_data/type_boolean.yml +39 -0
  414. data/spec/integration/matcher_operator_data/type_code.yml +26 -0
  415. data/spec/integration/matcher_operator_data/type_code_with_scope.yml +26 -0
  416. data/spec/integration/matcher_operator_data/type_date.yml +39 -0
  417. data/spec/integration/matcher_operator_data/type_db_pointer.yml +19 -0
  418. data/spec/integration/matcher_operator_data/type_decimal.yml +40 -0
  419. data/spec/integration/matcher_operator_data/type_double.yml +15 -0
  420. data/spec/integration/matcher_operator_data/type_int32.yml +33 -0
  421. data/spec/integration/matcher_operator_data/type_int64.yml +33 -0
  422. data/spec/integration/matcher_operator_data/type_max_key.yml +17 -0
  423. data/spec/integration/matcher_operator_data/type_min_key.yml +17 -0
  424. data/spec/integration/matcher_operator_data/type_null.yml +23 -0
  425. data/spec/integration/matcher_operator_data/type_object.yml +23 -0
  426. data/spec/integration/matcher_operator_data/type_object_id.yml +25 -0
  427. data/spec/integration/matcher_operator_data/type_regex.yml +44 -0
  428. data/spec/integration/matcher_operator_data/type_string.yml +15 -0
  429. data/spec/integration/matcher_operator_data/type_symbol.yml +32 -0
  430. data/spec/integration/matcher_operator_data/type_timestamp.yml +25 -0
  431. data/spec/integration/matcher_operator_data/type_undefined.yml +17 -0
  432. data/spec/integration/matcher_operator_spec.rb +124 -0
  433. data/spec/integration/matcher_spec.rb +283 -0
  434. data/spec/integration/server_query_spec.rb +141 -0
  435. data/spec/integration/shardable_spec.rb +148 -0
  436. data/spec/integration/stringified_symbol_field_spec.rb +203 -0
  437. data/spec/lite_spec_helper.rb +83 -0
  438. data/spec/mongoid/association/accessors_spec.rb +1067 -0
  439. data/spec/mongoid/association/auto_save_spec.rb +403 -0
  440. data/spec/mongoid/association/builders_spec.rb +255 -0
  441. data/spec/mongoid/association/constrainable_spec.rb +117 -0
  442. data/spec/mongoid/association/counter_cache_spec.rb +452 -0
  443. data/spec/mongoid/association/depending_spec.rb +959 -0
  444. data/spec/mongoid/association/eager_spec.rb +281 -0
  445. data/spec/mongoid/association/embedded/cyclic_spec.rb +180 -0
  446. data/spec/mongoid/association/embedded/dirty_spec.rb +67 -0
  447. data/spec/mongoid/association/embedded/embedded_in/binding_spec.rb +173 -0
  448. data/spec/mongoid/association/embedded/embedded_in/buildable_spec.rb +36 -0
  449. data/spec/mongoid/association/embedded/embedded_in/proxy_spec.rb +559 -0
  450. data/spec/mongoid/association/embedded/embedded_in_spec.rb +903 -0
  451. data/spec/mongoid/association/embedded/embeds_many/binding_spec.rb +56 -0
  452. data/spec/mongoid/association/embedded/embeds_many/buildable_spec.rb +106 -0
  453. data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +4652 -0
  454. data/spec/mongoid/association/embedded/embeds_many_models.rb +69 -0
  455. data/spec/mongoid/association/embedded/embeds_many_query_spec.rb +51 -0
  456. data/spec/mongoid/association/embedded/embeds_many_spec.rb +864 -0
  457. data/spec/mongoid/association/embedded/embeds_one/binding_spec.rb +79 -0
  458. data/spec/mongoid/association/embedded/embeds_one/buildable_spec.rb +81 -0
  459. data/spec/mongoid/association/embedded/embeds_one/proxy_spec.rb +1025 -0
  460. data/spec/mongoid/association/embedded/embeds_one_dnl_models.rb +8 -0
  461. data/spec/mongoid/association/embedded/embeds_one_models.rb +54 -0
  462. data/spec/mongoid/association/embedded/embeds_one_query_spec.rb +28 -0
  463. data/spec/mongoid/association/embedded/embeds_one_spec.rb +956 -0
  464. data/spec/mongoid/association/macros_spec.rb +1116 -0
  465. data/spec/mongoid/association/nested/many_spec.rb +232 -0
  466. data/spec/mongoid/association/nested/one_spec.rb +253 -0
  467. data/spec/mongoid/association/options_spec.rb +1323 -0
  468. data/spec/mongoid/association/polymorphic_spec.rb +162 -0
  469. data/spec/mongoid/association/referenced/belongs_to/binding_spec.rb +243 -0
  470. data/spec/mongoid/association/referenced/belongs_to/buildable_spec.rb +238 -0
  471. data/spec/mongoid/association/referenced/belongs_to/eager_spec.rb +412 -0
  472. data/spec/mongoid/association/referenced/belongs_to/proxy_spec.rb +1373 -0
  473. data/spec/mongoid/association/referenced/belongs_to_query_spec.rb +57 -0
  474. data/spec/mongoid/association/referenced/belongs_to_spec.rb +2046 -0
  475. data/spec/mongoid/association/referenced/has_and_belongs_to_many/binding_spec.rb +180 -0
  476. data/spec/mongoid/association/referenced/has_and_belongs_to_many/buildable_spec.rb +148 -0
  477. data/spec/mongoid/association/referenced/has_and_belongs_to_many/eager_spec.rb +196 -0
  478. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_persistence_spec.rb +76 -0
  479. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_spec.rb +3773 -0
  480. data/spec/mongoid/association/referenced/has_and_belongs_to_many_models.rb +67 -0
  481. data/spec/mongoid/association/referenced/has_and_belongs_to_many_query_spec.rb +39 -0
  482. data/spec/mongoid/association/referenced/has_and_belongs_to_many_spec.rb +1071 -0
  483. data/spec/mongoid/association/referenced/has_many/binding_spec.rb +155 -0
  484. data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +142 -0
  485. data/spec/mongoid/association/referenced/has_many/eager_spec.rb +290 -0
  486. data/spec/mongoid/association/referenced/has_many/enumerable_spec.rb +2232 -0
  487. data/spec/mongoid/association/referenced/has_many/proxy_query_spec.rb +23 -0
  488. data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +4092 -0
  489. data/spec/mongoid/association/referenced/has_many_models.rb +95 -0
  490. data/spec/mongoid/association/referenced/has_many_query_spec.rb +37 -0
  491. data/spec/mongoid/association/referenced/has_many_spec.rb +1248 -0
  492. data/spec/mongoid/association/referenced/has_one/binding_spec.rb +133 -0
  493. data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +159 -0
  494. data/spec/mongoid/association/referenced/has_one/eager_spec.rb +193 -0
  495. data/spec/mongoid/association/referenced/has_one/proxy_spec.rb +1142 -0
  496. data/spec/mongoid/association/referenced/has_one_models.rb +97 -0
  497. data/spec/mongoid/association/referenced/has_one_query_spec.rb +37 -0
  498. data/spec/mongoid/association/referenced/has_one_spec.rb +1383 -0
  499. data/spec/mongoid/association/reflections_spec.rb +92 -0
  500. data/spec/mongoid/association/syncable_spec.rb +499 -0
  501. data/spec/mongoid/association_spec.rb +191 -0
  502. data/spec/mongoid/atomic/modifiers_spec.rb +52 -3
  503. data/spec/mongoid/atomic/paths/embedded/many_spec.rb +2 -0
  504. data/spec/mongoid/atomic/paths/embedded/one_spec.rb +2 -0
  505. data/spec/mongoid/atomic/paths/root_spec.rb +2 -0
  506. data/spec/mongoid/atomic/paths_spec.rb +107 -12
  507. data/spec/mongoid/atomic_spec.rb +36 -11
  508. data/spec/mongoid/attributes/dynamic_spec.rb +152 -0
  509. data/spec/mongoid/attributes/nested_spec.rb +115 -91
  510. data/spec/mongoid/attributes/projector_data/embedded.yml +105 -0
  511. data/spec/mongoid/attributes/projector_data/fields.yml +93 -0
  512. data/spec/mongoid/attributes/projector_spec.rb +44 -0
  513. data/spec/mongoid/attributes/readonly_spec.rb +111 -111
  514. data/spec/mongoid/attributes_spec.rb +501 -33
  515. data/spec/mongoid/cacheable_spec.rb +114 -0
  516. data/spec/mongoid/changeable_spec.rb +118 -35
  517. data/spec/mongoid/clients/factory_spec.rb +176 -34
  518. data/spec/mongoid/clients/options_spec.rb +431 -98
  519. data/spec/mongoid/clients/sessions_spec.rb +335 -0
  520. data/spec/mongoid/clients/transactions_spec.rb +415 -0
  521. data/spec/mongoid/clients_spec.rb +318 -114
  522. data/spec/mongoid/composable_spec.rb +9 -0
  523. data/spec/mongoid/config/environment_spec.rb +88 -8
  524. data/spec/mongoid/config/options_spec.rb +22 -3
  525. data/spec/mongoid/config_spec.rb +371 -13
  526. data/spec/mongoid/contextual/aggregable/memory_spec.rb +53 -11
  527. data/spec/mongoid/contextual/aggregable/mongo_spec.rb +122 -20
  528. data/spec/mongoid/contextual/aggregable/none_spec.rb +60 -0
  529. data/spec/mongoid/contextual/atomic_spec.rb +245 -84
  530. data/spec/mongoid/contextual/geo_near_spec.rb +31 -19
  531. data/spec/mongoid/contextual/map_reduce_spec.rb +24 -7
  532. data/spec/mongoid/contextual/memory_spec.rb +44 -23
  533. data/spec/mongoid/contextual/mongo_spec.rb +780 -155
  534. data/spec/mongoid/contextual/none_spec.rb +14 -71
  535. data/spec/mongoid/copyable_spec.rb +297 -23
  536. data/spec/mongoid/copyable_spec_models.rb +47 -0
  537. data/spec/mongoid/criteria/findable_spec.rb +77 -20
  538. data/spec/mongoid/criteria/inspectable_spec.rb +2 -0
  539. data/spec/mongoid/criteria/marshalable_spec.rb +2 -0
  540. data/spec/mongoid/criteria/modifiable_spec.rb +506 -50
  541. data/spec/mongoid/criteria/options_spec.rb +31 -0
  542. data/spec/mongoid/criteria/queryable/aggregable_spec.rb +372 -0
  543. data/spec/mongoid/criteria/queryable/expandable_spec.rb +61 -0
  544. data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +525 -0
  545. data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +61 -0
  546. data/spec/mongoid/criteria/queryable/extensions/bignum_spec.rb +60 -0
  547. data/spec/mongoid/criteria/queryable/extensions/boolean_spec.rb +215 -0
  548. data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +332 -0
  549. data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +423 -0
  550. data/spec/mongoid/criteria/queryable/extensions/fixnum_spec.rb +60 -0
  551. data/spec/mongoid/criteria/queryable/extensions/float_spec.rb +67 -0
  552. data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +329 -0
  553. data/spec/mongoid/criteria/queryable/extensions/integer_spec.rb +67 -0
  554. data/spec/mongoid/criteria/queryable/extensions/nil_class_spec.rb +79 -0
  555. data/spec/mongoid/criteria/queryable/extensions/numeric_spec.rb +53 -0
  556. data/spec/mongoid/criteria/queryable/extensions/object_spec.rb +110 -0
  557. data/spec/mongoid/criteria/queryable/extensions/range_spec.rb +370 -0
  558. data/spec/mongoid/criteria/queryable/extensions/regexp_raw_spec.rb +91 -0
  559. data/spec/mongoid/criteria/queryable/extensions/regexp_spec.rb +92 -0
  560. data/spec/mongoid/criteria/queryable/extensions/set_spec.rb +41 -0
  561. data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +347 -0
  562. data/spec/mongoid/criteria/queryable/extensions/symbol_spec.rb +169 -0
  563. data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +395 -0
  564. data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +376 -0
  565. data/spec/mongoid/criteria/queryable/key_spec.rb +96 -0
  566. data/spec/mongoid/criteria/queryable/mergeable_spec.rb +182 -0
  567. data/spec/mongoid/criteria/queryable/optional_spec.rb +1801 -0
  568. data/spec/mongoid/criteria/queryable/options_spec.rb +362 -0
  569. data/spec/mongoid/criteria/queryable/pipeline_spec.rb +214 -0
  570. data/spec/mongoid/criteria/queryable/queryable_spec.rb +139 -0
  571. data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +2069 -0
  572. data/spec/mongoid/criteria/queryable/selectable_shared_examples.rb +38 -0
  573. data/spec/mongoid/criteria/queryable/selectable_spec.rb +2297 -0
  574. data/spec/mongoid/criteria/queryable/selectable_where_spec.rb +589 -0
  575. data/spec/mongoid/criteria/queryable/selector_spec.rb +883 -0
  576. data/spec/mongoid/criteria/queryable/smash_spec.rb +32 -0
  577. data/spec/mongoid/criteria/queryable/storable_spec.rb +226 -0
  578. data/spec/mongoid/criteria/scopable_spec.rb +210 -0
  579. data/spec/mongoid/criteria_projection_spec.rb +410 -0
  580. data/spec/mongoid/criteria_spec.rb +876 -402
  581. data/spec/mongoid/document_fields_spec.rb +113 -0
  582. data/spec/mongoid/document_persistence_context_spec.rb +32 -0
  583. data/spec/mongoid/document_query_spec.rb +89 -0
  584. data/spec/mongoid/document_spec.rb +214 -104
  585. data/spec/mongoid/equality_spec.rb +144 -41
  586. data/spec/mongoid/errors/ambiguous_relationship_spec.rb +5 -3
  587. data/spec/mongoid/errors/callback_spec.rb +2 -0
  588. data/spec/mongoid/errors/delete_restriction_spec.rb +4 -2
  589. data/spec/mongoid/errors/document_not_destroyed_spec.rb +2 -0
  590. data/spec/mongoid/errors/document_not_found_spec.rb +2 -0
  591. data/spec/mongoid/errors/eager_load_spec.rb +2 -0
  592. data/spec/mongoid/errors/invalid_collection_spec.rb +2 -0
  593. data/spec/mongoid/errors/invalid_config_file_spec.rb +31 -0
  594. data/spec/mongoid/errors/invalid_config_option_spec.rb +2 -0
  595. data/spec/mongoid/errors/invalid_field_option_spec.rb +2 -0
  596. data/spec/mongoid/errors/invalid_field_spec.rb +2 -0
  597. data/spec/mongoid/errors/invalid_find_spec.rb +2 -0
  598. data/spec/mongoid/errors/invalid_includes_spec.rb +2 -0
  599. data/spec/mongoid/errors/invalid_index_spec.rb +2 -0
  600. data/spec/mongoid/errors/invalid_options_spec.rb +4 -2
  601. data/spec/mongoid/errors/invalid_path_spec.rb +2 -0
  602. data/spec/mongoid/errors/invalid_relation_spec.rb +39 -0
  603. data/spec/mongoid/errors/invalid_scope_spec.rb +3 -1
  604. data/spec/mongoid/errors/invalid_set_polymorphic_relation_spec.rb +2 -0
  605. data/spec/mongoid/errors/invalid_storage_options_spec.rb +2 -0
  606. data/spec/mongoid/errors/invalid_time_spec.rb +2 -0
  607. data/spec/mongoid/errors/inverse_not_found_spec.rb +3 -1
  608. data/spec/mongoid/errors/mixed_client_configuration_spec.rb +2 -0
  609. data/spec/mongoid/errors/mixed_relations_spec.rb +2 -0
  610. data/spec/mongoid/errors/mongoid_error_spec.rb +28 -11
  611. data/spec/mongoid/errors/nested_attributes_metadata_not_found_spec.rb +5 -3
  612. data/spec/mongoid/errors/no_client_config_spec.rb +4 -2
  613. data/spec/mongoid/errors/no_client_database_spec.rb +5 -3
  614. data/spec/mongoid/errors/no_client_hosts_spec.rb +5 -3
  615. data/spec/mongoid/errors/no_clients_config_spec.rb +2 -0
  616. data/spec/mongoid/errors/no_environment_spec.rb +2 -0
  617. data/spec/mongoid/errors/no_map_reduce_output_spec.rb +2 -0
  618. data/spec/mongoid/errors/no_metadata_spec.rb +4 -2
  619. data/spec/mongoid/errors/no_parent_spec.rb +3 -1
  620. data/spec/mongoid/errors/readonly_attribute_spec.rb +2 -0
  621. data/spec/mongoid/errors/readonly_document_spec.rb +2 -0
  622. data/spec/mongoid/errors/scope_overwrite_spec.rb +2 -0
  623. data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +2 -0
  624. data/spec/mongoid/errors/unknown_attribute_spec.rb +4 -2
  625. data/spec/mongoid/errors/unsaved_document_spec.rb +3 -1
  626. data/spec/mongoid/errors/unsupported_javascript_spec.rb +2 -0
  627. data/spec/mongoid/errors/validations_spec.rb +2 -0
  628. data/spec/mongoid/extensions/array_spec.rb +36 -58
  629. data/spec/mongoid/extensions/big_decimal_spec.rb +323 -19
  630. data/spec/mongoid/extensions/binary_spec.rb +2 -0
  631. data/spec/mongoid/extensions/boolean_spec.rb +16 -0
  632. data/spec/mongoid/extensions/date_class_mongoize_spec.rb +335 -0
  633. data/spec/mongoid/extensions/date_spec.rb +8 -164
  634. data/spec/mongoid/extensions/date_time_spec.rb +19 -66
  635. data/spec/mongoid/extensions/decimal128_spec.rb +3 -1
  636. data/spec/mongoid/extensions/false_class_spec.rb +3 -1
  637. data/spec/mongoid/extensions/float_spec.rb +25 -4
  638. data/spec/mongoid/extensions/hash_spec.rb +138 -1
  639. data/spec/mongoid/extensions/integer_spec.rb +22 -3
  640. data/spec/mongoid/extensions/module_spec.rb +2 -0
  641. data/spec/mongoid/extensions/nil_class_spec.rb +2 -0
  642. data/spec/mongoid/extensions/object_id_spec.rb +2 -0
  643. data/spec/mongoid/extensions/object_spec.rb +27 -31
  644. data/spec/mongoid/extensions/range_spec.rb +9 -0
  645. data/spec/mongoid/extensions/regexp_spec.rb +25 -0
  646. data/spec/mongoid/extensions/set_spec.rb +2 -0
  647. data/spec/mongoid/extensions/string_spec.rb +113 -31
  648. data/spec/mongoid/extensions/stringified_symbol_spec.rb +84 -0
  649. data/spec/mongoid/extensions/symbol_spec.rb +2 -0
  650. data/spec/mongoid/extensions/time_spec.rb +31 -6
  651. data/spec/mongoid/extensions/time_with_zone_spec.rb +35 -6
  652. data/spec/mongoid/extensions/true_class_spec.rb +3 -1
  653. data/spec/mongoid/extensions_spec.rb +16 -2
  654. data/spec/mongoid/factory_spec.rb +304 -15
  655. data/spec/mongoid/fields/foreign_key_spec.rb +26 -32
  656. data/spec/mongoid/fields/localized_spec.rb +6 -4
  657. data/spec/mongoid/fields/standard_spec.rb +2 -0
  658. data/spec/mongoid/fields_spec.rb +420 -38
  659. data/spec/mongoid/findable_spec.rb +98 -19
  660. data/spec/mongoid/indexable/specification_spec.rb +2 -0
  661. data/spec/mongoid/indexable_spec.rb +69 -17
  662. data/spec/mongoid/inspectable_spec.rb +39 -2
  663. data/spec/mongoid/interceptable_spec.rb +273 -114
  664. data/spec/mongoid/interceptable_spec_models.rb +76 -0
  665. data/spec/mongoid/loggable_spec.rb +2 -0
  666. data/spec/mongoid/matcher/extract_attribute_data/numeric_keys.yml +104 -0
  667. data/spec/mongoid/matcher/extract_attribute_data/traversal.yml +239 -0
  668. data/spec/mongoid/matcher/extract_attribute_spec.rb +40 -0
  669. data/spec/mongoid/persistable/creatable_spec.rb +119 -29
  670. data/spec/mongoid/persistable/deletable_spec.rb +307 -11
  671. data/spec/mongoid/persistable/destroyable_spec.rb +225 -12
  672. data/spec/mongoid/persistable/incrementable_spec.rb +29 -13
  673. data/spec/mongoid/persistable/logical_spec.rb +19 -3
  674. data/spec/mongoid/persistable/poppable_spec.rb +19 -3
  675. data/spec/mongoid/persistable/pullable_spec.rb +36 -6
  676. data/spec/mongoid/persistable/pushable_spec.rb +91 -7
  677. data/spec/mongoid/persistable/renamable_spec.rb +18 -2
  678. data/spec/mongoid/persistable/savable_spec.rb +218 -50
  679. data/spec/mongoid/persistable/settable_spec.rb +213 -32
  680. data/spec/mongoid/persistable/unsettable_spec.rb +19 -3
  681. data/spec/mongoid/persistable/updatable_spec.rb +222 -21
  682. data/spec/mongoid/persistable/upsertable_spec.rb +4 -2
  683. data/spec/mongoid/persistable_spec.rb +116 -25
  684. data/spec/mongoid/persistence_context_spec.rb +696 -0
  685. data/spec/mongoid/positional_spec.rb +3 -1
  686. data/spec/mongoid/query_cache_middleware_spec.rb +68 -0
  687. data/spec/mongoid/query_cache_spec.rb +647 -45
  688. data/spec/mongoid/relations/proxy_spec.rb +126 -98
  689. data/spec/mongoid/reloadable_spec.rb +346 -17
  690. data/spec/mongoid/scopable_spec.rb +82 -22
  691. data/spec/mongoid/selectable_spec.rb +8 -6
  692. data/spec/mongoid/serializable_spec.rb +160 -79
  693. data/spec/mongoid/shardable_models.rb +61 -0
  694. data/spec/mongoid/shardable_spec.rb +145 -26
  695. data/spec/mongoid/stateful_spec.rb +3 -1
  696. data/spec/mongoid/tasks/database_rake_spec.rb +15 -13
  697. data/spec/mongoid/tasks/database_spec.rb +3 -1
  698. data/spec/mongoid/threaded_spec.rb +72 -2
  699. data/spec/mongoid/timestamps/created/short_spec.rb +3 -1
  700. data/spec/mongoid/timestamps/created_spec.rb +3 -1
  701. data/spec/mongoid/timestamps/timeless_spec.rb +4 -2
  702. data/spec/mongoid/timestamps/updated/short_spec.rb +5 -3
  703. data/spec/mongoid/timestamps/updated_spec.rb +5 -3
  704. data/spec/mongoid/timestamps_spec.rb +8 -6
  705. data/spec/mongoid/touchable_spec.rb +588 -0
  706. data/spec/mongoid/touchable_spec_models.rb +53 -0
  707. data/spec/mongoid/traversable_spec.rb +1167 -1
  708. data/spec/mongoid/validatable/associated_spec.rb +3 -1
  709. data/spec/mongoid/validatable/format_spec.rb +2 -0
  710. data/spec/mongoid/validatable/length_spec.rb +2 -0
  711. data/spec/mongoid/validatable/numericality_spec.rb +2 -0
  712. data/spec/mongoid/validatable/presence_spec.rb +33 -26
  713. data/spec/mongoid/validatable/uniqueness_spec.rb +119 -81
  714. data/spec/mongoid/validatable_spec.rb +21 -3
  715. data/spec/mongoid_spec.rb +2 -0
  716. data/spec/rails/controller_extension/controller_runtime_spec.rb +112 -0
  717. data/spec/rails/mongoid_spec.rb +4 -2
  718. data/spec/shared/LICENSE +20 -0
  719. data/spec/shared/bin/get-mongodb-download-url +17 -0
  720. data/spec/shared/bin/s3-copy +45 -0
  721. data/spec/shared/bin/s3-upload +69 -0
  722. data/spec/shared/lib/mrss/child_process_helper.rb +80 -0
  723. data/spec/shared/lib/mrss/cluster_config.rb +231 -0
  724. data/spec/shared/lib/mrss/constraints.rb +386 -0
  725. data/spec/shared/lib/mrss/docker_runner.rb +271 -0
  726. data/spec/shared/lib/mrss/event_subscriber.rb +200 -0
  727. data/spec/shared/lib/mrss/lite_constraints.rb +199 -0
  728. data/spec/shared/lib/mrss/server_version_registry.rb +120 -0
  729. data/spec/shared/lib/mrss/session_registry.rb +69 -0
  730. data/spec/shared/lib/mrss/session_registry_legacy.rb +60 -0
  731. data/spec/shared/lib/mrss/spec_organizer.rb +179 -0
  732. data/spec/shared/lib/mrss/utils.rb +15 -0
  733. data/spec/shared/share/Dockerfile.erb +339 -0
  734. data/spec/shared/share/haproxy-1.conf +16 -0
  735. data/spec/shared/share/haproxy-2.conf +17 -0
  736. data/spec/shared/shlib/distro.sh +74 -0
  737. data/spec/shared/shlib/server.sh +379 -0
  738. data/spec/shared/shlib/set_env.sh +132 -0
  739. data/spec/spec_helper.rb +133 -53
  740. data/spec/support/authorization.rb +2 -0
  741. data/spec/support/client_registry.rb +9 -0
  742. data/spec/support/constraints.rb +53 -0
  743. data/spec/support/expectations.rb +21 -3
  744. data/spec/support/helpers.rb +11 -0
  745. data/spec/support/macros.rb +42 -0
  746. data/spec/support/models/account.rb +38 -0
  747. data/spec/support/models/acolyte.rb +19 -0
  748. data/spec/support/models/actor.rb +20 -0
  749. data/spec/support/models/actress.rb +4 -0
  750. data/spec/support/models/address.rb +85 -0
  751. data/spec/support/models/address_component.rb +7 -0
  752. data/spec/support/models/address_number.rb +8 -0
  753. data/spec/support/models/agency.rb +7 -0
  754. data/spec/support/models/agent.rb +18 -0
  755. data/spec/support/models/album.rb +20 -0
  756. data/spec/support/models/alert.rb +9 -0
  757. data/spec/support/models/animal.rb +28 -0
  758. data/spec/support/models/answer.rb +8 -0
  759. data/spec/support/models/appointment.rb +9 -0
  760. data/spec/support/models/armrest.rb +9 -0
  761. data/spec/support/models/array_field.rb +7 -0
  762. data/spec/support/models/article.rb +14 -0
  763. data/spec/support/models/artist.rb +91 -0
  764. data/spec/support/models/artwork.rb +6 -0
  765. data/spec/support/models/audible_sound.rb +3 -0
  766. data/spec/support/models/audio.rb +7 -0
  767. data/spec/support/models/augmentation.rb +13 -0
  768. data/spec/support/models/author.rb +8 -0
  769. data/spec/support/models/baby.rb +6 -0
  770. data/spec/support/models/band.rb +37 -0
  771. data/spec/support/models/bar.rb +12 -0
  772. data/spec/support/models/basic.rb +8 -0
  773. data/spec/support/models/bed.rb +3 -0
  774. data/spec/support/models/big_palette.rb +4 -0
  775. data/spec/support/models/birthday.rb +15 -0
  776. data/spec/support/models/bolt.rb +7 -0
  777. data/spec/support/models/bomb.rb +6 -0
  778. data/spec/support/models/book.rb +18 -0
  779. data/spec/support/models/breed.rb +6 -0
  780. data/spec/support/models/browser.rb +8 -0
  781. data/spec/support/models/building.rb +8 -0
  782. data/spec/support/models/building_address.rb +9 -0
  783. data/spec/support/models/bus.rb +9 -0
  784. data/spec/support/models/business.rb +7 -0
  785. data/spec/support/models/callback_test.rb +11 -0
  786. data/spec/support/models/canvas.rb +27 -0
  787. data/spec/support/models/car.rb +3 -0
  788. data/spec/support/models/cat.rb +10 -0
  789. data/spec/support/models/category.rb +10 -0
  790. data/spec/support/models/child.rb +6 -0
  791. data/spec/support/models/child_doc.rb +24 -0
  792. data/spec/support/models/church.rb +8 -0
  793. data/spec/support/models/circle.rb +5 -0
  794. data/spec/support/models/circuit.rb +6 -0
  795. data/spec/support/models/circus.rb +9 -0
  796. data/spec/support/models/code.rb +13 -0
  797. data/spec/support/models/coding/pull_request.rb +11 -0
  798. data/spec/support/models/coding.rb +3 -0
  799. data/spec/support/models/comment.rb +18 -0
  800. data/spec/support/models/company.rb +7 -0
  801. data/spec/support/models/consumption_period.rb +9 -0
  802. data/spec/support/models/contextable_item.rb +7 -0
  803. data/spec/support/models/contractor.rb +7 -0
  804. data/spec/support/models/cookie.rb +8 -0
  805. data/spec/support/models/country_code.rb +12 -0
  806. data/spec/support/models/courier_job.rb +6 -0
  807. data/spec/support/models/crate.rb +12 -0
  808. data/spec/support/models/customer.rb +10 -0
  809. data/spec/support/models/customer_address.rb +11 -0
  810. data/spec/support/models/deed.rb +7 -0
  811. data/spec/support/models/definition.rb +11 -0
  812. data/spec/support/models/delegating_patient.rb +15 -0
  813. data/spec/support/models/description.rb +13 -0
  814. data/spec/support/models/dictionary.rb +18 -0
  815. data/spec/support/models/division.rb +12 -0
  816. data/spec/support/models/doctor.rb +14 -0
  817. data/spec/support/models/dog.rb +9 -0
  818. data/spec/support/models/dokument.rb +8 -0
  819. data/spec/support/models/draft.rb +11 -0
  820. data/spec/support/models/dragon.rb +6 -0
  821. data/spec/support/models/driver.rb +9 -0
  822. data/spec/support/models/drug.rb +8 -0
  823. data/spec/support/models/dungeon.rb +6 -0
  824. data/spec/support/models/edit.rb +7 -0
  825. data/spec/support/models/email.rb +8 -0
  826. data/spec/support/models/employer.rb +7 -0
  827. data/spec/support/models/entry.rb +8 -0
  828. data/spec/support/models/eraser.rb +3 -0
  829. data/spec/support/models/even.rb +9 -0
  830. data/spec/support/models/event.rb +24 -0
  831. data/spec/support/models/exhibition.rb +6 -0
  832. data/spec/support/models/exhibitor.rb +8 -0
  833. data/spec/support/models/explosion.rb +6 -0
  834. data/spec/support/models/eye.rb +11 -0
  835. data/spec/support/models/eye_bowl.rb +11 -0
  836. data/spec/support/models/face.rb +10 -0
  837. data/spec/support/models/favorite.rb +8 -0
  838. data/spec/support/models/filesystem.rb +7 -0
  839. data/spec/support/models/fire_hydrant.rb +8 -0
  840. data/spec/support/models/firefox.rb +6 -0
  841. data/spec/support/models/fish.rb +9 -0
  842. data/spec/support/models/folder.rb +9 -0
  843. data/spec/support/models/folder_item.rb +11 -0
  844. data/spec/support/models/fruits.rb +36 -0
  845. data/spec/support/models/game.rb +21 -0
  846. data/spec/support/models/ghost.rb +9 -0
  847. data/spec/support/models/guitar.rb +4 -0
  848. data/spec/support/models/hole.rb +12 -0
  849. data/spec/support/models/home.rb +6 -0
  850. data/spec/support/models/house.rb +8 -0
  851. data/spec/support/models/html_writer.rb +5 -0
  852. data/spec/support/models/id_key.rb +8 -0
  853. data/spec/support/models/idnodef.rb +7 -0
  854. data/spec/support/models/image.rb +24 -0
  855. data/spec/support/models/implant.rb +18 -0
  856. data/spec/support/models/instrument.rb +8 -0
  857. data/spec/support/models/item.rb +10 -0
  858. data/spec/support/models/jar.rb +9 -0
  859. data/spec/support/models/kaleidoscope.rb +8 -0
  860. data/spec/support/models/kangaroo.rb +6 -0
  861. data/spec/support/models/label.rb +50 -0
  862. data/spec/support/models/language.rb +7 -0
  863. data/spec/support/models/lat_lng.rb +17 -0
  864. data/spec/support/models/league.rb +13 -0
  865. data/spec/support/models/learner.rb +4 -0
  866. data/spec/support/models/line_item.rb +8 -0
  867. data/spec/support/models/location.rb +10 -0
  868. data/spec/support/models/login.rb +10 -0
  869. data/spec/support/models/manufacturer.rb +9 -0
  870. data/spec/support/models/meat.rb +6 -0
  871. data/spec/support/models/membership.rb +6 -0
  872. data/spec/support/models/message.rb +13 -0
  873. data/spec/support/models/minim.rb +6 -0
  874. data/spec/support/models/mixed_drink.rb +6 -0
  875. data/spec/support/models/mop.rb +24 -0
  876. data/spec/support/models/movie.rb +15 -0
  877. data/spec/support/models/my_hash.rb +4 -0
  878. data/spec/support/models/name.rb +26 -0
  879. data/spec/support/models/name_only.rb +8 -0
  880. data/spec/support/models/node.rb +7 -0
  881. data/spec/support/models/note.rb +19 -0
  882. data/spec/support/models/nut.rb +7 -0
  883. data/spec/support/models/odd.rb +9 -0
  884. data/spec/support/models/order.rb +12 -0
  885. data/spec/support/models/ordered_post.rb +13 -0
  886. data/spec/support/models/ordered_preference.rb +8 -0
  887. data/spec/support/models/oscar.rb +16 -0
  888. data/spec/support/models/other_owner_object.rb +4 -0
  889. data/spec/support/models/override.rb +18 -0
  890. data/spec/support/models/ownable.rb +8 -0
  891. data/spec/support/models/owner.rb +10 -0
  892. data/spec/support/models/pack.rb +5 -0
  893. data/spec/support/models/page.rb +18 -0
  894. data/spec/support/models/page_question.rb +6 -0
  895. data/spec/support/models/palette.rb +9 -0
  896. data/spec/support/models/parent.rb +7 -0
  897. data/spec/support/models/parent_doc.rb +8 -0
  898. data/spec/support/models/passport.rb +13 -0
  899. data/spec/support/models/patient.rb +11 -0
  900. data/spec/support/models/pdf_writer.rb +5 -0
  901. data/spec/support/models/pencil.rb +3 -0
  902. data/spec/support/models/person.rb +230 -0
  903. data/spec/support/models/pet.rb +25 -0
  904. data/spec/support/models/pet_owner.rb +8 -0
  905. data/spec/support/models/phone.rb +13 -0
  906. data/spec/support/models/piano.rb +4 -0
  907. data/spec/support/models/pizza.rb +9 -0
  908. data/spec/support/models/player.rb +37 -0
  909. data/spec/support/models/post.rb +52 -0
  910. data/spec/support/models/post_genre.rb +8 -0
  911. data/spec/support/models/powerup.rb +13 -0
  912. data/spec/support/models/preference.rb +11 -0
  913. data/spec/support/models/princess.rb +12 -0
  914. data/spec/support/models/product.rb +19 -0
  915. data/spec/support/models/profile.rb +17 -0
  916. data/spec/support/models/pronunciation.rb +7 -0
  917. data/spec/support/models/pub.rb +8 -0
  918. data/spec/support/models/publication/encyclopedia.rb +11 -0
  919. data/spec/support/models/publication/review.rb +13 -0
  920. data/spec/support/models/publication.rb +4 -0
  921. data/spec/support/models/purchase.rb +6 -0
  922. data/spec/support/models/purchased_item.rb +10 -0
  923. data/spec/support/models/question.rb +10 -0
  924. data/spec/support/models/quiz.rb +9 -0
  925. data/spec/support/models/rating.rb +10 -0
  926. data/spec/support/models/record.rb +54 -0
  927. data/spec/support/models/registry.rb +6 -0
  928. data/spec/support/models/role.rb +9 -0
  929. data/spec/support/models/root_category.rb +6 -0
  930. data/spec/support/models/sandwich.rb +11 -0
  931. data/spec/support/models/scheduler.rb +9 -0
  932. data/spec/support/models/scribe.rb +7 -0
  933. data/spec/support/models/sealer.rb +7 -0
  934. data/spec/support/models/seat.rb +24 -0
  935. data/spec/support/models/seo.rb +9 -0
  936. data/spec/support/models/series.rb +7 -0
  937. data/spec/support/models/server.rb +15 -0
  938. data/spec/support/models/service.rb +24 -0
  939. data/spec/support/models/shape.rb +14 -0
  940. data/spec/support/models/shelf.rb +7 -0
  941. data/spec/support/models/shipment_address.rb +5 -0
  942. data/spec/support/models/shipping_container.rb +7 -0
  943. data/spec/support/models/shipping_pack.rb +5 -0
  944. data/spec/support/models/shirt.rb +11 -0
  945. data/spec/support/models/shop.rb +8 -0
  946. data/spec/support/models/short_agent.rb +6 -0
  947. data/spec/support/models/short_quiz.rb +7 -0
  948. data/spec/support/models/simple.rb +7 -0
  949. data/spec/support/models/slave.rb +8 -0
  950. data/spec/support/models/song.rb +10 -0
  951. data/spec/support/models/sound.rb +7 -0
  952. data/spec/support/models/spacer.rb +7 -0
  953. data/spec/support/models/square.rb +6 -0
  954. data/spec/support/models/staff.rb +9 -0
  955. data/spec/support/models/store_as_dup_test1.rb +7 -0
  956. data/spec/support/models/store_as_dup_test2.rb +7 -0
  957. data/spec/support/models/store_as_dup_test3.rb +7 -0
  958. data/spec/support/models/store_as_dup_test4.rb +7 -0
  959. data/spec/support/models/strategy.rb +5 -0
  960. data/spec/support/models/sub_item.rb +5 -0
  961. data/spec/support/models/subscription.rb +7 -0
  962. data/spec/support/models/survey.rb +7 -0
  963. data/spec/support/models/symptom.rb +8 -0
  964. data/spec/support/models/system_role.rb +7 -0
  965. data/spec/support/models/tag.rb +10 -0
  966. data/spec/support/models/target.rb +7 -0
  967. data/spec/support/models/template.rb +7 -0
  968. data/spec/support/models/thing.rb +11 -0
  969. data/spec/support/models/threadlocker.rb +7 -0
  970. data/spec/support/models/title.rb +5 -0
  971. data/spec/support/models/tool.rb +10 -0
  972. data/spec/support/models/topping.rb +7 -0
  973. data/spec/support/models/toy.rb +9 -0
  974. data/spec/support/models/track.rb +40 -0
  975. data/spec/support/models/translation.rb +7 -0
  976. data/spec/support/models/tree.rb +11 -0
  977. data/spec/support/models/truck.rb +7 -0
  978. data/spec/support/models/updatable.rb +7 -0
  979. data/spec/support/models/user.rb +23 -0
  980. data/spec/support/models/user_account.rb +12 -0
  981. data/spec/support/models/validation_callback.rb +12 -0
  982. data/spec/support/models/vehicle.rb +18 -0
  983. data/spec/support/models/version.rb +7 -0
  984. data/spec/support/models/vertex.rb +8 -0
  985. data/spec/support/models/vet_visit.rb +7 -0
  986. data/spec/support/models/video.rb +15 -0
  987. data/spec/support/models/video_game.rb +3 -0
  988. data/spec/support/models/washer.rb +7 -0
  989. data/spec/support/models/weapon.rb +13 -0
  990. data/spec/support/models/wiki_page.rb +17 -0
  991. data/spec/support/models/word.rb +17 -0
  992. data/spec/support/models/word_origin.rb +13 -0
  993. data/spec/support/models/writer.rb +13 -0
  994. data/spec/support/shared/time.rb +53 -0
  995. data/spec/support/spec_config.rb +60 -0
  996. data.tar.gz.sig +0 -0
  997. metadata +1347 -813
  998. metadata.gz.sig +0 -0
  999. data/lib/mongoid/clients/thread_options.rb +0 -19
  1000. data/lib/mongoid/extensions/origin/regexp_raw.rb +0 -43
  1001. data/lib/mongoid/matchable/all.rb +0 -27
  1002. data/lib/mongoid/matchable/and.rb +0 -30
  1003. data/lib/mongoid/matchable/default.rb +0 -72
  1004. data/lib/mongoid/matchable/exists.rb +0 -23
  1005. data/lib/mongoid/matchable/gt.rb +0 -21
  1006. data/lib/mongoid/matchable/gte.rb +0 -21
  1007. data/lib/mongoid/matchable/in.rb +0 -24
  1008. data/lib/mongoid/matchable/lt.rb +0 -21
  1009. data/lib/mongoid/matchable/lte.rb +0 -21
  1010. data/lib/mongoid/matchable/ne.rb +0 -21
  1011. data/lib/mongoid/matchable/nin.rb +0 -22
  1012. data/lib/mongoid/matchable/or.rb +0 -33
  1013. data/lib/mongoid/matchable/regexp.rb +0 -27
  1014. data/lib/mongoid/matchable/size.rb +0 -21
  1015. data/lib/mongoid/railties/document.rb +0 -12
  1016. data/lib/mongoid/relations/accessors.rb +0 -264
  1017. data/lib/mongoid/relations/auto_save.rb +0 -86
  1018. data/lib/mongoid/relations/binding.rb +0 -218
  1019. data/lib/mongoid/relations/bindings/embedded/in.rb +0 -59
  1020. data/lib/mongoid/relations/bindings/embedded/many.rb +0 -43
  1021. data/lib/mongoid/relations/bindings/embedded/one.rb +0 -45
  1022. data/lib/mongoid/relations/bindings/referenced/in.rb +0 -65
  1023. data/lib/mongoid/relations/bindings/referenced/many.rb +0 -38
  1024. data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +0 -70
  1025. data/lib/mongoid/relations/bindings/referenced/one.rb +0 -44
  1026. data/lib/mongoid/relations/bindings.rb +0 -9
  1027. data/lib/mongoid/relations/builder.rb +0 -57
  1028. data/lib/mongoid/relations/builders/embedded/in.rb +0 -29
  1029. data/lib/mongoid/relations/builders/embedded/many.rb +0 -36
  1030. data/lib/mongoid/relations/builders/embedded/one.rb +0 -30
  1031. data/lib/mongoid/relations/builders/nested_attributes/many.rb +0 -199
  1032. data/lib/mongoid/relations/builders/nested_attributes/one.rb +0 -126
  1033. data/lib/mongoid/relations/builders/referenced/in.rb +0 -26
  1034. data/lib/mongoid/relations/builders/referenced/many.rb +0 -26
  1035. data/lib/mongoid/relations/builders/referenced/many_to_many.rb +0 -39
  1036. data/lib/mongoid/relations/builders/referenced/one.rb +0 -26
  1037. data/lib/mongoid/relations/builders.rb +0 -106
  1038. data/lib/mongoid/relations/cascading/delete.rb +0 -44
  1039. data/lib/mongoid/relations/cascading/destroy.rb +0 -43
  1040. data/lib/mongoid/relations/cascading/nullify.rb +0 -35
  1041. data/lib/mongoid/relations/cascading/restrict.rb +0 -39
  1042. data/lib/mongoid/relations/cascading.rb +0 -56
  1043. data/lib/mongoid/relations/constraint.rb +0 -55
  1044. data/lib/mongoid/relations/conversions.rb +0 -34
  1045. data/lib/mongoid/relations/counter_cache.rb +0 -150
  1046. data/lib/mongoid/relations/cyclic.rb +0 -107
  1047. data/lib/mongoid/relations/eager/base.rb +0 -153
  1048. data/lib/mongoid/relations/eager/belongs_to.rb +0 -31
  1049. data/lib/mongoid/relations/eager/has_and_belongs_to_many.rb +0 -47
  1050. data/lib/mongoid/relations/eager/has_many.rb +0 -38
  1051. data/lib/mongoid/relations/eager/has_one.rb +0 -30
  1052. data/lib/mongoid/relations/eager.rb +0 -41
  1053. data/lib/mongoid/relations/embedded/batchable.rb +0 -382
  1054. data/lib/mongoid/relations/embedded/in.rb +0 -229
  1055. data/lib/mongoid/relations/embedded/many.rb +0 -642
  1056. data/lib/mongoid/relations/embedded/one.rb +0 -222
  1057. data/lib/mongoid/relations/macros.rb +0 -359
  1058. data/lib/mongoid/relations/many.rb +0 -238
  1059. data/lib/mongoid/relations/marshalable.rb +0 -32
  1060. data/lib/mongoid/relations/metadata.rb +0 -1179
  1061. data/lib/mongoid/relations/nested_builder.rb +0 -74
  1062. data/lib/mongoid/relations/one.rb +0 -60
  1063. data/lib/mongoid/relations/options.rb +0 -49
  1064. data/lib/mongoid/relations/polymorphic.rb +0 -39
  1065. data/lib/mongoid/relations/proxy.rb +0 -245
  1066. data/lib/mongoid/relations/referenced/in.rb +0 -295
  1067. data/lib/mongoid/relations/referenced/many.rb +0 -808
  1068. data/lib/mongoid/relations/referenced/many_to_many.rb +0 -472
  1069. data/lib/mongoid/relations/referenced/one.rb +0 -276
  1070. data/lib/mongoid/relations/reflections.rb +0 -64
  1071. data/lib/mongoid/relations/synchronization.rb +0 -169
  1072. data/lib/mongoid/relations/targets/enumerable.rb +0 -473
  1073. data/lib/mongoid/relations/targets.rb +0 -2
  1074. data/lib/mongoid/relations/touchable.rb +0 -94
  1075. data/lib/mongoid/relations.rb +0 -148
  1076. data/lib/support/ruby_version.rb +0 -26
  1077. data/spec/app/models/account.rb +0 -36
  1078. data/spec/app/models/acolyte.rb +0 -17
  1079. data/spec/app/models/actor.rb +0 -18
  1080. data/spec/app/models/actress.rb +0 -2
  1081. data/spec/app/models/address.rb +0 -79
  1082. data/spec/app/models/address_component.rb +0 -5
  1083. data/spec/app/models/address_number.rb +0 -6
  1084. data/spec/app/models/agency.rb +0 -5
  1085. data/spec/app/models/agent.rb +0 -14
  1086. data/spec/app/models/album.rb +0 -14
  1087. data/spec/app/models/alert.rb +0 -7
  1088. data/spec/app/models/animal.rb +0 -25
  1089. data/spec/app/models/answer.rb +0 -6
  1090. data/spec/app/models/appointment.rb +0 -7
  1091. data/spec/app/models/article.rb +0 -12
  1092. data/spec/app/models/artist.rb +0 -66
  1093. data/spec/app/models/artwork.rb +0 -4
  1094. data/spec/app/models/audio.rb +0 -5
  1095. data/spec/app/models/augmentation.rb +0 -11
  1096. data/spec/app/models/author.rb +0 -6
  1097. data/spec/app/models/baby.rb +0 -4
  1098. data/spec/app/models/band.rb +0 -28
  1099. data/spec/app/models/bar.rb +0 -10
  1100. data/spec/app/models/basic.rb +0 -6
  1101. data/spec/app/models/bed.rb +0 -1
  1102. data/spec/app/models/big_palette.rb +0 -2
  1103. data/spec/app/models/birthday.rb +0 -13
  1104. data/spec/app/models/bomb.rb +0 -4
  1105. data/spec/app/models/book.rb +0 -15
  1106. data/spec/app/models/breed.rb +0 -4
  1107. data/spec/app/models/browser.rb +0 -6
  1108. data/spec/app/models/building.rb +0 -6
  1109. data/spec/app/models/building_address.rb +0 -7
  1110. data/spec/app/models/bus.rb +0 -7
  1111. data/spec/app/models/business.rb +0 -5
  1112. data/spec/app/models/callback_test.rb +0 -9
  1113. data/spec/app/models/canvas.rb +0 -25
  1114. data/spec/app/models/car.rb +0 -1
  1115. data/spec/app/models/cat.rb +0 -8
  1116. data/spec/app/models/category.rb +0 -8
  1117. data/spec/app/models/child.rb +0 -4
  1118. data/spec/app/models/child_doc.rb +0 -22
  1119. data/spec/app/models/church.rb +0 -6
  1120. data/spec/app/models/circle.rb +0 -3
  1121. data/spec/app/models/circuit.rb +0 -4
  1122. data/spec/app/models/circus.rb +0 -7
  1123. data/spec/app/models/code.rb +0 -11
  1124. data/spec/app/models/comment.rb +0 -16
  1125. data/spec/app/models/company.rb +0 -5
  1126. data/spec/app/models/consumption_period.rb +0 -7
  1127. data/spec/app/models/contextable_item.rb +0 -5
  1128. data/spec/app/models/contractor.rb +0 -5
  1129. data/spec/app/models/cookie.rb +0 -6
  1130. data/spec/app/models/country_code.rb +0 -8
  1131. data/spec/app/models/courier_job.rb +0 -4
  1132. data/spec/app/models/definition.rb +0 -9
  1133. data/spec/app/models/description.rb +0 -11
  1134. data/spec/app/models/dictionary.rb +0 -10
  1135. data/spec/app/models/division.rb +0 -10
  1136. data/spec/app/models/doctor.rb +0 -12
  1137. data/spec/app/models/dog.rb +0 -7
  1138. data/spec/app/models/dokument.rb +0 -5
  1139. data/spec/app/models/draft.rb +0 -9
  1140. data/spec/app/models/dragon.rb +0 -4
  1141. data/spec/app/models/driver.rb +0 -7
  1142. data/spec/app/models/drug.rb +0 -6
  1143. data/spec/app/models/dungeon.rb +0 -4
  1144. data/spec/app/models/edit.rb +0 -5
  1145. data/spec/app/models/email.rb +0 -6
  1146. data/spec/app/models/employer.rb +0 -5
  1147. data/spec/app/models/entry.rb +0 -6
  1148. data/spec/app/models/eraser.rb +0 -1
  1149. data/spec/app/models/even.rb +0 -7
  1150. data/spec/app/models/event.rb +0 -22
  1151. data/spec/app/models/exhibition.rb +0 -4
  1152. data/spec/app/models/exhibitor.rb +0 -6
  1153. data/spec/app/models/explosion.rb +0 -4
  1154. data/spec/app/models/eye.rb +0 -9
  1155. data/spec/app/models/eye_bowl.rb +0 -9
  1156. data/spec/app/models/face.rb +0 -8
  1157. data/spec/app/models/favorite.rb +0 -6
  1158. data/spec/app/models/filesystem.rb +0 -5
  1159. data/spec/app/models/fire_hydrant.rb +0 -6
  1160. data/spec/app/models/firefox.rb +0 -4
  1161. data/spec/app/models/fish.rb +0 -7
  1162. data/spec/app/models/folder.rb +0 -7
  1163. data/spec/app/models/folder_item.rb +0 -9
  1164. data/spec/app/models/fruits.rb +0 -34
  1165. data/spec/app/models/game.rb +0 -19
  1166. data/spec/app/models/ghost.rb +0 -7
  1167. data/spec/app/models/home.rb +0 -4
  1168. data/spec/app/models/house.rb +0 -6
  1169. data/spec/app/models/html_writer.rb +0 -3
  1170. data/spec/app/models/id_key.rb +0 -6
  1171. data/spec/app/models/image.rb +0 -22
  1172. data/spec/app/models/implant.rb +0 -16
  1173. data/spec/app/models/item.rb +0 -8
  1174. data/spec/app/models/jar.rb +0 -7
  1175. data/spec/app/models/kaleidoscope.rb +0 -6
  1176. data/spec/app/models/kangaroo.rb +0 -4
  1177. data/spec/app/models/label.rb +0 -47
  1178. data/spec/app/models/language.rb +0 -5
  1179. data/spec/app/models/lat_lng.rb +0 -15
  1180. data/spec/app/models/league.rb +0 -11
  1181. data/spec/app/models/learner.rb +0 -2
  1182. data/spec/app/models/line_item.rb +0 -6
  1183. data/spec/app/models/location.rb +0 -8
  1184. data/spec/app/models/login.rb +0 -8
  1185. data/spec/app/models/manufacturer.rb +0 -7
  1186. data/spec/app/models/meat.rb +0 -4
  1187. data/spec/app/models/membership.rb +0 -4
  1188. data/spec/app/models/message.rb +0 -11
  1189. data/spec/app/models/mixed_drink.rb +0 -4
  1190. data/spec/app/models/movie.rb +0 -13
  1191. data/spec/app/models/my_hash.rb +0 -2
  1192. data/spec/app/models/name.rb +0 -24
  1193. data/spec/app/models/node.rb +0 -5
  1194. data/spec/app/models/note.rb +0 -17
  1195. data/spec/app/models/odd.rb +0 -7
  1196. data/spec/app/models/ordered_post.rb +0 -6
  1197. data/spec/app/models/ordered_preference.rb +0 -6
  1198. data/spec/app/models/oscar.rb +0 -15
  1199. data/spec/app/models/override.rb +0 -16
  1200. data/spec/app/models/ownable.rb +0 -6
  1201. data/spec/app/models/owner.rb +0 -6
  1202. data/spec/app/models/pack.rb +0 -3
  1203. data/spec/app/models/page.rb +0 -16
  1204. data/spec/app/models/page_question.rb +0 -4
  1205. data/spec/app/models/palette.rb +0 -7
  1206. data/spec/app/models/parent.rb +0 -5
  1207. data/spec/app/models/parent_doc.rb +0 -6
  1208. data/spec/app/models/passport.rb +0 -5
  1209. data/spec/app/models/patient.rb +0 -9
  1210. data/spec/app/models/pdf_writer.rb +0 -3
  1211. data/spec/app/models/pencil.rb +0 -1
  1212. data/spec/app/models/person.rb +0 -207
  1213. data/spec/app/models/pet.rb +0 -23
  1214. data/spec/app/models/pet_owner.rb +0 -6
  1215. data/spec/app/models/phone.rb +0 -9
  1216. data/spec/app/models/pizza.rb +0 -7
  1217. data/spec/app/models/player.rb +0 -35
  1218. data/spec/app/models/post.rb +0 -50
  1219. data/spec/app/models/post_genre.rb +0 -6
  1220. data/spec/app/models/powerup.rb +0 -11
  1221. data/spec/app/models/preference.rb +0 -9
  1222. data/spec/app/models/princess.rb +0 -8
  1223. data/spec/app/models/product.rb +0 -17
  1224. data/spec/app/models/profile.rb +0 -5
  1225. data/spec/app/models/pronunciation.rb +0 -5
  1226. data/spec/app/models/pub.rb +0 -6
  1227. data/spec/app/models/purchase.rb +0 -4
  1228. data/spec/app/models/question.rb +0 -8
  1229. data/spec/app/models/quiz.rb +0 -7
  1230. data/spec/app/models/rating.rb +0 -8
  1231. data/spec/app/models/record.rb +0 -51
  1232. data/spec/app/models/registry.rb +0 -4
  1233. data/spec/app/models/role.rb +0 -7
  1234. data/spec/app/models/root_category.rb +0 -4
  1235. data/spec/app/models/sandwich.rb +0 -9
  1236. data/spec/app/models/scheduler.rb +0 -7
  1237. data/spec/app/models/seo.rb +0 -7
  1238. data/spec/app/models/series.rb +0 -4
  1239. data/spec/app/models/server.rb +0 -13
  1240. data/spec/app/models/service.rb +0 -22
  1241. data/spec/app/models/shape.rb +0 -12
  1242. data/spec/app/models/shelf.rb +0 -5
  1243. data/spec/app/models/shipment_address.rb +0 -2
  1244. data/spec/app/models/shipping_container.rb +0 -5
  1245. data/spec/app/models/shipping_pack.rb +0 -3
  1246. data/spec/app/models/shop.rb +0 -6
  1247. data/spec/app/models/short_agent.rb +0 -4
  1248. data/spec/app/models/short_quiz.rb +0 -5
  1249. data/spec/app/models/simple.rb +0 -5
  1250. data/spec/app/models/slave.rb +0 -6
  1251. data/spec/app/models/song.rb +0 -8
  1252. data/spec/app/models/sound.rb +0 -5
  1253. data/spec/app/models/square.rb +0 -4
  1254. data/spec/app/models/staff.rb +0 -7
  1255. data/spec/app/models/store_as_dup_test1.rb +0 -5
  1256. data/spec/app/models/store_as_dup_test2.rb +0 -5
  1257. data/spec/app/models/strategy.rb +0 -3
  1258. data/spec/app/models/sub_item.rb +0 -3
  1259. data/spec/app/models/subscription.rb +0 -4
  1260. data/spec/app/models/survey.rb +0 -5
  1261. data/spec/app/models/symptom.rb +0 -6
  1262. data/spec/app/models/tag.rb +0 -8
  1263. data/spec/app/models/target.rb +0 -5
  1264. data/spec/app/models/template.rb +0 -5
  1265. data/spec/app/models/thing.rb +0 -9
  1266. data/spec/app/models/title.rb +0 -3
  1267. data/spec/app/models/tool.rb +0 -8
  1268. data/spec/app/models/topping.rb +0 -5
  1269. data/spec/app/models/track.rb +0 -38
  1270. data/spec/app/models/translation.rb +0 -5
  1271. data/spec/app/models/tree.rb +0 -9
  1272. data/spec/app/models/truck.rb +0 -3
  1273. data/spec/app/models/user.rb +0 -21
  1274. data/spec/app/models/user_account.rb +0 -10
  1275. data/spec/app/models/validation_callback.rb +0 -10
  1276. data/spec/app/models/vehicle.rb +0 -11
  1277. data/spec/app/models/version.rb +0 -5
  1278. data/spec/app/models/vet_visit.rb +0 -5
  1279. data/spec/app/models/video.rb +0 -13
  1280. data/spec/app/models/video_game.rb +0 -1
  1281. data/spec/app/models/weapon.rb +0 -11
  1282. data/spec/app/models/wiki_page.rb +0 -14
  1283. data/spec/app/models/word.rb +0 -15
  1284. data/spec/app/models/word_origin.rb +0 -11
  1285. data/spec/app/models/writer.rb +0 -11
  1286. data/spec/mongoid/extensions/origin/regexp_raw_spec.rb +0 -89
  1287. data/spec/mongoid/fields/internal/foreign_keys/array_spec.rb +0 -184
  1288. data/spec/mongoid/fields/internal/foreign_keys/object_spec.rb +0 -201
  1289. data/spec/mongoid/matchable/all_spec.rb +0 -31
  1290. data/spec/mongoid/matchable/and_spec.rb +0 -187
  1291. data/spec/mongoid/matchable/default_spec.rb +0 -130
  1292. data/spec/mongoid/matchable/exists_spec.rb +0 -57
  1293. data/spec/mongoid/matchable/gt_spec.rb +0 -75
  1294. data/spec/mongoid/matchable/gte_spec.rb +0 -74
  1295. data/spec/mongoid/matchable/in_spec.rb +0 -49
  1296. data/spec/mongoid/matchable/lt_spec.rb +0 -74
  1297. data/spec/mongoid/matchable/lte_spec.rb +0 -74
  1298. data/spec/mongoid/matchable/ne_spec.rb +0 -46
  1299. data/spec/mongoid/matchable/nin_spec.rb +0 -48
  1300. data/spec/mongoid/matchable/or_spec.rb +0 -131
  1301. data/spec/mongoid/matchable/regexp_spec.rb +0 -59
  1302. data/spec/mongoid/matchable/size_spec.rb +0 -25
  1303. data/spec/mongoid/matchable_spec.rb +0 -708
  1304. data/spec/mongoid/railties/document_spec.rb +0 -24
  1305. data/spec/mongoid/relations/accessors_spec.rb +0 -821
  1306. data/spec/mongoid/relations/auto_save_spec.rb +0 -281
  1307. data/spec/mongoid/relations/bindings/embedded/in_spec.rb +0 -171
  1308. data/spec/mongoid/relations/bindings/embedded/many_spec.rb +0 -54
  1309. data/spec/mongoid/relations/bindings/embedded/one_spec.rb +0 -77
  1310. data/spec/mongoid/relations/bindings/referenced/in_spec.rb +0 -241
  1311. data/spec/mongoid/relations/bindings/referenced/many_spec.rb +0 -153
  1312. data/spec/mongoid/relations/bindings/referenced/many_to_many_spec.rb +0 -178
  1313. data/spec/mongoid/relations/bindings/referenced/one_spec.rb +0 -131
  1314. data/spec/mongoid/relations/builders/embedded/in_spec.rb +0 -34
  1315. data/spec/mongoid/relations/builders/embedded/many_spec.rb +0 -132
  1316. data/spec/mongoid/relations/builders/embedded/one_spec.rb +0 -99
  1317. data/spec/mongoid/relations/builders/nested_attributes/many_spec.rb +0 -233
  1318. data/spec/mongoid/relations/builders/nested_attributes/one_spec.rb +0 -250
  1319. data/spec/mongoid/relations/builders/referenced/in_spec.rb +0 -230
  1320. data/spec/mongoid/relations/builders/referenced/many_spec.rb +0 -137
  1321. data/spec/mongoid/relations/builders/referenced/many_to_many_spec.rb +0 -178
  1322. data/spec/mongoid/relations/builders/referenced/one_spec.rb +0 -111
  1323. data/spec/mongoid/relations/builders_spec.rb +0 -226
  1324. data/spec/mongoid/relations/cascading/delete_spec.rb +0 -101
  1325. data/spec/mongoid/relations/cascading/destroy_spec.rb +0 -47
  1326. data/spec/mongoid/relations/cascading/nullify_spec.rb +0 -32
  1327. data/spec/mongoid/relations/cascading/restrict_spec.rb +0 -68
  1328. data/spec/mongoid/relations/cascading_spec.rb +0 -355
  1329. data/spec/mongoid/relations/constraint_spec.rb +0 -75
  1330. data/spec/mongoid/relations/conversions_spec.rb +0 -128
  1331. data/spec/mongoid/relations/counter_cache_spec.rb +0 -389
  1332. data/spec/mongoid/relations/cyclic_spec.rb +0 -178
  1333. data/spec/mongoid/relations/eager/belongs_to_spec.rb +0 -163
  1334. data/spec/mongoid/relations/eager/has_and_belongs_to_many_spec.rb +0 -117
  1335. data/spec/mongoid/relations/eager/has_many_spec.rb +0 -244
  1336. data/spec/mongoid/relations/eager/has_one_spec.rb +0 -163
  1337. data/spec/mongoid/relations/eager_spec.rb +0 -239
  1338. data/spec/mongoid/relations/embedded/dirty_spec.rb +0 -65
  1339. data/spec/mongoid/relations/embedded/in_spec.rb +0 -579
  1340. data/spec/mongoid/relations/embedded/many_spec.rb +0 -4166
  1341. data/spec/mongoid/relations/embedded/one_spec.rb +0 -1067
  1342. data/spec/mongoid/relations/macros_spec.rb +0 -631
  1343. data/spec/mongoid/relations/metadata_spec.rb +0 -1971
  1344. data/spec/mongoid/relations/options_spec.rb +0 -35
  1345. data/spec/mongoid/relations/polymorphic_spec.rb +0 -128
  1346. data/spec/mongoid/relations/referenced/in_spec.rb +0 -1326
  1347. data/spec/mongoid/relations/referenced/many_spec.rb +0 -3806
  1348. data/spec/mongoid/relations/referenced/many_to_many_spec.rb +0 -3589
  1349. data/spec/mongoid/relations/referenced/one_spec.rb +0 -1240
  1350. data/spec/mongoid/relations/reflections_spec.rb +0 -101
  1351. data/spec/mongoid/relations/synchronization_spec.rb +0 -449
  1352. data/spec/mongoid/relations/targets/enumerable_spec.rb +0 -1717
  1353. data/spec/mongoid/relations/touchable_spec.rb +0 -362
  1354. data/spec/mongoid/relations_spec.rb +0 -189
@@ -1,3589 +0,0 @@
1
- require "spec_helper"
2
-
3
- describe Mongoid::Relations::Referenced::ManyToMany do
4
-
5
- before(:all) do
6
- Mongoid.raise_not_found_error = true
7
- Person.autosave(Person.relations["preferences"].merge!(autosave: true))
8
- Person.synced(Person.relations["preferences"])
9
- end
10
-
11
- after(:all) do
12
- Person.reset_callbacks(:save)
13
- Person.reset_callbacks(:destroy)
14
- end
15
-
16
- [ :<<, :push ].each do |method|
17
-
18
- describe "##{method}" do
19
-
20
- context "when the inverse_of is nil" do
21
-
22
- let!(:article) do
23
- Article.create
24
- end
25
-
26
- context "when the child document is new" do
27
-
28
- let(:preference) do
29
- Preference.new
30
- end
31
-
32
- before do
33
- article.preferences.send(method, preference)
34
- end
35
-
36
- it "persists the child document" do
37
- expect(preference).to be_persisted
38
- end
39
- end
40
-
41
- context "when the child document is not new" do
42
-
43
- let(:preference) do
44
- Preference.create
45
- end
46
-
47
- it "does not persist the child document" do
48
- expect(preference).to receive(:save).never
49
- article.preferences.send(method, preference)
50
- end
51
- end
52
- end
53
-
54
- context "when the parent is a new record" do
55
-
56
- let(:person) do
57
- Person.new
58
- end
59
-
60
- let!(:preference) do
61
- Preference.new
62
- end
63
-
64
- let(:result) do
65
- person.preferences.send(method, preference)
66
- end
67
-
68
- it "returns an array of loaded documents" do
69
- expect(result).to eq([ preference ])
70
- end
71
- end
72
-
73
- context "when the parent is not a new record" do
74
-
75
- let(:person) do
76
- Person.create
77
- end
78
-
79
- let!(:preference) do
80
- Preference.new
81
- end
82
-
83
- let(:result) do
84
- person.preferences.send(method, preference)
85
- end
86
-
87
- it "returns an array of loaded documents" do
88
- expect(result).to eq([ preference ])
89
- end
90
- end
91
-
92
- context "when the relations are not polymorphic" do
93
-
94
- context "when the inverse relation is not defined" do
95
-
96
- let(:person) do
97
- Person.new
98
- end
99
-
100
- let(:house) do
101
- House.new
102
- end
103
-
104
- before do
105
- person.houses << house
106
- end
107
-
108
- it "appends the document to the relation" do
109
- expect(person.houses).to eq([ house ])
110
- end
111
-
112
- it "sets the foreign key on the relation" do
113
- expect(person.house_ids).to eq([ house.id ])
114
- end
115
- end
116
-
117
- context "when appending in a parent create block" do
118
-
119
- let!(:preference) do
120
- Preference.create(name: "testing")
121
- end
122
-
123
- let!(:person) do
124
- Person.create do |doc|
125
- doc.preferences << preference
126
- end
127
- end
128
-
129
- it "adds the documents to the relation" do
130
- expect(person.preferences).to eq([ preference ])
131
- end
132
-
133
- it "sets the foreign key on the relation" do
134
- expect(person.preference_ids).to eq([ preference.id ])
135
- end
136
-
137
- it "sets the foreign key on the inverse relation" do
138
- expect(preference.person_ids).to eq([ person.id ])
139
- end
140
-
141
- it "saves the target" do
142
- expect(preference).to be_persisted
143
- end
144
-
145
- it "adds the correct number of documents" do
146
- expect(person.preferences.size).to eq(1)
147
- end
148
-
149
- it "persists the link" do
150
- expect(person.reload.preferences).to eq([ preference ])
151
- end
152
- end
153
-
154
- context "when the parent is a new record" do
155
-
156
- let(:person) do
157
- Person.new
158
- end
159
-
160
- context "when the child is new" do
161
-
162
- let(:preference) do
163
- Preference.new
164
- end
165
-
166
- before do
167
- person.preferences.send(method, preference)
168
- end
169
-
170
- it "adds the documents to the relation" do
171
- expect(person.preferences).to eq([ preference ])
172
- end
173
-
174
- it "sets the foreign key on the relation" do
175
- expect(person.preference_ids).to eq([ preference.id ])
176
- end
177
-
178
- it "sets the foreign key on the inverse relation" do
179
- expect(preference.person_ids).to eq([ person.id ])
180
- end
181
-
182
- it "does not save the target" do
183
- expect(preference).to be_new_record
184
- end
185
-
186
- it "adds the correct number of documents" do
187
- expect(person.preferences.size).to eq(1)
188
- end
189
-
190
- context "when appending a second time" do
191
-
192
- before do
193
- person.preferences.send(method, preference)
194
- end
195
-
196
- it "does not allow the document to be added again" do
197
- expect(person.preferences).to eq([ preference ])
198
- end
199
-
200
- it "does not allow duplicate ids" do
201
- expect(person.preference_ids).to eq([ preference.id ])
202
- end
203
- end
204
- end
205
-
206
- context "when the child is already persisted" do
207
-
208
- let!(:persisted) do
209
- Preference.create(name: "testy")
210
- end
211
-
212
- let(:preference) do
213
- Preference.first
214
- end
215
-
216
- before do
217
- person.preferences.send(method, preference)
218
- person.save
219
- end
220
-
221
- it "adds the documents to the relation" do
222
- expect(person.preferences).to eq([ preference ])
223
- end
224
-
225
- it "sets the foreign key on the relation" do
226
- expect(person.preference_ids).to eq([ preference.id ])
227
- end
228
-
229
- it "sets the foreign key on the inverse relation" do
230
- expect(preference.person_ids).to eq([ person.id ])
231
- end
232
-
233
- it "saves the target" do
234
- expect(preference).to be_persisted
235
- end
236
-
237
- it "adds the correct number of documents" do
238
- expect(person.preferences.size).to eq(1)
239
- end
240
-
241
- it "persists the link" do
242
- expect(person.reload.preferences).to eq([ preference ])
243
- end
244
- end
245
-
246
- context "when setting via the associated ids" do
247
-
248
- let!(:persisted) do
249
- Preference.create(name: "testy")
250
- end
251
-
252
- let(:preference) do
253
- Preference.first
254
- end
255
-
256
- let(:person) do
257
- Person.new(preference_ids: [ preference.id ])
258
- end
259
-
260
- before do
261
- person.save
262
- end
263
-
264
- it "adds the documents to the relation" do
265
- expect(person.preferences).to eq([ preference ])
266
- end
267
-
268
- it "sets the foreign key on the relation" do
269
- expect(person.preference_ids).to eq([ preference.id ])
270
- end
271
-
272
- it "sets the foreign key on the inverse relation" do
273
- expect(preference.reload.person_ids).to eq([ person.id ])
274
- end
275
-
276
- it "adds the correct number of documents" do
277
- expect(person.preferences.size).to eq(1)
278
- end
279
-
280
- it "persists the link" do
281
- expect(person.reload.preferences).to eq([ preference ])
282
- end
283
- end
284
- end
285
-
286
- context "when the parent is not a new record" do
287
-
288
- let(:person) do
289
- Person.create
290
- end
291
-
292
- let(:preference) do
293
- Preference.new
294
- end
295
-
296
- before do
297
- person.preferences.send(method, preference)
298
- end
299
-
300
- it "adds the documents to the relation" do
301
- expect(person.preferences).to eq([ preference ])
302
- end
303
-
304
- it "sets the foreign key on the relation" do
305
- expect(person.preference_ids).to eq([ preference.id ])
306
- end
307
-
308
- it "sets the foreign key on the inverse relation" do
309
- expect(preference.person_ids).to eq([ person.id ])
310
- end
311
-
312
- it "sets the base on the inverse relation" do
313
- expect(preference.people).to eq([ person ])
314
- end
315
-
316
- it "sets the same instance on the inverse relation" do
317
- expect(preference.people.first).to eql(person)
318
- end
319
-
320
- it "saves the target" do
321
- expect(preference).to_not be_new_record
322
- end
323
-
324
- it "adds the document to the target" do
325
- expect(person.preferences.count).to eq(1)
326
- end
327
-
328
- context "when documents already exist on the relation" do
329
-
330
- let(:preference_two) do
331
- Preference.new
332
- end
333
-
334
- before do
335
- person.preferences.send(method, preference_two)
336
- end
337
-
338
- it "adds the documents to the relation" do
339
- expect(person.preferences).to eq([ preference, preference_two ])
340
- end
341
-
342
- it "sets the foreign key on the relation" do
343
- expect(person.preference_ids).to eq([ preference.id, preference_two.id ])
344
- end
345
-
346
- it "sets the foreign key on the inverse relation" do
347
- expect(preference_two.person_ids).to eq([ person.id ])
348
- end
349
-
350
- it "sets the base on the inverse relation" do
351
- expect(preference_two.people).to eq([ person ])
352
- end
353
-
354
- it "sets the same instance on the inverse relation" do
355
- expect(preference_two.people.first).to eql(person)
356
- end
357
-
358
- it "saves the target" do
359
- expect(preference).to_not be_new_record
360
- end
361
-
362
- it "adds the document to the target" do
363
- expect(person.preferences.count).to eq(2)
364
- end
365
- end
366
- end
367
-
368
- context "when both sides have been persisted" do
369
-
370
- let(:person) do
371
- Person.create
372
- end
373
-
374
- let(:event) do
375
- Event.create
376
- end
377
-
378
- before do
379
- person.administrated_events << event
380
- end
381
-
382
- it "sets the front side of the relation" do
383
- expect(person.administrated_events).to eq([ event ])
384
- end
385
-
386
- it "sets the inverse side of the relation" do
387
- expect(event.administrators(true)).to eq([ person ])
388
- end
389
-
390
- context "when reloading" do
391
-
392
- it "sets the front side of the relation" do
393
- expect(person.reload.administrated_events).to eq([ event ])
394
- end
395
-
396
- it "sets the inverse side of the relation" do
397
- expect(event.reload.administrators).to eq([ person ])
398
- end
399
- end
400
-
401
- context "when performing a new database query" do
402
-
403
- let(:loaded_person) do
404
- Person.find(person.id)
405
- end
406
-
407
- let(:loaded_event) do
408
- Event.find(event.id)
409
- end
410
-
411
- it "sets the front side of the relation" do
412
- expect(loaded_person.administrated_events).to eq([ event ])
413
- end
414
-
415
- it "sets the inverse side of the relation" do
416
- expect(loaded_event.administrators).to eq([ person ])
417
- end
418
- end
419
- end
420
-
421
- context "when the relation also includes a has_many relation" do
422
-
423
- let(:artwork) do
424
- Artwork.create
425
- end
426
-
427
- let(:exhibition) do
428
- Exhibition.create
429
- end
430
-
431
- let(:exhibitor) do
432
- Exhibitor.create(exhibition: exhibition)
433
- end
434
-
435
- before do
436
- artwork.exhibitors << exhibitor
437
- end
438
-
439
- it "creates a single artwork object" do
440
- expect(Artwork.count).to eq(1)
441
- end
442
- end
443
-
444
- context "when the relation is self referencing" do
445
-
446
- let(:tag_one) do
447
- Tag.create(text: "one")
448
- end
449
-
450
- let(:tag_two) do
451
- Tag.create(text: "two")
452
- end
453
-
454
- before do
455
- tag_one.related << tag_two
456
- end
457
-
458
- it "sets the front side of the relation" do
459
- expect(tag_one.related).to eq([ tag_two ])
460
- end
461
-
462
- it "sets the inverse side of the relation" do
463
- expect(tag_two.related(true)).to eq([ tag_one ])
464
- end
465
-
466
- context "when reloading" do
467
-
468
- it "sets the front side of the relation" do
469
- expect(tag_one.reload.related).to eq([ tag_two ])
470
- end
471
-
472
- it "sets the inverse side of the relation" do
473
- expect(tag_two.reload.related).to eq([ tag_one ])
474
- end
475
- end
476
-
477
- context "when performing a new database query" do
478
-
479
- let(:loaded_tag_one) do
480
- Tag.find(tag_one.id)
481
- end
482
-
483
- let(:loaded_tag_two) do
484
- Tag.find(tag_two.id)
485
- end
486
-
487
- it "sets the front side of the relation" do
488
- expect(loaded_tag_one.related).to eq([ tag_two ])
489
- end
490
-
491
- it "sets the inverse side of the relation" do
492
- expect(loaded_tag_two.related).to eq([ tag_one ])
493
- end
494
- end
495
- end
496
- end
497
-
498
- context "when association has callbacks" do
499
-
500
- let(:post) do
501
- Post.new
502
- end
503
-
504
- let(:tag) do
505
- Tag.new
506
- end
507
-
508
- context "when the callback is a before_add" do
509
-
510
- it "executes the callback" do
511
- post.tags.send(method, tag)
512
- expect(post.before_add_called).to be true
513
- end
514
-
515
- context "when errors are raised" do
516
-
517
- before do
518
- expect(post).to receive(:before_add_tag).and_raise
519
- end
520
-
521
- it "does not add the document to the relation" do
522
- expect {
523
- post.tags.send(method, tag)
524
- }.to raise_error
525
- expect(post.tags).to be_empty
526
- end
527
- end
528
- end
529
-
530
- context "when the callback is an after_add" do
531
-
532
- it "executes the callback" do
533
- post.tags.send(method, tag)
534
- expect(post.after_add_called).to be true
535
- end
536
-
537
- context "when errors are raised" do
538
-
539
- before do
540
- expect(post).to receive(:after_add_tag).and_raise
541
- end
542
-
543
- it "adds the document to the relation" do
544
- expect {
545
- post.tags.send(method, tag)
546
- }.to raise_error
547
- expect(post.tags).to eq([ tag ])
548
- end
549
- end
550
- end
551
- end
552
- end
553
- end
554
-
555
- describe "#=" do
556
-
557
- context "when trying to add duplicate entries" do
558
-
559
- let(:person) do
560
- Person.new
561
- end
562
-
563
- let(:preference) do
564
- Preference.create(name: "one")
565
- end
566
-
567
- before do
568
- person.preferences = [ preference, preference ]
569
- end
570
-
571
- context "when the document is new" do
572
-
573
- it "does not add the duplicates" do
574
- expect(person.preferences).to eq([ preference ])
575
- end
576
-
577
- it "does not create duplicate keys" do
578
- expect(person.preference_ids).to eq([ preference.id ])
579
- end
580
- end
581
-
582
- context "when the document is persisted" do
583
-
584
- before do
585
- person.save
586
- end
587
-
588
- it "does not add the duplicates" do
589
- expect(person.preferences).to eq([ preference ])
590
- end
591
-
592
- it "does not create duplicate keys" do
593
- expect(person.preference_ids).to eq([ preference.id ])
594
- end
595
-
596
- it "does not add duplicates on the inverse" do
597
- expect(preference.people).to eq([ person ])
598
- end
599
-
600
- it "does not add duplicate inverse keys" do
601
- expect(preference.person_ids).to eq([ person.id ])
602
- end
603
-
604
- context "when reloading document from db" do
605
-
606
- let(:from_db) { Preference.last }
607
-
608
- it "does not create duplicate keys" do
609
- person.preferences = [ from_db ]
610
- expect(from_db.person_ids).to eq([ person.id ])
611
- end
612
- end
613
- end
614
- end
615
-
616
- context "when the relation is not polymorphic" do
617
-
618
- context "when the parent and relation are new records" do
619
-
620
- let(:person) do
621
- Person.new
622
- end
623
-
624
- let(:preference) do
625
- Preference.new
626
- end
627
-
628
- before do
629
- person.preferences = [ preference ]
630
- end
631
-
632
- it "sets the relation" do
633
- expect(person.preferences).to eq([ preference ])
634
- end
635
-
636
- it "sets the foreign key on the relation" do
637
- expect(person.preference_ids).to eq([ preference.id ])
638
- end
639
-
640
- it "sets the foreign key on the inverse relation" do
641
- expect(preference.person_ids).to eq([ person.id ])
642
- end
643
-
644
- it "does not save the target" do
645
- expect(preference).to be_new_record
646
- end
647
- end
648
-
649
- context "when the parent is new but the relation exists" do
650
-
651
- let(:person) do
652
- Person.new
653
- end
654
-
655
- let!(:preference) do
656
- Preference.create
657
- end
658
-
659
- before do
660
- person.preferences = [ preference ]
661
- end
662
-
663
- it "sets the relation" do
664
- expect(person.preferences).to eq([ preference ])
665
- end
666
-
667
- it "sets the foreign key on the relation" do
668
- expect(person.preference_ids).to eq([ preference.id ])
669
- end
670
-
671
- it "sets the foreign key on the inverse relation" do
672
- expect(preference.person_ids).to eq([ person.id ])
673
- end
674
-
675
- context "and the parent is persisted" do
676
-
677
- before do
678
- person.save!
679
- preference.reload
680
- end
681
-
682
- it "maintains the relation" do
683
- expect(person.preferences).to eq([ preference ])
684
- end
685
-
686
- it "maintains the foreign key on the relation" do
687
- expect(person.preference_ids).to eq([ preference.id ])
688
- end
689
-
690
- it "maintains the foreign key on the inverse relation" do
691
- expect(preference.person_ids).to eq([ person.id ])
692
- end
693
-
694
- it "maintains the base on the inverse relation" do
695
- expect(preference.people.first).to eq(person)
696
- end
697
- end
698
- end
699
-
700
- context "when the parent is not a new record" do
701
-
702
- let(:person) do
703
- Person.create
704
- end
705
-
706
- let(:preference) do
707
- Preference.new
708
- end
709
-
710
- before do
711
- person.preferences = [ preference ]
712
- end
713
-
714
- it "sets the relation" do
715
- expect(person.preferences).to eq([ preference ])
716
- end
717
-
718
- it "sets the foreign key on the relation" do
719
- expect(person.preference_ids).to eq([ preference.id ])
720
- end
721
-
722
- it "sets the foreign key on the inverse relation" do
723
- expect(preference.person_ids).to eq([ person.id ])
724
- end
725
-
726
- it "sets the base on the inverse relation" do
727
- expect(preference.people.first).to eq(person)
728
- end
729
-
730
- it "saves the target" do
731
- expect(preference).to be_persisted
732
- end
733
-
734
- it "persists the relation" do
735
- person.reload.preferences == [ preference ]
736
- end
737
-
738
- context "when overwriting an existing relation" do
739
-
740
- let(:another_preference) do
741
- Preference.new
742
- end
743
-
744
- before do
745
- person.preferences = [ another_preference ]
746
- end
747
-
748
- it "sets the relation" do
749
- expect(person.preferences).to eq([ another_preference ])
750
- end
751
-
752
- it "saves the target" do
753
- expect(another_preference).to be_persisted
754
- end
755
-
756
- it "does not leave foreign keys of the previous relation" do
757
- expect(person.preference_ids).to eq([ another_preference.id ])
758
- end
759
-
760
- it "clears its own key on the foreign relation" do
761
- expect(preference.person_ids).to be_empty
762
- end
763
-
764
- context "and then overwriting it again with the same value" do
765
-
766
- before do
767
- person.preferences = [ another_preference ]
768
- end
769
-
770
- it "persists the relation between another_preference and person" do
771
- expect(another_preference.reload.people).to eq([ person ])
772
- end
773
-
774
- end
775
-
776
- context "and person reloaded instead of saved" do
777
-
778
- before do
779
- person.reload
780
- another_preference.reload
781
- end
782
-
783
- it "persists the relation between person and another_preference" do
784
- expect(person.preferences).to eq([ another_preference ])
785
- end
786
-
787
- it "persists the relation between another_prefrence and person" do
788
- expect(another_preference.people).to eq([ person ])
789
- end
790
-
791
- it "no longer has any relation between preference and person" do
792
- expect(preference.people).to be_empty
793
- end
794
- end
795
-
796
- context "and person is saved" do
797
-
798
- before do
799
- person.save
800
- person.reload
801
- another_preference.reload
802
- end
803
-
804
- it "persists the relation between person and another_preference" do
805
- expect(person.preferences).to eq([ another_preference ])
806
- end
807
-
808
- it "persists the relation between another_prefrence and person" do
809
- expect(another_preference.people).to eq([ person ])
810
- end
811
-
812
- it "no longer has any relation between preference and person" do
813
- expect(preference.people).to be_empty
814
- end
815
- end
816
- end
817
- end
818
- end
819
- end
820
-
821
- [ nil, [] ].each do |value|
822
-
823
- describe "#= #{value}" do
824
-
825
- context "when the relation is not polymorphic" do
826
-
827
- context "when the inverse relation is not defined" do
828
-
829
- let(:person) do
830
- Person.new
831
- end
832
-
833
- let(:house) do
834
- House.new
835
- end
836
-
837
- before do
838
- person.houses << house
839
- person.houses = value
840
- end
841
-
842
- it "clears the relation" do
843
- expect(person.houses).to be_empty
844
- end
845
-
846
- it "clears the foreign keys" do
847
- expect(person.house_ids).to be_empty
848
- end
849
- end
850
-
851
- context "when the parent is a new record" do
852
-
853
- let(:person) do
854
- Person.new
855
- end
856
-
857
- let(:preference) do
858
- Preference.new
859
- end
860
-
861
- before do
862
- person.preferences = [ preference ]
863
- person.preferences = value
864
- end
865
-
866
- it "sets the relation to an empty array" do
867
- expect(person.preferences).to be_empty
868
- end
869
-
870
- it "removed the inverse relation" do
871
- expect(preference.people).to be_empty
872
- end
873
-
874
- it "removes the foreign key values" do
875
- expect(person.preference_ids).to be_empty
876
- end
877
-
878
- it "removes the inverse foreign key values" do
879
- expect(preference.person_ids).to be_empty
880
- end
881
- end
882
-
883
- context "when the parent is not a new record" do
884
-
885
- context "when the relation has been loaded" do
886
-
887
- let(:person) do
888
- Person.create
889
- end
890
-
891
- let(:preference) do
892
- Preference.new
893
- end
894
-
895
- before do
896
- person.preferences = [ preference ]
897
- person.preferences = value
898
- end
899
-
900
- it "sets the relation to an empty array" do
901
- expect(person.preferences).to be_empty
902
- end
903
-
904
- it "removed the inverse relation" do
905
- expect(preference.people).to be_empty
906
- end
907
-
908
- it "removes the foreign key values" do
909
- expect(person.preference_ids).to be_empty
910
- end
911
-
912
- it "removes the inverse foreign key values" do
913
- expect(preference.person_ids).to be_empty
914
- end
915
-
916
- it "does not delete the target from the database" do
917
- expect(preference).to_not be_destroyed
918
- end
919
- end
920
-
921
- context "when the relation has not been loaded" do
922
-
923
- let(:preference) do
924
- Preference.new
925
- end
926
-
927
- let(:person) do
928
- Person.create.tap do |p|
929
- p.preferences = [ preference ]
930
- end
931
- end
932
-
933
- let!(:from_db) do
934
- Person.find(person.id)
935
- end
936
-
937
- before do
938
- from_db.preferences = value
939
- end
940
-
941
- it "sets the relation to an empty array" do
942
- expect(from_db.preferences).to be_empty
943
- end
944
-
945
- it "removes the foreign key values" do
946
- expect(from_db.preference_ids).to be_empty
947
- end
948
- end
949
- end
950
- end
951
- end
952
- end
953
-
954
- [ :build, :new ].each do |method|
955
-
956
- describe "##{method}" do
957
-
958
- context "when the relation is not polymorphic" do
959
-
960
- context "when the parent is a new record" do
961
-
962
- let(:person) do
963
- Person.new
964
- end
965
-
966
- let!(:preference) do
967
- person.preferences.send(method, name: "settings")
968
- end
969
-
970
- it "adds the document to the relation" do
971
- expect(person.preferences).to eq([ preference ])
972
- end
973
-
974
- it "sets the foreign key on the relation" do
975
- expect(person.preference_ids).to eq([ preference.id ])
976
- end
977
-
978
- it "sets the inverse foreign key on the relation" do
979
- expect(preference.person_ids).to eq([ person.id ])
980
- end
981
-
982
- it "sets the attributes" do
983
- expect(preference.name).to eq("settings")
984
- end
985
-
986
- it "does not save the target" do
987
- expect(preference).to be_new_record
988
- end
989
-
990
- it "adds the correct number of documents" do
991
- expect(person.preferences.size).to eq(1)
992
- end
993
- end
994
-
995
- context "when the parent is not a new record" do
996
-
997
- let(:person) do
998
- Person.create
999
- end
1000
-
1001
- let!(:preference) do
1002
- person.preferences.send(method, name: "settings")
1003
- end
1004
-
1005
- it "adds the document to the relation" do
1006
- expect(person.preferences).to eq([ preference ])
1007
- end
1008
-
1009
- it "sets the foreign key on the relation" do
1010
- expect(person.preference_ids).to eq([ preference.id ])
1011
- end
1012
-
1013
- it "sets the inverse foreign key on the relation" do
1014
- expect(preference.person_ids).to eq([ person.id ])
1015
- end
1016
-
1017
- it "sets the base on the inverse relation" do
1018
- expect(preference.people).to eq([ person ])
1019
- end
1020
-
1021
- it "sets the attributes" do
1022
- expect(preference.name).to eq("settings")
1023
- end
1024
-
1025
- it "does not save the target" do
1026
- expect(preference).to be_new_record
1027
- end
1028
-
1029
- it "adds the correct number of documents" do
1030
- expect(person.preferences.size).to eq(1)
1031
- end
1032
-
1033
- context "when saving the target" do
1034
-
1035
- before do
1036
- preference.save
1037
- end
1038
-
1039
- it "persists the parent keys" do
1040
- expect(person.reload.preference_ids).to eq([ preference.id ])
1041
- end
1042
- end
1043
- end
1044
- end
1045
- end
1046
- end
1047
-
1048
- describe ".builder" do
1049
-
1050
- let(:builder_klass) do
1051
- Mongoid::Relations::Builders::Referenced::ManyToMany
1052
- end
1053
-
1054
- let(:document) do
1055
- double
1056
- end
1057
-
1058
- let(:metadata) do
1059
- double(extension?: false)
1060
- end
1061
-
1062
- it "returns the embedded in builder" do
1063
- expect(
1064
- described_class.builder(nil, metadata, document)
1065
- ).to be_a_kind_of(builder_klass)
1066
- end
1067
- end
1068
-
1069
- describe "#clear" do
1070
-
1071
- context "when the relation is not polymorphic" do
1072
-
1073
- context "when the parent has been persisted" do
1074
-
1075
- let!(:person) do
1076
- Person.create
1077
- end
1078
-
1079
- context "when the children are persisted" do
1080
-
1081
- let!(:preference) do
1082
- person.preferences.create(name: "settings")
1083
- end
1084
-
1085
- let!(:relation) do
1086
- person.preferences.clear
1087
- end
1088
-
1089
- it "clears out the relation" do
1090
- expect(person.preferences).to be_empty
1091
- end
1092
-
1093
- it "removes the parent from the inverse relation" do
1094
- expect(preference.people).to_not include(person)
1095
- end
1096
-
1097
- it "removes the foreign keys" do
1098
- expect(person.preference_ids).to be_empty
1099
- end
1100
-
1101
- it "removes the parent key from the inverse" do
1102
- expect(preference.person_ids).to_not include(person.id)
1103
- end
1104
-
1105
- it "does not delete the documents" do
1106
- expect(preference).to_not be_destroyed
1107
- end
1108
-
1109
- it "persists the nullification" do
1110
- expect(person.reload.preferences).to be_empty
1111
- end
1112
-
1113
- it "returns the relation" do
1114
- expect(relation).to be_empty
1115
- end
1116
- end
1117
-
1118
- context "when the children are not persisted" do
1119
-
1120
- let!(:preference) do
1121
- person.preferences.build(name: "setting")
1122
- end
1123
-
1124
- let!(:relation) do
1125
- person.preferences.clear
1126
- end
1127
-
1128
- it "clears out the relation" do
1129
- expect(person.preferences).to be_empty
1130
- end
1131
- end
1132
- end
1133
-
1134
- context "when the parent is not persisted" do
1135
-
1136
- let(:person) do
1137
- Person.new
1138
- end
1139
-
1140
- let!(:preference) do
1141
- person.preferences.build(name: "setting")
1142
- end
1143
-
1144
- let!(:relation) do
1145
- person.preferences.clear
1146
- end
1147
-
1148
- it "clears out the relation" do
1149
- expect(person.preferences).to be_empty
1150
- end
1151
- end
1152
- end
1153
-
1154
- context "when the association has callbacks" do
1155
-
1156
- let(:post) do
1157
- Post.new
1158
- end
1159
-
1160
- let(:tag) do
1161
- Tag.new
1162
- end
1163
-
1164
- before do
1165
- post.tags << tag
1166
- end
1167
-
1168
- context "when the callback is a before_remove" do
1169
-
1170
- context "when no errors are raised" do
1171
-
1172
- before do
1173
- post.tags.clear
1174
- end
1175
-
1176
- it "executes the callback" do
1177
- expect(post.before_remove_called).to be true
1178
- end
1179
-
1180
- it "removes the document from the relation" do
1181
- expect(post.tags).to be_empty
1182
- end
1183
- end
1184
-
1185
- context "when errors are raised" do
1186
-
1187
- before do
1188
- expect(post).to receive(:before_remove_tag).and_raise
1189
- end
1190
-
1191
- it "does not remove the document from the relation" do
1192
- expect {
1193
- post.tags.clear
1194
- }.to raise_error
1195
- expect(post.tags).to eq([ tag ])
1196
- end
1197
- end
1198
- end
1199
-
1200
- context "when the callback is an after_remove" do
1201
-
1202
- context "when no errors are raised" do
1203
-
1204
- before do
1205
- post.tags.clear
1206
- end
1207
-
1208
- it "executes the callback" do
1209
- expect(post.after_remove_called).to be true
1210
- end
1211
-
1212
- it "removes the document from the relation" do
1213
- expect(post.tags).to be_empty
1214
- end
1215
- end
1216
-
1217
- context "when errors are raised" do
1218
-
1219
- before do
1220
- expect(post).to receive(:after_remove_tag).and_raise
1221
- end
1222
-
1223
- it "removes the document from the relation" do
1224
- expect {
1225
- post.tags.clear
1226
- }.to raise_error
1227
- expect(post.tags).to be_empty
1228
- end
1229
- end
1230
- end
1231
- end
1232
- end
1233
-
1234
- describe "#concat" do
1235
-
1236
- context "when the parent is a new record" do
1237
-
1238
- let(:person) do
1239
- Person.new
1240
- end
1241
-
1242
- let!(:preference) do
1243
- Preference.new
1244
- end
1245
-
1246
- let(:result) do
1247
- person.preferences.concat([ preference ])
1248
- end
1249
-
1250
- it "returns an array of loaded documents" do
1251
- expect(result).to eq([ preference ])
1252
- end
1253
- end
1254
-
1255
- context "when the parent is not a new record" do
1256
-
1257
- let(:person) do
1258
- Person.create
1259
- end
1260
-
1261
- let!(:preference) do
1262
- Preference.new
1263
- end
1264
-
1265
- let(:result) do
1266
- person.preferences.concat([ preference ])
1267
- end
1268
-
1269
- it "returns an array of loaded documents" do
1270
- expect(result).to eq([ preference ])
1271
- end
1272
- end
1273
-
1274
- context "when the relations are not polymorphic" do
1275
-
1276
- context "when the inverse relation is not defined" do
1277
-
1278
- let(:person) do
1279
- Person.new
1280
- end
1281
-
1282
- let(:house) do
1283
- House.new
1284
- end
1285
-
1286
- before do
1287
- person.houses.concat([ house ])
1288
- end
1289
-
1290
- it "appends the document to the relation" do
1291
- expect(person.houses).to eq([ house ])
1292
- end
1293
-
1294
- it "sets the foreign key on the relation" do
1295
- expect(person.house_ids).to eq([ house.id ])
1296
- end
1297
- end
1298
-
1299
- context "when appending in a parent create block" do
1300
-
1301
- let!(:preference) do
1302
- Preference.create(name: "testing")
1303
- end
1304
-
1305
- let!(:person) do
1306
- Person.create do |doc|
1307
- doc.preferences.concat([ preference ])
1308
- end
1309
- end
1310
-
1311
- it "adds the documents to the relation" do
1312
- expect(person.preferences).to eq([ preference ])
1313
- end
1314
-
1315
- it "sets the foreign key on the relation" do
1316
- expect(person.preference_ids).to eq([ preference.id ])
1317
- end
1318
-
1319
- it "sets the foreign key on the inverse relation" do
1320
- expect(preference.person_ids).to eq([ person.id ])
1321
- end
1322
-
1323
- it "saves the target" do
1324
- expect(preference).to be_persisted
1325
- end
1326
-
1327
- it "adds the correct number of documents" do
1328
- expect(person.preferences.size).to eq(1)
1329
- end
1330
-
1331
- it "persists the link" do
1332
- expect(person.reload.preferences).to eq([ preference ])
1333
- end
1334
- end
1335
-
1336
- context "when the parent is a new record" do
1337
-
1338
- let(:person) do
1339
- Person.new
1340
- end
1341
-
1342
- context "when the child is new" do
1343
-
1344
- let(:preference) do
1345
- Preference.new
1346
- end
1347
-
1348
- before do
1349
- person.preferences.concat([ preference ])
1350
- end
1351
-
1352
- it "adds the documents to the relation" do
1353
- expect(person.preferences).to eq([ preference ])
1354
- end
1355
-
1356
- it "sets the foreign key on the relation" do
1357
- expect(person.preference_ids).to eq([ preference.id ])
1358
- end
1359
-
1360
- it "sets the foreign key on the inverse relation" do
1361
- expect(preference.person_ids).to eq([ person.id ])
1362
- end
1363
-
1364
- it "does not save the target" do
1365
- expect(preference).to be_new_record
1366
- end
1367
-
1368
- it "adds the correct number of documents" do
1369
- expect(person.preferences.size).to eq(1)
1370
- end
1371
-
1372
- context "when appending a second time" do
1373
-
1374
- before do
1375
- person.preferences.concat([ preference ])
1376
- end
1377
-
1378
- it "does not allow the document to be added again" do
1379
- expect(person.preferences).to eq([ preference ])
1380
- end
1381
-
1382
- it "does not allow duplicate ids" do
1383
- expect(person.preference_ids).to eq([ preference.id ])
1384
- end
1385
- end
1386
- end
1387
-
1388
- context "when the child is already persisted" do
1389
-
1390
- let!(:persisted) do
1391
- Preference.create(name: "testy")
1392
- end
1393
-
1394
- let(:preference) do
1395
- Preference.first
1396
- end
1397
-
1398
- before do
1399
- person.preferences.concat([ preference ])
1400
- person.save
1401
- end
1402
-
1403
- it "adds the documents to the relation" do
1404
- expect(person.preferences).to eq([ preference ])
1405
- end
1406
-
1407
- it "sets the foreign key on the relation" do
1408
- expect(person.preference_ids).to eq([ preference.id ])
1409
- end
1410
-
1411
- it "sets the foreign key on the inverse relation" do
1412
- expect(preference.person_ids).to eq([ person.id ])
1413
- end
1414
-
1415
- it "saves the target" do
1416
- expect(preference).to be_persisted
1417
- end
1418
-
1419
- it "adds the correct number of documents" do
1420
- expect(person.preferences.size).to eq(1)
1421
- end
1422
-
1423
- it "persists the link" do
1424
- expect(person.reload.preferences).to eq([ preference ])
1425
- end
1426
- end
1427
-
1428
- context "when setting via the associated ids" do
1429
-
1430
- let!(:persisted) do
1431
- Preference.create(name: "testy")
1432
- end
1433
-
1434
- let(:preference) do
1435
- Preference.first
1436
- end
1437
-
1438
- let(:person) do
1439
- Person.new(preference_ids: [ preference.id ])
1440
- end
1441
-
1442
- before do
1443
- person.save
1444
- end
1445
-
1446
- it "adds the documents to the relation" do
1447
- expect(person.preferences).to eq([ preference ])
1448
- end
1449
-
1450
- it "sets the foreign key on the relation" do
1451
- expect(person.preference_ids).to eq([ preference.id ])
1452
- end
1453
-
1454
- it "sets the foreign key on the inverse relation" do
1455
- expect(preference.reload.person_ids).to eq([ person.id ])
1456
- end
1457
-
1458
- it "adds the correct number of documents" do
1459
- expect(person.preferences.size).to eq(1)
1460
- end
1461
-
1462
- it "persists the link" do
1463
- expect(person.reload.preferences).to eq([ preference ])
1464
- end
1465
- end
1466
- end
1467
-
1468
- context "when the parent is not a new record" do
1469
-
1470
- let(:person) do
1471
- Person.create
1472
- end
1473
-
1474
- let(:preference) do
1475
- Preference.new
1476
- end
1477
-
1478
- before do
1479
- person.preferences.concat([ preference ])
1480
- end
1481
-
1482
- it "adds the documents to the relation" do
1483
- expect(person.preferences).to eq([ preference ])
1484
- end
1485
-
1486
- it "sets the foreign key on the relation" do
1487
- expect(person.preference_ids).to eq([ preference.id ])
1488
- end
1489
-
1490
- it "sets the foreign key on the inverse relation" do
1491
- expect(preference.person_ids).to eq([ person.id ])
1492
- end
1493
-
1494
- it "sets the base on the inverse relation" do
1495
- expect(preference.people).to eq([ person ])
1496
- end
1497
-
1498
- it "sets the same instance on the inverse relation" do
1499
- expect(preference.people.first).to eql(person)
1500
- end
1501
-
1502
- it "saves the target" do
1503
- expect(preference).to_not be_new_record
1504
- end
1505
-
1506
- it "adds the document to the target" do
1507
- expect(person.preferences.count).to eq(1)
1508
- end
1509
-
1510
- context "when documents already exist on the relation" do
1511
-
1512
- let(:preference_two) do
1513
- Preference.new
1514
- end
1515
-
1516
- before do
1517
- person.preferences.concat([ preference_two ])
1518
- end
1519
-
1520
- it "adds the documents to the relation" do
1521
- expect(person.preferences).to eq([ preference, preference_two ])
1522
- end
1523
-
1524
- it "sets the foreign key on the relation" do
1525
- expect(person.preference_ids).to eq([ preference.id, preference_two.id ])
1526
- end
1527
-
1528
- it "sets the foreign key on the inverse relation" do
1529
- expect(preference_two.person_ids).to eq([ person.id ])
1530
- end
1531
-
1532
- it "sets the base on the inverse relation" do
1533
- expect(preference_two.people).to eq([ person ])
1534
- end
1535
-
1536
- it "sets the same instance on the inverse relation" do
1537
- expect(preference_two.people.first).to eql(person)
1538
- end
1539
-
1540
- it "saves the target" do
1541
- expect(preference).to_not be_new_record
1542
- end
1543
-
1544
- it "adds the document to the target" do
1545
- expect(person.preferences.count).to eq(2)
1546
- end
1547
- end
1548
- end
1549
-
1550
- context "when both sides have been persisted" do
1551
-
1552
- let(:person) do
1553
- Person.create
1554
- end
1555
-
1556
- let(:event) do
1557
- Event.create
1558
- end
1559
-
1560
- before do
1561
- person.administrated_events.concat([ event ])
1562
- end
1563
-
1564
- it "sets the front side of the relation" do
1565
- expect(person.administrated_events).to eq([ event ])
1566
- end
1567
-
1568
- it "sets the inverse side of the relation" do
1569
- expect(event.administrators(true)).to eq([ person ])
1570
- end
1571
-
1572
- context "when reloading" do
1573
-
1574
- it "sets the front side of the relation" do
1575
- expect(person.reload.administrated_events).to eq([ event ])
1576
- end
1577
-
1578
- it "sets the inverse side of the relation" do
1579
- expect(event.reload.administrators).to eq([ person ])
1580
- end
1581
- end
1582
-
1583
- context "when performing a new database query" do
1584
-
1585
- let(:loaded_person) do
1586
- Person.find(person.id)
1587
- end
1588
-
1589
- let(:loaded_event) do
1590
- Event.find(event.id)
1591
- end
1592
-
1593
- it "sets the front side of the relation" do
1594
- expect(loaded_person.administrated_events).to eq([ event ])
1595
- end
1596
-
1597
- it "sets the inverse side of the relation" do
1598
- expect(loaded_event.administrators).to eq([ person ])
1599
- end
1600
- end
1601
- end
1602
-
1603
- context "when the relation also includes a has_many relation" do
1604
-
1605
- let(:artwork) do
1606
- Artwork.create
1607
- end
1608
-
1609
- let(:exhibition) do
1610
- Exhibition.create
1611
- end
1612
-
1613
- let(:exhibitor) do
1614
- Exhibitor.create(exhibition: exhibition)
1615
- end
1616
-
1617
- before do
1618
- artwork.exhibitors.concat([ exhibitor ])
1619
- end
1620
-
1621
- it "creates a single artwork object" do
1622
- expect(Artwork.count).to eq(1)
1623
- end
1624
- end
1625
-
1626
- context "when the relation is self referencing" do
1627
-
1628
- let(:tag_one) do
1629
- Tag.create(text: "one")
1630
- end
1631
-
1632
- let(:tag_two) do
1633
- Tag.create(text: "two")
1634
- end
1635
-
1636
- before do
1637
- tag_one.related.concat([ tag_two ])
1638
- end
1639
-
1640
- it "sets the front side of the relation" do
1641
- expect(tag_one.related).to eq([ tag_two ])
1642
- end
1643
-
1644
- it "sets the inverse side of the relation" do
1645
- expect(tag_two.related(true)).to eq([ tag_one ])
1646
- end
1647
-
1648
- context "when reloading" do
1649
-
1650
- it "sets the front side of the relation" do
1651
- expect(tag_one.reload.related).to eq([ tag_two ])
1652
- end
1653
-
1654
- it "sets the inverse side of the relation" do
1655
- expect(tag_two.reload.related).to eq([ tag_one ])
1656
- end
1657
- end
1658
-
1659
- context "when performing a new database query" do
1660
-
1661
- let(:loaded_tag_one) do
1662
- Tag.find(tag_one.id)
1663
- end
1664
-
1665
- let(:loaded_tag_two) do
1666
- Tag.find(tag_two.id)
1667
- end
1668
-
1669
- it "sets the front side of the relation" do
1670
- expect(loaded_tag_one.related).to eq([ tag_two ])
1671
- end
1672
-
1673
- it "sets the inverse side of the relation" do
1674
- expect(loaded_tag_two.related).to eq([ tag_one ])
1675
- end
1676
- end
1677
- end
1678
- end
1679
- end
1680
-
1681
- describe "#count" do
1682
-
1683
- let(:person) do
1684
- Person.create
1685
- end
1686
-
1687
- context "when nothing exists on the relation" do
1688
-
1689
- context "when the document is destroyed" do
1690
-
1691
- before do
1692
- Meat.create!
1693
- end
1694
-
1695
- let!(:sandwich) do
1696
- Sandwich.create!
1697
- end
1698
-
1699
- it "returns zero" do
1700
- sandwich.destroy
1701
- expect(sandwich.meats.count).to eq(0)
1702
- end
1703
- end
1704
- end
1705
-
1706
- context "when documents have been persisted" do
1707
-
1708
- let!(:preference) do
1709
- person.preferences.create(name: "setting")
1710
- end
1711
-
1712
- it "returns the number of persisted documents" do
1713
- expect(person.preferences.count).to eq(1)
1714
- end
1715
- end
1716
-
1717
- context "when appending to a loaded relation" do
1718
-
1719
- let!(:preference) do
1720
- person.preferences.create(name: "setting")
1721
- end
1722
-
1723
- before do
1724
- person.preferences.count
1725
- person.preferences << Preference.create(name: "two")
1726
- end
1727
-
1728
- it "returns the number of persisted documents" do
1729
- expect(person.preferences.count).to eq(2)
1730
- end
1731
- end
1732
-
1733
- context "when documents have not been persisted" do
1734
-
1735
- let!(:preference) do
1736
- person.preferences.build(name: "settings")
1737
- end
1738
-
1739
- it "returns 0" do
1740
- expect(person.preferences.count).to eq(0)
1741
- end
1742
- end
1743
-
1744
- context "when new documents exist in the database" do
1745
-
1746
- context "when the documents are part of the relation" do
1747
-
1748
- before do
1749
- Preference.create(person_ids: [ person.id ])
1750
- end
1751
-
1752
- it "returns the count from the db" do
1753
- expect(person.reload.preferences.count).to eq(1)
1754
- end
1755
- end
1756
-
1757
- context "when the documents are not part of the relation" do
1758
-
1759
- before do
1760
- Preference.create
1761
- end
1762
-
1763
- it "returns the count from the db" do
1764
- expect(person.preferences.count).to eq(0)
1765
- end
1766
- end
1767
- end
1768
-
1769
- context "when the inverse relation is not defined" do
1770
-
1771
- context "when documents have been persisted" do
1772
-
1773
- let!(:house) do
1774
- person.houses.create(name: "Wayne Manor")
1775
- end
1776
-
1777
- it "returns the number of persisted documents" do
1778
- expect(person.houses.count).to eq(1)
1779
- end
1780
- end
1781
-
1782
- context "when documents have not been persisted" do
1783
-
1784
- let!(:house) do
1785
- person.houses.build(name: "Ryugyong Hotel")
1786
- end
1787
-
1788
- it "returns 0" do
1789
- expect(person.preferences.count).to eq(0)
1790
- end
1791
- end
1792
- end
1793
- end
1794
-
1795
- [ :create, :create! ].each do |method|
1796
-
1797
- describe "##{method}" do
1798
-
1799
- context "when the relation is not polymorphic" do
1800
-
1801
- context "when using string keys" do
1802
-
1803
- let(:agent) do
1804
- Agent.create(number: "007")
1805
- end
1806
-
1807
- before do
1808
- agent.accounts.create(name: "testing again")
1809
- end
1810
-
1811
- it "does not convert the string key to an object id" do
1812
- expect(agent.account_ids).to eq([ "testing-again" ])
1813
- end
1814
- end
1815
-
1816
- context "when the parent is a new record" do
1817
-
1818
- let(:person) do
1819
- Person.new
1820
- end
1821
-
1822
- it "raises an unsaved document error" do
1823
- expect {
1824
- person.preferences.send(method, name: "Testing")
1825
- }.to raise_error(Mongoid::Errors::UnsavedDocument)
1826
- end
1827
- end
1828
-
1829
- context "when the parent is not a new record" do
1830
-
1831
- let(:person) do
1832
- Person.send(method)
1833
- end
1834
-
1835
- let!(:preference) do
1836
- person.preferences.send(method, name: "Testing")
1837
- end
1838
-
1839
- it "sets the foreign key on the relation" do
1840
- expect(person.preference_ids).to eq([ preference.id ])
1841
- end
1842
-
1843
- it "sets the foreign key on the inverse relation" do
1844
- expect(preference.person_ids).to eq([ person.id ])
1845
- end
1846
-
1847
- it "adds the document" do
1848
- expect(person.preferences).to eq([ preference ])
1849
- end
1850
-
1851
- it "sets the base on the inverse relation" do
1852
- expect(preference.people).to eq([ person ])
1853
- end
1854
-
1855
- it "sets the attributes" do
1856
- expect(preference.name).to eq("Testing")
1857
- end
1858
-
1859
- it "saves the target" do
1860
- expect(preference).to be_persisted
1861
- end
1862
-
1863
- it "adds the document to the target" do
1864
- expect(person.preferences.count).to eq(1)
1865
- end
1866
-
1867
- it "does not duplicate documents" do
1868
- expect(person.reload.preferences.count).to eq(1)
1869
- end
1870
-
1871
- it "does not duplicate ids" do
1872
- expect(person.reload.preference_ids.count).to eq(1)
1873
- end
1874
- end
1875
- end
1876
- end
1877
- end
1878
-
1879
- describe "#create!" do
1880
-
1881
- context "when validation fails" do
1882
-
1883
- let(:person) do
1884
- Person.create
1885
- end
1886
-
1887
- context "when the relation is not polymorphic" do
1888
-
1889
- it "raises an error" do
1890
- expect {
1891
- person.preferences.create!(name: "a")
1892
- }.to raise_error(Mongoid::Errors::Validations)
1893
- end
1894
- end
1895
- end
1896
- end
1897
-
1898
- describe "#delete" do
1899
-
1900
- let(:person) do
1901
- Person.create
1902
- end
1903
-
1904
- let(:preference_one) do
1905
- Preference.create(name: "Testing")
1906
- end
1907
-
1908
- let(:preference_two) do
1909
- Preference.create(name: "Test")
1910
- end
1911
-
1912
- before do
1913
- person.preferences << [ preference_one, preference_two ]
1914
- end
1915
-
1916
- context "when the document exists" do
1917
-
1918
- let!(:deleted) do
1919
- person.preferences.delete(preference_one)
1920
- end
1921
-
1922
- it "removes the document from the relation" do
1923
- expect(person.preferences).to eq([ preference_two ])
1924
- end
1925
-
1926
- it "returns the document" do
1927
- expect(deleted).to eq(preference_one)
1928
- end
1929
-
1930
- it "removes the document key from the foreign key" do
1931
- expect(person.preference_ids).to eq([ preference_two.id ])
1932
- end
1933
-
1934
- it "removes the inverse reference" do
1935
- expect(deleted.reload.people).to be_empty
1936
- end
1937
-
1938
- it "removes the base id from the inverse keys" do
1939
- expect(deleted.reload.person_ids).to be_empty
1940
- end
1941
-
1942
- context "and person and preferences are reloaded" do
1943
-
1944
- before do
1945
- person.reload
1946
- preference_one.reload
1947
- preference_two.reload
1948
- end
1949
-
1950
- it "nullifies the deleted preference" do
1951
- expect(person.preferences).to eq([ preference_two ])
1952
- end
1953
-
1954
- it "retains the ids for one preference" do
1955
- expect(person.preference_ids).to eq([ preference_two.id ])
1956
- end
1957
- end
1958
- end
1959
-
1960
- context "when the document does not exist" do
1961
-
1962
- let!(:deleted) do
1963
- person.preferences.delete(Preference.new)
1964
- end
1965
-
1966
- it "returns nil" do
1967
- expect(deleted).to be_nil
1968
- end
1969
-
1970
- it "does not modify the relation" do
1971
- expect(person.preferences).to eq([ preference_one, preference_two ])
1972
- end
1973
-
1974
- it "does not modify the keys" do
1975
- expect(person.preference_ids).to eq([ preference_one.id, preference_two.id ])
1976
- end
1977
- end
1978
-
1979
- context "when :dependent => :nullify is set" do
1980
-
1981
- context "when :inverse_of is set" do
1982
-
1983
- let(:event) do
1984
- Event.create
1985
- end
1986
-
1987
- before do
1988
- person.administrated_events << [ event ]
1989
- end
1990
-
1991
- it "deletes the document" do
1992
- expect(event.delete).to be true
1993
- end
1994
- end
1995
- end
1996
-
1997
- context "when the relationships are self referencing" do
1998
-
1999
- let(:tag_one) do
2000
- Tag.create(text: "one")
2001
- end
2002
-
2003
- let(:tag_two) do
2004
- Tag.create(text: "two")
2005
- end
2006
-
2007
- before do
2008
- tag_one.related << tag_two
2009
- end
2010
-
2011
- context "when deleting without reloading" do
2012
-
2013
- let!(:deleted) do
2014
- tag_one.related.delete(tag_two)
2015
- end
2016
-
2017
- it "deletes the document from the relation" do
2018
- expect(tag_one.related).to be_empty
2019
- end
2020
-
2021
- it "deletes the foreign key from the relation" do
2022
- expect(tag_one.related_ids).to be_empty
2023
- end
2024
-
2025
- it "removes the reference from the inverse" do
2026
- expect(deleted.related).to be_empty
2027
- end
2028
-
2029
- it "removes the foreign keys from the inverse" do
2030
- expect(deleted.related_ids).to be_empty
2031
- end
2032
- end
2033
-
2034
- context "when deleting with reloading" do
2035
-
2036
- context "when deleting from the front side" do
2037
-
2038
- let(:reloaded) do
2039
- tag_one.reload
2040
- end
2041
-
2042
- let!(:deleted) do
2043
- reloaded.related.delete(tag_two)
2044
- end
2045
-
2046
- it "deletes the document from the relation" do
2047
- expect(reloaded.related).to be_empty
2048
- end
2049
-
2050
- it "deletes the foreign key from the relation" do
2051
- expect(reloaded.related_ids).to be_empty
2052
- end
2053
-
2054
- it "removes the reference from the inverse" do
2055
- expect(deleted.related).to be_empty
2056
- end
2057
-
2058
- it "removes the foreign keys from the inverse" do
2059
- expect(deleted.related_ids).to be_empty
2060
- end
2061
- end
2062
-
2063
- context "when deleting from the inverse side" do
2064
-
2065
- let(:reloaded) do
2066
- tag_two.reload
2067
- end
2068
-
2069
- let!(:deleted) do
2070
- reloaded.related.delete(tag_one)
2071
- end
2072
-
2073
- it "deletes the document from the relation" do
2074
- expect(reloaded.related).to be_empty
2075
- end
2076
-
2077
- it "deletes the foreign key from the relation" do
2078
- expect(reloaded.related_ids).to be_empty
2079
- end
2080
-
2081
- it "removes the foreign keys from the inverse" do
2082
- expect(deleted.related_ids).to be_empty
2083
- end
2084
- end
2085
- end
2086
- end
2087
-
2088
- context "when the association has callbacks" do
2089
-
2090
- let(:post) do
2091
- Post.new
2092
- end
2093
-
2094
- let(:tag) do
2095
- Tag.new
2096
- end
2097
-
2098
- before do
2099
- post.tags << tag
2100
- end
2101
-
2102
- context "when the callback is a before_remove" do
2103
-
2104
- context "when there are no errors" do
2105
-
2106
- before do
2107
- post.tags.delete tag
2108
- end
2109
-
2110
- it "executes the callback" do
2111
- expect(post.before_remove_called).to be true
2112
- end
2113
-
2114
- it "removes the document from the relation" do
2115
- expect(post.tags).to be_empty
2116
- end
2117
- end
2118
-
2119
- context "when errors are raised" do
2120
-
2121
- before do
2122
- expect(post).to receive(:before_remove_tag).and_raise
2123
- end
2124
-
2125
- it "does not remove the document from the relation" do
2126
- expect {
2127
- post.tags.delete tag
2128
- }.to raise_error
2129
- expect(post.tags).to eq([ tag ])
2130
- end
2131
- end
2132
- end
2133
-
2134
- context "when the callback is an after_remove" do
2135
-
2136
- context "when no errors are raised" do
2137
-
2138
- before do
2139
- post.tags.delete(tag)
2140
- end
2141
-
2142
- it "executes the callback" do
2143
- expect(post.after_remove_called).to be true
2144
- end
2145
-
2146
- it "removes the document from the relation" do
2147
- expect(post.tags).to be_empty
2148
- end
2149
- end
2150
-
2151
- context "when errors are raised" do
2152
-
2153
- before do
2154
- expect(post).to receive(:after_remove_tag).and_raise
2155
- end
2156
-
2157
- it "removes the document from the relation" do
2158
- expect {
2159
- post.tags.delete(tag)
2160
- }.to raise_error
2161
- expect(post.tags).to be_empty
2162
- end
2163
- end
2164
- end
2165
- end
2166
- end
2167
-
2168
- [ :delete_all, :destroy_all ].each do |method|
2169
-
2170
- describe "##{method}" do
2171
-
2172
- context "when the relation is not polymorphic" do
2173
-
2174
- context "when conditions are provided" do
2175
-
2176
- let(:person) do
2177
- Person.create
2178
- end
2179
-
2180
- let!(:preference_one) do
2181
- person.preferences.create(name: "Testing")
2182
- end
2183
-
2184
- let!(:preference_two) do
2185
- person.preferences.create(name: "Test")
2186
- end
2187
-
2188
- let!(:deleted) do
2189
- person.preferences.send(
2190
- method,
2191
- { name: "Testing" }
2192
- )
2193
- end
2194
-
2195
- it "removes the correct preferences" do
2196
- expect(person.preferences.count).to eq(1)
2197
- end
2198
-
2199
- it "deletes the documents from the database" do
2200
- expect(Preference.where(name: "Testing").count).to eq(0)
2201
- end
2202
-
2203
- it "returns the number of documents deleted" do
2204
- expect(deleted).to eq(1)
2205
- end
2206
-
2207
- it "removes the ids from the foreign key" do
2208
- expect(person.preference_ids).to eq([ preference_two.id ])
2209
- end
2210
- end
2211
-
2212
- context "when conditions are not provided" do
2213
-
2214
- let(:person) do
2215
- Person.create.tap do |person|
2216
- person.preferences.create(name: "Testing")
2217
- person.preferences.create(name: "Test")
2218
- end
2219
- end
2220
-
2221
- let!(:deleted) do
2222
- person.preferences.send(method)
2223
- end
2224
-
2225
- it "removes the correct preferences" do
2226
- expect(person.preferences.count).to eq(0)
2227
- end
2228
-
2229
- it "deletes the documents from the database" do
2230
- expect(Preference.count).to eq(0)
2231
- end
2232
-
2233
- it "returns the number of documents deleted" do
2234
- expect(deleted).to eq(2)
2235
- end
2236
- end
2237
- end
2238
- end
2239
- end
2240
-
2241
- describe ".embedded?" do
2242
-
2243
- it "returns false" do
2244
- expect(described_class).to_not be_embedded
2245
- end
2246
- end
2247
-
2248
- describe "#exists?" do
2249
-
2250
- let!(:person) do
2251
- Person.create
2252
- end
2253
-
2254
- context "when documents exist in the database" do
2255
-
2256
- before do
2257
- person.preferences.create
2258
- end
2259
-
2260
- it "returns true" do
2261
- expect(person.preferences.exists?).to be true
2262
- end
2263
- end
2264
-
2265
- context "when no documents exist in the database" do
2266
-
2267
- before do
2268
- person.preferences.build
2269
- end
2270
-
2271
- it "returns false" do
2272
- expect(person.preferences.exists?).to be false
2273
- end
2274
- end
2275
- end
2276
-
2277
- describe "#find" do
2278
-
2279
- context "when the relation is not polymorphic" do
2280
-
2281
- let(:person) do
2282
- Person.create
2283
- end
2284
-
2285
- let!(:preference_one) do
2286
- person.preferences.create(name: "Test")
2287
- end
2288
-
2289
- let!(:preference_two) do
2290
- person.preferences.create(name: "OMG I has relations")
2291
- end
2292
-
2293
- let!(:unrelated_pref) do
2294
- Preference.create(name: "orphan annie")
2295
- end
2296
-
2297
- let!(:unrelated_pref_two) do
2298
- Preference.create(name: "orphan two")
2299
- end
2300
-
2301
- context "when providing an id" do
2302
-
2303
- context "when the id matches" do
2304
-
2305
- let(:preference) do
2306
- person.preferences.find(preference_one.id)
2307
- end
2308
-
2309
- it "returns the matching document" do
2310
- expect(preference).to eq(preference_one)
2311
- end
2312
- end
2313
-
2314
- context "when the id matches an unreferenced document" do
2315
-
2316
- let(:preference) do
2317
- person.preferences.find(unrelated_pref.id)
2318
- end
2319
-
2320
- it "raises an error" do
2321
- expect {
2322
- preference
2323
- }.to raise_error(Mongoid::Errors::DocumentNotFound)
2324
- end
2325
- end
2326
-
2327
- context "when the id does not match" do
2328
-
2329
- context "when config set to raise error" do
2330
-
2331
- before do
2332
- Mongoid.raise_not_found_error = true
2333
- end
2334
-
2335
- it "raises an error" do
2336
- expect {
2337
- person.preferences.find(BSON::ObjectId.new)
2338
- }.to raise_error(Mongoid::Errors::DocumentNotFound)
2339
- end
2340
- end
2341
-
2342
- context "when config set not to raise error" do
2343
-
2344
- let(:preference) do
2345
- person.preferences.find(BSON::ObjectId.new)
2346
- end
2347
-
2348
- before do
2349
- Mongoid.raise_not_found_error = false
2350
- end
2351
-
2352
- after do
2353
- Mongoid.raise_not_found_error = true
2354
- end
2355
-
2356
- it "returns nil" do
2357
- expect(preference).to be_nil
2358
- end
2359
- end
2360
- end
2361
- end
2362
-
2363
- context "when providing an array of ids" do
2364
-
2365
- context "when the ids match" do
2366
-
2367
- let(:preferences) do
2368
- person.preferences.find([ preference_one.id, preference_two.id ])
2369
- end
2370
-
2371
- it "returns the matching documents" do
2372
- expect(preferences).to eq([ preference_one, preference_two ])
2373
- end
2374
- end
2375
-
2376
- context "when the ids matche unreferenced documents" do
2377
-
2378
- let(:preferences) do
2379
- person.preferences.find(
2380
- [ unrelated_pref.id, unrelated_pref_two.id ]
2381
- )
2382
- end
2383
-
2384
- it "raises an error" do
2385
- expect {
2386
- preferences
2387
- }.to raise_error(Mongoid::Errors::DocumentNotFound)
2388
- end
2389
- end
2390
-
2391
- context "when the ids do not match" do
2392
-
2393
- context "when config set to raise error" do
2394
-
2395
- before do
2396
- Mongoid.raise_not_found_error = true
2397
- end
2398
-
2399
- it "raises an error" do
2400
- expect {
2401
- person.preferences.find([ BSON::ObjectId.new ])
2402
- }.to raise_error(Mongoid::Errors::DocumentNotFound)
2403
- end
2404
- end
2405
-
2406
- context "when config set not to raise error" do
2407
-
2408
- let(:preferences) do
2409
- person.preferences.find([ BSON::ObjectId.new ])
2410
- end
2411
-
2412
- before do
2413
- Mongoid.raise_not_found_error = false
2414
- end
2415
-
2416
- after do
2417
- Mongoid.raise_not_found_error = true
2418
- end
2419
-
2420
- it "returns an empty array" do
2421
- expect(preferences).to be_empty
2422
- end
2423
- end
2424
- end
2425
- end
2426
- end
2427
- end
2428
-
2429
- describe "#find_or_create_by" do
2430
-
2431
- context "when the relation is not polymorphic" do
2432
-
2433
- let(:person) do
2434
- Person.create
2435
- end
2436
-
2437
- let!(:preference) do
2438
- person.preferences.create(name: "Testing")
2439
- end
2440
-
2441
- context "when the document exists" do
2442
-
2443
- let(:found) do
2444
- person.preferences.find_or_create_by(name: "Testing")
2445
- end
2446
-
2447
- it "returns the document" do
2448
- expect(found).to eq(preference)
2449
- end
2450
- end
2451
-
2452
- context "when the document does not exist" do
2453
-
2454
- let(:found) do
2455
- person.preferences.find_or_create_by(name: "Test")
2456
- end
2457
-
2458
- it "sets the new document attributes" do
2459
- expect(found.name).to eq("Test")
2460
- end
2461
-
2462
- it "returns a newly persisted document" do
2463
- expect(found).to be_persisted
2464
- end
2465
- end
2466
- end
2467
- end
2468
-
2469
- describe "#find_or_create_by!" do
2470
-
2471
- context "when the relation is not polymorphic" do
2472
-
2473
- let(:person) do
2474
- Person.create
2475
- end
2476
-
2477
- let!(:preference) do
2478
- person.preferences.create(name: "Testing")
2479
- end
2480
-
2481
- context "when the document exists" do
2482
-
2483
- let(:found) do
2484
- person.preferences.find_or_create_by!(name: "Testing")
2485
- end
2486
-
2487
- it "returns the document" do
2488
- expect(found).to eq(preference)
2489
- end
2490
- end
2491
-
2492
- context "when the document does not exist" do
2493
-
2494
- let(:found) do
2495
- person.preferences.find_or_create_by!(name: "Test")
2496
- end
2497
-
2498
- it "sets the new document attributes" do
2499
- expect(found.name).to eq("Test")
2500
- end
2501
-
2502
- it "returns a newly persisted document" do
2503
- expect(found).to be_persisted
2504
- end
2505
-
2506
- context "when validation fails" do
2507
-
2508
- it "raises an error" do
2509
- expect {
2510
- person.preferences.find_or_create_by!(name: "A")
2511
- }.to raise_error(Mongoid::Errors::Validations)
2512
- end
2513
- end
2514
- end
2515
- end
2516
- end
2517
-
2518
- describe "#find_or_initialize_by" do
2519
-
2520
- context "when the relation is not polymorphic" do
2521
-
2522
- let(:person) do
2523
- Person.create
2524
- end
2525
-
2526
- let!(:preference) do
2527
- person.preferences.create(name: "Testing")
2528
- end
2529
-
2530
- context "when the document exists" do
2531
-
2532
- let(:found) do
2533
- person.preferences.find_or_initialize_by(name: "Testing")
2534
- end
2535
-
2536
- it "returns the document" do
2537
- expect(found).to eq(preference)
2538
- end
2539
- end
2540
-
2541
- context "when the document does not exist" do
2542
-
2543
- let(:found) do
2544
- person.preferences.find_or_initialize_by(name: "Test")
2545
- end
2546
-
2547
- it "sets the new document attributes" do
2548
- expect(found.name).to eq("Test")
2549
- end
2550
-
2551
- it "returns a non persisted document" do
2552
- expect(found).to_not be_persisted
2553
- end
2554
- end
2555
- end
2556
- end
2557
-
2558
- describe ".foreign_key_suffix" do
2559
-
2560
- it "returns _ids" do
2561
- expect(described_class.foreign_key_suffix).to eq("_ids")
2562
- end
2563
- end
2564
-
2565
- describe ".macro" do
2566
-
2567
- it "returns has_and_belongs_to_many" do
2568
- expect(described_class.macro).to eq(:has_and_belongs_to_many)
2569
- end
2570
- end
2571
-
2572
- describe "#max" do
2573
-
2574
- let(:person) do
2575
- Person.create
2576
- end
2577
-
2578
- let(:preference_one) do
2579
- Preference.create(ranking: 5)
2580
- end
2581
-
2582
- let(:preference_two) do
2583
- Preference.create(ranking: 10)
2584
- end
2585
-
2586
- before do
2587
- person.preferences.push(preference_one, preference_two)
2588
- end
2589
-
2590
- let(:max) do
2591
- person.preferences.max do |a,b|
2592
- a.ranking <=> b.ranking
2593
- end
2594
- end
2595
-
2596
- it "returns the document with the max value of the supplied field" do
2597
- expect(max).to eq(preference_two)
2598
- end
2599
- end
2600
-
2601
- describe "#max_by" do
2602
-
2603
- let(:person) do
2604
- Person.create
2605
- end
2606
-
2607
- let(:preference_one) do
2608
- Preference.create(ranking: 5)
2609
- end
2610
-
2611
- let(:preference_two) do
2612
- Preference.create(ranking: 10)
2613
- end
2614
-
2615
- before do
2616
- person.preferences.push(preference_one, preference_two)
2617
- end
2618
-
2619
- let(:max) do
2620
- person.preferences.max_by(&:ranking)
2621
- end
2622
-
2623
- it "returns the document with the max value of the supplied field" do
2624
- expect(max).to eq(preference_two)
2625
- end
2626
- end
2627
-
2628
- describe "#method_missing" do
2629
-
2630
- let!(:person) do
2631
- Person.create
2632
- end
2633
-
2634
- let!(:preference_one) do
2635
- person.preferences.create(name: "First", value: "Posting")
2636
- end
2637
-
2638
- let!(:preference_two) do
2639
- person.preferences.create(name: "Second", value: "Testing")
2640
- end
2641
-
2642
- let!(:unrelated) do
2643
- Preference.create(name: "Third")
2644
- end
2645
-
2646
- context "when providing a single criteria" do
2647
-
2648
- let(:preferences) do
2649
- person.preferences.where(name: "First")
2650
- end
2651
-
2652
- it "applies the criteria to the documents" do
2653
- expect(preferences).to eq([ preference_one ])
2654
- end
2655
- end
2656
-
2657
- context 'when providing a collation', if: collation_supported? do
2658
-
2659
- let(:preferences) do
2660
- person.preferences.where(name: "FIRST").collation(locale: 'en_US', strength: 2).to_a
2661
- end
2662
-
2663
- it "applies the collation option to the query" do
2664
- expect(preferences).to eq([ preference_one ])
2665
- end
2666
- end
2667
-
2668
- context "when providing a criteria on id" do
2669
-
2670
- let(:preferences) do
2671
- person.preferences.where(_id: unrelated.id)
2672
- end
2673
-
2674
- it "does not return unrelated documents" do
2675
- expect(preferences).to be_empty
2676
- end
2677
- end
2678
-
2679
- context "when providing a criteria class method" do
2680
-
2681
- let(:preferences) do
2682
- person.preferences.posting
2683
- end
2684
-
2685
- it "applies the criteria to the documents" do
2686
- expect(preferences).to eq([ preference_one ])
2687
- end
2688
- end
2689
-
2690
- context "when chaining criteria" do
2691
-
2692
- let(:preferences) do
2693
- person.preferences.posting.where(:name.in => [ "First" ])
2694
- end
2695
-
2696
- it "applies the criteria to the documents" do
2697
- expect(preferences).to eq([ preference_one ])
2698
- end
2699
- end
2700
-
2701
- context "when delegating methods" do
2702
-
2703
- describe "#distinct" do
2704
-
2705
- let(:values) do
2706
- person.preferences.distinct(:name)
2707
- end
2708
-
2709
- it "returns the distinct values for the fields" do
2710
- expect(values).to include("First")
2711
- expect(values).to include("Second")
2712
- end
2713
-
2714
- context "when the inverse relation is not defined" do
2715
-
2716
- let!(:house) do
2717
- person.houses.create(name: "Wayne Manor")
2718
- end
2719
-
2720
- it "returns the distinct values for the fields" do
2721
- expect(person.houses.distinct(:name)).to eq([ house.name ])
2722
- end
2723
- end
2724
- end
2725
- end
2726
- end
2727
-
2728
- describe "#min" do
2729
-
2730
- let(:person) do
2731
- Person.create
2732
- end
2733
-
2734
- let(:preference_one) do
2735
- Preference.create(ranking: 5)
2736
- end
2737
-
2738
- let(:preference_two) do
2739
- Preference.create(ranking: 10)
2740
- end
2741
-
2742
- before do
2743
- person.preferences.push(preference_one, preference_two)
2744
- end
2745
-
2746
- let(:min) do
2747
- person.preferences.min do |a, b|
2748
- a.ranking <=> b.ranking
2749
- end
2750
- end
2751
-
2752
- it "returns the min value of the supplied field" do
2753
- expect(min).to eq(preference_one)
2754
- end
2755
- end
2756
-
2757
- describe "#min_by" do
2758
-
2759
- let(:person) do
2760
- Person.create
2761
- end
2762
-
2763
- let(:preference_one) do
2764
- Preference.create(ranking: 5)
2765
- end
2766
-
2767
- let(:preference_two) do
2768
- Preference.create(ranking: 10)
2769
- end
2770
-
2771
- before do
2772
- person.preferences.push(preference_one, preference_two)
2773
- end
2774
-
2775
- let(:min) do
2776
- person.preferences.min_by(&:ranking)
2777
- end
2778
-
2779
- it "returns the min value of the supplied field" do
2780
- expect(min).to eq(preference_one)
2781
- end
2782
- end
2783
-
2784
- describe "#nil?" do
2785
-
2786
- it "returns false" do
2787
- expect(Person.new.preferences).to_not be_nil
2788
- end
2789
- end
2790
-
2791
- describe "#nullify_all" do
2792
-
2793
- let(:person) do
2794
- Person.create
2795
- end
2796
-
2797
- let!(:preference_one) do
2798
- person.preferences.create(name: "One")
2799
- end
2800
-
2801
- let!(:preference_two) do
2802
- person.preferences.create(name: "Two")
2803
- end
2804
-
2805
- before do
2806
- person.preferences.nullify_all
2807
- end
2808
-
2809
- it "removes the foreign key from the base document" do
2810
- [ preference_one, preference_two ].each do |preference|
2811
- expect(person.preference_ids).to_not include(preference.id)
2812
- end
2813
- end
2814
-
2815
- it "removes the foreign key from the target documents" do
2816
- [ preference_one, preference_two ].each do |preference|
2817
- expect(preference.person_ids).to_not include(person.id)
2818
- end
2819
- end
2820
-
2821
- it "removes the reference from the base document" do
2822
- [ preference_one, preference_two ].each do |preference|
2823
- expect(person.preferences).to_not include(preference)
2824
- end
2825
- end
2826
-
2827
- it "removes the reference from the target documents" do
2828
- [ preference_one, preference_two ].each do |preference|
2829
- expect(preference.people).to_not include(person)
2830
- end
2831
- end
2832
-
2833
- it "saves the documents" do
2834
- expect(preference_one.reload.people).to_not include(person)
2835
- end
2836
- end
2837
-
2838
- describe "#respond_to?" do
2839
-
2840
- let(:person) do
2841
- Person.new
2842
- end
2843
-
2844
- let(:preferences) do
2845
- person.preferences
2846
- end
2847
-
2848
- Array.public_instance_methods.each do |method|
2849
-
2850
- context "when checking #{method}" do
2851
-
2852
- it "returns true" do
2853
- expect(preferences.respond_to?(method)).to be true
2854
- end
2855
- end
2856
- end
2857
-
2858
- Mongoid::Relations::Referenced::Many.public_instance_methods.each do |method|
2859
-
2860
- context "when checking #{method}" do
2861
-
2862
- it "returns true" do
2863
- expect(preferences.respond_to?(method)).to be true
2864
- end
2865
- end
2866
- end
2867
-
2868
- Preference.scopes.keys.each do |method|
2869
-
2870
- context "when checking #{method}" do
2871
-
2872
- it "returns true" do
2873
- expect(preferences.respond_to?(method)).to be true
2874
- end
2875
- end
2876
- end
2877
- end
2878
-
2879
- describe ".stores_foreign_key?" do
2880
-
2881
- it "returns true" do
2882
- expect(described_class.stores_foreign_key?).to be true
2883
- end
2884
- end
2885
-
2886
- describe "#scoped" do
2887
-
2888
- let(:person) do
2889
- Person.new
2890
- end
2891
-
2892
- let(:scoped) do
2893
- person.preferences.scoped
2894
- end
2895
-
2896
- it "returns the relation criteria" do
2897
- expect(scoped).to be_a(Mongoid::Criteria)
2898
- end
2899
-
2900
- it "returns with an empty selector" do
2901
- expect(scoped.selector).to eq({ "$and" => [{ "_id" => { "$in" => [] }}]})
2902
- end
2903
- end
2904
-
2905
- [ :size, :length ].each do |method|
2906
-
2907
- describe "##{method}" do
2908
-
2909
- let(:person) do
2910
- Person.create
2911
- end
2912
-
2913
- context "when documents have been persisted" do
2914
-
2915
- let!(:preference) do
2916
- person.preferences.create(name: "Testing")
2917
- end
2918
-
2919
- it "returns the number of documents" do
2920
- expect(person.preferences.send(method)).to eq(1)
2921
- end
2922
- end
2923
-
2924
- context "when documents have not been persisted" do
2925
-
2926
- before do
2927
- person.preferences.build(name: "Test")
2928
- person.preferences.create(name: "Test 2")
2929
- end
2930
-
2931
- it "returns the total number of documents" do
2932
- expect(person.preferences.send(method)).to eq(2)
2933
- end
2934
- end
2935
- end
2936
- end
2937
-
2938
- describe "#unscoped" do
2939
-
2940
- context "when the relation has no default scope" do
2941
-
2942
- let!(:person) do
2943
- Person.create
2944
- end
2945
-
2946
- let!(:preference_one) do
2947
- person.preferences.create(name: "first")
2948
- end
2949
-
2950
- let!(:preference_two) do
2951
- Preference.create(name: "second")
2952
- end
2953
-
2954
- let(:unscoped) do
2955
- person.preferences.unscoped
2956
- end
2957
-
2958
- it "returns only the associated documents" do
2959
- expect(unscoped).to eq([ preference_one ])
2960
- end
2961
- end
2962
-
2963
- context "when the relation has a default scope" do
2964
-
2965
- let!(:person) do
2966
- Person.create
2967
- end
2968
-
2969
- let!(:house_one) do
2970
- person.houses.create(name: "first")
2971
- end
2972
-
2973
- let!(:house_two) do
2974
- House.create(name: "second")
2975
- end
2976
-
2977
- let(:unscoped) do
2978
- person.houses.unscoped
2979
- end
2980
-
2981
- it "only returns associated documents" do
2982
- expect(unscoped).to eq([ house_one ])
2983
- end
2984
-
2985
- it "removes the default scoping options" do
2986
- expect(unscoped.options).to eq({})
2987
- end
2988
- end
2989
- end
2990
-
2991
- describe ".valid_options" do
2992
-
2993
- it "returns the valid options" do
2994
- expect(described_class.valid_options).to eq(
2995
- [
2996
- :after_add,
2997
- :after_remove,
2998
- :autosave,
2999
- :before_add,
3000
- :before_remove,
3001
- :dependent,
3002
- :foreign_key,
3003
- :index,
3004
- :order,
3005
- :primary_key
3006
- ]
3007
- )
3008
- end
3009
- end
3010
-
3011
- describe ".validation_default" do
3012
-
3013
- it "returns true" do
3014
- expect(described_class.validation_default).to be true
3015
- end
3016
- end
3017
-
3018
- context "when setting the ids directly after the documents" do
3019
-
3020
- let!(:person) do
3021
- Person.create!(title: "The Boss")
3022
- end
3023
-
3024
- let!(:girlfriend_house) do
3025
- House.create!(name: "Girlfriend")
3026
- end
3027
-
3028
- let!(:wife_house) do
3029
- House.create!(name: "Wife")
3030
- end
3031
-
3032
- let!(:exwife_house) do
3033
- House.create!(name: "Ex-Wife")
3034
- end
3035
-
3036
- before do
3037
- person.update_attributes(
3038
- houses: [ wife_house, exwife_house, girlfriend_house ]
3039
- )
3040
- person.update_attributes(house_ids: [ girlfriend_house.id ])
3041
- end
3042
-
3043
- context "when reloading" do
3044
-
3045
- it "properly sets the references" do
3046
- expect(person.houses(true)).to eq([ girlfriend_house ])
3047
- end
3048
- end
3049
- end
3050
-
3051
- context "when setting both sides in a single call" do
3052
-
3053
- context "when the documents are new" do
3054
-
3055
- let(:user) do
3056
- User.new(name: "testing")
3057
- end
3058
-
3059
- let(:business) do
3060
- Business.new(name: "serious", owners: [ user ])
3061
- end
3062
-
3063
- before do
3064
- user.businesses = [ business ]
3065
- end
3066
-
3067
- it "sets the businesses" do
3068
- expect(user.businesses).to eq([ business ])
3069
- end
3070
-
3071
- it "sets the inverse users" do
3072
- expect(user.businesses.first.owners.first).to eq(user)
3073
- end
3074
-
3075
- it "sets the inverse businesses" do
3076
- expect(business.owners).to eq([ user ])
3077
- end
3078
- end
3079
-
3080
- context "when one side is persisted" do
3081
-
3082
- let!(:user) do
3083
- User.new(name: "testing")
3084
- end
3085
-
3086
- let!(:business) do
3087
- Business.create(name: "serious", owners: [ user ])
3088
- end
3089
-
3090
- before do
3091
- user.businesses = [ business ]
3092
- end
3093
-
3094
- it "sets the businesses" do
3095
- expect(user.businesses).to eq([ business ])
3096
- end
3097
-
3098
- it "sets the inverse users" do
3099
- expect(user.businesses.first.owners.first).to eq(user)
3100
- end
3101
-
3102
- it "sets the inverse businesses" do
3103
- expect(business.owners).to eq([ user ])
3104
- end
3105
-
3106
- context "when reloading" do
3107
-
3108
- before do
3109
- user.reload
3110
- business.reload
3111
- end
3112
-
3113
- it "persists the businesses" do
3114
- expect(user.businesses).to eq([ business ])
3115
- end
3116
-
3117
- it "persists the inverse users" do
3118
- expect(user.businesses.first.owners.first).to eq(user)
3119
- end
3120
-
3121
- it "persists the inverse businesses" do
3122
- expect(business.owners).to eq([ user ])
3123
- end
3124
- end
3125
- end
3126
-
3127
- context "when the documents are persisted" do
3128
-
3129
- let(:user) do
3130
- User.create(name: "tst")
3131
- end
3132
-
3133
- let(:business) do
3134
- Business.create(name: "srs", owners: [ user ])
3135
- end
3136
-
3137
- before do
3138
- user.businesses = [ business ]
3139
- end
3140
-
3141
- it "sets the businesses" do
3142
- expect(user.businesses).to eq([ business ])
3143
- end
3144
-
3145
- it "sets the inverse users" do
3146
- expect(user.businesses.first.owners.first).to eq(user)
3147
- end
3148
-
3149
- it "sets the inverse businesses" do
3150
- expect(business.owners).to eq([ user ])
3151
- end
3152
-
3153
- context "when reloading" do
3154
-
3155
- before do
3156
- user.reload
3157
- business.reload
3158
- end
3159
-
3160
- it "persists the businesses" do
3161
- expect(user.businesses).to eq([ business ])
3162
- end
3163
-
3164
- it "persists the inverse users" do
3165
- expect(user.businesses.first.owners.first).to eq(user)
3166
- end
3167
-
3168
- it "persists the inverse businesses" do
3169
- expect(business.owners).to eq([ user ])
3170
- end
3171
- end
3172
- end
3173
- end
3174
-
3175
- context "when binding the relation multiple times" do
3176
-
3177
- let(:person) do
3178
- Person.create
3179
- end
3180
-
3181
- let(:preference) do
3182
- person.preferences.create(name: "testing")
3183
- end
3184
-
3185
- before do
3186
- 2.times do
3187
- person.preferences.each do |preference|
3188
- expect(preference.person_ids).to eq([ person.id ])
3189
- end
3190
- end
3191
- end
3192
-
3193
- it "does not duplicate foreign keys" do
3194
- expect(person.preference_ids).to eq([ preference.id ])
3195
- end
3196
- end
3197
-
3198
- context "when the association has order criteria" do
3199
-
3200
- let(:person) do
3201
- Person.create
3202
- end
3203
-
3204
- let(:preference_one) do
3205
- OrderedPreference.create(name: 'preference-1', value: 10)
3206
- end
3207
-
3208
- let(:preference_two) do
3209
- OrderedPreference.create(name: 'preference-2', value: 20)
3210
- end
3211
-
3212
- let(:preference_three) do
3213
- OrderedPreference.create(name: 'preference-3', value: 20)
3214
- end
3215
-
3216
- before do
3217
- person.ordered_preferences.nullify_all
3218
- person.ordered_preferences.push(preference_one, preference_two, preference_three)
3219
- end
3220
-
3221
- it "orders the documents" do
3222
- expect(person.ordered_preferences(true)).to eq(
3223
- [preference_two, preference_three, preference_one]
3224
- )
3225
- end
3226
-
3227
- it "chains default criteria with additional" do
3228
- expect(person.ordered_preferences.order_by(:name.desc).to_a).to eq(
3229
- [preference_three, preference_two, preference_one]
3230
- )
3231
- end
3232
- end
3233
-
3234
- context "when the parent is not a new record and freshly loaded" do
3235
-
3236
- let(:person) do
3237
- Person.create
3238
- end
3239
-
3240
- let(:preference) do
3241
- Preference.new
3242
- end
3243
-
3244
- before do
3245
- person.preferences = [ preference ]
3246
- person.save
3247
- person.reload
3248
- person.preferences = nil
3249
- end
3250
-
3251
- it "sets the relation to an empty array" do
3252
- expect(person.preferences).to be_empty
3253
- end
3254
-
3255
- it "removes the foreign key values" do
3256
- expect(person.preference_ids).to be_empty
3257
- end
3258
-
3259
- it "does not delete the target from the database" do
3260
- expect {
3261
- preference.reload
3262
- }.not_to raise_error
3263
- end
3264
- end
3265
-
3266
- context "when reloading the relation" do
3267
-
3268
- let!(:person) do
3269
- Person.create
3270
- end
3271
-
3272
- let!(:preference_one) do
3273
- Preference.create(name: "one")
3274
- end
3275
-
3276
- let!(:preference_two) do
3277
- Preference.create(name: "two")
3278
- end
3279
-
3280
- before do
3281
- person.preferences << preference_one
3282
- end
3283
-
3284
- context "when the relation references the same documents" do
3285
-
3286
- before do
3287
- Preference.collection.find({ _id: preference_one.id }).
3288
- update_one({ "$set" => { name: "reloaded" }})
3289
- end
3290
-
3291
- let(:reloaded) do
3292
- person.preferences(true)
3293
- end
3294
-
3295
- it "reloads the document from the database" do
3296
- expect(reloaded.first.name).to eq("reloaded")
3297
- end
3298
- end
3299
-
3300
- context "when the relation references different documents" do
3301
-
3302
- before do
3303
- person.preferences << preference_two
3304
- end
3305
-
3306
- let(:reloaded) do
3307
- person.preferences(true)
3308
- end
3309
-
3310
- it "reloads the new document from the database" do
3311
- expect(reloaded).to eq([ preference_one, preference_two ])
3312
- end
3313
- end
3314
- end
3315
-
3316
- context "when adding to a relation via a field setter" do
3317
-
3318
- context "when the document is new" do
3319
-
3320
- let!(:person) do
3321
- Person.create(preference_names: "one, two")
3322
- end
3323
-
3324
- let(:preference_one) do
3325
- person.reload.preferences.first
3326
- end
3327
-
3328
- let(:preference_two) do
3329
- person.reload.preferences.last
3330
- end
3331
-
3332
- it "persists the first preference" do
3333
- expect(preference_one).to_not be_nil
3334
- end
3335
-
3336
- it "sets the first inverse" do
3337
- expect(preference_one.people).to eq([ person ])
3338
- end
3339
-
3340
- it "persists the second preference" do
3341
- expect(preference_two).to_not be_nil
3342
- end
3343
-
3344
- it "sets the second inverse keys" do
3345
- expect(preference_two.people).to eq([ person ])
3346
- end
3347
- end
3348
- end
3349
-
3350
- context "when changing the order of existing ids" do
3351
-
3352
- let(:person) do
3353
- Person.new
3354
- end
3355
-
3356
- let(:preference_one) do
3357
- Preference.create(name: "one")
3358
- end
3359
-
3360
- let(:preference_two) do
3361
- Preference.create(name: "two")
3362
- end
3363
-
3364
- before do
3365
- person.preference_ids = [ preference_one.id, preference_two.id ]
3366
- person.save
3367
- end
3368
-
3369
- context "and the order is changed" do
3370
-
3371
- before do
3372
- person.preference_ids = [ preference_two.id, preference_one.id ]
3373
- person.save
3374
- end
3375
-
3376
- let(:reloaded) do
3377
- Person.find(person.id)
3378
- end
3379
-
3380
- it "persists the change in id order" do
3381
- expect(reloaded.preference_ids).to eq(
3382
- [ preference_two.id, preference_one.id ]
3383
- )
3384
- end
3385
- end
3386
-
3387
- context "and the order is changed and an element is added" do
3388
-
3389
- let(:preference_three) do
3390
- Preference.create(name: "three")
3391
- end
3392
-
3393
- before do
3394
- person.preference_ids =
3395
- [ preference_two.id, preference_one.id, preference_three.id ]
3396
- person.save
3397
- end
3398
-
3399
- let(:reloaded) do
3400
- Person.find(person.id)
3401
- end
3402
-
3403
- it "also persists the change in id order" do
3404
- expect(reloaded.preference_ids).to eq(
3405
- [ preference_two.id, preference_one.id, preference_three.id ]
3406
- )
3407
- end
3408
- end
3409
-
3410
- context "and the order is changed and an element is removed" do
3411
-
3412
- let(:preference_three) do
3413
- Preference.create(name: "three")
3414
- end
3415
-
3416
- before do
3417
- person.preference_ids =
3418
- [ preference_one.id, preference_two.id, preference_three.id ]
3419
- person.save
3420
- person.preference_ids =
3421
- [ preference_three.id, preference_two.id ]
3422
- person.save
3423
- end
3424
-
3425
- let(:reloaded) do
3426
- Person.find(person.id)
3427
- end
3428
-
3429
- it "also persists the change in id order" do
3430
- expect(reloaded.preference_ids).to eq(
3431
- [ preference_three.id, preference_two.id ]
3432
- )
3433
- end
3434
- end
3435
- end
3436
-
3437
- context "when adding a document" do
3438
-
3439
- let(:person) do
3440
- Person.new
3441
- end
3442
-
3443
- let(:preference_one) do
3444
- Preference.new
3445
- end
3446
-
3447
- let(:first_add) do
3448
- person.preferences.push(preference_one)
3449
- end
3450
-
3451
- context "when chaining a second add" do
3452
-
3453
- let(:preference_two) do
3454
- Preference.new
3455
- end
3456
-
3457
- let(:result) do
3458
- first_add.push(preference_two)
3459
- end
3460
-
3461
- it "adds both documents" do
3462
- expect(result).to eq([ preference_one, preference_two ])
3463
- end
3464
- end
3465
- end
3466
-
3467
- context "when setting the relation via the foreign key" do
3468
-
3469
- context "when the relation exists" do
3470
-
3471
- let!(:person) do
3472
- Person.create
3473
- end
3474
-
3475
- let!(:pref_one) do
3476
- person.preferences.create
3477
- end
3478
-
3479
- let!(:pref_two) do
3480
- Preference.create
3481
- end
3482
-
3483
- before do
3484
- person.preference_ids = [ pref_two.id ]
3485
- end
3486
-
3487
- it "sets the new documents on the relation" do
3488
- expect(person.preferences).to eq([ pref_two ])
3489
- end
3490
- end
3491
- end
3492
-
3493
- context "when using a different primary key" do
3494
-
3495
- let(:dog) do
3496
- Dog.create(name: 'Doggie')
3497
- end
3498
-
3499
- let(:cat) do
3500
- Cat.create(name: 'Kitty')
3501
- end
3502
-
3503
- let(:fire_hydrant) do
3504
- FireHydrant.create(location: '221B Baker Street')
3505
- end
3506
-
3507
- context "when adding to a one-way many to many" do
3508
-
3509
- before do
3510
- fire_hydrant.cats.push(cat)
3511
- end
3512
-
3513
- it "adds the pk value to the fk set" do
3514
- expect(fire_hydrant.cat_ids).to eq([cat.name])
3515
- end
3516
- end
3517
-
3518
- context "when adding to a two-way many to many" do
3519
-
3520
- before do
3521
- fire_hydrant.dogs.push(dog)
3522
- end
3523
-
3524
- it "adds the pk value to the fk set" do
3525
- expect(fire_hydrant.dog_ids).to eq([dog.name])
3526
- end
3527
-
3528
- it "adds the base pk value to the inverse fk set" do
3529
- expect(dog.fire_hydrant_ids).to eq([fire_hydrant.location])
3530
- end
3531
- end
3532
-
3533
- context "when deleting from a two-way many to many" do
3534
-
3535
- before do
3536
- dog.fire_hydrants.push(fire_hydrant)
3537
- fire_hydrant.dogs.delete(dog)
3538
- end
3539
-
3540
- it "removes the pk value from the fk set" do
3541
- expect(fire_hydrant.dog_ids).to eq([])
3542
- end
3543
-
3544
- it "removes the base pk value from the inverse fk set" do
3545
- expect(dog.fire_hydrant_ids).to eq([])
3546
- end
3547
- end
3548
- end
3549
-
3550
- context "HABTM" do
3551
- before do
3552
- class Project
3553
- include Mongoid::Document
3554
-
3555
- field :n, type: String, as: :name
3556
-
3557
- has_and_belongs_to_many :distributors,
3558
- foreign_key: :d_ids,
3559
- inverse_of: 'p',
3560
- inverse_class_name: 'Distributor'
3561
- end
3562
-
3563
- class Distributor
3564
- include Mongoid::Document
3565
-
3566
- field :n, type: String, as: :name
3567
-
3568
- has_and_belongs_to_many :projects,
3569
- foreign_key: :p_ids,
3570
- inverse_of: 'd',
3571
- inverse_class_name: 'Project'
3572
- end
3573
- end
3574
-
3575
- it "should assign relation from both sides" do
3576
- p1 = Project.create name: 'Foo'
3577
- p2 = Project.create name: 'Bar'
3578
- d1 = Distributor.create name: 'Rock'
3579
- d2 = Distributor.create name: 'Soul'
3580
-
3581
- p1.distributors << d1
3582
- expect(p1.d_ids).to match_array([d1.id])
3583
- expect(d1.p_ids).to match_array([p1.id])
3584
- d2.projects << p2
3585
- expect(d2.p_ids).to match_array([p2.id])
3586
- expect(p2.d_ids).to match_array([d2.id])
3587
- end
3588
- end
3589
- end