mongoid 6.4.4 → 7.1.7

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 (942) 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 +25 -18
  6. data/Rakefile +28 -5
  7. data/lib/config/locales/en.yml +76 -50
  8. data/lib/mongoid/association/accessors.rb +417 -0
  9. data/lib/mongoid/{relations/binding.rb → association/bindable.rb} +39 -57
  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 +140 -0
  13. data/lib/mongoid/{relations/eager.rb → association/eager_loadable.rb} +13 -11
  14. data/lib/mongoid/{relations → association}/embedded/batchable.rb +23 -21
  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/{relations/bindings/embedded/many.rb → association/embedded/embeds_many/binding.rb} +14 -9
  21. data/lib/mongoid/{relations/builders/embedded/many.rb → association/embedded/embeds_many/buildable.rb} +19 -7
  22. data/lib/mongoid/association/embedded/embeds_many/proxy.rb +555 -0
  23. data/lib/mongoid/association/embedded/embeds_many.rb +214 -0
  24. data/lib/mongoid/{relations/bindings/embedded/one.rb → association/embedded/embeds_one/binding.rb} +15 -10
  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/{relations → association}/many.rb +32 -59
  31. data/lib/mongoid/{relations → association}/marshalable.rb +9 -5
  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 +129 -0
  35. data/lib/mongoid/association/nested.rb +18 -0
  36. data/lib/mongoid/{relations → association}/one.rb +9 -7
  37. data/lib/mongoid/association/options.rb +155 -0
  38. data/lib/mongoid/{relations → association}/proxy.rb +59 -69
  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/{relations/bindings/referenced/many.rb → association/referenced/has_many/binding.rb} +9 -6
  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 +517 -0
  56. data/lib/mongoid/association/referenced/has_many/proxy.rb +581 -0
  57. data/lib/mongoid/association/referenced/has_many.rb +278 -0
  58. data/lib/mongoid/{relations/bindings/referenced/one.rb → association/referenced/has_one/binding.rb} +14 -9
  59. data/lib/mongoid/association/referenced/has_one/buildable.rb +67 -0
  60. data/lib/mongoid/association/referenced/has_one/eager.rb +37 -0
  61. data/lib/mongoid/{relations/builders/nested_attributes/one.rb → association/referenced/has_one/nested_builder.rb} +20 -18
  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 +24 -1
  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 +18 -15
  77. data/lib/mongoid/attributes/nested.rb +29 -16
  78. data/lib/mongoid/attributes/processing.rb +10 -8
  79. data/lib/mongoid/attributes/readonly.rb +5 -5
  80. data/lib/mongoid/attributes.rb +62 -44
  81. data/lib/mongoid/cacheable.rb +3 -1
  82. data/lib/mongoid/changeable.rb +4 -2
  83. data/lib/mongoid/clients/factory.rb +3 -2
  84. data/lib/mongoid/clients/options.rb +17 -13
  85. data/lib/mongoid/clients/sessions.rb +23 -4
  86. data/lib/mongoid/clients/storage_options.rb +7 -5
  87. data/lib/mongoid/clients/validators/storage.rb +2 -0
  88. data/lib/mongoid/clients/validators.rb +2 -0
  89. data/lib/mongoid/clients.rb +2 -0
  90. data/lib/mongoid/composable.rb +8 -6
  91. data/lib/mongoid/config/environment.rb +23 -8
  92. data/lib/mongoid/config/options.rb +20 -12
  93. data/lib/mongoid/config/validators/client.rb +2 -0
  94. data/lib/mongoid/config/validators/option.rb +2 -0
  95. data/lib/mongoid/config/validators.rb +2 -0
  96. data/lib/mongoid/config.rb +53 -9
  97. data/lib/mongoid/contextual/aggregable/memory.rb +3 -1
  98. data/lib/mongoid/contextual/aggregable/mongo.rb +3 -1
  99. data/lib/mongoid/contextual/atomic.rb +24 -6
  100. data/lib/mongoid/contextual/command.rb +2 -0
  101. data/lib/mongoid/contextual/geo_near.rb +6 -4
  102. data/lib/mongoid/contextual/map_reduce.rb +5 -2
  103. data/lib/mongoid/contextual/memory.rb +23 -3
  104. data/lib/mongoid/contextual/mongo.rb +16 -9
  105. data/lib/mongoid/contextual/none.rb +2 -0
  106. data/lib/mongoid/contextual/queryable.rb +2 -0
  107. data/lib/mongoid/contextual.rb +7 -4
  108. data/lib/mongoid/copyable.rb +14 -7
  109. data/lib/mongoid/criteria/findable.rb +11 -1
  110. data/lib/mongoid/criteria/includable.rb +21 -19
  111. data/lib/mongoid/criteria/inspectable.rb +2 -0
  112. data/lib/mongoid/criteria/marshalable.rb +2 -0
  113. data/lib/mongoid/criteria/modifiable.rb +10 -3
  114. data/lib/mongoid/criteria/options.rb +4 -2
  115. data/lib/mongoid/criteria/permission.rb +2 -0
  116. data/lib/mongoid/criteria/queryable/aggregable.rb +2 -0
  117. data/lib/mongoid/criteria/queryable/expandable.rb +93 -0
  118. data/lib/mongoid/criteria/queryable/extensions/array.rb +3 -1
  119. data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +3 -1
  120. data/lib/mongoid/criteria/queryable/extensions/boolean.rb +2 -0
  121. data/lib/mongoid/criteria/queryable/extensions/date.rb +3 -1
  122. data/lib/mongoid/criteria/queryable/extensions/date_time.rb +5 -6
  123. data/lib/mongoid/criteria/queryable/extensions/hash.rb +3 -1
  124. data/lib/mongoid/criteria/queryable/extensions/nil_class.rb +3 -1
  125. data/lib/mongoid/criteria/queryable/extensions/numeric.rb +4 -2
  126. data/lib/mongoid/criteria/queryable/extensions/object.rb +3 -1
  127. data/lib/mongoid/criteria/queryable/extensions/range.rb +3 -1
  128. data/lib/mongoid/criteria/queryable/extensions/regexp.rb +9 -7
  129. data/lib/mongoid/criteria/queryable/extensions/set.rb +3 -1
  130. data/lib/mongoid/criteria/queryable/extensions/string.rb +4 -2
  131. data/lib/mongoid/criteria/queryable/extensions/symbol.rb +3 -1
  132. data/lib/mongoid/criteria/queryable/extensions/time.rb +4 -2
  133. data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +15 -1
  134. data/lib/mongoid/criteria/queryable/extensions.rb +2 -0
  135. data/lib/mongoid/criteria/queryable/key.rb +101 -14
  136. data/lib/mongoid/criteria/queryable/macroable.rb +3 -1
  137. data/lib/mongoid/criteria/queryable/mergeable.rb +158 -15
  138. data/lib/mongoid/criteria/queryable/optional.rb +5 -3
  139. data/lib/mongoid/criteria/queryable/options.rb +2 -0
  140. data/lib/mongoid/criteria/queryable/pipeline.rb +14 -6
  141. data/lib/mongoid/criteria/queryable/selectable.rb +376 -90
  142. data/lib/mongoid/criteria/queryable/selector.rb +43 -36
  143. data/lib/mongoid/criteria/queryable/smash.rb +2 -0
  144. data/lib/mongoid/criteria/queryable/storable.rb +233 -0
  145. data/lib/mongoid/criteria/queryable.rb +7 -2
  146. data/lib/mongoid/criteria/scopable.rb +2 -0
  147. data/lib/mongoid/criteria.rb +27 -6
  148. data/lib/mongoid/document.rb +16 -4
  149. data/lib/mongoid/equality.rb +3 -2
  150. data/lib/mongoid/errors/ambiguous_relationship.rb +4 -2
  151. data/lib/mongoid/errors/callback.rb +2 -0
  152. data/lib/mongoid/errors/criteria_argument_required.rb +19 -0
  153. data/lib/mongoid/errors/delete_restriction.rb +3 -2
  154. data/lib/mongoid/errors/document_not_destroyed.rb +2 -0
  155. data/lib/mongoid/errors/document_not_found.rb +2 -0
  156. data/lib/mongoid/errors/eager_load.rb +6 -2
  157. data/lib/mongoid/errors/in_memory_collation_not_supported.rb +2 -0
  158. data/lib/mongoid/errors/invalid_collection.rb +2 -0
  159. data/lib/mongoid/errors/invalid_config_option.rb +2 -0
  160. data/lib/mongoid/errors/invalid_dependent_strategy.rb +34 -0
  161. data/lib/mongoid/errors/invalid_field.rb +2 -0
  162. data/lib/mongoid/errors/invalid_field_option.rb +2 -0
  163. data/lib/mongoid/errors/invalid_find.rb +2 -0
  164. data/lib/mongoid/errors/invalid_includes.rb +2 -0
  165. data/lib/mongoid/errors/invalid_index.rb +2 -0
  166. data/lib/mongoid/errors/invalid_options.rb +4 -2
  167. data/lib/mongoid/errors/invalid_path.rb +2 -0
  168. data/lib/mongoid/errors/invalid_persistence_option.rb +2 -0
  169. data/lib/mongoid/errors/invalid_relation.rb +4 -2
  170. data/lib/mongoid/errors/invalid_relation_option.rb +31 -0
  171. data/lib/mongoid/errors/invalid_scope.rb +2 -0
  172. data/lib/mongoid/errors/invalid_session_use.rb +2 -0
  173. data/lib/mongoid/errors/invalid_set_polymorphic_relation.rb +6 -4
  174. data/lib/mongoid/errors/invalid_storage_options.rb +2 -0
  175. data/lib/mongoid/errors/invalid_storage_parent.rb +2 -0
  176. data/lib/mongoid/errors/invalid_time.rb +2 -0
  177. data/lib/mongoid/errors/invalid_value.rb +2 -0
  178. data/lib/mongoid/errors/inverse_not_found.rb +3 -1
  179. data/lib/mongoid/errors/mixed_client_configuration.rb +2 -0
  180. data/lib/mongoid/errors/mixed_relations.rb +2 -0
  181. data/lib/mongoid/errors/mongoid_error.rb +2 -0
  182. data/lib/mongoid/errors/nested_attributes_metadata_not_found.rb +3 -1
  183. data/lib/mongoid/errors/no_client_config.rb +4 -2
  184. data/lib/mongoid/errors/no_client_database.rb +2 -0
  185. data/lib/mongoid/errors/no_client_hosts.rb +2 -0
  186. data/lib/mongoid/errors/no_clients_config.rb +2 -0
  187. data/lib/mongoid/errors/no_default_client.rb +3 -1
  188. data/lib/mongoid/errors/no_environment.rb +2 -0
  189. data/lib/mongoid/errors/no_map_reduce_output.rb +2 -0
  190. data/lib/mongoid/errors/no_metadata.rb +2 -0
  191. data/lib/mongoid/errors/no_parent.rb +2 -0
  192. data/lib/mongoid/errors/readonly_attribute.rb +2 -0
  193. data/lib/mongoid/errors/readonly_document.rb +2 -0
  194. data/lib/mongoid/errors/scope_overwrite.rb +2 -0
  195. data/lib/mongoid/errors/too_many_nested_attribute_records.rb +3 -0
  196. data/lib/mongoid/errors/unknown_attribute.rb +2 -0
  197. data/lib/mongoid/errors/unknown_model.rb +27 -0
  198. data/lib/mongoid/errors/unsaved_document.rb +2 -0
  199. data/lib/mongoid/errors/unsupported_javascript.rb +2 -0
  200. data/lib/mongoid/errors/validations.rb +2 -0
  201. data/lib/mongoid/errors.rb +6 -0
  202. data/lib/mongoid/evolvable.rb +3 -1
  203. data/lib/mongoid/extensions/array.rb +28 -11
  204. data/lib/mongoid/extensions/big_decimal.rb +2 -0
  205. data/lib/mongoid/extensions/boolean.rb +2 -0
  206. data/lib/mongoid/extensions/date.rb +13 -3
  207. data/lib/mongoid/extensions/date_time.rb +4 -3
  208. data/lib/mongoid/extensions/decimal128.rb +2 -0
  209. data/lib/mongoid/extensions/false_class.rb +2 -0
  210. data/lib/mongoid/extensions/float.rb +5 -3
  211. data/lib/mongoid/extensions/hash.rb +56 -11
  212. data/lib/mongoid/extensions/integer.rb +5 -3
  213. data/lib/mongoid/extensions/module.rb +2 -0
  214. data/lib/mongoid/extensions/nil_class.rb +2 -0
  215. data/lib/mongoid/extensions/object.rb +20 -8
  216. data/lib/mongoid/extensions/object_id.rb +2 -0
  217. data/lib/mongoid/extensions/range.rb +3 -0
  218. data/lib/mongoid/extensions/regexp.rb +3 -1
  219. data/lib/mongoid/extensions/set.rb +2 -0
  220. data/lib/mongoid/extensions/string.rb +23 -12
  221. data/lib/mongoid/extensions/symbol.rb +2 -0
  222. data/lib/mongoid/extensions/time.rb +14 -0
  223. data/lib/mongoid/extensions/time_with_zone.rb +14 -0
  224. data/lib/mongoid/extensions/true_class.rb +2 -0
  225. data/lib/mongoid/extensions.rb +2 -4
  226. data/lib/mongoid/factory.rb +38 -5
  227. data/lib/mongoid/fields/foreign_key.rb +8 -6
  228. data/lib/mongoid/fields/localized.rb +2 -0
  229. data/lib/mongoid/fields/standard.rb +8 -17
  230. data/lib/mongoid/fields/validators/macro.rb +17 -3
  231. data/lib/mongoid/fields/validators.rb +2 -0
  232. data/lib/mongoid/fields.rb +8 -5
  233. data/lib/mongoid/findable.rb +9 -4
  234. data/lib/mongoid/indexable/specification.rb +3 -1
  235. data/lib/mongoid/indexable/validators/options.rb +2 -0
  236. data/lib/mongoid/indexable.rb +7 -2
  237. data/lib/mongoid/inspectable.rb +3 -1
  238. data/lib/mongoid/interceptable.rb +17 -9
  239. data/lib/mongoid/loggable.rb +13 -7
  240. data/lib/mongoid/matchable/all.rb +6 -3
  241. data/lib/mongoid/matchable/and.rb +3 -1
  242. data/lib/mongoid/matchable/default.rb +73 -24
  243. data/lib/mongoid/matchable/elem_match.rb +11 -3
  244. data/lib/mongoid/matchable/eq.rb +23 -0
  245. data/lib/mongoid/matchable/exists.rb +2 -0
  246. data/lib/mongoid/matchable/gt.rb +2 -0
  247. data/lib/mongoid/matchable/gte.rb +2 -0
  248. data/lib/mongoid/matchable/in.rb +2 -0
  249. data/lib/mongoid/matchable/lt.rb +2 -0
  250. data/lib/mongoid/matchable/lte.rb +2 -0
  251. data/lib/mongoid/matchable/ne.rb +3 -1
  252. data/lib/mongoid/matchable/nin.rb +2 -0
  253. data/lib/mongoid/matchable/nor.rb +2 -1
  254. data/lib/mongoid/matchable/or.rb +2 -0
  255. data/lib/mongoid/matchable/regexp.rb +5 -2
  256. data/lib/mongoid/matchable/size.rb +2 -0
  257. data/lib/mongoid/matchable.rb +19 -16
  258. data/lib/mongoid/persistable/creatable.rb +3 -1
  259. data/lib/mongoid/persistable/deletable.rb +10 -7
  260. data/lib/mongoid/persistable/destroyable.rb +3 -1
  261. data/lib/mongoid/persistable/incrementable.rb +7 -3
  262. data/lib/mongoid/persistable/logical.rb +5 -2
  263. data/lib/mongoid/persistable/poppable.rb +3 -1
  264. data/lib/mongoid/persistable/pullable.rb +3 -1
  265. data/lib/mongoid/persistable/pushable.rb +14 -3
  266. data/lib/mongoid/persistable/renamable.rb +10 -3
  267. data/lib/mongoid/persistable/savable.rb +3 -1
  268. data/lib/mongoid/persistable/settable.rb +60 -13
  269. data/lib/mongoid/persistable/unsettable.rb +8 -3
  270. data/lib/mongoid/persistable/updatable.rb +3 -1
  271. data/lib/mongoid/persistable/upsertable.rb +3 -1
  272. data/lib/mongoid/persistable.rb +136 -19
  273. data/lib/mongoid/persistence_context.rb +47 -20
  274. data/lib/mongoid/positional.rb +3 -1
  275. data/lib/mongoid/query_cache.rb +76 -29
  276. data/lib/mongoid/railtie.rb +3 -1
  277. data/lib/mongoid/railties/controller_runtime.rb +4 -1
  278. data/lib/mongoid/railties/database.rake +9 -0
  279. data/lib/mongoid/reloadable.rb +4 -2
  280. data/lib/mongoid/scopable.rb +2 -1
  281. data/lib/mongoid/selectable.rb +3 -1
  282. data/lib/mongoid/serializable.rb +27 -17
  283. data/lib/mongoid/shardable.rb +60 -6
  284. data/lib/mongoid/stateful.rb +3 -1
  285. data/lib/mongoid/tasks/database.rake +12 -5
  286. data/lib/mongoid/tasks/database.rb +85 -0
  287. data/lib/mongoid/threaded/lifecycle.rb +2 -0
  288. data/lib/mongoid/threaded.rb +2 -0
  289. data/lib/mongoid/timestamps/created/short.rb +2 -0
  290. data/lib/mongoid/timestamps/created.rb +3 -1
  291. data/lib/mongoid/timestamps/short.rb +2 -0
  292. data/lib/mongoid/timestamps/timeless.rb +6 -2
  293. data/lib/mongoid/timestamps/updated/short.rb +2 -0
  294. data/lib/mongoid/timestamps/updated.rb +3 -1
  295. data/lib/mongoid/timestamps.rb +3 -1
  296. data/lib/mongoid/touchable.rb +110 -0
  297. data/lib/mongoid/traversable.rb +7 -5
  298. data/lib/mongoid/validatable/associated.rb +4 -2
  299. data/lib/mongoid/validatable/format.rb +2 -0
  300. data/lib/mongoid/validatable/length.rb +2 -0
  301. data/lib/mongoid/validatable/localizable.rb +2 -0
  302. data/lib/mongoid/validatable/macros.rb +3 -1
  303. data/lib/mongoid/validatable/presence.rb +6 -4
  304. data/lib/mongoid/validatable/queryable.rb +2 -0
  305. data/lib/mongoid/validatable/uniqueness.rb +9 -7
  306. data/lib/mongoid/validatable.rb +15 -13
  307. data/lib/mongoid/version.rb +3 -1
  308. data/lib/mongoid.rb +11 -2
  309. data/lib/rails/generators/mongoid/config/config_generator.rb +2 -0
  310. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +44 -26
  311. data/lib/rails/generators/mongoid/model/model_generator.rb +3 -1
  312. data/lib/rails/generators/mongoid/model/templates/model.rb.tt +1 -1
  313. data/lib/rails/generators/mongoid_generator.rb +2 -0
  314. data/lib/rails/mongoid.rb +4 -2
  315. data/lib/support/ruby_version.rb +3 -0
  316. data/spec/README.md +18 -0
  317. data/spec/app/models/account.rb +3 -0
  318. data/spec/app/models/acolyte.rb +3 -0
  319. data/spec/app/models/actor.rb +3 -0
  320. data/spec/app/models/actress.rb +3 -0
  321. data/spec/app/models/address.rb +3 -0
  322. data/spec/app/models/address_component.rb +3 -0
  323. data/spec/app/models/address_number.rb +3 -0
  324. data/spec/app/models/agency.rb +3 -0
  325. data/spec/app/models/agent.rb +3 -0
  326. data/spec/app/models/album.rb +3 -0
  327. data/spec/app/models/alert.rb +3 -0
  328. data/spec/app/models/animal.rb +5 -1
  329. data/spec/app/models/answer.rb +3 -0
  330. data/spec/app/models/appointment.rb +3 -0
  331. data/spec/app/models/array_field.rb +1 -0
  332. data/spec/app/models/article.rb +3 -0
  333. data/spec/app/models/artist.rb +3 -0
  334. data/spec/app/models/artwork.rb +3 -0
  335. data/spec/app/models/audio.rb +3 -0
  336. data/spec/app/models/augmentation.rb +3 -0
  337. data/spec/app/models/author.rb +3 -0
  338. data/spec/app/models/baby.rb +3 -0
  339. data/spec/app/models/band.rb +3 -0
  340. data/spec/app/models/bar.rb +3 -0
  341. data/spec/app/models/basic.rb +3 -0
  342. data/spec/app/models/bed.rb +3 -0
  343. data/spec/app/models/big_palette.rb +3 -0
  344. data/spec/app/models/birthday.rb +3 -0
  345. data/spec/app/models/bomb.rb +4 -1
  346. data/spec/app/models/book.rb +3 -0
  347. data/spec/app/models/breed.rb +3 -0
  348. data/spec/app/models/browser.rb +3 -0
  349. data/spec/app/models/building.rb +3 -0
  350. data/spec/app/models/building_address.rb +3 -0
  351. data/spec/app/models/bus.rb +3 -0
  352. data/spec/app/models/business.rb +3 -0
  353. data/spec/app/models/callback_test.rb +3 -0
  354. data/spec/app/models/canvas.rb +3 -0
  355. data/spec/app/models/car.rb +3 -0
  356. data/spec/app/models/cat.rb +3 -0
  357. data/spec/app/models/category.rb +3 -0
  358. data/spec/app/models/child.rb +3 -0
  359. data/spec/app/models/child_doc.rb +3 -0
  360. data/spec/app/models/church.rb +3 -0
  361. data/spec/app/models/circle.rb +3 -0
  362. data/spec/app/models/circuit.rb +3 -0
  363. data/spec/app/models/circus.rb +3 -0
  364. data/spec/app/models/code.rb +3 -0
  365. data/spec/app/models/coding/pull_request.rb +12 -0
  366. data/spec/app/models/coding.rb +4 -0
  367. data/spec/app/models/comment.rb +3 -0
  368. data/spec/app/models/company.rb +3 -0
  369. data/spec/app/models/consumption_period.rb +3 -0
  370. data/spec/app/models/contextable_item.rb +3 -0
  371. data/spec/app/models/contractor.rb +3 -0
  372. data/spec/app/models/cookie.rb +3 -0
  373. data/spec/app/models/country_code.rb +3 -0
  374. data/spec/app/models/courier_job.rb +3 -0
  375. data/spec/app/models/customer.rb +11 -0
  376. data/spec/app/models/customer_address.rb +12 -0
  377. data/spec/app/models/definition.rb +3 -0
  378. data/spec/app/models/delegating_patient.rb +16 -0
  379. data/spec/app/models/description.rb +3 -0
  380. data/spec/app/models/dictionary.rb +9 -0
  381. data/spec/app/models/division.rb +3 -0
  382. data/spec/app/models/doctor.rb +3 -0
  383. data/spec/app/models/dog.rb +3 -0
  384. data/spec/app/models/dokument.rb +3 -0
  385. data/spec/app/models/draft.rb +3 -0
  386. data/spec/app/models/dragon.rb +3 -0
  387. data/spec/app/models/driver.rb +3 -0
  388. data/spec/app/models/drug.rb +3 -0
  389. data/spec/app/models/dungeon.rb +3 -0
  390. data/spec/app/models/edit.rb +3 -0
  391. data/spec/app/models/email.rb +3 -0
  392. data/spec/app/models/employer.rb +3 -0
  393. data/spec/app/models/entry.rb +3 -0
  394. data/spec/app/models/eraser.rb +3 -0
  395. data/spec/app/models/even.rb +3 -0
  396. data/spec/app/models/event.rb +3 -0
  397. data/spec/app/models/exhibition.rb +3 -0
  398. data/spec/app/models/exhibitor.rb +3 -0
  399. data/spec/app/models/explosion.rb +3 -0
  400. data/spec/app/models/eye.rb +3 -0
  401. data/spec/app/models/eye_bowl.rb +3 -0
  402. data/spec/app/models/face.rb +3 -0
  403. data/spec/app/models/favorite.rb +3 -0
  404. data/spec/app/models/filesystem.rb +3 -0
  405. data/spec/app/models/fire_hydrant.rb +3 -0
  406. data/spec/app/models/firefox.rb +3 -0
  407. data/spec/app/models/fish.rb +3 -0
  408. data/spec/app/models/folder.rb +3 -0
  409. data/spec/app/models/folder_item.rb +3 -0
  410. data/spec/app/models/fruits.rb +3 -0
  411. data/spec/app/models/game.rb +3 -0
  412. data/spec/app/models/ghost.rb +3 -0
  413. data/spec/app/models/home.rb +3 -0
  414. data/spec/app/models/house.rb +3 -0
  415. data/spec/app/models/html_writer.rb +3 -0
  416. data/spec/app/models/id_key.rb +3 -0
  417. data/spec/app/models/image.rb +3 -0
  418. data/spec/app/models/implant.rb +3 -0
  419. data/spec/app/models/item.rb +3 -0
  420. data/spec/app/models/jar.rb +3 -0
  421. data/spec/app/models/kaleidoscope.rb +3 -0
  422. data/spec/app/models/kangaroo.rb +4 -1
  423. data/spec/app/models/label.rb +3 -0
  424. data/spec/app/models/language.rb +3 -0
  425. data/spec/app/models/lat_lng.rb +3 -0
  426. data/spec/app/models/league.rb +3 -0
  427. data/spec/app/models/learner.rb +3 -0
  428. data/spec/app/models/line_item.rb +3 -0
  429. data/spec/app/models/location.rb +3 -0
  430. data/spec/app/models/login.rb +3 -0
  431. data/spec/app/models/manufacturer.rb +3 -0
  432. data/spec/app/models/meat.rb +3 -0
  433. data/spec/app/models/membership.rb +3 -0
  434. data/spec/app/models/message.rb +4 -1
  435. data/spec/app/models/minim.rb +7 -0
  436. data/spec/app/models/mixed_drink.rb +3 -0
  437. data/spec/app/models/movie.rb +3 -0
  438. data/spec/app/models/my_hash.rb +3 -0
  439. data/spec/app/models/name.rb +3 -0
  440. data/spec/app/models/name_only.rb +9 -0
  441. data/spec/app/models/node.rb +3 -0
  442. data/spec/app/models/note.rb +3 -0
  443. data/spec/app/models/odd.rb +3 -0
  444. data/spec/app/models/ordered_post.rb +3 -0
  445. data/spec/app/models/ordered_preference.rb +3 -0
  446. data/spec/app/models/oscar.rb +3 -0
  447. data/spec/app/models/other_owner_object.rb +5 -0
  448. data/spec/app/models/override.rb +3 -0
  449. data/spec/app/models/ownable.rb +3 -0
  450. data/spec/app/models/owner.rb +3 -0
  451. data/spec/app/models/pack.rb +3 -0
  452. data/spec/app/models/page.rb +3 -0
  453. data/spec/app/models/page_question.rb +3 -0
  454. data/spec/app/models/palette.rb +3 -0
  455. data/spec/app/models/parent.rb +3 -0
  456. data/spec/app/models/parent_doc.rb +3 -0
  457. data/spec/app/models/passport.rb +4 -0
  458. data/spec/app/models/patient.rb +3 -0
  459. data/spec/app/models/pdf_writer.rb +3 -0
  460. data/spec/app/models/pencil.rb +3 -0
  461. data/spec/app/models/person.rb +10 -2
  462. data/spec/app/models/pet.rb +3 -0
  463. data/spec/app/models/pet_owner.rb +3 -0
  464. data/spec/app/models/phone.rb +4 -0
  465. data/spec/app/models/pizza.rb +3 -0
  466. data/spec/app/models/player.rb +3 -0
  467. data/spec/app/models/post.rb +3 -0
  468. data/spec/app/models/post_genre.rb +3 -0
  469. data/spec/app/models/powerup.rb +3 -0
  470. data/spec/app/models/preference.rb +3 -0
  471. data/spec/app/models/princess.rb +3 -0
  472. data/spec/app/models/product.rb +3 -0
  473. data/spec/app/models/profile.rb +3 -0
  474. data/spec/app/models/pronunciation.rb +3 -0
  475. data/spec/app/models/pub.rb +3 -0
  476. data/spec/app/models/publication/encyclopedia.rb +12 -0
  477. data/spec/app/models/publication/review.rb +14 -0
  478. data/spec/app/models/publication.rb +5 -0
  479. data/spec/app/models/purchase.rb +3 -0
  480. data/spec/app/models/question.rb +3 -0
  481. data/spec/app/models/quiz.rb +3 -0
  482. data/spec/app/models/rating.rb +3 -0
  483. data/spec/app/models/record.rb +3 -0
  484. data/spec/app/models/registry.rb +3 -0
  485. data/spec/app/models/role.rb +3 -0
  486. data/spec/app/models/root_category.rb +3 -0
  487. data/spec/app/models/sandwich.rb +3 -0
  488. data/spec/app/models/scheduler.rb +3 -0
  489. data/spec/app/models/seo.rb +3 -0
  490. data/spec/app/models/series.rb +4 -0
  491. data/spec/app/models/server.rb +3 -0
  492. data/spec/app/models/service.rb +3 -0
  493. data/spec/app/models/shape.rb +3 -0
  494. data/spec/app/models/shelf.rb +3 -0
  495. data/spec/app/models/shipment_address.rb +4 -0
  496. data/spec/app/models/shipping_container.rb +3 -0
  497. data/spec/app/models/shipping_pack.rb +3 -0
  498. data/spec/app/models/shop.rb +3 -0
  499. data/spec/app/models/short_agent.rb +3 -0
  500. data/spec/app/models/short_quiz.rb +3 -0
  501. data/spec/app/models/simple.rb +3 -0
  502. data/spec/app/models/slave.rb +3 -0
  503. data/spec/app/models/song.rb +3 -0
  504. data/spec/app/models/sound.rb +3 -0
  505. data/spec/app/models/square.rb +3 -0
  506. data/spec/app/models/staff.rb +3 -0
  507. data/spec/app/models/store_as_dup_test1.rb +3 -0
  508. data/spec/app/models/store_as_dup_test2.rb +3 -0
  509. data/spec/app/models/store_as_dup_test3.rb +8 -0
  510. data/spec/app/models/store_as_dup_test4.rb +8 -0
  511. data/spec/app/models/strategy.rb +3 -0
  512. data/spec/app/models/sub_item.rb +3 -0
  513. data/spec/app/models/subscription.rb +3 -0
  514. data/spec/app/models/survey.rb +3 -0
  515. data/spec/app/models/symptom.rb +3 -0
  516. data/spec/app/models/tag.rb +3 -0
  517. data/spec/app/models/target.rb +3 -0
  518. data/spec/app/models/template.rb +3 -0
  519. data/spec/app/models/thing.rb +3 -0
  520. data/spec/app/models/title.rb +3 -0
  521. data/spec/app/models/tool.rb +3 -0
  522. data/spec/app/models/topping.rb +3 -0
  523. data/spec/app/models/track.rb +3 -0
  524. data/spec/app/models/translation.rb +3 -0
  525. data/spec/app/models/tree.rb +3 -0
  526. data/spec/app/models/truck.rb +3 -0
  527. data/spec/app/models/updatable.rb +8 -0
  528. data/spec/app/models/user.rb +3 -0
  529. data/spec/app/models/user_account.rb +3 -0
  530. data/spec/app/models/validation_callback.rb +3 -0
  531. data/spec/app/models/vehicle.rb +3 -0
  532. data/spec/app/models/version.rb +3 -0
  533. data/spec/app/models/vertex.rb +9 -0
  534. data/spec/app/models/vet_visit.rb +3 -0
  535. data/spec/app/models/video.rb +3 -0
  536. data/spec/app/models/video_game.rb +3 -0
  537. data/spec/app/models/weapon.rb +3 -0
  538. data/spec/app/models/wiki_page.rb +5 -1
  539. data/spec/app/models/word.rb +3 -0
  540. data/spec/app/models/word_origin.rb +3 -0
  541. data/spec/app/models/writer.rb +3 -0
  542. data/spec/config/mongoid.yml +14 -3
  543. data/spec/integration/app_spec.rb +287 -0
  544. data/spec/integration/associations/belongs_to_spec.rb +16 -0
  545. data/spec/integration/associations/embedded_spec.rb +175 -0
  546. data/spec/integration/associations/embeds_many_spec.rb +24 -0
  547. data/spec/integration/associations/embeds_one_spec.rb +24 -0
  548. data/spec/integration/associations/foreign_key_spec.rb +99 -0
  549. data/spec/integration/associations/foreign_key_spec_models.rb +65 -0
  550. data/spec/integration/associations/has_many_spec.rb +76 -0
  551. data/spec/integration/associations/has_one_spec.rb +76 -0
  552. data/spec/integration/associations/reverse_population_spec.rb +35 -0
  553. data/spec/integration/associations/reverse_population_spec_models.rb +37 -0
  554. data/spec/integration/bson_regexp_raw_spec.rb +20 -0
  555. data/spec/integration/callbacks_models.rb +49 -0
  556. data/spec/integration/callbacks_spec.rb +216 -0
  557. data/spec/integration/criteria/date_field_spec.rb +41 -0
  558. data/spec/integration/criteria/default_scope_spec.rb +21 -0
  559. data/spec/integration/criteria/logical_spec.rb +94 -0
  560. data/spec/integration/criteria/time_with_zone_spec.rb +32 -0
  561. data/spec/integration/document_spec.rb +22 -0
  562. data/spec/integration/i18n_fallbacks_spec.rb +90 -0
  563. data/spec/integration/matchable_spec.rb +680 -0
  564. data/spec/integration/shardable_spec.rb +149 -0
  565. data/spec/lite_spec_helper.rb +75 -0
  566. data/spec/mongoid/{relations → association}/accessors_spec.rb +281 -64
  567. data/spec/mongoid/{relations → association}/auto_save_spec.rb +63 -12
  568. data/spec/mongoid/{relations → association}/builders_spec.rb +4 -1
  569. data/spec/mongoid/association/constrainable_spec.rb +118 -0
  570. data/spec/mongoid/{relations → association}/counter_cache_spec.rb +4 -1
  571. data/spec/mongoid/association/depending_spec.rb +869 -0
  572. data/spec/mongoid/{relations → association}/eager_spec.rb +15 -12
  573. data/spec/mongoid/{relations → association/embedded}/cyclic_spec.rb +4 -1
  574. data/spec/mongoid/{relations → association}/embedded/dirty_spec.rb +3 -0
  575. data/spec/mongoid/{relations/bindings/embedded/in_spec.rb → association/embedded/embedded_in/binding_spec.rb} +16 -13
  576. data/spec/mongoid/association/embedded/embedded_in/buildable_spec.rb +37 -0
  577. data/spec/mongoid/{relations/embedded/in_spec.rb → association/embedded/embedded_in/proxy_spec.rb} +58 -77
  578. data/spec/mongoid/association/embedded/embedded_in_spec.rb +904 -0
  579. data/spec/mongoid/{relations/bindings/embedded/many_spec.rb → association/embedded/embeds_many/binding_spec.rb} +6 -3
  580. data/spec/mongoid/{relations/builders/embedded/many_spec.rb → association/embedded/embeds_many/buildable_spec.rb} +20 -45
  581. data/spec/mongoid/{relations/embedded/many_spec.rb → association/embedded/embeds_many/proxy_spec.rb} +127 -182
  582. data/spec/mongoid/association/embedded/embeds_many_models.rb +53 -0
  583. data/spec/mongoid/association/embedded/embeds_many_query_spec.rb +52 -0
  584. data/spec/mongoid/association/embedded/embeds_many_spec.rb +865 -0
  585. data/spec/mongoid/{relations/bindings/embedded/one_spec.rb → association/embedded/embeds_one/binding_spec.rb} +7 -4
  586. data/spec/mongoid/{relations/builders/embedded/one_spec.rb → association/embedded/embeds_one/buildable_spec.rb} +17 -34
  587. data/spec/mongoid/{relations/embedded/one_spec.rb → association/embedded/embeds_one/proxy_spec.rb} +42 -84
  588. data/spec/mongoid/association/embedded/embeds_one_dnl_models.rb +9 -0
  589. data/spec/mongoid/association/embedded/embeds_one_models.rb +54 -0
  590. data/spec/mongoid/association/embedded/embeds_one_query_spec.rb +29 -0
  591. data/spec/mongoid/association/embedded/embeds_one_spec.rb +957 -0
  592. data/spec/mongoid/{relations → association}/macros_spec.rb +151 -73
  593. data/spec/mongoid/{relations/builders/nested_attributes → association/nested}/many_spec.rb +19 -19
  594. data/spec/mongoid/{relations/builders/nested_attributes → association/nested}/one_spec.rb +20 -20
  595. data/spec/mongoid/association/options_spec.rb +1324 -0
  596. data/spec/mongoid/{relations → association}/polymorphic_spec.rb +69 -34
  597. data/spec/mongoid/{relations/bindings/referenced/in_spec.rb → association/referenced/belongs_to/binding_spec.rb} +10 -7
  598. data/spec/mongoid/{relations/builders/referenced/in_spec.rb → association/referenced/belongs_to/buildable_spec.rb} +49 -79
  599. data/spec/mongoid/association/referenced/belongs_to/eager_spec.rb +377 -0
  600. data/spec/mongoid/{relations/referenced/in_spec.rb → association/referenced/belongs_to/proxy_spec.rb} +60 -91
  601. data/spec/mongoid/association/referenced/belongs_to_query_spec.rb +38 -0
  602. data/spec/mongoid/association/referenced/belongs_to_spec.rb +2026 -0
  603. data/spec/mongoid/{relations/bindings/referenced/many_to_many_spec.rb → association/referenced/has_and_belongs_to_many/binding_spec.rb} +8 -5
  604. data/spec/mongoid/association/referenced/has_and_belongs_to_many/buildable_spec.rb +124 -0
  605. data/spec/mongoid/{relations/eager/has_and_belongs_to_many_spec.rb → association/referenced/has_and_belongs_to_many/eager_spec.rb} +42 -7
  606. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_persistence_spec.rb +77 -0
  607. data/spec/mongoid/{relations/referenced/many_to_many_spec.rb → association/referenced/has_and_belongs_to_many/proxy_spec.rb} +283 -112
  608. data/spec/mongoid/association/referenced/has_and_belongs_to_many_models.rb +50 -0
  609. data/spec/mongoid/association/referenced/has_and_belongs_to_many_query_spec.rb +40 -0
  610. data/spec/mongoid/association/referenced/has_and_belongs_to_many_spec.rb +1051 -0
  611. data/spec/mongoid/{relations/bindings/referenced/many_spec.rb → association/referenced/has_many/binding_spec.rb} +8 -5
  612. data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +122 -0
  613. data/spec/mongoid/{relations/eager/has_many_spec.rb → association/referenced/has_many/eager_spec.rb} +43 -13
  614. data/spec/mongoid/{relations/targets → association/referenced/has_many}/enumerable_spec.rb +230 -1
  615. data/spec/mongoid/association/referenced/has_many/proxy_query_spec.rb +24 -0
  616. data/spec/mongoid/{relations/referenced/many_spec.rb → association/referenced/has_many/proxy_spec.rb} +33 -94
  617. data/spec/mongoid/association/referenced/has_many_models.rb +40 -0
  618. data/spec/mongoid/association/referenced/has_many_query_spec.rb +38 -0
  619. data/spec/mongoid/association/referenced/has_many_spec.rb +1228 -0
  620. data/spec/mongoid/{relations/bindings/referenced/one_spec.rb → association/referenced/has_one/binding_spec.rb} +7 -4
  621. data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +116 -0
  622. data/spec/mongoid/{relations/eager/has_one_spec.rb → association/referenced/has_one/eager_spec.rb} +27 -12
  623. data/spec/mongoid/{relations/referenced/one_spec.rb → association/referenced/has_one/proxy_spec.rb} +12 -109
  624. data/spec/mongoid/association/referenced/has_one_models.rb +51 -0
  625. data/spec/mongoid/association/referenced/has_one_query_spec.rb +38 -0
  626. data/spec/mongoid/association/referenced/has_one_spec.rb +1363 -0
  627. data/spec/mongoid/{relations → association}/reflections_spec.rb +4 -12
  628. data/spec/mongoid/{relations/synchronization_spec.rb → association/syncable_spec.rb} +7 -2
  629. data/spec/mongoid/{relations_spec.rb → association_spec.rb} +4 -1
  630. data/spec/mongoid/atomic/modifiers_spec.rb +5 -2
  631. data/spec/mongoid/atomic/paths/embedded/many_spec.rb +3 -0
  632. data/spec/mongoid/atomic/paths/embedded/one_spec.rb +3 -0
  633. data/spec/mongoid/atomic/paths/root_spec.rb +3 -0
  634. data/spec/mongoid/atomic/paths_spec.rb +44 -0
  635. data/spec/mongoid/atomic_spec.rb +7 -4
  636. data/spec/mongoid/attributes/dynamic_spec.rb +153 -0
  637. data/spec/mongoid/attributes/nested_spec.rb +32 -11
  638. data/spec/mongoid/attributes/readonly_spec.rb +83 -125
  639. data/spec/mongoid/attributes_spec.rb +60 -9
  640. data/spec/mongoid/cacheable_spec.rb +3 -0
  641. data/spec/mongoid/changeable_spec.rb +26 -0
  642. data/spec/mongoid/clients/factory_spec.rb +57 -33
  643. data/spec/mongoid/clients/options_spec.rb +81 -56
  644. data/spec/mongoid/clients/sessions_spec.rb +24 -8
  645. data/spec/mongoid/clients/transactions_spec.rb +393 -0
  646. data/spec/mongoid/clients_spec.rb +73 -10
  647. data/spec/mongoid/composable_spec.rb +3 -0
  648. data/spec/mongoid/config/environment_spec.rb +3 -0
  649. data/spec/mongoid/config/options_spec.rb +23 -3
  650. data/spec/mongoid/config_spec.rb +66 -1
  651. data/spec/mongoid/contextual/aggregable/memory_spec.rb +3 -0
  652. data/spec/mongoid/contextual/aggregable/mongo_spec.rb +3 -0
  653. data/spec/mongoid/contextual/atomic_spec.rb +120 -10
  654. data/spec/mongoid/contextual/geo_near_spec.rb +15 -2
  655. data/spec/mongoid/contextual/map_reduce_spec.rb +23 -5
  656. data/spec/mongoid/contextual/memory_spec.rb +22 -0
  657. data/spec/mongoid/contextual/mongo_spec.rb +113 -57
  658. data/spec/mongoid/contextual/none_spec.rb +3 -0
  659. data/spec/mongoid/copyable_spec.rb +93 -6
  660. data/spec/mongoid/copyable_spec_models.rb +20 -0
  661. data/spec/mongoid/criteria/findable_spec.rb +58 -0
  662. data/spec/mongoid/criteria/inspectable_spec.rb +3 -0
  663. data/spec/mongoid/criteria/marshalable_spec.rb +3 -0
  664. data/spec/mongoid/criteria/modifiable_spec.rb +180 -4
  665. data/spec/mongoid/criteria/options_spec.rb +3 -0
  666. data/spec/mongoid/criteria/queryable/aggregable_spec.rb +3 -0
  667. data/spec/mongoid/criteria/queryable/expandable_spec.rb +135 -0
  668. data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +3 -0
  669. data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +3 -0
  670. data/spec/mongoid/criteria/queryable/extensions/bignum_spec.rb +3 -0
  671. data/spec/mongoid/criteria/queryable/extensions/boolean_spec.rb +3 -0
  672. data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +3 -0
  673. data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +36 -17
  674. data/spec/mongoid/criteria/queryable/extensions/fixnum_spec.rb +3 -0
  675. data/spec/mongoid/criteria/queryable/extensions/float_spec.rb +3 -0
  676. data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +3 -0
  677. data/spec/mongoid/criteria/queryable/extensions/integer_spec.rb +3 -0
  678. data/spec/mongoid/criteria/queryable/extensions/nil_class_spec.rb +3 -0
  679. data/spec/mongoid/criteria/queryable/extensions/numeric_spec.rb +54 -0
  680. data/spec/mongoid/criteria/queryable/extensions/object_spec.rb +3 -0
  681. data/spec/mongoid/criteria/queryable/extensions/range_spec.rb +3 -0
  682. data/spec/mongoid/criteria/queryable/extensions/regexp_raw_spec.rb +4 -1
  683. data/spec/mongoid/criteria/queryable/extensions/regexp_spec.rb +10 -7
  684. data/spec/mongoid/criteria/queryable/extensions/set_spec.rb +3 -0
  685. data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +47 -1
  686. data/spec/mongoid/criteria/queryable/extensions/symbol_spec.rb +3 -0
  687. data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +43 -23
  688. data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +31 -1
  689. data/spec/mongoid/criteria/queryable/key_spec.rb +51 -6
  690. data/spec/mongoid/criteria/queryable/mergeable_spec.rb +48 -12
  691. data/spec/mongoid/criteria/queryable/optional_spec.rb +3 -0
  692. data/spec/mongoid/criteria/queryable/options_spec.rb +3 -0
  693. data/spec/mongoid/criteria/queryable/pipeline_spec.rb +15 -0
  694. data/spec/mongoid/criteria/queryable/queryable_spec.rb +3 -0
  695. data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +1865 -0
  696. data/spec/mongoid/criteria/queryable/selectable_spec.rb +1007 -2389
  697. data/spec/mongoid/criteria/queryable/selector_spec.rb +40 -0
  698. data/spec/mongoid/criteria/queryable/smash_spec.rb +3 -0
  699. data/spec/mongoid/criteria/queryable/storable_spec.rb +190 -0
  700. data/spec/mongoid/criteria/scopable_spec.rb +3 -0
  701. data/spec/mongoid/criteria_spec.rb +108 -19
  702. data/spec/mongoid/document_fields_spec.rb +88 -0
  703. data/spec/mongoid/document_persistence_context_spec.rb +33 -0
  704. data/spec/mongoid/document_query_spec.rb +39 -0
  705. data/spec/mongoid/document_spec.rb +32 -4
  706. data/spec/mongoid/equality_spec.rb +3 -0
  707. data/spec/mongoid/errors/ambiguous_relationship_spec.rb +6 -3
  708. data/spec/mongoid/errors/callback_spec.rb +3 -0
  709. data/spec/mongoid/errors/delete_restriction_spec.rb +3 -0
  710. data/spec/mongoid/errors/document_not_destroyed_spec.rb +3 -0
  711. data/spec/mongoid/errors/document_not_found_spec.rb +3 -0
  712. data/spec/mongoid/errors/eager_load_spec.rb +3 -0
  713. data/spec/mongoid/errors/invalid_collection_spec.rb +3 -0
  714. data/spec/mongoid/errors/invalid_config_option_spec.rb +3 -0
  715. data/spec/mongoid/errors/invalid_field_option_spec.rb +3 -0
  716. data/spec/mongoid/errors/invalid_field_spec.rb +3 -0
  717. data/spec/mongoid/errors/invalid_find_spec.rb +3 -0
  718. data/spec/mongoid/errors/invalid_includes_spec.rb +3 -0
  719. data/spec/mongoid/errors/invalid_index_spec.rb +3 -0
  720. data/spec/mongoid/errors/invalid_options_spec.rb +5 -2
  721. data/spec/mongoid/errors/invalid_path_spec.rb +3 -0
  722. data/spec/mongoid/errors/invalid_relation_spec.rb +5 -2
  723. data/spec/mongoid/errors/invalid_scope_spec.rb +3 -0
  724. data/spec/mongoid/errors/invalid_set_polymorphic_relation_spec.rb +3 -0
  725. data/spec/mongoid/errors/invalid_storage_options_spec.rb +3 -0
  726. data/spec/mongoid/errors/invalid_time_spec.rb +3 -0
  727. data/spec/mongoid/errors/inverse_not_found_spec.rb +4 -1
  728. data/spec/mongoid/errors/mixed_client_configuration_spec.rb +3 -0
  729. data/spec/mongoid/errors/mixed_relations_spec.rb +3 -0
  730. data/spec/mongoid/errors/mongoid_error_spec.rb +3 -0
  731. data/spec/mongoid/errors/nested_attributes_metadata_not_found_spec.rb +6 -3
  732. data/spec/mongoid/errors/no_client_config_spec.rb +5 -2
  733. data/spec/mongoid/errors/no_client_database_spec.rb +6 -3
  734. data/spec/mongoid/errors/no_client_hosts_spec.rb +6 -3
  735. data/spec/mongoid/errors/no_clients_config_spec.rb +3 -0
  736. data/spec/mongoid/errors/no_environment_spec.rb +3 -0
  737. data/spec/mongoid/errors/no_map_reduce_output_spec.rb +3 -0
  738. data/spec/mongoid/errors/no_metadata_spec.rb +5 -2
  739. data/spec/mongoid/errors/no_parent_spec.rb +4 -1
  740. data/spec/mongoid/errors/readonly_attribute_spec.rb +3 -0
  741. data/spec/mongoid/errors/readonly_document_spec.rb +3 -0
  742. data/spec/mongoid/errors/scope_overwrite_spec.rb +3 -0
  743. data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +3 -0
  744. data/spec/mongoid/errors/unknown_attribute_spec.rb +3 -0
  745. data/spec/mongoid/errors/unsaved_document_spec.rb +4 -1
  746. data/spec/mongoid/errors/unsupported_javascript_spec.rb +3 -0
  747. data/spec/mongoid/errors/validations_spec.rb +3 -0
  748. data/spec/mongoid/extensions/array_spec.rb +37 -58
  749. data/spec/mongoid/extensions/big_decimal_spec.rb +3 -0
  750. data/spec/mongoid/extensions/binary_spec.rb +3 -0
  751. data/spec/mongoid/extensions/boolean_spec.rb +3 -0
  752. data/spec/mongoid/extensions/date_class_mongoize_spec.rb +336 -0
  753. data/spec/mongoid/extensions/date_spec.rb +9 -160
  754. data/spec/mongoid/extensions/date_time_spec.rb +18 -60
  755. data/spec/mongoid/extensions/decimal128_spec.rb +3 -0
  756. data/spec/mongoid/extensions/false_class_spec.rb +3 -0
  757. data/spec/mongoid/extensions/float_spec.rb +18 -3
  758. data/spec/mongoid/extensions/hash_spec.rb +124 -1
  759. data/spec/mongoid/extensions/integer_spec.rb +15 -2
  760. data/spec/mongoid/extensions/module_spec.rb +3 -0
  761. data/spec/mongoid/extensions/nil_class_spec.rb +3 -0
  762. data/spec/mongoid/extensions/object_id_spec.rb +3 -0
  763. data/spec/mongoid/extensions/object_spec.rb +21 -35
  764. data/spec/mongoid/extensions/range_spec.rb +10 -0
  765. data/spec/mongoid/extensions/regexp_spec.rb +3 -0
  766. data/spec/mongoid/extensions/set_spec.rb +3 -0
  767. data/spec/mongoid/extensions/string_spec.rb +95 -33
  768. data/spec/mongoid/extensions/symbol_spec.rb +3 -0
  769. data/spec/mongoid/extensions/time_spec.rb +30 -0
  770. data/spec/mongoid/extensions/time_with_zone_spec.rb +34 -0
  771. data/spec/mongoid/extensions/true_class_spec.rb +3 -0
  772. data/spec/mongoid/extensions_spec.rb +3 -0
  773. data/spec/mongoid/factory_spec.rb +46 -1
  774. data/spec/mongoid/fields/foreign_key_spec.rb +27 -32
  775. data/spec/mongoid/fields/localized_spec.rb +3 -0
  776. data/spec/mongoid/fields/standard_spec.rb +3 -0
  777. data/spec/mongoid/fields_spec.rb +42 -1
  778. data/spec/mongoid/findable_spec.rb +4 -1
  779. data/spec/mongoid/indexable/specification_spec.rb +3 -0
  780. data/spec/mongoid/indexable_spec.rb +27 -12
  781. data/spec/mongoid/inspectable_spec.rb +3 -0
  782. data/spec/mongoid/interceptable_spec.rb +87 -1
  783. data/spec/mongoid/interceptable_spec_models.rb +76 -0
  784. data/spec/mongoid/loggable_spec.rb +3 -0
  785. data/spec/mongoid/matchable/all_spec.rb +3 -0
  786. data/spec/mongoid/matchable/and_spec.rb +3 -0
  787. data/spec/mongoid/matchable/default_spec.rb +13 -3
  788. data/spec/mongoid/matchable/elem_match_spec.rb +23 -0
  789. data/spec/mongoid/matchable/eq_spec.rb +49 -0
  790. data/spec/mongoid/matchable/exists_spec.rb +3 -0
  791. data/spec/mongoid/matchable/gt_spec.rb +3 -0
  792. data/spec/mongoid/matchable/gte_spec.rb +3 -0
  793. data/spec/mongoid/matchable/in_spec.rb +3 -0
  794. data/spec/mongoid/matchable/lt_spec.rb +3 -0
  795. data/spec/mongoid/matchable/lte_spec.rb +3 -0
  796. data/spec/mongoid/matchable/ne_spec.rb +3 -0
  797. data/spec/mongoid/matchable/nin_spec.rb +3 -0
  798. data/spec/mongoid/matchable/nor_spec.rb +1 -0
  799. data/spec/mongoid/matchable/or_spec.rb +3 -0
  800. data/spec/mongoid/matchable/regexp_spec.rb +5 -2
  801. data/spec/mongoid/matchable/size_spec.rb +3 -0
  802. data/spec/mongoid/matchable_spec.rb +5 -2
  803. data/spec/mongoid/persistable/creatable_spec.rb +3 -0
  804. data/spec/mongoid/persistable/deletable_spec.rb +3 -0
  805. data/spec/mongoid/persistable/destroyable_spec.rb +3 -0
  806. data/spec/mongoid/persistable/incrementable_spec.rb +17 -0
  807. data/spec/mongoid/persistable/logical_spec.rb +17 -0
  808. data/spec/mongoid/persistable/poppable_spec.rb +17 -0
  809. data/spec/mongoid/persistable/pullable_spec.rb +31 -0
  810. data/spec/mongoid/persistable/pushable_spec.rb +86 -1
  811. data/spec/mongoid/persistable/renamable_spec.rb +17 -0
  812. data/spec/mongoid/persistable/savable_spec.rb +5 -2
  813. data/spec/mongoid/persistable/settable_spec.rb +112 -10
  814. data/spec/mongoid/persistable/unsettable_spec.rb +17 -0
  815. data/spec/mongoid/persistable/updatable_spec.rb +3 -0
  816. data/spec/mongoid/persistable/upsertable_spec.rb +3 -0
  817. data/spec/mongoid/persistable_spec.rb +106 -14
  818. data/spec/mongoid/persistence_context_spec.rb +4 -1
  819. data/spec/mongoid/positional_spec.rb +3 -0
  820. data/spec/mongoid/query_cache_middleware_spec.rb +48 -0
  821. data/spec/mongoid/query_cache_spec.rb +131 -65
  822. data/spec/mongoid/relations/proxy_spec.rb +127 -124
  823. data/spec/mongoid/reloadable_spec.rb +3 -0
  824. data/spec/mongoid/scopable_spec.rb +5 -1
  825. data/spec/mongoid/selectable_spec.rb +3 -0
  826. data/spec/mongoid/serializable_spec.rb +132 -18
  827. data/spec/mongoid/shardable_models.rb +61 -0
  828. data/spec/mongoid/shardable_spec.rb +104 -28
  829. data/spec/mongoid/stateful_spec.rb +3 -0
  830. data/spec/mongoid/tasks/database_rake_spec.rb +16 -13
  831. data/spec/mongoid/tasks/database_spec.rb +4 -1
  832. data/spec/mongoid/threaded_spec.rb +3 -0
  833. data/spec/mongoid/timestamps/created/short_spec.rb +3 -0
  834. data/spec/mongoid/timestamps/created_spec.rb +3 -0
  835. data/spec/mongoid/timestamps/timeless_spec.rb +3 -0
  836. data/spec/mongoid/timestamps/updated/short_spec.rb +3 -0
  837. data/spec/mongoid/timestamps/updated_spec.rb +3 -0
  838. data/spec/mongoid/timestamps_spec.rb +3 -0
  839. data/spec/mongoid/{relations/touchable_spec.rb → touchable_spec.rb} +89 -4
  840. data/spec/mongoid/traversable_spec.rb +3 -0
  841. data/spec/mongoid/validatable/associated_spec.rb +4 -1
  842. data/spec/mongoid/validatable/format_spec.rb +3 -0
  843. data/spec/mongoid/validatable/length_spec.rb +3 -0
  844. data/spec/mongoid/validatable/numericality_spec.rb +3 -0
  845. data/spec/mongoid/validatable/presence_spec.rb +10 -6
  846. data/spec/mongoid/validatable/uniqueness_spec.rb +36 -6
  847. data/spec/mongoid/validatable_spec.rb +4 -1
  848. data/spec/mongoid_spec.rb +3 -0
  849. data/spec/rails/controller_extension/controller_runtime_spec.rb +4 -1
  850. data/spec/rails/mongoid_spec.rb +5 -2
  851. data/spec/shared/LICENSE +20 -0
  852. data/spec/shared/lib/mrss/child_process_helper.rb +80 -0
  853. data/spec/shared/lib/mrss/cluster_config.rb +211 -0
  854. data/spec/shared/lib/mrss/constraints.rb +330 -0
  855. data/spec/shared/lib/mrss/docker_runner.rb +262 -0
  856. data/spec/shared/lib/mrss/lite_constraints.rb +175 -0
  857. data/spec/shared/lib/mrss/server_version_registry.rb +69 -0
  858. data/spec/shared/lib/mrss/spec_organizer.rb +149 -0
  859. data/spec/shared/share/Dockerfile.erb +229 -0
  860. data/spec/shared/shlib/distro.sh +73 -0
  861. data/spec/shared/shlib/server.sh +270 -0
  862. data/spec/shared/shlib/set_env.sh +128 -0
  863. data/spec/spec_helper.rb +56 -55
  864. data/spec/support/authorization.rb +3 -0
  865. data/spec/support/child_process_helper.rb +76 -0
  866. data/spec/support/cluster_config.rb +158 -0
  867. data/spec/support/constraints.rb +256 -0
  868. data/spec/support/expectations.rb +22 -3
  869. data/spec/support/helpers.rb +11 -0
  870. data/spec/support/lite_constraints.rb +22 -0
  871. data/spec/support/macros.rb +21 -0
  872. data/spec/support/session_registry.rb +50 -0
  873. data/spec/support/shared/time.rb +54 -0
  874. data/spec/support/spec_config.rb +50 -0
  875. data.tar.gz.sig +2 -1
  876. metadata +737 -550
  877. metadata.gz.sig +0 -0
  878. data/lib/mongoid/criteria/queryable/forwardable.rb +0 -65
  879. data/lib/mongoid/relations/accessors.rb +0 -267
  880. data/lib/mongoid/relations/auto_save.rb +0 -94
  881. data/lib/mongoid/relations/bindings/embedded/in.rb +0 -59
  882. data/lib/mongoid/relations/bindings/referenced/in.rb +0 -65
  883. data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +0 -70
  884. data/lib/mongoid/relations/bindings.rb +0 -9
  885. data/lib/mongoid/relations/builder.rb +0 -57
  886. data/lib/mongoid/relations/builders/embedded/in.rb +0 -29
  887. data/lib/mongoid/relations/builders/embedded/one.rb +0 -30
  888. data/lib/mongoid/relations/builders/nested_attributes/many.rb +0 -199
  889. data/lib/mongoid/relations/builders/referenced/in.rb +0 -26
  890. data/lib/mongoid/relations/builders/referenced/many.rb +0 -26
  891. data/lib/mongoid/relations/builders/referenced/many_to_many.rb +0 -39
  892. data/lib/mongoid/relations/builders/referenced/one.rb +0 -26
  893. data/lib/mongoid/relations/builders.rb +0 -106
  894. data/lib/mongoid/relations/cascading/delete.rb +0 -44
  895. data/lib/mongoid/relations/cascading/destroy.rb +0 -43
  896. data/lib/mongoid/relations/cascading/nullify.rb +0 -35
  897. data/lib/mongoid/relations/cascading/restrict.rb +0 -39
  898. data/lib/mongoid/relations/cascading.rb +0 -56
  899. data/lib/mongoid/relations/constraint.rb +0 -55
  900. data/lib/mongoid/relations/conversions.rb +0 -34
  901. data/lib/mongoid/relations/counter_cache.rb +0 -160
  902. data/lib/mongoid/relations/cyclic.rb +0 -107
  903. data/lib/mongoid/relations/eager/base.rb +0 -153
  904. data/lib/mongoid/relations/eager/belongs_to.rb +0 -31
  905. data/lib/mongoid/relations/eager/has_and_belongs_to_many.rb +0 -47
  906. data/lib/mongoid/relations/eager/has_many.rb +0 -38
  907. data/lib/mongoid/relations/eager/has_one.rb +0 -30
  908. data/lib/mongoid/relations/embedded/in.rb +0 -241
  909. data/lib/mongoid/relations/embedded/many.rb +0 -683
  910. data/lib/mongoid/relations/embedded/one.rb +0 -235
  911. data/lib/mongoid/relations/macros.rb +0 -367
  912. data/lib/mongoid/relations/metadata.rb +0 -1179
  913. data/lib/mongoid/relations/nested_builder.rb +0 -74
  914. data/lib/mongoid/relations/options.rb +0 -49
  915. data/lib/mongoid/relations/polymorphic.rb +0 -39
  916. data/lib/mongoid/relations/referenced/in.rb +0 -304
  917. data/lib/mongoid/relations/referenced/many.rb +0 -812
  918. data/lib/mongoid/relations/referenced/many_to_many.rb +0 -479
  919. data/lib/mongoid/relations/referenced/one.rb +0 -290
  920. data/lib/mongoid/relations/reflections.rb +0 -64
  921. data/lib/mongoid/relations/synchronization.rb +0 -169
  922. data/lib/mongoid/relations/targets/enumerable.rb +0 -493
  923. data/lib/mongoid/relations/targets.rb +0 -2
  924. data/lib/mongoid/relations/touchable.rb +0 -97
  925. data/lib/mongoid/relations.rb +0 -148
  926. data/spec/mongoid/criteria/queryable/forwardable_spec.rb +0 -87
  927. data/spec/mongoid/fields/internal/foreign_keys/array_spec.rb +0 -184
  928. data/spec/mongoid/fields/internal/foreign_keys/object_spec.rb +0 -201
  929. data/spec/mongoid/relations/builders/embedded/in_spec.rb +0 -34
  930. data/spec/mongoid/relations/builders/referenced/many_spec.rb +0 -137
  931. data/spec/mongoid/relations/builders/referenced/many_to_many_spec.rb +0 -178
  932. data/spec/mongoid/relations/builders/referenced/one_spec.rb +0 -111
  933. data/spec/mongoid/relations/cascading/delete_spec.rb +0 -101
  934. data/spec/mongoid/relations/cascading/destroy_spec.rb +0 -47
  935. data/spec/mongoid/relations/cascading/nullify_spec.rb +0 -32
  936. data/spec/mongoid/relations/cascading/restrict_spec.rb +0 -68
  937. data/spec/mongoid/relations/cascading_spec.rb +0 -355
  938. data/spec/mongoid/relations/constraint_spec.rb +0 -75
  939. data/spec/mongoid/relations/conversions_spec.rb +0 -128
  940. data/spec/mongoid/relations/eager/belongs_to_spec.rb +0 -163
  941. data/spec/mongoid/relations/metadata_spec.rb +0 -1985
  942. data/spec/mongoid/relations/options_spec.rb +0 -35
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+ # encoding: utf-8
3
+
4
+ require "spec_helper"
5
+ require_relative '../has_many_models'
6
+
7
+ describe Mongoid::Association::Referenced::HasMany::Proxy do
8
+ context 'with primary_key and foreign_key given' do
9
+ let(:company) { HmmCompany.create!(p: 123) }
10
+ let(:criteria) { company.emails }
11
+
12
+ it 'generates correct query' do
13
+ expect(criteria.selector).to eq('f' => 123)
14
+ end
15
+
16
+ context 'unscoped' do
17
+ let(:criteria) { company.emails.unscoped }
18
+
19
+ it 'generates correct query' do
20
+ expect(criteria.selector).to eq('f' => 123)
21
+ end
22
+ end
23
+ end
24
+ end
@@ -1,6 +1,9 @@
1
+ # frozen_string_literal: true
2
+ # encoding: utf-8
3
+
1
4
  require "spec_helper"
