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::Bindings::Embedded::One do
6
+ describe Mongoid::Association::Embedded::EmbedsOne::Binding do
4
7
 
5
8
  let(:person) do
6
9
  Person.new
@@ -10,14 +13,14 @@ describe Mongoid::Relations::Bindings::Embedded::One do
10
13
  Name.new
11
14
  end
12
15
 
13
- let(:metadata) do
16
+ let(:association) do
14
17
  Person.relations["name"]
15
18
  end
16
19
 
17
20
  describe "#bind" do
18
21
 
19
22
  let(:binding) do
20
- described_class.new(person, target, metadata)
23
+ described_class.new(person, target, association)
21
24
  end
22
25
 
23
26
  context "when the document is bindable" do
@@ -51,7 +54,7 @@ describe Mongoid::Relations::Bindings::Embedded::One do
51
54
  describe "#unbind" do
52
55
 
53
56
  let(:binding) do
54
- described_class.new(person, target, metadata)
57
+ described_class.new(person, target, association)
55
58
  end
56
59
 
57
60
  context "when the document is unbindable" do
@@ -1,29 +1,32 @@
1
+ # frozen_string_literal: true
2
+ # encoding: utf-8
3
+
1
4
  require "spec_helper"
2
5
 
3
- describe Mongoid::Relations::Builders::Embedded::One do
6
+ describe Mongoid::Association::Embedded::EmbedsOne::Buildable do
4
7
 
5
8
  let(:base) do
6
9
  double
7
10
  end
8
11
 
9
- let(:builder) do
10
- described_class.new(base, metadata, object)
12
+ let(:options) do
13
+ { }
11
14
  end
12
15
 
13
16
  describe "#build" do
14
17
 
15
- context "when provided nil" do
18
+ let(:document) do
19
+ association.build(base, object)
20
+ end
16
21
 
17
- let(:metadata) do
18
- double(klass: Name, name: :name)
19
- end
22
+ let(:association) do
23
+ Mongoid::Association::Embedded::EmbedsOne.new(Person, :name, options)
24
+ end
20
25
 
21
- let(:builder) do
22
- described_class.new(nil, metadata, nil)
23
- end
26
+ context "when provided nil" do
24
27
 
25
- let(:document) do
26
- builder.build
28
+ let(:object) do
29
+ nil
27
30
  end
28
31
 
29
32
  it "returns nil" do
@@ -33,18 +36,10 @@ describe Mongoid::Relations::Builders::Embedded::One do
33
36
 
34
37
  context "when provided a document" do
35
38
 
36
- let(:metadata) do
37
- double(klass: Name, name: :name)
38
- end
39
-
40
39
  let(:object) do
41
40
  Name.new
42
41
  end
43
42
 
44
- let(:document) do
45
- builder.build
46
- end
47
-
48
43
  it "returns the document" do
49
44
  expect(document).to eq(object)
50
45
  end
@@ -52,18 +47,10 @@ describe Mongoid::Relations::Builders::Embedded::One do
52
47
 
53
48
  context "when no type is in the object" do
54
49
 
55
- let(:metadata) do
56
- double(klass: Name, name: :name)
57
- end
58
-
59
50
  let(:object) do
60
51
  { "first_name" => "Corbin" }
61
52
  end
62
53
 
63
- let(:document) do
64
- builder.build
65
- end
66
-
67
54
  it "creates the correct type of document" do
68
55
  expect(document).to be_a_kind_of(Name)
69
56
  end
@@ -75,18 +62,14 @@ describe Mongoid::Relations::Builders::Embedded::One do
75
62
 
76
63
  context "when a type is in the object" do
77
64
 
78
- let(:metadata) do
79
- double(klass: Writer, name: :writer)
65
+ let(:association) do
66
+ Mongoid::Association::Embedded::EmbedsOne.new(Person, :writer, options)
80
67
  end
81
68
 
82
69
  let(:object) do
83
70
  { "_type" => PdfWriter.name, "speed" => 100 }
84
71
  end
85
72
 
86
- let(:document) do
87
- builder.build
88
- end
89
-
90
73
  it "creates the correct type of document" do
91
74
  expect(document).to be_a_kind_of(PdfWriter)
92
75
  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::One do
6
+ describe Mongoid::Association::Embedded::EmbedsOne::Proxy do
4
7
 
5
8
  describe "#===" do
6
9
 
@@ -12,12 +15,12 @@ describe Mongoid::Relations::Embedded::One do
12
15
  Name.new
13
16
  end
14
17
 
15
- let(:metadata) do
18
+ let(:association) do
16
19
  Person.relations["name"]
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
@@ -168,7 +171,7 @@ describe Mongoid::Relations::Embedded::One do
168
171
  expect(name).to be_persisted
169
172
  end
170
173
 
171
- context "when replacing an exising document" do
174
+ context "when replacing an existing document" do
172
175
 
173
176
  let(:pet_owner) do
