mongoid 6.4.4 → 7.3.2

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