2
5
 
3
- describe Mongoid::Relations::Referenced::Many do
6
+ describe Mongoid::Association::Referenced::HasMany::Proxy do
4
7
 
5
8
  before :all do
6
9
  Mongoid.raise_not_found_error = true
@@ -401,7 +404,7 @@ describe Mongoid::Relations::Referenced::Many do
401
404
  end
402
405
 
403
406
  it "sets the target of the relation" do
404
- expect(person.posts.target).to eq([ post ])
407
+ expect(person.posts._target).to eq([ post ])
405
408
  end
406
409
 
407
410
  it "sets the foreign key on the relation" do
@@ -432,7 +435,7 @@ describe Mongoid::Relations::Referenced::Many do
432
435
  end
433
436
 
434
437
  it "sets the target of the relation" do
435
- expect(person.posts.target).to eq([ post ])
438
+ expect(person.posts._target).to eq([ post ])
436
439
  end
437
440
 
438
441
  it "sets the foreign key of the relation" do
@@ -593,7 +596,7 @@ describe Mongoid::Relations::Referenced::Many do
593
596
  end
594
597
 
595
598
  it "sets the target of the relation" do
596
- expect(movie.ratings.target).to eq([ rating ])
599
+ expect(movie.ratings._target).to eq([ rating ])
597
600
  end