174
177
  PetOwner.create
@@ -200,6 +203,29 @@ describe Mongoid::Relations::Embedded::One do
200
203
  end
201
204
  end
202
205
  end
206
+
207
+ context 'when the original document does not need to be unset because it will be replaced by the $set' do
208
+
209
+ let!(:pet_owner) do
210
+ PetOwner.create(pet: pet_one)
211
+ end
212
+
213
+ let(:pet_one) do
214
+ Pet.new(name: 'kika')
215
+ end
216
+
217
+ let(:pet_two) do
218
+ Pet.new(name: 'tiksy')
219
+ end
220
+
221
+ before do
222
+ expect(Mongo::Logger.logger).to receive(:debug?).exactly(2).times
223
+ end
224
+
225
+ it 'does not execute an unnecessary unset for the relation' do
226
+ pet_owner.pet = pet_two
227
+ end
228
+ end
203
229
 
204
230
  context "when setting via the parent attributes" do
205
231
 
@@ -644,29 +670,6 @@ describe Mongoid::Relations::Embedded::One do
644
670
  end
645
671
  end
646
672
 
647
- describe ".builder" do
648
-
649
- let(:base) do
650
- Person.new
651
- end
652
-
653
- let(:target) do
654
- Name.new
655
- end
656
-
657
- let(:metadata) do
658
- Person.relations["name"]
659
- end
660
-
661
- let(:builder_klass) do
662
- Mongoid::Relations::Builders::Embedded::One
663
- end
664
-
665
- it "returns the embedded one builder" do
666
- expect(described_class.builder(base, metadata, target)).to be_a(builder_klass)
667
- end
668
- end
669
-
670
673
  describe "#create_#\{name}" do
671
674
 
672
675
  context "when the parent is a new record" do
@@ -787,6 +790,12 @@ describe Mongoid::Relations::Embedded::One do
787
790
  ShipmentAddress.new
788
791
  end
789
792
 
793
+ after do
794
+ # Note that this is necessary, otherwise all further Address objects will be
795
+ # saved with a "_type" attributes. See Traversable#inherited for why.
796
+ Address.send(:remove_defaults, "_type")
797
+ end
798
+
790
799
  before do
791
800
  courier_job.drop_address = old_child
792
801
  courier_job.update_attribute(:drop_address, new_child)
@@ -807,41 +816,6 @@ describe Mongoid::Relations::Embedded::One do
807
816
  end
808
817
  end
809
818
 
810
- describe ".foreign_key_suffix" do
811
-
812
- it "returns nil" do
813
- expect(described_class.foreign_key_suffix).to be_nil
814
- end
815
- end
816
-
817
- describe ".macro" do
818
-
819
- it "returns embeds_one" do
820
- expect(described_class.macro).to eq(:embeds_one)
821
- end
822
- end
823
-
824
- describe ".nested_builder" do
825
-
826
- let(:nested_builder_klass) do
827
- Mongoid::Relations::Builders::NestedAttributes::One
828
- end
829
-
830
- let(:metadata) do
831
- Person.relations["name"]
832
- end
833
-
834
- let(:attributes) do
835
- {}
836
- end
837
-
838
- it "returns the single nested builder" do
839
- expect(
840
- described_class.nested_builder(metadata, attributes, {})
841
- ).to be_a(nested_builder_klass)
842
- end
843
- end
844
-
845
819
  describe "#respond_to?" do
846
820
 
847
821
  let(:person) do
@@ -871,22 +845,6 @@ describe Mongoid::Relations::Embedded::One do
871
845
  end
872
846
  end
873
847
 
874
- describe ".valid_options" do
875
-
876
- it "returns the valid options" do
877
- expect(described_class.valid_options).to eq(
878
- [ :autobuild, :as, :cascade_callbacks, :cyclic, :store_as ]
879
- )
880
- end
881
- end
882
-
883
- describe ".validation_default" do
884
-
885
- it "returns true" do
886
- expect(described_class.validation_default).to be true
887
- end
888
- end
889
-
890
848
  context "when the embedded document has an array field" do
891
849
 
892
850
  let!(:person) do
@@ -895,9 +853,9 @@ describe Mongoid::Relations::Embedded::One do
895
853
 
896
854
  let!(:name) do
897
855
  person.create_name(
898
- first_name: "Syd",
899
- last_name: "Vicious",
900
- aliases: nil
856
+ first_name: "Syd",
857
+ last_name: "Vicious",
858
+ aliases: nil
901
859
  )
902
860
  end
903
861
 
@@ -980,7 +938,7 @@ describe Mongoid::Relations::Embedded::One do
980
938
 
981
939
  before do
982
940
  person.collection.find(_id: person.id).update_one(
983
- "$pull" => { "addresses" => { _id: address_one.id }}
941
+ "$pull" => { "addresses" => { _id: address_one.id }}
984
942
  )
985
943
  end
986
944
 
