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
@@ -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::Eager do
6
+ describe Mongoid::Association::EagerLoadable do
4
7
 
5
8
  describe ".preload" do
6
9
 
@@ -122,12 +125,12 @@ describe Mongoid::Relations::Eager do
122
125
  Person.all.to_a
123
126
  end
124
127
 
125
- let(:posts_metadata) do
128
+ let(:posts_association) do
126
129
  Person.reflect_on_association(:posts)
127
130
  end
128
131
 
129
132
  it "runs the has_many preload" do
130
- expect(Mongoid::Relations::Eager::HasMany).to receive(:new).with([posts_metadata], docs).once.and_call_original
133
+ expect(Mongoid::Association::Referenced::HasMany::Eager).to receive(:new).with([posts_association], docs).once.and_call_original
131
134
 
132
135
  context.eager_load(docs)
133
136
  end
@@ -154,31 +157,31 @@ describe Mongoid::Relations::Eager do
154
157
  Person.all.to_a
155
158
  end
156
159
 
157
- let(:posts_metadata) do
160
+ let(:posts_association) do
158
161
  Person.reflect_on_association(:posts)
159
162
  end
160
163
 
161
- let(:houses_metadata) do
164
+ let(:houses_association) do
162
165
  Person.reflect_on_association(:houses)
163
166
  end
164
167
 
165
- let(:cat_metadata) do
168
+ let(:cat_association) do
166
169
  Person.reflect_on_association(:cat)
167
170
  end
168
171
 
169
172
  it "runs the has_many preload" do
170
- expect(Mongoid::Relations::Eager::HasMany).to receive(:new).with([posts_metadata], docs).once.and_call_original
173
+ expect(Mongoid::Association::Referenced::HasMany::Eager).to receive(:new).with([posts_association], docs).once.and_call_original
171
174
 
172
175
  context.eager_load(docs)
173
176
  end
174
177
 
175
178
  it "runs the has_one preload" do
176
- expect(Mongoid::Relations::Eager::HasOne).to receive(:new).with([cat_metadata], docs).once.and_call_original
179
+ expect(Mongoid::Association::Referenced::HasOne::Eager).to receive(:new).with([cat_association], docs).once.and_call_original
177
180
  context.eager_load(docs)
178
181
  end
179
182
 
180
183
  it "runs the has_and_belongs_to_many preload" do
181
- expect(Mongoid::Relations::Eager::HasAndBelongsToMany).to receive(:new).with([houses_metadata], docs).once.and_call_original
184
+ expect(Mongoid::Association::Referenced::HasAndBelongsToMany::Eager).to receive(:new).with([houses_association], docs).once.and_call_original
182
185
  context.eager_load(docs)
183
186
  end
184
187
 
@@ -233,16 +236,16 @@ describe Mongoid::Relations::Eager do
233
236
  Person.all.to_a
234
237
  end
235
238
 
236
- let(:book_metadata) do
239
+ let(:book_association) do
237
240
  Person.reflect_on_association(:book)
238
241
  end
239
242
 
240
- let(:cat_metadata) do
243
+ let(:cat_association) do
241
244
  Person.reflect_on_association(:cat)
242
245
  end
243
246
 
244
247
  it "runs the has_one preload" do
245
- expect(Mongoid::Relations::Eager::HasOne).to receive(:new).with([book_metadata, cat_metadata], docs).once.and_call_original
248
+ expect(Mongoid::Association::Referenced::HasOne::Eager).to receive(:new).with([book_association, cat_association], docs).once.and_call_original
246
249
  context.eager_load(docs)
247
250
  end
248
251
  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::Cyclic do
6
+ describe Mongoid::Association::Embedded::Cyclic do
4
7
 
5
8
  describe ".recursively_embeds_many" do
6
9
 
@@ -1,3 +1,6 @@
1
+ # frozen_string_literal: true
2
+ # encoding: utf-8
3
+
1
4
  require 'spec_helper'
2
5
 
3
6
  describe "when initialize a model with an embedded model" do
@@ -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::Bindings::Embedded::In do
6
+ describe Mongoid::Association::Embedded::EmbeddedIn::Binding do
4
7
 
5
8
  let(:person) do
6
9
  Person.new
@@ -14,15 +17,15 @@ describe Mongoid::Relations::Bindings::Embedded::In do
14
17
  Address.new
15
18
  end
16
19
 
17
- let(:name_metadata) do
20
+ let(:name_association) do
18
21
  Name.relations["namable"]
19
22
  end
20
23
 
21
- let(:address_metadata) do
24
+ let(:address_association) do
22
25
  Address.relations["addressable"]
23
26
  end
24
27
 
25
- let(:person_metadata) do
28
+ let(:person_association) do
26
29
  Person.relations["addresses"]
27
30
  end
28
31
 
@@ -31,7 +34,7 @@ describe Mongoid::Relations::Bindings::Embedded::In do
31
34
  context "when the child of an embeds one" do
32
35
 
33
36
  let(:binding) do