598
601
 
599
602
  it "sets the foreign key on the relation" do
@@ -624,7 +627,7 @@ describe Mongoid::Relations::Referenced::Many do
624
627
  end
625
628
 
626
629
  it "sets the target of the relation" do
627
- expect(movie.ratings.target).to eq([ rating ])
630
+ expect(movie.ratings._target).to eq([ rating ])
628
631
  end
629
632
 
630
633
  it "sets the foreign key of the relation" do
@@ -1039,27 +1042,6 @@ describe Mongoid::Relations::Referenced::Many do
1039
1042
  end
1040
1043
  end
1041
1044
 
1042
- describe ".builder" do
1043
-
1044
- let(:builder_klass) do
1045
- Mongoid::Relations::Builders::Referenced::Many
1046
- end
1047
-
1048
- let(:document) do
1049
- double
1050
- end
1051
-
1052
- let(:metadata) do
1053
- double(extension?: false)
1054
- end
1055
-
1056
- it "returns the embedded in builder" do
1057
- expect(
1058
- described_class.builder(nil, metadata, document)
1059
- ).to be_a_kind_of(builder_klass)
1060
- end
1061
- end
1062
-
1063
1045
  describe "#clear" do
1064
1046
 
1065
1047
  context "when the relation is not polymorphic" do