@@ -1013,8 +971,8 @@ describe Mongoid::Relations::Embedded::One do
1013
971
 
1014
972
  before do
1015
973
  band.collection.
1016
- find(_id: band.id).
1017
- update_one("$set" => { label: { name: "Mute" }})
974
+ find(_id: band.id).
975
+ update_one("$set" => { label: { name: "Mute" }})
1018
976
  end
1019
977
 
1020
978
  context "when loading the documents" do
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+ # encoding: utf-8
3
+
4
+ # This file is added as an autoload target, but should never be actually
5
+ # processed.
6
+
7
+ # Marker class - if this class exists, this file was attempted to be required.
8
+ class EoDnlMarker
9
+ end
@@ -0,0 +1,54 @@
1
+ # frozen_string_literal: true
2
+ # encoding: utf-8
3
+
4
+ class EomParent
5
+ include Mongoid::Document
6
+
7
+ embeds_one :child, class_name: 'EomChild'
8
+
9
+ field :name, type: String
10
+ end
11
+
12
+ class EomChild
13
+ include Mongoid::Document
14
+
15
+ embedded_in :parent, class_name: 'EomParent'
16
+
17
+ field :a, type: Integer, default: 0
18
+ field :b, type: Integer, default: 0
19
+ end
20
+
21
+ # Models with associations with :class_name as a :: prefixed string
22
+
23
+ class EomCcParent
24
+ include Mongoid::Document
25
+
26
+ embeds_one :child, class_name: '::EomCcChild'
27
+ end
28
+
29
+ class EomCcChild
30
+ include Mongoid::Document
31
+
32
+ embedded_in :parent, class_name: '::EomCcParent'
33
+ end
34
+
35
+ # Models referencing other models which should not be loaded unless the
36
+ # respective association is referenced
37
+
38
+ autoload :EomDnlMissingChild, 'mongoid/association/embedded/embeds_one_dnl_models'
39
+
40
+ class EomDnlParent
41
+ include Mongoid::Document
42
+
43
+ embeds_one :child, class_name: 'EomDnlChild'
44
+ embeds_one :missing_child, class_name: 'EomDnlMissingChild'
45
+ end
46
+
47
+ autoload :EomDnlMissingParent, 'mongoid/association/embedded/embeds_one_dnl_models'
48
+
49
+ class EomDnlChild
50
+ include Mongoid::Document
51
+
52
+ embedded_in :parent, class_name: 'EomDnlParent'
53
+ embedded_in :missing_parent, class_name: 'EomDnlMissingParent'
54
+ end
@@ -0,0 +1,29 @@
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::EmbedsOne do
8
+
9
+ context 'when projecting with #only' do
10
+ before do
11
+ parent = EomParent.new(name: 'foo')
12
+ parent.child = EomChild.new(a: 1, b: 2)
13
+ parent.save!
14
+ end
15
+
16
+ let(:parent) do
17
+ EomParent.where(name: 'foo').only(:name, 'child._id', 'child.a').first
18
+ end
19
+
20
+ it 'populates specified fields only' do
21
+ expect(parent.child.a).to eq(1)
22
+ # has a default value specified in the model
23
+ expect do
24
+ parent.child.b
25
+ end.to raise_error(ActiveModel::MissingAttributeError)
26
+ expect(parent.child.attributes.keys).to eq(['_id', 'a'])
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,957 @@
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::EmbedsOne 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
+ Container.relations.clear
16
+ EmbeddedObject.relations.clear
17
+ end
18
+
19
+ let(:embeds_one_class) do
20
+ Container
21
+ end
22
+
23
+ let(:name) do
24
+ :embedded_object
25
+ end
26
+
27
+ let(:association) do
28
+ embeds_one_class.embeds_one name, options
29
+ end
30
+
31
+ let(:options) do
32
+ { }
33
+ end
34
+
35
+ describe '#relation_complements' do
36
+
37
+ let(:expected_complements) do
38
+ [
39
+ Mongoid::Association::Embedded::EmbeddedIn,
40
+ ]
41
+ end
42
+
43
+ it 'returns the relation complements' do
44
+ expect(association.send(:relation_complements)).to eq(expected_complements)
45
+ end
46
+ end
47
+
48
+ describe '#setup!' do
49
+
50
+ it 'sets up a getter for the relation' do
51
+ expect(Mongoid::Association::Accessors).to receive(:define_getter!).with(association)
52
+ association.setup!
53
+ end
54
+
55
+ it 'sets up a setter for the relation' do
56
+ expect(Mongoid::Association::Accessors).to receive(:define_setter!).with(association)
57
+ association.setup!
58
+ end
59
+
60
+ it 'sets up an existence check for the relation' do
61
+ expect(Mongoid::Association::Accessors).to receive(:define_existence_check!).with(association)
62
+ association.setup!
63
+ end
64
+
65
+ it 'sets up the builder for the relation' do
66
+ expect(Mongoid::Association::Builders).to receive(:define_builder!).with(association)
67
+ association.setup!
68
+ end
69
+
70
+ it 'sets up the creator for the relation' do
71
+ expect(Mongoid::Association::Builders).to receive(:define_creator!).with(association)
72
+ association.setup!
73
+ end
74
+
75
+ context 'when the :validate option is true' do
76
+
77
+ let(:options) do
78
+ {
79
+ validate: true
80
+ }
81
+ end
82
+
83
+ let(:association) do
84
+ # Note that it is necessary to create the association directly, otherwise the
85
+ # setup! method will be called by the :embeds_one macro
86
+ described_class.new(embeds_one_class, name, options)
87
+ end
88
+
89
+ it 'sets up validation' do
90
+ expect(embeds_one_class).to receive(:validates_associated).with(name).and_call_original
91
+ association.setup!
92
+ end
93
+ end
94
+
95
+ context 'when the :validate option is false' do
96
+
97
+ let(:options) do
98
+ {
99
+ validate: false
100
+ }
101
+ end
102
+
103
+ it 'does not set up validation' do
104
+ expect(embeds_one_class).not_to receive(:validates_associated)
105
+ association.setup!
106
+ end
107
+ end
108
+
109
+ context 'when the :validate option is not provided' do
110
+
111
+ let(:association) do
112
+ # Note that it is necessary to create the association directly, otherwise the
113
+ # setup! method will be called by the :embeds_one macro
114
+ described_class.new(embeds_one_class, name, options)
115
+ end
116
+
117
+ it 'sets up the validation because it uses the validation default (true)' do
118
+ expect(embeds_one_class).to receive(:validates_associated).with(name).and_call_original
119
+ association.setup!
120
+ end
121
+ end
122
+ end
123
+
124
+ describe '#type' do
125
+
126
+ context 'when polymorphic' do
127
+
128
+ let(:options) do
129
+ { as: :containable }
130
+ end
131
+
132
+ it 'returns the as attribute followed by "_type"' do
133
+ expect(association.type).to eq("#{options[:as]}_type")
134
+ end
135
+ end
136
+
137
+ context 'when not polymorphic' do
138
+
139
+ it 'returns nil' do
140
+ expect(association.type).to be_nil
141
+ end
142
+ end
143
+ end
144
+
145
+ describe '#inverse_type' do
146
+
147
+ context 'when polymorphic' do
148
+
149
+ let(:options) do
150
+ { as: :containable }
151
+ end
152
+
153
+ it 'returns nil' do
154
+ expect(association.inverse_type).to be_nil
155
+ end
156
+ end
157
+
158
+ context 'when not polymorphic' do
159
+
160
+ it 'returns nil' do
161
+ expect(association.inverse_type).to be_nil
162
+ end
163
+ end
164
+ end
165
+
166
+ describe '#inverse_type_setter' do
167
+
168
+ context 'when polymorphic' do
169
+
170
+ let(:options) do
171
+ { as: :containable }
172
+ end
173
+
174
+ it 'returns nil' do
175
+ expect(association.inverse_type).to be_nil
176
+ end
177
+ end
178
+
179
+ context 'when not polymorphic' do
180
+
181
+ it 'returns nil' do
182
+ expect(association.inverse_type).to be_nil
183
+ end
184
+ end
185
+ end
186
+
187
+ describe '#embedded?' do
188
+
189
+ it 'returns true' do
190
+ expect(association.embedded?).to be(true)
191
+ end
192
+ end
193
+
194
+ describe '#primary_key' do
195
+
196
+ it 'returns nil' do
197
+ expect(association.primary_key).to be_nil
198
+ end
199
+ end
200
+
201
+ describe '#indexed?' do
202
+
203
+ it 'returns false' do
204
+ expect(association.indexed?).to be(false)
205
+ end
206
+ end
207
+
208
+ describe '#relation' do
209
+
210
+ it 'returns Mongoid::Association::Embedded::EmbedsOne::Proxy' do
211
+ expect(association.relation).to be(Mongoid::Association::Embedded::EmbedsOne::Proxy)
212
+ end
213
+ end
214
+
215
+ describe '#validation_default' do
216
+
217
+ it 'returns true' do
218
+ expect(association.validation_default).to be(true)
219
+ end
220
+ end
221
+
222
+ describe '#name' do
223
+
224
+ it 'returns the name of the relation' do
225
+ expect(association.name).to be(name)
226
+ end
227
+ end
228
+
229
+ describe '#options' do
230
+
231
+ it 'returns the options' do
232
+ expect(association.options).to be(options)
233
+ end
234
+ end
235
+
236
+ describe '#cyclic?' do
237
+
238
+ context 'when :cyclic is specified in the options' do
239
+
240
+ let(:options) do
241
+ { cyclic: true }
242
+ end
243
+
244
+ it 'returns true' do
245
+ expect(association.cyclic?).to be(true)
246
+ end
247
+ end
248
+
249
+ context 'when :cyclic is not specified in the options' do
250
+
251
+ it 'returns false' do
252
+ expect(association.cyclic?).to be(false)
253
+ end
254
+ end
255
+ end
256
+
257
+ describe '#merge!' do
258
+
259
+ end
260
+
261
+ describe '#store_as' do
262
+
263
+ context 'when :store_as is specified in the options' do
264
+
265
+ let(:options) do
266
+ {
267
+ store_as: :baby_kangaroo
268
+ }
269
+ end
270
+
271
+ it 'returns the :store_as option as a String' do
272
+ expect(association.store_as).to eq(options[:store_as].to_s)
273
+ end
274
+ end
275
+
276
+ context 'when :store_as is not specified in the options' do
277
+
278
+ it 'returns name as a String' do
279
+ expect(association.store_as).to eq(name.to_s)
280
+ end
281
+ end
282
+ end
283
+
284
+ describe '#touchable?' do
285
+
286
+ it 'return false' do
287
+ expect(association.send(:touchable?)).to be(false)
288
+ end
289
+ end
290
+
291
+ describe '#order' do
292
+
293
+ it 'returns nil' do
294
+ expect(association.order).to be_nil
295
+ end
296
+ end
297
+
298
+ describe '#as' do
299
+
300
+ context 'when :as is specified in the options' do
301
+
302
+ let(:options) do
303
+ {
304
+ as: :containable
305
+ }
306
+ end
307
+
308
+ it 'returns the :as option' do
309
+ expect(association.as).to eq(options[:as])
310
+ end
311
+ end
312
+
313
+ context 'when :as is not specified in the options' do
314
+
315
+ it 'returns nil' do
316
+ expect(association.as).to be_nil
317
+ end
318
+ end
319
+ end
320
+
321
+ describe '#polymorphic?' do
322
+
323
+ context 'when :as is specified in the options' do
324
+
325
+ let(:options) do
326
+ {
327
+ as: :containable
328
+ }
329
+ end
330
+
331
+ it 'returns true' do
332
+ expect(association.polymorphic?).to be(true)
333
+ end
334
+
335
+ end
336
+
337
+ context 'when :as is not specified in the options' do
338
+
339
+ it 'returns false' do
340
+ expect(association.polymorphic?).to be(false)
341
+ end
342
+ end
343
+ end
344
+
345
+ describe '#type_setter' do
346
+
347
+ context 'when polymorphic' do
348
+
349
+ let(:options) do
350
+ { as: :containable }
351
+ end
352
+
353
+ it 'returns the type followed by = as a String' do
354
+ expect(association.type_setter).to eq("containable_type=")
355
+ end
356
+ end
357
+
358
+ context 'when not polymorphic' do
359
+
360
+ it 'returns nil' do
361
+ expect(association.type).to be_nil
362
+ end
363
+ end
364
+ end
365
+
366
+ describe '#dependent' do
367
+
368
+ it 'returns nil' do
369
+ expect(association.dependent).to be_nil
370
+ end
371
+ end
372
+
373
+ describe '#inverse_type' do
374
+
375
+ it 'returns nil' do
376
+ expect(association.inverse_type).to be_nil
377
+ end
378
+ end
379
+
380
+ describe '#bindable?' do
381
+
382
+ it 'returns false' do
383
+ expect(association.bindable?(Person.new)).to be(false)
384
+ end
385
+ end
386
+
387
+ describe '#inverses' do
388
+
389
+ context 'when polymorphic' do
390
+
391
+ before do
392
+ EmbeddedObject.embedded_in :containable, polymorphic: true
393
+ end
394
+
395
+ let(:options) do
396
+ {
397
+ as: :containable
398
+ }
399
+ end
400
+
401
+ context 'when another object is passed to the method' do
402
+
403
+ let(:instance_of_other_class) do
404
+ EmbeddedObject.new
405
+ end
406
+
407
+ context 'when the relation class has only one relation whose class matches the owning class' do
408
+
409
+ it 'returns the :as attribute of this association' do
410
+ expect(association.inverses(instance_of_other_class)).to match_array([ :containable ])
411
+ end
412
+ end
413
+
414
+ context 'when :inverse_of is specified' do
415
+
416
+ before do
417
+ options.merge!(inverse_of: :inverse_name)
418
+ end
419
+
420
+ it 'returns the :inverse_of value' do
421
+ expect(association.inverses(instance_of_other_class)).to eq([ :inverse_name ])
422
+ end
423
+ end
424
+
425
+ context 'when inverse_of is not specified' do
426
+
427
+ it 'returns the :as attribute of this association' do
428
+ expect(association.inverses(instance_of_other_class)).to match_array([ :containable ])
429
+ end
430
+ end
431
+ end
432
+
433
+ context 'when another object is not passed to the method' do
434
+
435
+ context 'when inverse_of is specified' do
436
+
437
+ before do
438
+ options.merge!(inverse_of: :inverse_name)
439
+ end
440
+
441
+ it 'returns the :inverse_of value' do
442
+ expect(association.inverses).to eq([ :inverse_name ])
443
+ end
444
+ end
445
+
446
+ context 'when inverse_of is not specified' do
447
+
448
+ it 'returns the :as attribute' do
449
+ expect(association.inverses).to eq([ :containable ])
450
+ end
451
+
452
+ context 'when class_name is given and is a :: prefixed string' do
453
+
454
+ let(:association) do
455
+ EomCcParent.relations['child']
456
+ end
457
+
458
+ it 'returns the inverse in an array' do
459
+ inverses = association.inverses
460
+ expect(inverses).to eq([:parent])
461
+ end
462
+
463
+ context 'when other associations referencing unloaded classes exist' do
464
+ let(:association) do
465
+ EomDnlParent.relations['child']
466
+ end
467
+
468
+ it 'does not load other classes' do
469
+ inverses = association.inverses
470
+ expect(inverses).to eq([:parent])
471
+ expect(Object.const_defined?(:EoDnlMarker)).to be false
472
+ end
473
+ end
474
+ end
475
+ end
476
+ end
477
+ end
478
+
479
+ context 'when not polymorphic' do
480
+
481
+ before do
482
+ EmbeddedObject.embedded_in :container
483
+ end
484
+
485
+ context 'when inverse_of is specified' do
486
+
487
+ before do
488
+ options.merge!(inverse_of: :inverse_name)
489
+ end
490
+
491
+ it 'returns the :inverse_of value' do
492
+ expect(association.inverses).to eq([ :inverse_name ])
493
+ end
494
+ end
495
+
496
+ context 'when inverse_of is not specified' do
497
+
498
+ it 'uses the inverse class to find the inverse name' do
499
+ expect(association.inverses).to eq([ :container ])
500
+ end
501
+ end
502
+
503
+ context 'when :cyclic is specified' do
504
+
505
+ it 'returns the cyclic inverse name' do
506
+
507
+ end
508
+ end
509
+ end
510
+ end
511
+
512
+ describe '##inverse' do
513
+
514
+ context 'when polymorphic' do
515
+
516
+ before do
517
+ EmbeddedObject.embedded_in :containable, polymorphic: true
518
+ end
519
+
520
+ let(:options) do
521
+ {
522
+ as: :containable
523
+ }
524
+ end
525
+
526
+ context 'when another object is passed to the method' do
527
+
528
+ let(:instance_of_other_class) do
529
+ EmbeddedObject.new
530
+ end
531
+
532
+ context 'when the relation class has only one relation whose class matches the owning class' do
533
+
534
+ it 'returns the :as attribute of this association' do
535
+ expect(association.inverse(instance_of_other_class)).to eq(:containable)
536
+ end
537
+ end
538
+
539
+ context 'when :inverse_of is specified' do
540
+
541
+ before do
542
+ options.merge!(inverse_of: :inverse_name)
543
+ end
544
+
545
+ it 'returns the :inverse_of value' do
546
+ expect(association.inverse(instance_of_other_class)).to eq(:inverse_name)
547
+ end
548
+ end
549
+
550
+ context 'when inverse_of is not specified' do
551
+
552
+ it 'returns the :as attribute of this association' do
553
+ expect(association.inverse(instance_of_other_class)).to eq(:containable)
554
+ end
555
+ end
556
+ end
557
+
558
+ context 'when another object is not passed to the method' do
559
+
560
+ context 'when inverse_of is specified' do
561
+
562
+ before do
563
+ options.merge!(inverse_of: :inverse_name)
564
+ end
565
+
566
+ it 'returns the :inverse_of value' do
567
+ expect(association.inverse).to eq(:inverse_name)
568
+ end
569
+ end
570
+
571
+ context 'when inverse_of is not specified' do
572
+
573
+ it 'returns the :as attribute' do
574
+ expect(association.inverse).to eq(:containable)
575
+ end
576
+ end
577
+ end
578
+ end
579
+
580
+ context 'when not polymorphic' do
581
+
582
+ before do
583
+ EmbeddedObject.embedded_in :container
584
+ end
585
+
586
+ context 'when inverse_of is specified' do
587
+
588
+ before do
589
+ options.merge!(inverse_of: :inverse_name)
590
+ end
591
+
592
+ it 'returns the :inverse_of value' do
593
+ expect(association.inverse).to eq(:inverse_name)
594
+ end
595
+ end
596
+
597
+ context 'when inverse_of is not specified' do
598
+
599
+ it 'uses the inverse class to find the inverse name' do
600
+ expect(association.inverse).to eq(:container)
601
+ end
602
+ end
603
+
604
+ context 'when :cyclic is specified' do
605
+
606
+ it 'returns the cyclic inverse name' do
607
+
608
+ end
609
+ end
610
+ end
611
+ end
612
+
613
+ describe '#inverse_association' do
614
+
615
+ end
616
+
617
+ describe '#autosave' do
618
+
619
+ it 'returns false' do
620
+ expect(association.autosave).to be(false)
621
+ end
622
+ end
623
+
624
+ describe '#relation_class_name' do
625
+
626
+ context 'when the :class_name option is specified' do
627
+
628
+ let(:options) do
629
+ { class_name: 'OtherEmbeddedObject' }
630
+ end
631
+
632
+ it 'returns the class name option' do
633
+ expect(association.relation_class_name).to eq('OtherEmbeddedObject')
634
+ end
635
+
636
+ context ':class_name is a :: prefixed string' do
637
+ let(:association) do
638
+ EomCcParent.relations['child']
639
+ end
640
+
641
+ it 'returns the :: prefixed string' do
642
+ expect(association.relation_class_name).to eq('::EomCcChild')
643
+ end
644
+ end
645
+ end
646
+
647
+ context 'when the class_name option is not specified' do
648
+
649
+ it 'uses the name of the relation to deduce the class name' do
650
+ expect(association.relation_class_name).to eq('EmbeddedObject')
651
+ end
652
+ end
653
+
654
+ context 'when another association in the model is referencing a third model class' do
655
+ let(:association) do
656
+ EomDnlParent.relations['child']
657
+ end
658
+
659
+ it 'does not attempt to load the third class' do
660
+ expect(association.relation_class_name).to eq('EomDnlChild')
661
+ expect(Object.const_defined?(:EoDnlMarker)).to be false
662
+ end
663
+ end
664
+ end
665
+
666
+ describe '#klass' do
667
+
668
+ context 'when the :class_name option is specified' do
669
+
670
+ let!(:_class) do
671
+ class OtherEmbeddedObject; end
672
+ OtherEmbeddedObject
673
+ end
674
+
675
+ let(:options) do
676
+ { class_name: 'OtherEmbeddedObject' }
677
+ end
678
+
679
+ it 'returns the class name option' do
680
+ expect(association.klass).to eq(_class)
681
+ end
682
+ end
683
+
684
+ context 'when the class_name option is not specified' do
685
+
686
+ it 'uses the name of the relation to deduce the class name' do
687
+ expect(association.klass).to eq(EmbeddedObject)
688
+ end
689
+ end
690
+ end
691
+
692
+ describe '#inverse_class_name' do
693
+
694
+ it 'returns the name of the owner class' do
695
+ expect(association.inverse_class_name).to eq(Container.name)
696
+ end
697
+ end
698
+
699
+ describe '#inverse_class' do
700
+
701
+ it 'returns the owner class' do
702
+ expect(association.inverse_class).to be(Container)
703
+ end
704
+ end
705
+
706
+ describe '#inverse_of' do
707
+
708
+ context 'when :inverse_of is specified in the options' do
709
+
710
+ let(:options) do
711
+ { inverse_of: :objects_list }
712
+ end
713
+
714
+ it 'returns the inverse_of value' do
715
+ expect(association.inverse_of).to eq(options[:inverse_of])
716
+ end
717
+ end
718
+
719
+ context 'when :inverse_of is not specified in the options' do
720
+
721
+ it 'returns nil' do
722
+ expect(association.inverse_of).to be_nil
723
+ end
724
+ end
725
+ end
726
+
727
+ describe '#key' do
728
+
729
+ it 'returns the name of the relation as a string' do
730
+ expect(association.key).to eq(name.to_s)
731
+ end
732
+ end
733
+
734
+ describe '#setter' do
735
+
736
+ it 'returns a string of the name followed by =' do
737
+ expect(association.setter).to eq("#{name}=")
738
+ end
739
+ end
740
+
741
+ describe '#validate?' do
742
+
743
+ context 'when :validate is specified in the options' do
744
+
745
+ context 'when validate is true' do
746
+
747
+ let(:options) do
748
+ { validate: true }
749
+ end
750
+
751
+ it 'returns true' do
752
+ expect(association.send(:validate?)).to be(true)
753
+ end
754
+ end
755
+
756
+ context 'when validate is false' do
757
+
758
+ let(:options) do
759
+ { validate: false }
760
+ end
761
+
762
+ it 'returns false' do
763
+ expect(association.send(:validate?)).to be(false)
764
+ end
765
+ end
766
+ end
767
+
768
+ context 'when :validate is not specified in the options' do
769
+
770
+ it 'returns the validation_default' do
771
+ expect(association.send(:validate?)).to eq(association.validation_default)
772
+ end
773
+ end
774
+ end
775
+
776
+ describe '#autobuilding?' do
777
+
778
+ context 'when :autobuild is specified in the options' do
779
+
780
+ context 'when autobuild is true' do
781
+
782
+ let(:options) do
783
+ { autobuild: true }
784
+ end
785
+
786
+ it 'returns true' do
787
+ expect(association.autobuilding?).to be(true)
788
+ end
789
+ end
790
+
791
+ context 'when autobuild is false' do
792
+
793
+ let(:options) do
794
+ { autobuild: false }
795
+ end
796
+
797
+ it 'returns true' do
798
+ expect(association.autobuilding?).to be(false)
799
+ end
800
+ end
801
+ end
802
+
803
+ context 'when :validate is not specified in the options' do
804
+
805
+ it 'returns false' do
806
+ expect(association.autobuilding?).to be(false)
807
+ end
808
+ end
809
+ end
810
+
811
+ describe '#forced_nil_inverse?' do
812
+
813
+ it 'returns false' do
814
+ expect(association.forced_nil_inverse?).to be(false)
815
+ end
816
+ end
817
+
818
+ describe '#stores_foreign_key?' do
819
+
820
+ it 'returns false' do
821
+ expect(association.stores_foreign_key?).to be(false)
822
+ end
823
+ end
824
+
825
+ describe '#inverse_setter' do
826
+
827
+ context 'when an inverse can be determined' do
828
+
829
+ before do
830
+ EmbeddedObject.embedded_in :container
831
+ end
832
+
833
+ it 'returns the name of the inverse followed by =' do
834
+ expect(association.inverse_setter).to eq('container=')
835
+ end
836
+ end
837
+
838
+ context 'when an inverse cannot be determined' do
839
+
840
+ it 'returns nil' do
841
+ expect(association.inverse_setter).to be_nil
842
+ end
843
+ end
844
+ end
845
+
846
+ describe '#extension' do
847
+
848
+ context 'when a block is passed' do
849
+
850
+ let(:association) do
851
+ embeds_one_class.embeds_one name, options do; end
852
+ end
853
+
854
+ it 'defines an extension module' do
855
+ expect(association.extension).to be_a(Module)
856
+ end
857
+
858
+ it 'returns the extension' do
859
+ expect(association.extension).to eq(
860
+ "#{embeds_one_class.name}::#{embeds_one_class.name}#{name.to_s.camelize}RelationExtension".constantize)
861
+ end
862
+ end
863
+
864
+ context 'when an :extension is not specified in the options' do
865
+
866
+ it 'returns false' do
867
+ expect(association.extension).to be_nil
868
+ end
869
+ end
870
+ end
871
+
872
+ describe '#criteria' do
873
+
874
+ it 'does not respond to the method' do
875
+ expect {
876
+ association.criteria
877
+ }.to raise_exception(NoMethodError)
878
+ end
879
+ end
880
+
881
+ describe '#destructive?' do
882
+
883
+ it 'returns false' do
884
+ expect(association.destructive?).to be(false)
885
+ end
886
+ end
887
+
888
+ describe '#nested_builder' do
889
+
890
+ it 'returns an instance of Association::Nested::One' do
891
+ expect(association.nested_builder({}, {})).to be_a(Mongoid::Association::Nested::One)
892
+ end
893
+ end
894
+
895
+ describe '#cascading_callbacks?' do
896
+
897
+ context 'when cascade_callbacks is specified in the options' do
898
+
899
+ context 'when :cascade_callbacks is true' do
900
+
901
+ let(:options) do
902
+ { cascade_callbacks: true }
903
+ end
904
+
905
+ it 'returns true' do
906
+ expect(association.cascading_callbacks?).to be(true)
907
+ end
908
+ end
909
+
910
+ context 'when :cascade_callbacks is false' do
911
+
912
+ let(:options) do
913
+ { cascade_callbacks: false }
914
+ end
915
+
916
+ it 'returns false' do
917
+ expect(association.cascading_callbacks?).to be(false)
918
+ end
919
+ end
920
+ end
921
+
922
+ context 'when cascade_callbacks is not specified in the options' do
923
+
924
+ it 'returns false' do
925
+ expect(association.cascading_callbacks?).to be(false)
926
+ end
927
+ end
928
+ end
929
+
930
+ describe '#path' do
931
+
932
+ it 'returns an instance of Mongoid::Atomic::Paths::Root' do
933
+ expect(association.path(double( :_parent => true))).to be_a(Mongoid::Atomic::Paths::Embedded::One)
934
+ end
935
+ end
936
+
937
+ describe '#create_relation' do
938
+
939
+ let(:owner) do
940
+ Container.new
941
+ end
942
+
943
+ let(:target) do
944
+ EmbeddedObject.new
945
+ end
946
+
947
+ before do
948
+ association
949
+ EmbeddedObject.embedded_in :container
950
+ end
951
+
952
+ it 'returns an the target (EmbeddedObject)' do
953
+ expect(Mongoid::Association::Embedded::EmbedsOne::Proxy).to receive(:new).and_call_original
954
+ expect(association.create_relation(owner, target)).to be_a(EmbeddedObject)
955
+ end
956
+ end
957
+ end