34
- described_class.new(name, person, name_metadata)
37
+ described_class.new(name, person, name_association)
35
38
  end
36
39
 
37
40
  context "when the document is bindable" do
@@ -65,12 +68,12 @@ describe Mongoid::Relations::Bindings::Embedded::In do
65
68
  context "when the child of an embeds many" do
66
69
 
67
70
  let(:binding) do
68
- described_class.new(address, person, address_metadata)
71
+ described_class.new(address, person, address_association)
69
72
  end
70
73
 
71
74
  context "when the document is bindable" do
72
75
 
73
- context "when the base has no metadata" do
76
+ context "when the base has no association" do
74
77
 
75
78
  before do
76
79
  binding.bind_one
@@ -85,14 +88,14 @@ describe Mongoid::Relations::Bindings::Embedded::In do
85
88
  end
86
89
  end
87
90
 
88
- context "when the base has metadata" do
91
+ context "when the base has an association" do
89
92
 
90
93
  before do
91
- address.__metadata = person_metadata
94
+ address._association = person_association
92
95
  end
93
96
 
94
- it "does not overwrite the existing metadata" do
95
- expect(address).to receive(:__metadata=).never
97
+ it "does not overwrite the existing association" do
98
+ expect(address).to receive(:_association=).never
96
99
  binding.bind_one
97
100
  end
98
101
  end
@@ -117,7 +120,7 @@ describe Mongoid::Relations::Bindings::Embedded::In do
117
120
  context "when the child of an embeds one" do
118
121
 
119
122
  let(:binding) do
120
- described_class.new(name, person, name_metadata)
123
+ described_class.new(name, person, name_association)
121
124
  end
122
125
 
123
126
  context "when the document is unbindable" do
@@ -144,7 +147,7 @@ describe Mongoid::Relations::Bindings::Embedded::In do
144
147
  context "when the child of an embeds many" do
145
148
 
146
149
  let(:binding) do
147
- described_class.new(address, person, address_metadata)
150
+ described_class.new(address, person, address_association)
148
151
  end
149
152
 
150
153
  context "when the document is unbindable" do
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+ # encoding: utf-8
3
+
4
+ require "spec_helper"
5
+
6
+ describe Mongoid::Association::Embedded::EmbeddedIn::Buildable do
7
+
8
+ describe "#build" do
9
+
10
+ let(:base) do
11
+ double
12
+ end
13
+
14
+ let(:options) do
15
+ { }
16
+ end
17
+
18
+ let(:association) do
19
+ Mongoid::Association::Embedded::EmbeddedIn.new(Person, :addresses, options)
20
+ end
21
+
22
+ context "when a document is provided" do
23
+
24
+ let(:object) do
25
+ double
26
+ end
27
+
28
+ let(:document) do
29
+ association.build(base, object)
30
+ end
31
+
32
+ it "returns the document" do
33
+ expect(document).to eq(object)
34
+ end
35
+ end
36
+ end
37
+ 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::Embedded::In do
6
+ describe Mongoid::Association::Embedded::EmbeddedIn::Proxy do
4
7
 
5
8
  describe "#===" do
6
9
 
@@ -12,12 +15,12 @@ describe Mongoid::Relations::Embedded::In do
12
15
  Person.new
13
16
  end
14
17
 
15
- let(:metadata) do
18
+ let(:association) do
16
19
  Name.relations["namable"]
17
20
  end
18
21
 
19
22
  let(:relation) do
20
- described_class.new(base, target, metadata)
23
+ described_class.new(base, target, association)
21
24
  end
22
25
 
23
26
  context "when the proxied document is same class" do
@@ -354,29 +357,6 @@ describe Mongoid::Relations::Embedded::In do
354
357
  end
355
358
  end
356
359
 
357
- describe ".builder" do
358
-
359
- let(:builder_klass) do
360
- Mongoid::Relations::Builders::Embedded::In
361
- end
362
-
363
- let(:base) do
364
- Name.new
365
- end
366
-
367
- let(:target) do
368
- Person.new
369
- end
370
-
371
- let(:metadata) do
372
- Name.relations["namable"]
373
- end
374
-
375
- it "returns the embedded one builder" do
376
- expect(described_class.builder(base, metadata, target)).to be_a(builder_klass)
377
- end
378
- end
379
-
380
360
  describe ".embedded?" do
381
361
 
382
362
  it "returns true" do
@@ -384,39 +364,6 @@ describe Mongoid::Relations::Embedded::In do
384
364
  end
385
365
  end
386
366
 