@@ -1835,44 +1817,48 @@ describe Mongoid::Relations::Referenced::Many do
1835
1817
  end
1836
1818
  end
1837
1819
 
1838
- describe ".criteria" do
1820
+ describe "#criteria" do
1839
1821
 
1840
- let(:id) do
1841
- BSON::ObjectId.new
1822
+ let(:base) do
1823
+ Movie.new
1842
1824
  end
1843
1825
 
1844
1826
  context "when the relation is polymorphic" do
1845
1827
 
1846
- let(:metadata) do
1828
+ let(:association) do
1847
1829
  Movie.relations["ratings"]
1848
1830
  end
1849
1831
 
1850
1832
  let(:criteria) do
1851
- described_class.criteria(metadata, id, Movie)
1833
+ association.criteria(base)
1852
1834
  end
1853
1835
 
1854
1836
  it "includes the type in the criteria" do
1855
1837
  expect(criteria.selector).to eq(
1856
- {
1857
- "ratable_id" => id,
1858
- "ratable_type" => "Movie"
1859
- }
1860
- )
1838
+ {
1839
+ "ratable_id" => base.id,
1840
+ "ratable_type" => "Movie"
1841
+ }
1842
+ )
1861
1843
  end
1862
1844
  end
1863
1845
 
1864
1846
  context "when the relation is not polymorphic" do
1865
1847
 
1866
- let(:metadata) do
1848
+ let(:association) do
1867
1849
  Person.relations["posts"]
1868
1850
  end
1869
1851
 
1852
+ let(:base) do
1853
+ Person.new
1854
+ end
1855
+
1870
1856
  let(:criteria) do
1871
- described_class.criteria(metadata, id, Person)
1857
+ association.criteria(base)
1872
1858
  end
1873
1859
 
1874
1860
  it "does not include the type in the criteria" do
1875
- expect(criteria.selector).to eq({ "person_id" => id })
1861
+ expect(criteria.selector).to eq({ "person_id" => base.id })
1876
1862
  end
1877
1863
  end
1878
1864
  end
@@ -2785,13 +2771,6 @@ describe Mongoid::Relations::Referenced::Many do
2785
2771
  end
2786
2772
  end
2787
2773
 
2788
- describe ".foreign_key_suffix" do
2789
-
2790
- it "returns _id" do
2791
- expect(described_class.foreign_key_suffix).to eq("_id")
2792
- end
2793
- end
2794
-
2795
2774
  describe "#initialize" do
2796
2775
 
2797
2776
  context "when an illegal mixed relation exists" do
@@ -2848,13 +2827,6 @@ describe Mongoid::Relations::Referenced::Many do
2848
2827
  end