387
- describe ".foreign_key_suffix" do
388
-
389
- it "returns nil" do
390
- expect(described_class.foreign_key_suffix).to be_nil
391
- end
392
- end
393
-
394
- describe ".macro" do
395
-
396
- it "returns embeds_one" do
397
- expect(described_class.macro).to eq(:embedded_in)
398
- end
399
- end
400
-
401
- describe ".nested_builder" do
402
-
403
- let(:nested_builder_klass) do
404
- Mongoid::Relations::Builders::NestedAttributes::One
405
- end
406
-
407
- let(:metadata) do
408
- Name.relations["namable"]
409
- end
410
-
411
- let(:attributes) do
412
- {}
413
- end
414
-
415
- it "returns the single nested builder" do
416
- expect(described_class.nested_builder(metadata, attributes, {})).to be_a(nested_builder_klass)
417
- end
418
- end
419
-
420
367
  describe "#respond_to?" do
421
368
 
422
369
  let(:person) do
@@ -442,22 +389,6 @@ describe Mongoid::Relations::Embedded::In do
442
389
  end
443
390
  end
444
391
 
445
- describe ".valid_options" do
446
-
447
- it "returns the valid options" do
448
- expect(described_class.valid_options).to eq(
449
- [ :autobuild, :cyclic, :polymorphic, :touch ]
450
- )
451
- end
452
- end
453
-
454
- describe ".validation_default" do
455
-
456
- it "returns false" do
457
- expect(described_class.validation_default).to be false
458
- end
459
- end
460
-
461
392
  context "when creating the tree through initialization" do
462
393
 
463
394
  let!(:person) do
@@ -494,8 +425,8 @@ describe Mongoid::Relations::Embedded::In do
494
425
 
495
426
  it "has the locations in the association array" do
496
427
  expect(Person.last.addresses.last.locations).to eq(
497
- [first_location, second_location]
498
- )
428
+ [first_location, second_location]
429
+ )
499
430
  end
500
431
  end
501
432
 
@@ -576,4 +507,54 @@ describe Mongoid::Relations::Embedded::In do
576
507
  end
577
508
  end
578
509
  end
510
+
511
+ context "when the same class is embedded multiple times" do
512
+
513
+ let(:customer) do
514
+ Customer.new
515
+ end
516
+
517
+ context "assignment after saving" do
518
+
519
+ it "correctly sets the association for the embedded class" do
520
+ pending 'MONGOID-5039'
521
+
522
+ customer.home_address = CustomerAddress.new
523
+ customer.work_address = CustomerAddress.new
524
+
525
+ expect(customer.home_address._association.store_as).to eq("home_address")
526
+ expect(customer.work_address._association.store_as).to eq("work_address")
527
+
528
+ expect(customer.home_address.instance_eval { _association.store_as }).to eq("home_address")
529
+ expect(customer.work_address.instance_eval { _association.store_as }).to eq("work_address")
530
+
531
+ customer.save!
532
+
533
+ customer.home_address = CustomerAddress.new
534
+ customer.work_address = CustomerAddress.new
535
+
536
+ expect(customer.home_address._association.store_as).to eq("home_address")
537
+ expect(customer.work_address._association.store_as).to eq("work_address")
538
+
539
+ expect(customer.home_address.instance_eval { _association.store_as }).to eq("home_address")
540
+ expect(customer.work_address.instance_eval { _association.store_as }).to eq("work_address")
541
+ end
542
+ end
543
+
544
+ context "inverse assignment" do
545
+
546
+ it "correctly sets the association for the embedded class" do
547
+ pending 'MONGOID-5039'
548
+
549
+ customer.work_address = CustomerAddress.new
550
+ customer.work_address.addressable = customer
551
+
552
+ expect(customer.home_address._association.store_as).to eq("home_address")
553
+ expect(customer.work_address._association.store_as).to eq("work_address")
554
+
555
+ expect(customer.home_address.instance_eval { _association.store_as }).to eq("home_address")
556
+ expect(customer.work_address.instance_eval { _association.store_as }).to eq("work_address")
557
+ end
558
+ end
559
+ end
579
560
  end
@@ -0,0 +1,904 @@
1
+ # frozen_string_literal: true
2
+ # encoding: utf-8
3
+
4
+ require "spec_helper"
5
+ require_relative './embeds_one_models'
6
+
7
+ describe Mongoid::Association::Embedded::EmbeddedIn do
8
+
9
+ before do
10
+ class Container; include Mongoid::Document; end
11
+ class EmbeddedObject; include Mongoid::Document; end
12
+ end
13
+
14
+ after do
15
+ Object.send(:remove_const, :Container)
16
+ Object.send(:remove_const, :EmbeddedObject)
17
+ end
18
+
19
+ let(:embedded_class) do
20
+ EmbeddedObject
21
+ end
22
+
23
+ let(:name) do
24
+ :container
25
+ end
26
+
27
+ let(:association) do
28
+ embedded_class.embedded_in name, options
29
+ end
30
+
31
+ let(:options) do
32
+ { }
33
+ end
34
+
35
+ describe '#VALID_OPTIONS' do
36
+
37
+ it 'returns the SHARED options with the ASSOCIATION_OPTIONS' do
38
+ expect(association.class::VALID_OPTIONS).to match_array(Mongoid::Association::Relatable::SHARED_OPTIONS +
39
+ association.class::ASSOCIATION_OPTIONS)
40
+ end
41
+ end
42
+
43
+ describe '#relation_complements' do
44
+
45
+ let(:expected_complements) do
46
+ [
47
+ Mongoid::Association::Embedded::EmbedsMany,
48
+ Mongoid::Association::Embedded::EmbedsOne
49
+ ]
50
+ end
51
+
52
+ it 'returns the relation complements' do
53
+ expect(association.send(:relation_complements)).to eq(expected_complements)
54
+ end
55
+ end
56
+
57
+ describe '#setup_instance_methods!' do
58
+
59
+ it 'sets up a getter for the relation' do
60
+ expect(Mongoid::Association::Accessors).to receive(:define_getter!).with(association)
61
+ association.send(:setup_instance_methods!)
62
+ end
63
+
64
+ it 'sets up a setter for the relation' do
65
+ expect(Mongoid::Association::Accessors).to receive(:define_setter!).with(association)
66
+ association.send(:setup_instance_methods!)
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.send(:setup_instance_methods!)
72
+ end
73
+ end
74
+
75
+ describe '#inverse_type_setter' do
76
+
77
+ context 'when polymorphic' do
78
+
79
+ let(:options) do
80
+ { polymorphic: true }
81
+ end
82
+
83
+ it 'returns nil' do
84
+ expect(association.inverse_type).to be_nil
85
+ end
86
+ end
87
+
88
+ context 'when not polymorphic' do
89
+
90
+ it 'returns nil' do
91
+ expect(association.inverse_type).to be_nil
92
+ end
93
+ end
94
+ end
95
+
96
+ describe '#embedded?' do
97
+
98
+ it 'returns true' do
99
+ expect(association.embedded?).to be(true)
100
+ end
101
+ end
102
+
103
+ describe '#relation' do
104
+
105
+ it 'returns Mongoid::Association::Embedded::EmbeddedIn::Proxy' do
106
+ expect(association.relation).to be(Mongoid::Association::Embedded::EmbeddedIn::Proxy)
107
+ end
108
+ end
109
+
110
+ describe '#validation_default' do
111
+
112
+ it 'returns false' do
113
+ expect(association.validation_default).to be(false)
114
+ end
115
+ end
116
+
117
+ describe '#name' do
118
+
119
+ it 'returns the name of the relation' do
120
+ expect(association.name).to be(name)
121
+ end
122
+ end
123
+
124
+ describe '#options' do
125
+
126
+ it 'returns the options' do
127
+ expect(association.options).to be(options)
128
+ end
129
+ end
130
+
131
+ describe '#cyclic?' do
132
+
133
+ context 'when :cyclic is specified in the options' do
134
+
135
+ let(:options) do
136
+ { cyclic: true }
137
+ end
138
+
139
+ it 'returns true' do
140
+ expect(association.cyclic?).to be(true)
141
+ end
142
+ end
143
+
144
+ context 'when :cyclic is not specified in the options' do
145
+
146
+ it 'returns false' do
147
+ expect(association.cyclic?).to be(false)
148
+ end
149
+ end
150
+ end
151
+
152
+ describe '#merge!' do
153
+
154
+ end
155
+
156
+
157
+ describe '#touchable?' do
158
+
159
+ context 'when :touch is in the options' do
160
+
161
+ let(:options) do
162
+ { touch: true}
163
+ end
164
+
165
+ it 'returns true' do
166
+ expect(association.send(:touchable?)).to be(true)
167
+ end
168
+ end
169
+
170
+ context 'when :touch is not in the options' do
171
+
172
+ it 'return false' do
173
+ expect(association.send(:touchable?)).to be(false)
174
+ end
175
+ end
176
+ end
177
+
178
+ describe '#polymorphic?' do
179
+
180
+ context 'when :polymorphic is specified in the options as true' do
181
+
182
+ let(:options) do
183
+ { polymorphic: true }
184
+ end
185
+
186
+ it 'returns true' do
187
+ expect(association.polymorphic?).to be(true)
188
+ end
189
+ end
190
+
191
+ context 'when :polymorphic is specified in the options as false' do
192
+
193
+ let(:options) do
194
+ { polymorphic: false }
195
+ end
196
+
197
+ it 'returns false' do
198
+ expect(association.polymorphic?).to be(false)
199
+ end
200
+ end
201
+
202
+ context 'when :polymorphic is not specified in the options' do
203
+
204
+ it 'returns false' do
205
+ expect(association.polymorphic?).to be(false)
206
+ end
207
+ end
208
+ end
209
+
210
+ describe '#bindable?' do
211
+
212
+ it 'returns false' do
213
+ expect(association.bindable?(Person.new)).to be(false)
214
+ end
215
+ end
216
+
217
+ describe '#inverses' do
218
+
219
+ context 'when polymorphic' do
220
+
221
+ let(:options) do
222
+ {
223
+ polymorphic: true
224
+ }
225
+ end
226
+
227
+ let(:name) do
228
+ :containable
229
+ end
230
+
231
+ context 'when another object is passed to the method' do
232
+
233
+ let(:instance_of_other_class) do
234
+ Container.new
235
+ end
236
+
237
+ context 'when the relation class has only one relation whose class matches the owning class' do
238
+
239
+ before do
240
+ Container.embeds_many :embedded_objects, as: :containable
241
+ end
242
+
243
+ context 'when :inverse_of is specified' do
244
+
245
+ before do
246
+ options.merge!(inverse_of: :inverse_name)
247
+ end
248
+
249
+ it 'returns the :inverse_of value' do
250
+ expect(association.inverses(instance_of_other_class)).to eq([ :inverse_name ])
251
+ end
252
+ end
253
+
254
+ context 'when inverse_of is not specified' do
255
+
256
+ it 'returns the list of relations whose :as attribute matches the name of this association' do
257
+ expect(association.inverses(instance_of_other_class)).to match_array([ :embedded_objects ])
258
+ end
259
+
260
+ context 'when the relation class has two associations with the same name' do
261
+
262
+ before do
263
+ Container.embeds_many :embedded_objects, as: :containable
264
+ Container.embeds_many :other_embedded_objects, as: :containable
265
+ end
266
+
267
+ it 'returns only the relations whose :as attribute and class match' do
268
+ expect(association.inverses(instance_of_other_class)).to match_array([ :embedded_objects ])
269
+ end
270
+ end
271
+ end
272
+ end
273
+
274
+ context 'when the relation class has more than one relation whose class matches the owning class' do
275
+
276
+ before do
277
+ Container.embeds_many :embedded_objects, as: :containable
278
+ Container.embeds_one :other_embedded_object, as: :containable, class_name: 'EmbeddedObject'
279
+ end
280
+
281
+ context 'when :inverse_of is specified' do
282
+
283
+ before do
284
+ options.merge!(inverse_of: :inverse_name)
285
+ end
286
+
287
+ it 'returns the :inverse_of value' do
288
+ expect(association.inverses(instance_of_other_class)).to eq([ :inverse_name ])
289
+ end
290
+ end
291
+
292
+ context 'when inverse_of is not specified' do
293
+
294
+ it 'returns the list of relations whose :as attribute matches the name of this association' do
295
+ expect(association.inverses(instance_of_other_class)).to match_array([ :embedded_objects,
296
+ :other_embedded_object ])
297
+ end
298
+ end
299
+ end
300
+ end
301
+
302
+ context 'when another object is not passed to the method' do
303
+
304
+ context 'when inverse_of is specified' do
305
+
306
+ before do
307
+ options.merge!(inverse_of: :inverse_name)
308
+ end
309
+
310
+ it 'returns the :inverse_of value' do
311
+ expect(association.inverses).to eq([ :inverse_name ])
312
+ end
313
+ end
314
+
315
+ context 'when inverse_of is not specified' do
316
+
317
+ it 'returns nil' do
318
+ expect(association.inverses).to eq(nil)
319
+ end
320
+
321
+ context 'when class_name is given and is a plain string' do
322
+ let(:association) do
323
+ EomParent.relations['child']
324
+ end
325
+
326
+ it 'returns the inverse in an array' do
327
+ inverses = association.inverses
328
+ expect(inverses).to eq([:parent])
329
+ end
330
+ end
331
+
332
+ context 'when class_name is given and is a :: prefixed string' do
333
+ let(:association) do
334
+ EomCcChild.relations['parent']
335
+ end
336
+
337
+ it 'returns the inverse in an array' do
338
+ pending 'MONGOID-4751'
339
+
340
+ inverses = association.inverses
341
+ expect(inverses).to eq([:child])
342
+ end
343
+
344
+ context 'when other associations referencing unloaded classes exist' do
345
+ let(:association) do
346
+ EomDnlChild.relations['parent']
347
+ end
348
+
349
+ it 'does not load other classes' do
350
+ inverses = association.inverses
351
+ expect(inverses).to eq([:child])
352
+ expect(Object.const_defined?(:EoDnlMarker)).to be false
353
+ end
354
+ end
355
+ end
356
+ end
357
+ end
358
+ end
359
+
360
+ context 'when not polymorphic' do
361
+
362
+ context 'when inverse_of is specified' do
363
+
364
+ before do
365
+ options.merge!(inverse_of: :inverse_name)
366
+ end
367
+
368
+ it 'returns the :inverse_of value' do
369
+ expect(association.inverses).to eq([ :inverse_name ])
370
+ end
371
+ end
372
+
373
+ context 'when inverse_of is not specified' do
374
+
375
+ before do
376
+ Container.embeds_many :embedded_objects
377
+ end
378
+
379
+ it 'uses the inverse class to find the inverse name' do
380
+ expect(association.inverses).to eq([ :embedded_objects ])
381
+ end
382
+ end
383
+
384
+ context 'when :cyclic is specified' do
385
+
386
+ it 'returns the cyclic inverse name' do
387
+
388
+ end
389
+ end
390
+
391
+ context 'when the inverse class has more than one relation with objects of the owner class' do
392
+
393
+ before do
394
+ Container.embeds_many :embedded_objects
395
+ Container.embeds_many :other_embedded_objects, class_name: 'EmbeddedObject'
396
+ end
397
+
398
+ it 'raises a Mongoid::Errors::AmbiguousRelationship exception' do
399
+ expect {
400
+ association.inverses
401
+ }.to raise_exception(Mongoid::Errors::AmbiguousRelationship)
402
+ end
403
+ end
404
+
405
+ context 'when the inverse class only has one relation with objects of the owner class' do
406
+
407
+ before do
408
+ Container.embeds_many :embedded_objects
409
+ end
410
+
411
+ it 'uses the inverse class to find the inverse name' do
412
+ expect(association.inverses).to eq([ :embedded_objects ])
413
+ end
414
+ end
415
+ end
416
+ end
417
+
418
+ describe '#inverse' do
419
+
420
+ context 'when polymorphic' do
421
+
422
+ let(:options) do
423
+ {
424
+ polymorphic: true
425
+ }
426
+ end
427
+
428
+ let(:name) do
429
+ :containable
430
+ end
431
+
432
+ context 'when another object is passed to the method' do
433
+
434
+ let(:instance_of_other_class) do
435
+ Container.new
436
+ end
437
+
438
+ context 'when the relation class has only one relation whose class matches the owning class' do
439
+
440
+ before do
441
+ Container.embeds_many :embedded_objects, as: :containable
442
+ end
443
+
444
+ context 'when :inverse_of is specified' do
445
+
446
+ before do
447
+ options.merge!(inverse_of: :inverse_name)
448
+ end
449
+
450
+ it 'returns the :inverse_of value' do
451
+ expect(association.inverse(instance_of_other_class)).to eq(:inverse_name)
452
+ end
453
+ end
454
+
455
+ context 'when inverse_of is not specified' do
456
+
457
+ it 'returns the list of relations whose :as attribute matches the name of this association' do
458
+ expect(association.inverse(instance_of_other_class)).to eq(:embedded_objects)
459
+ end
460
+ end
461
+ end
462
+
463
+ context 'when the relation class has more than one relation whose class matches the owning class' do
464
+
465
+ before do
466
+ Container.embeds_many :embedded_objects, as: :containable
467
+ Container.embeds_one :other_embedded_object, as: :containable
468
+ end
469
+
470
+ context 'when :inverse_of is specified' do
471
+
472
+ before do
473
+ options.merge!(inverse_of: :inverse_name)
474
+ end
475
+
476
+ it 'returns the :inverse_of value' do
477
+ expect(association.inverse(instance_of_other_class)).to eq(:inverse_name)
478
+ end
479
+ end
480
+
481
+ context 'when inverse_of is not specified' do
482
+
483
+ it 'returns the first candidate whose :as attribute matches the name of this association' do
484
+ expect(association.inverse(instance_of_other_class)).to eq(:embedded_objects)
485
+ end
486
+ end
487
+ end
488
+ end
489
+
490
+ context 'when another object is not passed to the method' do
491
+
492
+ context 'when inverse_of is specified' do
493
+
494
+ before do
495
+ options.merge!(inverse_of: :inverse_name)
496
+ end
497
+
498
+ it 'returns the :inverse_of value' do
499
+ expect(association.inverse).to eq(:inverse_name)
500
+ end
501
+ end
502
+
503
+ context 'when inverse_of is not specified' do
504
+
505
+ it 'returns nil' do
506
+ expect(association.inverse).to eq(nil)
507
+ end
508
+ end
509
+ end
510
+ end
511
+
512
+ context 'when not polymorphic' do
513
+
514
+ context 'when inverse_of is specified' do
515
+
516
+ before do
517
+ options.merge!(inverse_of: :inverse_name)
518
+ end
519
+
520
+ it 'returns the :inverse_of value' do
521
+ expect(association.inverse).to eq(:inverse_name)
522
+ end
523
+ end
524
+
525
+ context 'when inverse_of is not specified' do
526
+
527
+ before do
528
+ Container.embeds_many :embedded_objects
529
+ end
530
+
531
+ it 'uses the inverse class to find the inverse name' do
532
+ expect(association.inverse).to eq(:embedded_objects)
533
+ end
534
+ end
535
+
536
+ context 'when :cyclic is specified' do
537
+
538
+ it 'returns the cyclic inverse name' do
539
+
540
+ end
541
+ end
542
+
543
+ context 'when the inverse class has more than one relation with objects of the owner class' do
544
+
545
+ before do
546
+ Container.embeds_many :embedded_objects
547
+ Container.embeds_many :other_embedded_objects, class_name: 'EmbeddedObject'
548
+ end
549
+
550
+ it 'raises a Mongoid::Errors::AmbiguousRelationship exception' do
551
+ expect {
552
+ association.inverse
553
+ }.to raise_exception(Mongoid::Errors::AmbiguousRelationship)
554
+ end
555
+ end
556
+
557
+ context 'when the inverse class only has one relation with objects of the owner class' do
558
+
559
+ before do
560
+ Container.embeds_many :embedded_objects
561
+ end
562
+
563
+ it 'uses the inverse class to find the inverse name' do
564
+ expect(association.inverse).to eq(:embedded_objects)
565
+ end
566
+ end
567
+ end
568
+ end
569
+
570
+ describe '#inverse_association' do
571
+
572
+ end
573
+
574
+ describe '#autosave' do
575
+
576
+ it 'returns false' do
577
+ expect(association.autosave).to be(false)
578
+ end
579
+ end
580
+
581
+ describe '#relation_class_name' do
582
+
583
+ context 'when the :class_name option is specified' do
584
+
585
+ let(:options) do
586
+ { class_name: 'OtherContainer' }
587
+ end
588
+
589
+ it 'returns the class name option' do
590
+ expect(association.relation_class_name).to eq('OtherContainer')
591
+ end
592
+
593
+ context ':class_name is a :: prefixed string' do
594
+ let(:association) do
595
+ EomCcChild.relations['parent']
596
+ end
597
+
598
+ it 'returns the :: prefixed string' do
599
+ expect(association.relation_class_name).to eq('::EomCcParent')
600
+ end
601
+ end
602
+ end
603
+
604
+ context 'when the class_name option is not specified' do
605
+
606
+ it 'uses the name of the relation to deduce the class name' do
607
+ expect(association.relation_class_name).to eq('Container')
608
+ end
609
+ end
610
+
611
+ context 'when another association in the model is referencing a third model class' do
612
+ let(:association) do
613
+ EomDnlChild.relations['parent']
614
+ end
615
+
616
+ it 'does not attempt to load the third class' do
617
+ expect(association.relation_class_name).to eq('EomDnlParent')
618
+ expect(Object.const_defined?(:EoDnlMarker)).to be false
619
+ end
620
+ end
621
+ end
622
+
623
+ describe '#klass' do
624
+
625
+ context 'when the :class_name option is specified' do
626
+
627
+ let!(:_class) do
628
+ class OtherContainer; end
629
+ OtherContainer
630
+ end
631
+
632
+ let(:options) do
633
+ { class_name: 'OtherContainer' }
634
+ end
635
+
636
+ it 'returns the class name option' do
637
+ expect(association.klass).to eq(_class)
638
+ end
639
+ end
640
+
641
+ context 'when the class_name option is not specified' do
642
+
643
+ it 'uses the name of the relation to deduce the class name' do
644
+ expect(association.klass).to eq(Container)
645
+ end
646
+ end
647
+ end
648
+
649
+ describe '#inverse_class_name' do
650
+
651
+ it 'returns the name of the owner class' do
652
+ expect(association.inverse_class_name).to eq(embedded_class.name)
653
+ end
654
+ end
655
+
656
+ describe '#inverse_class' do
657
+
658
+ it 'returns the owner class' do
659
+ expect(association.inverse_class).to be(embedded_class)
660
+ end
661
+ end
662
+
663
+ describe '#inverse_of' do
664
+
665
+ context 'when :inverse_of is specified in the options' do
666
+
667
+ let(:options) do
668
+ { inverse_of: :a_container }
669
+ end
670
+
671
+ it 'returns the inverse_of value' do
672
+ expect(association.inverse_of).to eq(options[:inverse_of])
673
+ end
674
+ end
675
+
676
+ context 'when :inverse_of is not specified in the options' do
677
+
678
+ it 'returns nil' do
679
+ expect(association.inverse_of).to be_nil
680
+ end
681
+ end
682
+ end
683
+
684
+ describe '#key' do
685
+
686
+ it 'returns the name of the relation as a string' do
687
+ expect(association.key).to eq(name.to_s)
688
+ end
689
+ end
690
+
691
+ describe '#setter' do
692
+
693
+ it 'returns a string of the name followed by =' do
694
+ expect(association.setter).to eq("#{name}=")
695
+ end
696
+ end
697
+
698
+ describe '#validate?' do
699
+
700
+ context 'when :validate is specified in the options' do
701
+
702
+ context 'when validate is true' do
703
+
704
+ let(:options) do
705
+ { validate: true }
706
+ end
707
+
708
+ it 'returns true' do
709
+ expect(association.send(:validate?)).to be(true)
710
+ end
711
+ end
712
+
713
+ context 'when validate is false' do
714
+
715
+ let(:options) do
716
+ { validate: false }
717
+ end
718
+
719
+ it 'returns false' do
720
+ expect(association.send(:validate?)).to be(false)
721
+ end
722
+ end
723
+ end
724
+
725
+ context 'when :validate is not specified in the options' do
726
+
727
+ it 'returns the validation_default' do
728
+ expect(association.send(:validate?)).to eq(association.validation_default)
729
+ end
730
+ end
731
+ end
732
+
733
+ describe '#autobuilding?' do
734
+
735
+ context 'when :autobuild is specified in the options' do
736
+
737
+ context 'when autobuild is true' do
738
+
739
+ let(:options) do
740
+ { autobuild: true }
741
+ end
742
+
743
+ it 'returns true' do
744
+ expect(association.autobuilding?).to be(true)
745
+ end
746
+ end
747
+
748
+ context 'when autobuild is false' do
749
+
750
+ let(:options) do
751
+ { autobuild: false }
752
+ end
753
+
754
+ it 'returns true' do
755
+ expect(association.autobuilding?).to be(false)
756
+ end
757
+ end
758
+ end
759
+
760
+ context 'when :validate is not specified in the options' do
761
+
762
+ it 'returns false' do
763
+ expect(association.autobuilding?).to be(false)
764
+ end
765
+ end
766
+ end
767
+
768
+ describe '#forced_nil_inverse?' do
769
+
770
+ it 'returns false' do
771
+ expect(association.forced_nil_inverse?).to be(false)
772
+ end
773
+ end
774
+
775
+ describe '#stores_foreign_key?' do
776
+
777
+ it 'returns false' do
778
+ expect(association.stores_foreign_key?).to be(false)
779
+ end
780
+ end
781
+
782
+ describe '#inverse_setter' do
783
+
784
+ context 'when an inverse can be determined' do
785
+
786
+ before do
787
+ Container.embeds_many :embedded_objects
788
+ end
789
+
790
+ it 'returns the name of the inverse followed by =' do
791
+ expect(association.inverse_setter).to eq('embedded_objects=')
792
+ end
793
+ end
794
+
795
+ context 'when an inverse cannot be determined' do
796
+
797
+ it 'returns nil' do
798
+ expect(association.inverse_setter).to be_nil
799
+ end
800
+ end
801
+ end
802
+
803
+ describe '#extension' do
804
+
805
+ context 'when a block is passed' do
806
+
807
+ let(:association) do
808
+ embedded_class.embedded_in name, options do; end
809
+ end
810
+
811
+ it 'defines an extension module' do
812
+ expect(association.extension).to be_a(Module)
813
+ end
814
+
815
+ it 'returns the extension' do
816
+ expect(association.extension).to eq(
817
+ "#{embedded_class.name}::#{embedded_class.name}#{name.capitalize}RelationExtension".constantize)
818
+ end
819
+ end
820
+
821
+ context 'when an :extension is not specified in the options' do
822
+
823
+ it 'returns false' do
824
+ expect(association.extension).to be_nil
825
+ end
826
+ end
827
+ end
828
+
829
+ describe '#criteria' do
830
+
831
+ it 'does not respond to the method' do
832
+ expect {
833
+ association.criteria
834
+ }.to raise_exception(NoMethodError)
835
+ end
836
+ end
837
+
838
+ describe '#destructive?' do
839
+
840
+ it 'returns false' do
841
+ expect(association.destructive?).to be(false)
842
+ end
843
+ end
844
+
845
+ describe '#nested_builder' do
846
+
847
+ it 'returns an instance of Association::Nested::One' do
848
+ expect(association.nested_builder({}, {})).to be_a(Mongoid::Association::Nested::One)
849
+ end
850
+ end
851
+
852
+ describe '#cascading_callbacks?' do
853
+
854
+ context 'when cascade_callbacks is specified in the options' do
855
+
856
+ let(:options) do
857
+ {cascade_callbacks: true}
858
+ end
859
+
860
+ it 'raises a Mongoid::Errors::InvalidRelationOption exception' do
861
+ expect {
862
+ association.cascading_callbacks?
863
+ }.to raise_exception(Mongoid::Errors::InvalidRelationOption)
864
+ end
865
+ end
866
+
867
+ context 'when cascade_callbacks is not specified in the options' do
868
+
869
+ it 'returns false' do
870
+ expect(association.cascading_callbacks?).to be(false)
871
+ end
872
+ end
873
+ end
874
+
875
+ describe '#path' do
876
+
877
+ it 'returns an instance of Mongoid::Atomic::Paths::Root' do
878
+ expect(association.path({})).to be_a(Mongoid::Atomic::Paths::Root)
879
+ end
880
+ end
881
+
882
+ describe '#foreign_key_check' do
883
+
884
+ it 'returns nil' do
885
+ expect(association.foreign_key_check).to be_nil
886
+ end
887
+ end
888
+
889
+ describe '#create_relation' do
890
+
891
+ let(:owner) do
892
+ Container.new
893
+ end
894
+
895
+ let(:target) do
896
+ EmbeddedObject.new
897
+ end
898
+
899
+ it 'returns an instance of Mongoid::Association::Embedded::EmbeddedIn::Proxy' do
900
+ expect(Mongoid::Association::Embedded::EmbeddedIn::Proxy).to receive(:new).and_call_original
901
+ expect(association.create_relation(owner, target)).to be_a(EmbeddedObject)
902
+ end
903
+ end
904
+ end