2849
2828
  end
2850
2829
 
2851
- describe ".macro" do
2852
-
2853
- it "returns has_many" do
2854
- expect(described_class.macro).to eq(:has_many)
2855
- end
2856
- end
2857
-
2858
2830
  describe "#max" do
2859
2831
 
2860
2832
  let(:person) do
@@ -2935,7 +2907,8 @@ describe Mongoid::Relations::Referenced::Many do
2935
2907
  expect(posts).to eq([ post_one ])
2936
2908
  end
2937
2909
 
2938
- context 'when providing a collation', if: collation_supported? do
2910
+ context 'when providing a collation' do
2911
+ min_server_version '3.4'
2939
2912
 
2940
2913
  let(:posts) do
2941
2914
  person.posts.where(title: "FIRST").collation(locale: 'en_US', strength: 2)
@@ -3178,7 +3151,7 @@ describe Mongoid::Relations::Referenced::Many do
3178
3151
  end
3179
3152
  end
3180
3153
 
3181
- Mongoid::Relations::Referenced::Many.public_instance_methods.each do |method|
3154
+ Mongoid::Association::Referenced::HasMany::Proxy.public_instance_methods.each do |method|
3182
3155
 
3183
3156
  context "when checking #{method}" do
3184
3157
 
@@ -3199,13 +3172,6 @@ describe Mongoid::Relations::Referenced::Many do
3199
3172
  end
3200
3173
  end
3201
3174
 
3202
- describe ".stores_foreign_key?" do
3203
-
3204
- it "returns false" do
3205
- expect(described_class.stores_foreign_key?).to be false
3206
- end
3207
- end
3208
-
3209
3175
  describe "#scoped" do
3210
3176
 
3211
3177
  let(:person) do
@@ -3311,33 +3277,6 @@ describe Mongoid::Relations::Referenced::Many do
3311
3277
  end
3312
3278
  end
3313
3279
 
3314
- describe ".valid_options" do
3315
-
3316
- it "returns the valid options" do
3317
- expect(described_class.valid_options).to eq(
3318
- [
3319
- :after_add,
3320
- :after_remove,
3321
- :as,
3322
- :autosave,
3323
- :before_add,
3324
- :before_remove,
3325
- :dependent,
3326
- :foreign_key,
3327
- :order,
3328
- :primary_key
3329
- ]
3330
- )
3331
- end
3332
- end
3333
-
3334
- describe ".validation_default" do
3335
-
3336
- it "returns true" do
3337
- expect(described_class.validation_default).to be true
3338
- end
3339
- end
3340
-
3341
3280
  context "when the association has an order defined" do
3342
3281
 
3343
3282
  let(:person) do
@@ -3363,14 +3302,14 @@ describe Mongoid::Relations::Referenced::Many do
3363
3302
 
3364
3303
  it "order documents" do
3365
3304
  expect(person.ordered_posts(true)).to eq(
3366
- [post_two, post_three, post_one]
3367
- )
3305
+ [post_two, post_three, post_one]
3306
+ )
3368
3307
  end
3369
3308
 
3370
3309
  it "chaining order criterias" do
3371
3310
  expect(person.ordered_posts.order_by(:title.desc).to_a).to eq(
3372
- [post_three, post_two, post_one]
3373
- )
3311
+ [post_three, post_two, post_one]
3312
+ )
3374
3313
  end
3375
3314
  end
3376
3315
 
@@ -3396,7 +3335,7 @@ describe Mongoid::Relations::Referenced::Many do
3396
3335
 
3397
3336
  before do
3398
3337
  Post.collection.find({ _id: post_one.id }).
3399
- update_one({ "$set" => { title: "reloaded" }})
3338
+ update_one({ "$set" => { title: "reloaded" }})
3400
3339
  end
3401
3340
 
3402
3341
  let(:reloaded) do
@@ -0,0 +1,40 @@
1
+ # frozen_string_literal: true
2
+ # encoding: utf-8
3
+
4
+ class HmmCompany
5
+ include Mongoid::Document
6
+
7
+ field :p, type: Integer
8
+ has_many :emails, primary_key: :p, foreign_key: :f, class_name: 'HmmEmail'
9
+ end
10
+
11
+ class HmmEmail
12
+ include Mongoid::Document
13
+
14
+ field :f, type: Integer
15
+ belongs_to :company, primary_key: :p, foreign_key: :f, class_name: 'HmmCompany'
16
+ end
17
+
18
+ class HmmSchool
19
+ include Mongoid::Document
20
+
21
+ has_many :students, class_name: 'HmmStudent'
22
+
23
+ field :district, type: String
24
+ field :team, type: String
25
+ end
26
+
27
+ class HmmStudent
28
+ include Mongoid::Document
29
+
30
+ belongs_to :school, class_name: 'HmmSchool'
31
+
32
+ field :name, type: String
33
+ field :grade, type: Integer, default: 3
34
+ end
35
+
36
+ class HmmTicket
37
+ include Mongoid::Document
38
+
39
+ belongs_to :person
40
+ end
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+ # encoding: utf-8
3
+
4
+ require "spec_helper"
5
+ require_relative './has_many_models'
6
+
7
+ describe Mongoid::Association::Referenced::HasMany do
8
+ context 'when projecting with #only' do
9
+ before do
10
+ school = HmmSchool.create!(district: 'foo')
11
+ HmmStudent.create!(school: school, name: 'Dave', grade: 10)
12
+ end
13
+
14
+ let(:school) do
15
+ HmmSchool.where(district: 'foo').only('students._id', 'students.name').first
16
+ end
17
+
18
+ let(:student) { school.students.first }
19
+
20
+ it 'populates specified fields only' do
21
+ pending 'https://jira.mongodb.org/browse/MONGOID-4704'
22
+
23
+ expect(student.name).to eq('Dave')
24
+ # has a default value specified in the model
25
+ expect do
26
+ student.grade
27
+ end.to raise_error(ActiveModel::MissingAttributeError)
28
+ expect(student.attributes.keys).to eq(['_id', 'name'])
29
+ end
30
+
31
+ # Delete this test when https://jira.mongodb.org/browse/MONGOID-4704 is
32
+ # implemented and above test is unpended
33
+ it 'fetches all fields' do
34
+ expect(student.name).to eq('Dave')
35
+ expect(student.grade).to eq(10)
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,1228 @@
1
+ # frozen_string_literal: true
2
+ # encoding: utf-8
3
+
4
+ require "spec_helper"
5
+
6
+ describe Mongoid::Association::Referenced::HasMany do
7
+
8
+ before do
9
+ class OwnerObject; include Mongoid::Document; end
10
+ class BelongingObject; include Mongoid::Document; end
11
+ end
12
+
13
+ after do
14
+ Object.send(:remove_const, :BelongingObject)
15
+ Object.send(:remove_const, :OwnerObject)
16
+ end
17
+
18
+ let(:has_many_class) do
19
+ OwnerObject
20
+ end
21
+
22
+ let(:name) do
23
+ :belonging_objects
24
+ end
25
+
26
+ let(:association) do
27
+ has_many_class.has_many name, options
28
+ end
29
+
30
+ let(:options) do
31
+ { }
32
+ end
33
+
34
+ describe '#relation_complements' do
35
+
36
+ let(:expected_complements) do
37
+ [
38
+ Mongoid::Association::Referenced::BelongsTo,
39
+ ]
40
+ end
41
+
42
+ it 'returns the relation complements' do
43
+ expect(association.relation_complements).to eq(expected_complements)
44
+ end
45
+ end
46
+
47
+ describe '#setup!' do
48
+
49
+ it 'sets up a getter for the relation' do
50
+ expect(Mongoid::Association::Accessors).to receive(:define_getter!).with(association)
51
+ association.setup!
52
+ end
53
+
54
+ it 'sets up a ids getter for the relation' do
55
+ expect(Mongoid::Association::Accessors).to receive(:define_ids_getter!).with(association)
56
+ association.setup!
57
+ end
58
+
59
+ it 'sets up a setter for the relation' do
60
+ expect(Mongoid::Association::Accessors).to receive(:define_setter!).with(association)
61
+ association.setup!
62
+ end
63
+
64
+ it 'sets up a ids setter for the relation' do
65
+ expect(Mongoid::Association::Accessors).to receive(:define_ids_setter!).with(association)
66
+ association.setup!
67
+ end
68
+
69
+ it 'sets up an existence check for the relation' do
70
+ expect(Mongoid::Association::Accessors).to receive(:define_existence_check!).with(association)
71
+ association.setup!
72
+ end
73
+
74
+ context 'autosave' do
75
+
76
+ context 'when the :autosave option is true' do
77
+
78
+ let(:options) do
79
+ {
80
+ autosave: true
81
+ }
82
+ end
83
+
84
+ let(:association) do
85
+ # Note that it is necessary to create the association directly, otherwise the
86
+ # setup! method will be called by the :has_many macro
87
+ described_class.new(has_many_class, name, options)
88
+ end
89
+
90
+ it 'sets up autosave' do
91
+ expect(Mongoid::Association::Referenced::AutoSave).to receive(:define_autosave!).with(association)
92
+ association.setup!
93
+ end
94
+ end
95
+
96
+ context 'when the :autosave option is false' do
97
+
98
+ let(:options) do
99
+ {
100
+ autosave: false
101
+ }
102
+ end
103
+
104
+ it 'does not set up autosave' do
105
+ expect(Mongoid::Association::Referenced::AutoSave).not_to receive(:define_autosave!)
106
+ association.setup_instance_methods!
107
+ end
108
+ end
109
+
110
+ context 'when the :autosave option is not provided' do
111
+
112
+ let(:association) do
113
+ # Note that it is necessary to create the association directly, otherwise the
114
+ # setup! method will be called by the :has_many macro
115
+ described_class.new(has_many_class, name, options)
116
+ end
117
+
118
+ it 'does not set up autosave' do
119
+ expect(Mongoid::Association::Referenced::AutoSave).not_to receive(:define_autosave!)
120
+ association.setup!
121
+ end
122
+ end
123
+ end
124
+
125
+ context 'when the :validate option is true' do
126
+
127
+ let(:options) do
128
+ {
129
+ validate: true
130
+ }
131
+ end
132
+
133
+ let(:association) do
134
+ # Note that it is necessary to create the association directly, otherwise the
135
+ # setup! method will be called by the :has_many macro
136
+ described_class.new(has_many_class, name, options)
137
+ end
138
+
139
+ it 'sets up validation' do
140
+ expect(has_many_class).to receive(:validates_associated).with(name).and_call_original
141
+ association.setup!
142
+ end
143
+ end
144
+
145
+ context 'when the :validate option is false' do
146
+
147
+ let(:options) do
148
+ {
149
+ validate: false
150
+ }
151
+ end
152
+
153
+ it 'does not set up validation' do
154
+ expect(has_many_class).not_to receive(:validates_associated)
155
+ association.setup_instance_methods!
156
+ end
157
+ end
158
+
159
+ context 'when the :validate option is not provided' do
160
+
161
+ let(:association) do
162
+ # Note that it is necessary to create the association directly, otherwise the
163
+ # setup! method will be called by the :has_many macro
164
+ described_class.new(has_many_class, name, options)
165
+ end
166
+
167
+ it 'sets up the validation because it uses the validation default (true)' do
168
+ expect(has_many_class).to receive(:validates_associated).with(name).and_call_original
169
+ association.setup!
170
+ end
171
+ end
172
+
173
+ context 'polymorphic' do
174
+
175
+ context 'when the as option is provided' do
176
+
177
+
178
+ let(:options) do
179
+ {
180
+ as: :containable
181
+ }
182
+ end
183
+
184
+ before do
185
+ association
186
+ end
187
+
188
+ it 'set the polymorphic attribute on the owner class' do
189
+ expect(has_many_class.polymorphic).to be(true)
190
+ end
191
+ end
192
+
193
+ context 'when the as option is not provided' do
194
+
195
+ it 'does not set the polymorphic attribute on the owner class' do
196
+ expect(has_many_class.polymorphic).to be(false)
197
+ end
198
+ end
199
+ end
200
+
201
+ context 'dependent' do
202
+
203
+ context 'when the dependent option is provided' do
204
+
205
+ context 'when the dependent option is :delete_all' do
206
+
207
+ let(:options) do
208
+ {
209
+ dependent: :delete_all
210
+ }
211
+ end
212
+
213
+ let(:association) do
214
+ # Note that it is necessary to create the association directly, otherwise the
215
+ # setup! method will be called by the :belongs_to macro
216
+ described_class.new(has_many_class, name, options)
217
+ end
218
+
219
+ it 'sets up the dependency' do
220
+ expect(Mongoid::Association::Depending).to receive(:define_dependency!)
221
+ association.setup!
222
+ end
223
+ end
224
+
225
+ context 'when the dependent option is :destroy' do
226
+
227
+ let(:options) do
228
+ {
229
+ dependent: :destroy
230
+ }
231
+ end
232
+
233
+ let(:association) do
234
+ # Note that it is necessary to create the association directly, otherwise the
235
+ # setup! method will be called by the :belongs_to macro
236
+ described_class.new(has_many_class, name, options)
237
+ end
238
+
239
+ it 'sets up the dependency' do
240
+ expect(Mongoid::Association::Depending).to receive(:define_dependency!)
241
+ association.setup!
242
+ end
243
+ end
244
+
245
+ context 'when the dependent option is :nullify' do
246
+
247
+ let(:options) do
248
+ {
249
+ dependent: :nullify
250
+ }
251
+ end
252
+
253
+ let(:association) do
254
+ # Note that it is necessary to create the association directly, otherwise the
255
+ # setup! method will be called by the :belongs_to macro
256
+ described_class.new(has_many_class, name, options)
257
+ end
258
+
259
+ it 'sets up the dependency' do
260
+ expect(Mongoid::Association::Depending).to receive(:define_dependency!)
261
+ association.setup!
262
+ end
263
+ end
264
+
265
+ context 'when the dependent option is :restrict_with_exception' do
266
+
267
+ let(:options) do
268
+ {
269
+ dependent: :restrict_with_exception
270
+ }
271
+ end
272
+
273
+ let(:association) do
274
+ # Note that it is necessary to create the association directly, otherwise the
275
+ # setup! method will be called by the :belongs_to macro
276
+ described_class.new(has_many_class, name, options)
277
+ end
278
+
279
+ it 'sets up the dependency' do
280
+ expect(Mongoid::Association::Depending).to receive(:define_dependency!)
281
+ association.setup!
282
+ end
283
+ end
284
+
285
+ context 'when the dependent option is :restrict_with_error' do
286
+
287
+ let(:options) do
288
+ {
289
+ dependent: :restrict_with_error
290
+ }
291
+ end
292
+
293
+ let(:association) do
294
+ # Note that it is necessary to create the association directly, otherwise the
295
+ # setup_instance_methods! method will be called by the :belongs_to macro
296
+ described_class.new(has_many_class, name, options)
297
+ end
298
+
299
+ it 'sets up the dependency' do
300
+ expect(Mongoid::Association::Depending).to receive(:define_dependency!)
301
+ association.setup!
302
+ end
303
+ end
304
+ end
305
+
306
+ context 'when the dependent option is not provided' do
307
+
308
+ it 'does not set up the dependency' do
309
+ expect(Mongoid::Association::Depending).not_to receive(:define_dependency!)
310
+ association.setup!
311
+ end
312
+ end
313
+ end
314
+ end
315
+
316
+ describe '#type' do
317
+
318
+ context 'when polymorphic' do
319
+
320
+ let(:options) do
321
+ { as: :containable }
322
+ end
323
+
324
+ it 'returns the as attribute followed by "_type"' do
325
+ expect(association.type).to eq("#{options[:as]}_type")
326
+ end
327
+ end
328
+
329
+ context 'when not polymorphic' do
330
+
331
+ it 'returns nil' do
332
+ expect(association.type).to be_nil
333
+ end
334
+ end
335
+ end
336
+
337
+ describe '#inverse_type' do
338
+
339
+ context 'when polymorphic' do
340
+
341
+ let(:options) do
342
+ { as: :containable }
343
+ end
344
+
345
+ it 'returns nil' do
346
+ expect(association.inverse_type).to be_nil
347
+ end
348
+ end
349
+
350
+ context 'when not polymorphic' do
351
+
352
+ it 'returns nil' do
353
+ expect(association.inverse_type).to be_nil
354
+ end
355
+ end
356
+ end
357
+
358
+ describe '#inverse_type_setter' do
359
+
360
+ context 'when polymorphic' do
361
+
362
+ let(:options) do
363
+ { as: :containable }
364
+ end
365
+
366
+ it 'returns nil' do
367
+ expect(association.inverse_type).to be_nil
368
+ end
369
+ end
370
+
371
+ context 'when not polymorphic' do
372
+
373
+ it 'returns nil' do
374
+ expect(association.inverse_type).to be_nil
375
+ end
376
+ end
377
+ end
378
+
379
+ describe '#foreign_key' do
380
+
381
+ context 'when options has foreign_key specified' do
382
+
383
+ let(:options) do
384
+ { foreign_key: :other_object_id }
385
+ end
386
+
387
+ it 'raises returns the foreign key as a String' do
388
+ expect(association.foreign_key).to eq(options[:foreign_key].to_s)
389
+ end
390
+ end
391
+
392
+ context 'when options does not have foreign_key specified' do
393
+
394
+ it 'returns the default foreign key, the name of the inverse followed by "_id"' do
395
+ expect(association.foreign_key).to eq("#{association.inverse}_id")
396
+ end
397
+ end
398
+ end
399
+
400
+ describe '#embedded?' do
401
+
402
+ it 'returns false' do
403
+ expect(association.embedded?).to be(false)
404
+ end
405
+ end
406
+
407
+ describe '#primary_key' do
408
+
409
+ context 'when the :primary_key option is specified' do
410
+
411
+ let(:options) do
412
+ {
413
+ primary_key: 'guid'
414
+ }
415
+ end
416
+
417
+ it 'returns the primary_key' do
418
+ expect(association.primary_key).to eq(options[:primary_key])
419
+ end
420
+ end
421
+
422
+ context 'when the :primary_key option is not specified' do
423
+
424
+ it 'returns the primary_key default' do
425
+ expect(association.primary_key).to eq(Mongoid::Association::Relatable::PRIMARY_KEY_DEFAULT)
426
+ end
427
+ end
428
+ end
429
+
430
+ describe '#relation' do
431
+
432
+ it 'returns Mongoid::Association::Referenced::HasMany::Proxy' do
433
+ expect(association.relation).to be(Mongoid::Association::Referenced::HasMany::Proxy)
434
+ end
435
+ end
436
+
437
+ describe '#validation_default' do
438
+
439
+ it 'returns true' do
440
+ expect(association.validation_default).to be(true)
441
+ end
442
+ end
443
+
444
+ describe '#name' do
445
+
446
+ it 'returns the name of the relation' do
447
+ expect(association.name).to be(name)
448
+ end
449
+ end
450
+
451
+ describe '#options' do
452
+
453
+ it 'returns the options' do
454
+ expect(association.options).to be(options)
455
+ end
456
+ end
457
+
458
+ describe '#merge!' do
459
+
460
+ end
461
+
462
+ describe '#store_as' do
463
+ it 'returns nil' do
464
+ expect(association.store_as).to be_nil
465
+ end
466
+ end
467
+
468
+ describe '#touchable?' do
469
+
470
+ it 'return false' do
471
+ expect(association.send(:touchable?)).to be(false)
472
+ end
473
+ end
474
+
475
+ describe '#order' do
476
+
477
+ context 'when order is specified in the options' do
478
+
479
+ let(:options) do
480
+ {
481
+ order: :rating.desc
482
+ }
483
+ end
484
+
485
+ it 'returns a Criteria Queryable Key' do
486
+ expect(association.order).to be_a(Mongoid::Criteria::Queryable::Key)
487
+ end
488
+ end
489
+
490
+ context 'when order is not specified in the options' do
491
+
492
+ it 'returns nil' do
493
+ expect(association.order).to be_nil
494
+ end
495
+ end
496
+ end
497
+
498
+ describe '#as' do
499
+
500
+ context 'when :as is specified in the options' do
501
+
502
+ let(:options) do
503
+ {
504
+ as: :containable
505
+ }
506
+ end
507
+
508
+ it 'returns the :as option' do
509
+ expect(association.as).to eq(options[:as])
510
+ end
511
+ end
512
+
513
+ context 'when :as is not specified in the options' do
514
+
515
+ it 'returns nil' do
516
+ expect(association.as).to be_nil
517
+ end
518
+ end
519
+ end
520
+
521
+ describe '#polymorphic?' do
522
+
523
+ context 'when :as is specified in the options' do
524
+
525
+ let(:options) do
526
+ {
527
+ as: :containable
528
+ }
529
+ end
530
+
531
+ it 'returns true' do
532
+ expect(association.polymorphic?).to be(true)
533
+ end
534
+
535
+ end
536
+
537
+ context 'when :as is not specified in the options' do
538
+
539
+ it 'returns false' do
540
+ expect(association.polymorphic?).to be(false)
541
+ end
542
+ end
543
+ end
544
+
545
+ describe '#type_setter' do
546
+
547
+ context 'when polymorphic' do
548
+
549
+ let(:options) do
550
+ { as: :containable }
551
+ end
552
+
553
+ it 'returns the type followed by = as a String' do
554
+ expect(association.type_setter).to eq("containable_type=")
555
+ end
556
+ end
557
+
558
+ context 'when not polymorphic' do
559
+
560
+ it 'returns nil' do
561
+ expect(association.type).to be_nil
562
+ end
563
+ end
564
+ end
565
+
566
+ describe '#dependent' do
567
+
568
+ context 'when the dependent option is provided' do
569
+
570
+ context 'when the dependent option is :delete_all' do
571
+
572
+ let(:options) do
573
+ {
574
+ dependent: :delete_all
575
+ }
576
+ end
577
+
578
+ it 'returns :delete_all' do
579
+ expect(association.dependent).to eq(:delete_all)
580
+ end
581
+ end
582
+
583
+ context 'when the dependent option is :destroy' do
584
+
585
+ let(:options) do
586
+ {
587
+ dependent: :destroy
588
+ }
589
+ end
590
+
591
+ it 'returns :destroy' do
592
+ expect(association.dependent).to eq(:destroy)
593
+ end
594
+ end
595
+
596
+ context 'when the dependent option is :nullify' do
597
+
598
+ let(:options) do
599
+ {
600
+ dependent: :nullify
601
+ }
602
+ end
603
+
604
+ it 'returns :nullify' do
605
+ expect(association.dependent).to eq(:nullify)
606
+ end
607
+ end
608
+
609
+ context 'when the dependent option is :restrict_with_exception' do
610
+
611
+ let(:options) do
612
+ {
613
+ dependent: :restrict_with_exception
614
+ }
615
+ end
616
+
617
+ it 'returns :restrict_with_exception' do
618
+ expect(association.dependent).to eq(:restrict_with_exception)
619
+ end
620
+ end
621
+
622
+ context 'when the dependent option is :restrict_with_error' do
623
+
624
+ let(:options) do
625
+ {
626
+ dependent: :restrict_with_error
627
+ }
628
+ end
629
+
630
+ it 'returns :restrict_with_error' do
631
+ expect(association.dependent).to eq(:restrict_with_error)
632
+ end
633
+ end
634
+ end
635
+
636
+ context 'when the dependent option is not provided' do
637
+
638
+ it 'returns nil' do
639
+ expect(association.dependent).to be_nil
640
+ end
641
+ end
642
+ end
643
+
644
+ describe '#inverse_type' do
645
+
646
+ it 'returns nil' do
647
+ expect(association.inverse_type).to be_nil
648
+ end
649
+ end
650
+
651
+ describe '#bindable?' do
652
+
653
+ it 'returns false' do
654
+ expect(association.bindable?(Person.new)).to be(false)
655
+ end
656
+ end
657
+
658
+ describe '#inverses' do
659
+
660
+ context 'when polymorphic' do
661
+
662
+ before do
663
+ BelongingObject.belongs_to :containable, polymorphic: true
664
+ end
665
+
666
+ let(:options) do
667
+ {
668
+ as: :containable
669
+ }
670
+ end
671
+
672
+ context 'when another object is passed to the method' do
673
+
674
+ let(:instance_of_other_class) do
675
+ BelongingObject.new
676
+ end
677
+
678
+ context 'when the relation class has only one relation whose class matches the owning class' do
679
+
680
+ it 'returns the :as attribute of this association' do
681
+ expect(association.inverses(instance_of_other_class)).to match_array([ :containable ])
682
+ end
683
+ end
684
+
685
+ context 'when :inverse_of is specified' do
686
+
687
+ before do
688
+ options.merge!(inverse_of: :inverse_name)
689
+ end
690
+
691
+ it 'returns the :inverse_of value' do
692
+ expect(association.inverses(instance_of_other_class)).to eq([ :inverse_name ])
693
+ end
694
+ end
695
+
696
+ context 'when inverse_of is not specified' do
697
+
698
+ it 'returns the :as attribute of this association' do
699
+ expect(association.inverses(instance_of_other_class)).to match_array([ :containable ])
700
+ end
701
+ end
702
+ end
703
+
704
+ context 'when another object is not passed to the method' do
705
+
706
+ context 'when inverse_of is specified' do
707
+
708
+ before do
709
+ options.merge!(inverse_of: :inverse_name)
710
+ end
711
+
712
+ it 'returns the :inverse_of value' do
713
+ expect(association.inverses).to eq([ :inverse_name ])
714
+ end
715
+ end
716
+
717
+ context 'when inverse_of is not specified' do
718
+
719
+ it 'returns the :as attribute' do
720
+ expect(association.inverses).to eq([ :containable ])
721
+ end
722
+ end
723
+ end
724
+ end
725
+
726
+ context 'when not polymorphic' do
727
+
728
+ before do
729
+ BelongingObject.belongs_to :owner_object
730
+ end
731
+
732
+ context 'when inverse_of is specified' do
733
+
734
+ before do
735
+ options.merge!(inverse_of: :inverse_name)
736
+ end
737
+
738
+ it 'returns the :inverse_of value' do
739
+ expect(association.inverses).to eq([ :inverse_name ])
740
+ end
741
+ end
742
+
743
+ context 'when inverse_of is not specified' do
744
+
745
+ it 'uses the inverse class to find the inverse name' do
746
+ expect(association.inverses).to eq([ :owner_object ])
747
+ end
748
+ end
749
+
750
+ context 'when :cyclic is specified' do
751
+
752
+ it 'returns the cyclic inverse name' do
753
+
754
+ end
755
+ end
756
+ end
757
+ end
758
+
759
+ describe '##inverse' do
760
+
761
+ context 'when polymorphic' do
762
+
763
+ before do
764
+ BelongingObject.belongs_to :containable, polymorphic: true
765
+ end
766
+
767
+ let(:options) do
768
+ {
769
+ as: :containable
770
+ }
771
+ end
772
+
773
+ context 'when another object is passed to the method' do
774
+
775
+ let(:instance_of_other_class) do
776
+ BelongingObject.new
777
+ end
778
+
779
+ context 'when the relation class has only one relation whose class matches the owning class' do
780
+
781
+ it 'returns the :as attribute of this association' do
782
+ expect(association.inverse(instance_of_other_class)).to eq(:containable)
783
+ end
784
+ end
785
+
786
+ context 'when :inverse_of is specified' do
787
+
788
+ before do
789
+ options.merge!(inverse_of: :inverse_name)
790
+ end
791
+
792
+ it 'returns the :inverse_of value' do
793
+ expect(association.inverse(instance_of_other_class)).to eq(:inverse_name)
794
+ end
795
+ end
796
+
797
+ context 'when inverse_of is not specified' do
798
+
799
+ it 'returns the :as attribute of this association' do
800
+ expect(association.inverse(instance_of_other_class)).to eq(:containable)
801
+ end
802
+ end
803
+ end
804
+
805
+ context 'when another object is not passed to the method' do
806
+
807
+ context 'when inverse_of is specified' do
808
+
809
+ before do
810
+ options.merge!(inverse_of: :inverse_name)
811
+ end
812
+
813
+ it 'returns the :inverse_of value' do
814
+ expect(association.inverse).to eq(:inverse_name)
815
+ end
816
+ end
817
+
818
+ context 'when inverse_of is not specified' do
819
+
820
+ it 'returns the :as attribute' do
821
+ expect(association.inverse).to eq(:containable)
822
+ end
823
+ end
824
+ end
825
+ end
826
+
827
+ context 'when not polymorphic' do
828
+
829
+ before do
830
+ BelongingObject.belongs_to :owner_object
831
+ end
832
+
833
+ context 'when inverse_of is specified' do
834
+
835
+ before do
836
+ options.merge!(inverse_of: :inverse_name)
837
+ end
838
+
839
+ it 'returns the :inverse_of value' do
840
+ expect(association.inverse).to eq(:inverse_name)
841
+ end
842
+ end
843
+
844
+ context 'when inverse_of is not specified' do
845
+
846
+ it 'uses the inverse class to find the inverse name' do
847
+ expect(association.inverse).to eq(:owner_object)
848
+ end
849
+ end
850
+
851
+ context 'when :cyclic is specified' do
852
+
853
+ it 'returns the cyclic inverse name' do
854
+
855
+ end
856
+ end
857
+ end
858
+ end
859
+
860
+ describe '#inverse_association' do
861
+
862
+ end
863
+
864
+ describe '#autosave' do
865
+
866
+ context 'when the autosave option is specified' do
867
+
868
+ context 'when the autosave option is true' do
869
+
870
+ let(:options) do
871
+ {
872
+ autosave: true
873
+ }
874
+ end
875
+
876
+ it 'returns true' do
877
+ expect(association.autosave).to be(true)
878
+ end
879
+ end
880
+
881
+ context 'when the autosave option is false' do
882
+
883
+ let(:options) do
884
+ {
885
+ autosave: false
886
+ }
887
+ end
888
+
889
+ it 'returns false' do
890
+ expect(association.autosave).to be(false)
891
+ end
892
+ end
893
+ end
894
+
895
+ context 'when the autosave option is not specified' do
896
+
897
+ it 'returns false' do
898
+ expect(association.autosave).to be(false)
899
+ end
900
+ end
901
+ end
902
+
903
+ describe '#relation_class_name' do
904
+
905
+ context 'when the :class_name option is specified' do
906
+
907
+ let(:options) do
908
+ { class_name: 'OtherBelongingObject' }
909
+ end
910
+
911
+ it 'returns the class name option' do
912
+ expect(association.relation_class_name).to eq('OtherBelongingObject')
913
+ end
914
+ end
915
+
916
+ context 'when the class_name option is not specified' do
917
+
918
+ it 'uses the name of the relation to deduce the class name' do
919
+ expect(association.relation_class_name).to eq('BelongingObject')
920
+ end
921
+ end
922
+ end
923
+
924
+ describe '#relation_class' do
925
+
926
+ context 'when the :class_name option is specified' do
927
+
928
+ let!(:_class) do
929
+ class OtherBelongingObject; end
930
+ OtherBelongingObject
931
+ end
932
+
933
+ let(:options) do
934
+ { class_name: 'OtherBelongingObject' }
935
+ end
936
+
937
+ it 'returns the class name option' do
938
+ expect(association.relation_class).to eq(_class)
939
+ end
940
+ end
941
+
942
+ context 'when the class_name option is not specified' do
943
+
944
+ it 'uses the name of the relation to deduce the class name' do
945
+ expect(association.relation_class).to eq(BelongingObject)
946
+ end
947
+ end
948
+ end
949
+
950
+ describe '#inverse_class_name' do
951
+
952
+ it 'returns the name of the owner class' do
953
+ expect(association.inverse_class_name).to eq(OwnerObject.name)
954
+ end
955
+ end
956
+
957
+ describe '#inverse_class' do
958
+
959
+ it 'returns the owner class' do
960
+ expect(association.inverse_class).to be(OwnerObject)
961
+ end
962
+ end
963
+
964
+ describe '#inverse_of' do
965
+
966
+ context 'when :inverse_of is specified in the options' do
967
+
968
+ let(:options) do
969
+ { inverse_of: :a_belonging_object }
970
+ end
971
+
972
+ it 'returns the inverse_of value' do
973
+ expect(association.inverse_of).to eq(options[:inverse_of])
974
+ end
975
+ end
976
+
977
+ context 'when :inverse_of is not specified in the options' do
978
+
979
+ it 'returns nil' do
980
+ expect(association.inverse_of).to be_nil
981
+ end
982
+ end
983
+ end
984
+
985
+ describe '#key' do
986
+
987
+ it 'returns the primary key' do
988
+ expect(association.key).to eq(association.primary_key)
989
+ end
990
+ end
991
+
992
+ describe '#setter' do
993
+
994
+ it 'returns a string of the name followed by =' do
995
+ expect(association.setter).to eq("#{name}=")
996
+ end
997
+ end
998
+
999
+ describe '#validate?' do
1000
+
1001
+ context 'when :validate is specified in the options' do
1002
+
1003
+ context 'when validate is true' do
1004
+
1005
+ let(:options) do
1006
+ { validate: true }
1007
+ end
1008
+
1009
+ it 'returns true' do
1010
+ expect(association.send(:validate?)).to be(true)
1011
+ end
1012
+ end
1013
+
1014
+ context 'when validate is false' do
1015
+
1016
+ let(:options) do
1017
+ { validate: false }
1018
+ end
1019
+
1020
+ it 'returns false' do
1021
+ expect(association.send(:validate?)).to be(false)
1022
+ end
1023
+ end
1024
+ end
1025
+
1026
+ context 'when :validate is not specified in the options' do
1027
+
1028
+ it 'returns the validation_default' do
1029
+ expect(association.send(:validate?)).to eq(association.validation_default)
1030
+ end
1031
+ end
1032
+ end
1033
+
1034
+ describe '#forced_nil_inverse?' do
1035
+
1036
+ it 'returns false' do
1037
+ expect(association.forced_nil_inverse?).to be(false)
1038
+ end
1039
+ end
1040
+
1041
+ describe '#stores_foreign_key?' do
1042
+
1043
+ it 'returns false' do
1044
+ expect(association.stores_foreign_key?).to be(false)
1045
+ end
1046
+ end
1047
+
1048
+ describe '#inverse_setter' do
1049
+
1050
+ context 'when an inverse can be determined' do
1051
+
1052
+ before do
1053
+ BelongingObject.belongs_to :owner_object
1054
+ end
1055
+
1056
+ it 'returns the name of the inverse followed by =' do
1057
+ expect(association.inverse_setter).to eq('owner_object=')
1058
+ end
1059
+ end
1060
+
1061
+ context 'when an inverse cannot be determined' do
1062
+
1063
+ it 'returns nil' do
1064
+ expect(association.inverse_setter).to be_nil
1065
+ end
1066
+ end
1067
+ end
1068
+
1069
+ describe '#extension' do
1070
+
1071
+ context 'when a block is passed' do
1072
+
1073
+ let(:association) do
1074
+ has_many_class.embeds_one name, options do; end
1075
+ end
1076
+
1077
+ it 'defines an extension module' do
1078
+ expect(association.extension).to be_a(Module)
1079
+ end
1080
+
1081
+ it 'returns the extension' do
1082
+ expect(association.extension).to eq(
1083
+ "#{has_many_class.name}::#{has_many_class.name}#{name.to_s.camelize}RelationExtension".constantize)
1084
+ end
1085
+ end
1086
+
1087
+ context 'when an :extension is not specified in the options' do
1088
+
1089
+ it 'returns false' do
1090
+ expect(association.extension).to be_nil
1091
+ end
1092
+ end
1093
+ end
1094
+
1095
+ describe '#foreign_key_setter' do
1096
+
1097
+ it 'returns the foreign key followed by "="' do
1098
+ expect(association.foreign_key_setter).to eq("#{association.foreign_key}=")
1099
+ end
1100
+ end
1101
+
1102
+ describe '#criteria' do
1103
+
1104
+ it 'returns a criteria object' do
1105
+ expect(association.criteria(OwnerObject.new)).to be_a(Mongoid::Criteria)
1106
+ end
1107
+ end
1108
+
1109
+ describe '#destructive?' do
1110
+
1111
+ context 'when the dependent option is provided' do
1112
+
1113
+ context 'when the dependent option is :delete_all' do
1114
+
1115
+ let(:options) do
1116
+ {
1117
+ dependent: :delete_all
1118
+ }
1119
+ end
1120
+
1121
+ it 'returns true' do
1122
+ expect(association.destructive?).to be(true)
1123
+ end
1124
+ end
1125
+
1126
+ context 'when the dependent option is :destroy' do
1127
+
1128
+ let(:options) do
1129
+ {
1130
+ dependent: :destroy
1131
+ }
1132
+ end
1133
+
1134
+ it 'returns true' do
1135
+ expect(association.destructive?).to be(true)
1136
+ end
1137
+ end
1138
+
1139
+ context 'when the dependent option is :nullify' do
1140
+
1141
+ let(:options) do
1142
+ {
1143
+ dependent: :nullify
1144
+ }
1145
+ end
1146
+
1147
+ it 'returns false' do
1148
+ expect(association.destructive?).to be(false)
1149
+ end
1150
+ end
1151
+
1152
+ context 'when the dependent option is :restrict_with_exception' do
1153
+
1154
+ let(:options) do
1155
+ {
1156
+ dependent: :restrict_with_exception
1157
+ }
1158
+ end
1159
+
1160
+ it 'returns false' do
1161
+ expect(association.destructive?).to be(false)
1162
+ end
1163
+ end
1164
+
1165
+ context 'when the dependent option is :restrict_with_error' do
1166
+
1167
+ let(:options) do
1168
+ {
1169
+ dependent: :restrict_with_error
1170
+ }
1171
+ end
1172
+
1173
+ it 'returns false' do
1174
+ expect(association.destructive?).to be(false)
1175
+ end
1176
+ end
1177
+ end
1178
+
1179
+ context 'when the dependent option is not provided' do
1180
+
1181
+ it 'returns false' do
1182
+ expect(association.destructive?).to be(false)
1183
+ end
1184
+ end
1185
+ end
1186
+
1187
+ describe '#nested_builder' do
1188
+
1189
+ it 'returns an instance of Association::Nested::Many' do
1190
+ expect(association.nested_builder({}, {})).to be_a(Mongoid::Association::Nested::Many)
1191
+ end
1192
+ end
1193
+
1194
+ describe '#path' do
1195
+
1196
+ it 'returns an instance of Mongoid::Atomic::Paths::Root' do
1197
+ expect(association.path(double( :_parent => true))).to be_a(Mongoid::Atomic::Paths::Root)
1198
+ end
1199
+ end
1200
+
1201
+ describe '#foreign_key_check' do
1202
+
1203
+ it 'returns the nil' do
1204
+ expect(association.foreign_key_check).to be_nil
1205
+ end
1206
+ end
1207
+
1208
+ describe '#create_relation' do
1209
+
1210
+ let(:owner) do
1211
+ OwnerObject.new
1212
+ end
1213
+
1214
+ let(:target) do
1215
+ [ BelongingObject.new ]
1216
+ end
1217
+
1218
+ before do
1219
+ association
1220
+ BelongingObject.belongs_to :owner_object
1221
+ end
1222
+
1223
+ it 'returns an the target (EmbeddedObject)' do
1224
+ expect(Mongoid::Association::Referenced::HasMany::Proxy).to receive(:new).and_call_original
1225
+ expect(association.create_relation(owner, target)).to be_a(Array)
1226
+ end
1227
+ end
1228
+ end