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,12 +1,12 @@
1
+ # frozen_string_literal: true
2
+ # encoding: utf-8
3
+
1
4
  require "spec_helper"
2
5
 
3
- describe Mongoid::Relations::Builders::NestedAttributes::Many do
6
+ describe Mongoid::Association::Nested::Many do
4
7
 
5
- let(:metadata) do
6
- Mongoid::Relations::Metadata.new(
7
- name: :addresses,
8
- relation: Mongoid::Relations::Embedded::Many
9
- )
8
+ let(:association) do
9
+ Person.relations['addresses']
10
10
  end
11
11
 
12
12
  let(:person) do
@@ -18,7 +18,7 @@ describe Mongoid::Relations::Builders::NestedAttributes::Many do
18
18
  context "when the option is provided" do
19
19
 
20
20
  let(:builder) do
21
- described_class.new(metadata, {}, allow_destroy: true)
21
+ described_class.new(association, {}, allow_destroy: true)
22
22
  end
23
23
 
24
24
  it "returns the option" do
@@ -29,7 +29,7 @@ describe Mongoid::Relations::Builders::NestedAttributes::Many do
29
29
  context "when the option is not provided" do
30
30
 
31
31
  let(:builder) do
32
- described_class.new(metadata, {}, {})
32
+ described_class.new(association, {}, {})
33
33
  end
34
34
 
35
35
  it "returns false" do
@@ -51,7 +51,7 @@ describe Mongoid::Relations::Builders::NestedAttributes::Many do
51
51
  context "when attributes are over limit" do
52
52
 
53
53
  let(:builder) do
54
- described_class.new(metadata, attributes, limit: 2)
54
+ described_class.new(association, attributes, limit: 2)
55
55
  end
56
56
 
57
57
  it "raises an error" do
@@ -65,7 +65,7 @@ describe Mongoid::Relations::Builders::NestedAttributes::Many do
65
65
 
66
66
  let(:builder) do
67
67
  described_class.new(
68
- metadata,
68
+ association,
69
69
  attributes,
70
70
  reject_if: ->(attrs){ attrs[:city].blank? }
71
71
  )
@@ -85,7 +85,7 @@ describe Mongoid::Relations::Builders::NestedAttributes::Many do
85
85
 
86
86
  let(:builder) do
87
87
  described_class.new(
88
- metadata,
88
+ association,
89
89
  attributes,
90
90
  reject_if: :reject_if_city_is_empty
91
91
  )
@@ -112,7 +112,7 @@ describe Mongoid::Relations::Builders::NestedAttributes::Many do
112
112
  end
113
113
 
114
114
  let(:builder) do
115
- described_class.new(metadata, attributes)
115
+ described_class.new(association, attributes)
116
116
  end
117
117
 
118
118
  before do
@@ -131,7 +131,7 @@ describe Mongoid::Relations::Builders::NestedAttributes::Many do
131
131
  end
132
132
 
133
133
  let(:builder) do
134
- described_class.new(metadata, attributes)
134
+ described_class.new(association, attributes)
135
135
  end
136
136
 
137
137
  before do
@@ -155,7 +155,7 @@ describe Mongoid::Relations::Builders::NestedAttributes::Many do
155
155
  end
156
156
 
157
157
  let(:builder) do
158
- described_class.new(metadata, attributes, {})
158
+ described_class.new(association, attributes, {})
159
159
  end
160
160
 
161
161
  it "sorts the attributes" do
@@ -174,7 +174,7 @@ describe Mongoid::Relations::Builders::NestedAttributes::Many do
174
174
  context "when the proc matches" do
175
175
 
176
176
  let(:builder) do
177
- described_class.new(metadata, {}, options)
177
+ described_class.new(association, {}, options)
178
178
  end
179
179
 
180
180
  it "returns true" do
@@ -185,7 +185,7 @@ describe Mongoid::Relations::Builders::NestedAttributes::Many do
185
185
  context "when the proc does not match" do
186
186
 
187
187
  let(:builder) do
188
- described_class.new(metadata, {}, options)
188
+ described_class.new(association, {}, options)
189
189
  end
190
190
 
191
191
  it "returns false" do
@@ -197,7 +197,7 @@ describe Mongoid::Relations::Builders::NestedAttributes::Many do
197
197
  context "when the proc is not provided" do
198
198
 
199
199
  let(:builder) do
200
- described_class.new(metadata, {}, {})
200
+ described_class.new(association, {}, {})
201
201
  end
202
202
 
203
203
  it "returns false" do
@@ -211,7 +211,7 @@ describe Mongoid::Relations::Builders::NestedAttributes::Many do
211
211
  context "when the option is provided" do
212
212
 
213
213
  let(:builder) do
214
- described_class.new(metadata, {}, update_only: true)
214
+ described_class.new(association, {}, update_only: true)
215
215
  end
216
216
 
217
217
  it "returns the option" do
@@ -222,7 +222,7 @@ describe Mongoid::Relations::Builders::NestedAttributes::Many do
222
222
  context "when the option is not provided" do
223
223
 
224
224
  let(:builder) do
225
- described_class.new(metadata, {}, {})
225
+ described_class.new(association, {}, {})
226
226
  end
227
227
 
228
228
  it "returns false" do
@@ -1,12 +1,12 @@
1
+ # frozen_string_literal: true
2
+ # encoding: utf-8
3
+
1
4
  require "spec_helper"
2
5
 
3
- describe Mongoid::Relations::Builders::NestedAttributes::One do
6
+ describe Mongoid::Association::Nested::One do
4
7
 
5
- let(:metadata) do
6
- Mongoid::Relations::Metadata.new(
7
- name: :name,
8
- relation: Mongoid::Relations::Embedded::One
9
- )
8
+ let(:association) do
9
+ Person.relations['name']
10
10
  end
11
11
 
12
12
  describe "#allow_destroy?" do
@@ -14,7 +14,7 @@ describe Mongoid::Relations::Builders::NestedAttributes::One do
14
14
  context "when the option is provided" do
15
15
 
16
16
  let(:builder) do
17
- described_class.new(metadata, {}, allow_destroy: true)
17
+ described_class.new(association, {}, allow_destroy: true)
18
18
  end
19
19
 
20
20
  it "returns the option" do
@@ -25,7 +25,7 @@ describe Mongoid::Relations::Builders::NestedAttributes::One do
25
25
  context "when the option is not provided" do
26
26
 
27
27
  let(:builder) do
28
- described_class.new(metadata, {}, {})
28
+ described_class.new(association, {}, {})
29
29
  end
30
30
 
31
31
  it "returns false" do
@@ -47,7 +47,7 @@ describe Mongoid::Relations::Builders::NestedAttributes::One do
47
47
  end
48
48
 
49
49
  let(:builder) do
50
- described_class.new(metadata, { last_name: "Lang" }, options)
50
+ described_class.new(association, { last_name: "Lang" }, options)
51
51
  end
52
52
 
53
53
  before do
@@ -66,7 +66,7 @@ describe Mongoid::Relations::Builders::NestedAttributes::One do
66
66
  end
67
67
 
68
68
  let(:builder) do
69
- described_class.new(metadata, { last_name: "Lang" }, options)
69
+ described_class.new(association, { last_name: "Lang" }, options)
70
70
  end
71
71
 
72
72
  before do
@@ -91,7 +91,7 @@ describe Mongoid::Relations::Builders::NestedAttributes::One do
91
91
  end
92
92
 
93
93
  let(:builder) do
94
- described_class.new(metadata, {
94
+ described_class.new(association, {
95
95
  _id: name.id,
96
96
  last_name: "Lang"
97
97
  }, options)
@@ -113,7 +113,7 @@ describe Mongoid::Relations::Builders::NestedAttributes::One do
113
113
  end
114
114
 
115
115
  let(:builder) do
116
- described_class.new(metadata, {
116
+ described_class.new(association, {
117
117
  last_name: "Lang"
118
118
  }, options)
119
119
  end
@@ -138,7 +138,7 @@ describe Mongoid::Relations::Builders::NestedAttributes::One do
138
138
  end
139
139
 
140
140
  let(:builder) do
141
- described_class.new(metadata, {
141
+ described_class.new(association, {
142
142
  id: name.id,
143
143
  last_name: "Lang",
144
144
  _destroy: true
@@ -160,7 +160,7 @@ describe Mongoid::Relations::Builders::NestedAttributes::One do
160
160
  context "when the attribute exists" do
161
161
 
162
162
  let(:builder) do
163
- described_class.new(metadata, { _destroy: true }, {})
163
+ described_class.new(association, { _destroy: true }, {})
164
164
  end
165
165
 
166
166
  it "returns the value" do
@@ -171,7 +171,7 @@ describe Mongoid::Relations::Builders::NestedAttributes::One do
171
171
  context "when the attribute does not exist" do
172
172
 
173
173
  let(:builder) do
174
- described_class.new(metadata, {}, {})
174
+ described_class.new(association, {}, {})
175
175
  end
176
176
 
177
177
  it "returns nil" do
@@ -191,7 +191,7 @@ describe Mongoid::Relations::Builders::NestedAttributes::One do
191
191
  context "when the proc matches" do
192
192
 
193
193
  let(:builder) do
194
- described_class.new(metadata, {}, options)
194
+ described_class.new(association, {}, options)
195
195
  end
196
196
 
197
197
  it "returns true" do
@@ -202,7 +202,7 @@ describe Mongoid::Relations::Builders::NestedAttributes::One do
202
202
  context "when the proc does not match" do
203
203
 
204
204
  let(:builder) do
205
- described_class.new(metadata, {}, options)
205
+ described_class.new(association, {}, options)
206
206
  end
207
207
 
208
208
  it "returns false" do
@@ -214,7 +214,7 @@ describe Mongoid::Relations::Builders::NestedAttributes::One do
214
214
  context "when the proc is not provided" do
215
215
 
216
216
  let(:builder) do
217
- described_class.new(metadata, {}, {})
217
+ described_class.new(association, {}, {})
218
218
  end
219
219
 
220
220
  it "returns false" do
@@ -228,7 +228,7 @@ describe Mongoid::Relations::Builders::NestedAttributes::One do
228
228
  context "when the option is provided" do
229
229
 
230
230
  let(:builder) do
231
- described_class.new(metadata, {}, update_only: true)
231
+ described_class.new(association, {}, update_only: true)
232
232
  end
233
233
 
234
234
  it "returns the option" do
@@ -239,7 +239,7 @@ describe Mongoid::Relations::Builders::NestedAttributes::One do
239
239
  context "when the option is not provided" do
240
240
 
241
241
  let(:builder) do
242
- described_class.new(metadata, {}, {})
242
+ described_class.new(association, {}, {})
243
243
  end
244
244
 
245
245
  it "returns false" do
@@ -0,0 +1,1324 @@
1
+ # frozen_string_literal: true
2
+ # encoding: utf-8
3
+
4
+ require "spec_helper"
5
+
6
+ describe Mongoid::Association::Options do
7
+
8
+ STORES_FOREIGN_KEY =
9
+ [
10
+ Mongoid::Association::Referenced::HasAndBelongsToMany,
11
+ Mongoid::Association::Referenced::BelongsTo
12
+ ]
13
+
14
+ [
15
+ Mongoid::Association::Embedded::EmbeddedIn,
16
+ Mongoid::Association::Embedded::EmbedsMany,
17
+ Mongoid::Association::Embedded::EmbedsOne,
18
+ Mongoid::Association::Referenced::BelongsTo,
19
+ Mongoid::Association::Referenced::HasMany,
20
+ Mongoid::Association::Referenced::HasOne,
21
+ Mongoid::Association::Referenced::HasAndBelongsToMany
22
+ ].each do |association_class|
23
+
24
+ context "when the association type is #{association_class}" do
25
+
26
+ let(:class_left) do
27
+ class ClassLeft; include Mongoid::Document; end
28
+ ClassLeft
29
+ end
30
+
31
+ let(:class_right) do
32
+ class ClassRight; include Mongoid::Document; end
33
+ ClassRight
34
+ end
35
+
36
+ let(:association) do
37
+ association_class.new(class_left, :name, options)
38
+ end
39
+
40
+ let(:options) do
41
+ {}
42
+ end
43
+
44
+ describe 'the :as option' do
45
+
46
+ context 'when the option is supported by the association type', if: association_class::VALID_OPTIONS.include?(:as) do
47
+
48
+ context 'when :as is in the options' do
49
+
50
+ let(:options) do
51
+ {
52
+ as: :nameable
53
+ }
54
+ end
55
+
56
+ it 'returns the :as value' do
57
+ expect(association.as).to eq(:nameable)
58
+ end
59
+ end
60
+
61
+ context 'when :as is not in the options' do
62
+
63
+ it 'returns nil' do
64
+ expect(association.as).to be_nil
65
+ end
66
+ end
67
+ end
68
+
69
+ context 'when the option is not supported by the association type', if: !association_class::VALID_OPTIONS.include?(:as) do
70
+
71
+ it 'returns nil' do
72
+ expect(association.as).to be_nil
73
+ end
74
+
75
+ context 'when the option is provided' do
76
+
77
+ let(:options) do
78
+ {
79
+ as: :nameable
80
+ }
81
+ end
82
+
83
+ it 'raises a Mongoid::Errors::InvalidRelationOption error' do
84
+ expect {
85
+ association
86
+ }.to raise_exception(Mongoid::Errors::InvalidRelationOption)
87
+ end
88
+ end
89
+ end
90
+ end
91
+
92
+ describe '#autobuilding?' do
93
+
94
+ context 'when the option is supported by the association type', if: association_class::VALID_OPTIONS.include?(:autobuild) do
95
+
96
+ context 'when :autobuild is in the options' do
97
+
98
+ context 'when :autobuild is true' do
99
+
100
+ let(:options) do
101
+ {
102
+ autobuild: true
103
+ }
104
+ end
105
+
106
+ it 'returns true' do
107
+ expect(association.autobuilding?).to be(true)
108
+ end
109
+ end
110
+
111
+ context 'when :autobuild is false' do
112
+
113
+ let(:options) do
114
+ {
115
+ autobuild: false
116
+ }
117
+ end
118
+
119
+ it 'returns false' do
120
+ expect(association.autobuilding?).to be(false)
121
+ end
122
+ end
123
+
124
+ context 'when :autobuild is nil' do
125
+
126
+ let(:options) do
127
+ {
128
+ autobuild: nil
129
+ }
130
+ end
131
+
132
+ it 'returns false' do
133
+ expect(association.autobuilding?).to be(false)
134
+ end
135
+ end
136
+ end
137
+
138
+ context 'when :autobuild is not in the options' do
139
+
140
+ it 'returns false' do
141
+ expect(association.autobuilding?).to be(false)
142
+ end
143
+ end
144
+ end
145
+
146
+ context 'when the option is not supported by the association type', if: !association_class::VALID_OPTIONS.include?(:autobuild) do
147
+
148
+ it 'returns false' do
149
+ expect(association.autobuilding?).to be(false)
150
+ end
151
+
152
+ context 'when the option is provided' do
153
+
154
+ let(:options) do
155
+ {
156
+ autobuild: false
157
+ }
158
+ end
159
+
160
+ it 'raises a Mongoid::Errors::InvalidRelationOption error' do
161
+ expect {
162
+ association
163
+ }.to raise_exception(Mongoid::Errors::InvalidRelationOption)
164
+ end
165
+ end
166
+ end
167
+ end
168
+
169
+ describe '#autosave?' do
170
+
171
+ context 'when the option is supported by the association type', if: association_class::VALID_OPTIONS.include?(:autosave) do
172
+
173
+ context 'when :autosave is in the options' do
174
+
175
+ context 'when :autosave is true' do
176
+
177
+ let(:options) do
178
+ {
179
+ autosave: true
180
+ }
181
+ end
182
+
183
+ it 'returns true' do
184
+ expect(association.autosave?).to be(true)
185
+ end
186
+ end
187
+
188
+ context 'when :autosave is false' do
189
+
190
+ let(:options) do
191
+ {
192
+ autosave: false
193
+ }
194
+ end
195
+
196
+ it 'returns false' do
197
+ expect(association.autosave?).to be(false)
198
+ end
199
+ end
200
+
201
+ context 'when :autosave is nil' do
202
+
203
+ let(:options) do
204
+ {
205
+ autosave: nil
206
+ }
207
+ end
208
+
209
+ it 'returns false' do
210
+ expect(association.autosave?).to be(false)
211
+ end
212
+ end
213
+ end
214
+
215
+ context 'when :autosave is not in the options' do
216
+
217
+ it 'returns false' do
218
+ expect(association.autosave?).to be(false)
219
+ end
220
+ end
221
+ end
222
+
223
+ context 'when the option is not supported by the association type', if: !association_class::VALID_OPTIONS.include?(:autosave) do
224
+
225
+ it 'returns false' do
226
+ expect(association.autosave?).to be(false)
227
+ end
228
+
229
+ context 'when the option is provided' do
230
+
231
+ let(:options) do
232
+ {
233
+ autosave: false
234
+ }
235
+ end
236
+
237
+ it 'raises a Mongoid::Errors::InvalidRelationOption error' do
238
+ expect {
239
+ association
240
+ }.to raise_exception(Mongoid::Errors::InvalidRelationOption)
241
+ end
242
+ end
243
+ end
244
+ end
245
+
246
+ describe 'the :dependent option' do
247
+
248
+ context 'when the option is supported by the association type', if: association_class::VALID_OPTIONS.include?(:dependent) do
249
+
250
+ context 'when :dependent is in the options' do
251
+
252
+ let(:options) do
253
+ {
254
+ dependent: :delete_all
255
+ }
256
+ end
257
+
258
+ it 'returns the :dependent value' do
259
+ expect(association.dependent).to eq(options[:dependent])
260
+ end
261
+ end
262
+
263
+ context 'when :dependent is not in the options' do
264
+
265
+ it 'returns nil' do
266
+ expect(association.dependent).to be_nil
267
+ end
268
+ end
269
+ end
270
+
271
+ context 'when the option is not supported by the association type', if: !association_class::VALID_OPTIONS.include?(:dependent) do
272
+
273
+ it 'returns nil' do
274
+ expect(association.dependent).to be_nil
275
+ end
276
+
277
+ context 'when the option is provided' do
278
+
279
+ let(:options) do
280
+ {
281
+ dependent: :delete_all
282
+ }
283
+ end
284
+
285
+ it 'raises a Mongoid::Errors::InvalidRelationOption error' do
286
+ expect {
287
+ association
288
+ }.to raise_exception(Mongoid::Errors::InvalidRelationOption)
289
+ end
290
+ end
291
+ end
292
+ end
293
+
294
+ describe 'the :foreign_key option' do
295
+
296
+ context 'when the option is supported by the association type', if: association_class::VALID_OPTIONS.include?(:foreign_key) do
297
+
298
+ context 'when the :foreign_key option is specified' do
299
+
300
+ let(:options) do
301
+ {
302
+ foreign_key: :some_field
303
+ }
304
+ end
305
+
306
+ it 'returns the foreign_key as a String' do
307
+ expect(association.foreign_key).to eq(options[:foreign_key].to_s)
308
+ end
309
+ end
310
+
311
+ context 'when the association stores the foreign key', if: association_class::VALID_OPTIONS.include?(:foreign_key) &&
312
+ STORES_FOREIGN_KEY.include?(association_class) do
313
+
314
+ context 'when :foreign_key option is not specified' do
315
+
316
+ it 'returns the name followed by the foreign_key_suffix' do
317
+ expect(association.foreign_key).to eq("name#{association.class::FOREIGN_KEY_SUFFIX}")
318
+ end
319
+ end
320
+ end
321
+
322
+ context 'when the association does not store the foreign key', if: association_class::VALID_OPTIONS.include?(:foreign_key) &&
323
+ !STORES_FOREIGN_KEY.include?(association_class) do
324
+
325
+ context 'when :foreign_key option is not specified' do
326
+
327
+ before do
328
+ allow(association).to receive(:inverse).and_return(:other)
329
+ end
330
+
331
+ it 'returns the inverse name followed by the foreign_key_suffix' do
332
+ expect(association.foreign_key).to eq("other#{association.class::FOREIGN_KEY_SUFFIX}")
333
+ end
334
+ end
335
+ end
336
+ end
337
+
338
+ context 'when the option is not supported by the association type', if: !association_class::VALID_OPTIONS.include?(:foreign_key) do
339
+
340
+ it 'returns nil' do
341
+ expect(association.dependent).to be_nil
342
+ end
343
+
344
+ context 'when the option is provided' do
345
+
346
+ let(:options) do
347
+ {
348
+ foreign_key: :some_field
349
+ }
350
+ end
351
+
352
+ it 'raises a Mongoid::Errors::InvalidRelationOption error' do
353
+ expect {
354
+ association
355
+ }.to raise_exception(Mongoid::Errors::InvalidRelationOption)
356
+ end
357
+ end
358
+ end
359
+ end
360
+
361
+ describe 'the :primary_key option' do
362
+
363
+ context 'when the option is supported by the association type', if: association_class::VALID_OPTIONS.include?(:primary_key) do
364
+
365
+ context 'when the option is specified' do
366
+
367
+ let(:options) do
368
+ {
369
+ primary_key: :other_id
370
+ }
371
+ end
372
+
373
+ it 'returns the primary_key from the options as a String' do
374
+ expect(association.primary_key).to eq(options[:primary_key].to_s)
375
+ end
376
+ end
377
+
378
+ context 'when the option is not specified' do
379
+
380
+ it 'returns the default primary key' do
381
+ expect(association.primary_key).to eq(Mongoid::Association::Relatable::PRIMARY_KEY_DEFAULT)
382
+ end
383
+ end
384
+ end
385
+
386
+ context 'when the option is not supported by the association type', if: !association_class::VALID_OPTIONS.include?(:primary_key) do
387
+
388
+ it 'returns nil' do
389
+ expect(association.primary_key).to be_nil
390
+ end
391
+
392
+ context 'when the option is provided' do
393
+
394
+ let(:options) do
395
+ {
396
+ primary_key: :other_id
397
+ }
398
+ end
399
+
400
+ it 'raises a Mongoid::Errors::InvalidRelationOption error' do
401
+ expect {
402
+ association
403
+ }.to raise_exception(Mongoid::Errors::InvalidRelationOption)
404
+ end
405
+ end
406
+ end
407
+ end
408
+
409
+ describe 'the :after_add option' do
410
+
411
+ context 'when the option is supported by the association type', if: association_class::VALID_OPTIONS.include?(:after_add) do
412
+
413
+ context 'when the :after_add option is specified' do
414
+
415
+ let(:options) do
416
+ {
417
+ after_add: :method_name
418
+ }
419
+ end
420
+
421
+ it 'retrieves the after_add method name from the association' do
422
+ expect(association.get_callbacks(:after_add)).to eq(Array(options[:after_add]))
423
+ end
424
+ end
425
+
426
+ context 'when the :after_add option is not specified' do
427
+
428
+ it 'returns nil' do
429
+ expect(association.get_callbacks(:after_add)).to be_empty
430
+ end
431
+ end
432
+ end
433
+
434
+ context 'when the option is not supported by the association type', if: !association_class::VALID_OPTIONS.include?(:after_add) do
435
+
436
+
437
+ it 'returns nil' do
438
+ expect(association.get_callbacks(:after_add)).to be_empty
439
+ end
440
+
441
+ context 'when the option is provided' do
442
+
443
+ let(:options) do
444
+ {
445
+ after_add: :method_name
446
+ }
447
+ end
448
+
449
+ it 'raises a Mongoid::Errors::InvalidRelationOption error' do
450
+ expect {
451
+ association
452
+ }.to raise_exception(Mongoid::Errors::InvalidRelationOption)
453
+ end
454
+ end
455
+ end
456
+ end
457
+
458
+ describe 'the :after_remove option' do
459
+
460
+ context 'when the option is supported by the association type', if: association_class::VALID_OPTIONS.include?(:after_remove) do
461
+
462
+ context 'when the :after_remove option is specified' do
463
+
464
+ let(:options) do
465
+ {
466
+ after_remove: :method_name
467
+ }
468
+ end
469
+
470
+ it 'retrieves the after_remove method name from the association' do
471
+ expect(association.get_callbacks(:after_remove)).to eq(Array(options[:after_remove]))
472
+ end
473
+ end
474
+
475
+ context 'when the :after_remove option is not specified' do
476
+
477
+ it 'returns nil' do
478
+ expect(association.get_callbacks(:after_remove)).to be_empty
479
+ end
480
+ end
481
+ end
482
+
483
+ context 'when the option is not supported by the association type', if: !association_class::VALID_OPTIONS.include?(:after_remove) do
484
+
485
+
486
+ it 'returns nil' do
487
+ expect(association.get_callbacks(:after_remove)).to be_empty
488
+ end
489
+
490
+ context 'when the option is provided' do
491
+
492
+ let(:options) do
493
+ {
494
+ after_remove: :method_name
495
+ }
496
+ end
497
+
498
+ it 'raises a Mongoid::Errors::InvalidRelationOption error' do
499
+ expect {
500
+ association
501
+ }.to raise_exception(Mongoid::Errors::InvalidRelationOption)
502
+ end
503
+ end
504
+ end
505
+ end
506
+
507
+ describe 'the :before_add option' do
508
+
509
+ context 'when the option is supported by the association type', if: association_class::VALID_OPTIONS.include?(:before_add) do
510
+
511
+ context 'when the :before_add option is specified' do
512
+
513
+ let(:options) do
514
+ {
515
+ before_add: :method_name
516
+ }
517
+ end
518
+
519
+ it 'retrieves the before_add method name from the association' do
520
+ expect(association.get_callbacks(:before_add)).to eq(Array(options[:before_add]))
521
+ end
522
+ end
523
+
524
+ context 'when the :before_add option is not specified' do
525
+
526
+ it 'returns nil' do
527
+ expect(association.get_callbacks(:before_add)).to be_empty
528
+ end
529
+ end
530
+ end
531
+
532
+ context 'when the option is not supported by the association type', if: !association_class::VALID_OPTIONS.include?(:before_add) do
533
+
534
+
535
+ it 'returns nil' do
536
+ expect(association.get_callbacks(:before_add)).to be_empty
537
+ end
538
+
539
+ context 'when the option is provided' do
540
+
541
+ let(:options) do
542
+ {
543
+ before_add: :method_name
544
+ }
545
+ end
546
+
547
+ it 'raises a Mongoid::Errors::InvalidRelationOption error' do
548
+ expect {
549
+ association
550
+ }.to raise_exception(Mongoid::Errors::InvalidRelationOption)
551
+ end
552
+ end
553
+ end
554
+ end
555
+
556
+ describe 'the :before_remove option' do
557
+
558
+ context 'when the option is supported by the association type', if: association_class::VALID_OPTIONS.include?(:before_remove) do
559
+
560
+ context 'when the :before_remove option is specified' do
561
+
562
+ let(:options) do
563
+ {
564
+ before_remove: :method_name
565
+ }
566
+ end
567
+
568
+ it 'retrieves the before_remove method name from the association' do
569
+ expect(association.get_callbacks(:before_remove)).to eq(Array(options[:before_remove]))
570
+ end
571
+ end
572
+
573
+ context 'when the :before_remove option is not specified' do
574
+
575
+ it 'returns nil' do
576
+ expect(association.get_callbacks(:before_remove)).to be_empty
577
+ end
578
+ end
579
+ end
580
+
581
+ context 'when the option is not supported by the association type', if: !association_class::VALID_OPTIONS.include?(:before_remove) do
582
+
583
+
584
+ it 'returns nil' do
585
+ expect(association.get_callbacks(:before_remove)).to be_empty
586
+ end
587
+
588
+ context 'when the option is provided' do
589
+
590
+ let(:options) do
591
+ {
592
+ before_remove: :method_name
593
+ }
594
+ end
595
+
596
+ it 'raises a Mongoid::Errors::InvalidRelationOption error' do
597
+ expect {
598
+ association
599
+ }.to raise_exception(Mongoid::Errors::InvalidRelationOption)
600
+ end
601
+ end
602
+ end
603
+ end
604
+
605
+
606
+ describe '#indexed?' do
607
+
608
+ context 'when the option is supported by the association type', if: association_class::VALID_OPTIONS.include?(:index) do
609
+
610
+ context 'when :index is in the options' do
611
+
612
+ context 'when :index is true' do
613
+
614
+ let(:options) do
615
+ {
616
+ index: true
617
+ }
618
+ end
619
+
620
+ it 'returns true' do
621
+ expect(association.indexed?).to be(true)
622
+ end
623
+ end
624
+
625
+ context 'when :index is false' do
626
+
627
+ let(:options) do
628
+ {
629
+ index: false
630
+ }
631
+ end
632
+
633
+ it 'returns false' do
634
+ expect(association.indexed?).to be(false)
635
+ end
636
+ end
637
+
638
+ context 'when :index is nil' do
639
+
640
+ let(:options) do
641
+ {
642
+ index: nil
643
+ }
644
+ end
645
+
646
+ it 'returns false' do
647
+ expect(association.indexed?).to be(false)
648
+ end
649
+ end
650
+ end
651
+
652
+ context 'when :index is not in the options' do
653
+
654
+ it 'returns false' do
655
+ expect(association.indexed?).to be(false)
656
+ end
657
+ end
658
+ end
659
+
660
+ context 'when the option is not supported by the association type', if: !association_class::VALID_OPTIONS.include?(:index) do
661
+
662
+ it 'returns false' do
663
+ expect(association.indexed?).to be(false)
664
+ end
665
+
666
+ context 'when the option is provided' do
667
+
668
+ let(:options) do
669
+ {
670
+ index: true
671
+ }
672
+ end
673
+
674
+ it 'raises a Mongoid::Errors::InvalidRelationOption error' do
675
+ expect {
676
+ association
677
+ }.to raise_exception(Mongoid::Errors::InvalidRelationOption)
678
+ end
679
+ end
680
+ end
681
+ end
682
+
683
+ describe 'the :order option' do
684
+
685
+ context 'when the option is supported by the association type', if: association_class::VALID_OPTIONS.include?(:order) do
686
+
687
+ context 'when :order is in the options' do
688
+
689
+ let(:options) do
690
+ {
691
+ order: :rating.desc
692
+ }
693
+ end
694
+
695
+ it 'returns a Mongoid::Criteria::Queryable::Key' do
696
+ expect(association.order).to be_a(Mongoid::Criteria::Queryable::Key)
697
+ end
698
+ end
699
+
700
+ context 'when :order is not in the options' do
701
+
702
+ it 'returns nil' do
703
+ expect(association.order).to be_nil
704
+ end
705
+ end
706
+ end
707
+
708
+ context 'when the option is not supported by the association type', if: !association_class::VALID_OPTIONS.include?(:order) do
709
+
710
+ it 'returns nil' do
711
+ expect(association.order).to be_nil
712
+ end
713
+
714
+ context 'when the option is provided' do
715
+
716
+ let(:options) do
717
+ {
718
+ order: :rating.desc
719
+ }
720
+ end
721
+
722
+ it 'raises a Mongoid::Errors::InvalidRelationOption error' do
723
+ expect {
724
+ association
725
+ }.to raise_exception(Mongoid::Errors::InvalidRelationOption)
726
+ end
727
+ end
728
+ end
729
+ end
730
+
731
+ describe '#polymorphic' do
732
+
733
+ context 'when the option is supported by the association type', if: association_class::VALID_OPTIONS.include?(:polymorphic) do
734
+
735
+ context 'when :polymorphic is in the options' do
736
+
737
+ context 'when :polymorphic is true' do
738
+
739
+ let(:options) do
740
+ {
741
+ polymorphic: true
742
+ }
743
+ end
744
+
745
+ it 'returns true' do
746
+ expect(association.polymorphic?).to be(true)
747
+ end
748
+ end
749
+
750
+ context 'when :polymorphic is false' do
751
+
752
+ let(:options) do
753
+ {
754
+ polymorphic: false
755
+ }
756
+ end
757
+
758
+ it 'returns false' do
759
+ expect(association.polymorphic?).to be(false)
760
+ end
761
+ end
762
+
763
+ context 'when :polymorphic is nil' do
764
+
765
+ let(:options) do
766
+ {
767
+ polymorphic: nil
768
+ }
769
+ end
770
+
771
+ it 'returns false' do
772
+ expect(association.polymorphic?).to be(false)
773
+ end
774
+ end
775
+ end
776
+
777
+ context 'when :polymorphic is not in the options' do
778
+
779
+ it 'returns false' do
780
+ expect(association.polymorphic?).to be(false)
781
+ end
782
+ end
783
+ end
784
+
785
+ context 'when the option is not supported by the association type', if: !association_class::VALID_OPTIONS.include?(:polymorphic) do
786
+
787
+ it 'returns false' do
788
+ expect(association.polymorphic?).to be(false)
789
+ end
790
+
791
+ context 'when the option is provided' do
792
+
793
+ let(:options) do
794
+ {
795
+ polymorphic: true
796
+ }
797
+ end
798
+
799
+ it 'raises a Mongoid::Errors::InvalidRelationOption error' do
800
+ expect {
801
+ association
802
+ }.to raise_exception(Mongoid::Errors::InvalidRelationOption)
803
+ end
804
+ end
805
+ end
806
+ end
807
+
808
+ describe '#cascading_callbacks?' do
809
+
810
+ context 'when the option is supported by the association type', if: association_class::VALID_OPTIONS.include?(:cascade_callbacks) do
811
+
812
+ context 'when :cascade_callbacks is in the options' do
813
+
814
+ context 'when :cascade_callbacks is true' do
815
+
816
+ let(:options) do
817
+ {
818
+ cascade_callbacks: true
819
+ }
820
+ end
821
+
822
+ it 'returns true' do
823
+ expect(association.cascading_callbacks?).to be(true)
824
+ end
825
+ end
826
+
827
+ context 'when :cascade_callbacks is false' do
828
+
829
+ let(:options) do
830
+ {
831
+ cascade_callbacks: false
832
+ }
833
+ end
834
+
835
+ it 'returns false' do
836
+ expect(association.cascading_callbacks?).to be(false)
837
+ end
838
+ end
839
+
840
+ context 'when :cascade_callbacks is nil' do
841
+
842
+ let(:options) do
843
+ {
844
+ cascade_callbacks: nil
845
+ }
846
+ end
847
+
848
+ it 'returns false' do
849
+ expect(association.cascading_callbacks?).to be(false)
850
+ end
851
+ end
852
+ end
853
+
854
+ context 'when :cascade_callbacks is not in the options' do
855
+
856
+ it 'returns false' do
857
+ expect(association.cascading_callbacks?).to be(false)
858
+ end
859
+ end
860
+ end
861
+
862
+ context 'when the option is not supported by the association type', if: !association_class::VALID_OPTIONS.include?(:cascade_callbacks) do
863
+
864
+ it 'returns false' do
865
+ expect(association.cascading_callbacks?).to be(false)
866
+ end
867
+
868
+ context 'when the option is provided' do
869
+
870
+ let(:options) do
871
+ {
872
+ cascade_callbacks: true
873
+ }
874
+ end
875
+
876
+ it 'raises a Mongoid::Errors::InvalidRelationOption error' do
877
+ expect {
878
+ association
879
+ }.to raise_exception(Mongoid::Errors::InvalidRelationOption)
880
+ end
881
+ end
882
+ end
883
+ end
884
+
885
+ describe '#cyclic?' do
886
+
887
+ context 'when the option is supported by the association type', if: association_class::VALID_OPTIONS.include?(:cyclic) do
888
+
889
+ context 'when :cyclic is in the options' do
890
+
891
+ context 'when :cyclic is true' do
892
+
893
+ let(:options) do
894
+ {
895
+ cyclic: true
896
+ }
897
+ end
898
+
899
+ it 'returns true' do
900
+ expect(association.cyclic?).to be(true)
901
+ end
902
+ end
903
+
904
+ context 'when :cyclic is false' do
905
+
906
+ let(:options) do
907
+ {
908
+ cyclic: false
909
+ }
910
+ end
911
+
912
+ it 'returns false' do
913
+ expect(association.cyclic?).to be(false)
914
+ end
915
+ end
916
+
917
+ context 'when :cyclic is nil' do
918
+
919
+ let(:options) do
920
+ {
921
+ cyclic: nil
922
+ }
923
+ end
924
+
925
+ it 'returns false' do
926
+ expect(association.cyclic?).to be(false)
927
+ end
928
+ end
929
+ end
930
+
931
+ context 'when :cyclic is not in the options' do
932
+
933
+ it 'returns false' do
934
+ expect(association.cyclic?).to be(false)
935
+ end
936
+ end
937
+ end
938
+
939
+ context 'when the option is not supported by the association type', if: !association_class::VALID_OPTIONS.include?(:cyclic) do
940
+
941
+ it 'returns false' do
942
+ expect(association.cyclic?).to be(false)
943
+ end
944
+
945
+ context 'when the option is provided' do
946
+
947
+ let(:options) do
948
+ {
949
+ cyclic: true
950
+ }
951
+ end
952
+
953
+ it 'raises a Mongoid::Errors::InvalidRelationOption error' do
954
+ expect {
955
+ association
956
+ }.to raise_exception(Mongoid::Errors::InvalidRelationOption)
957
+ end
958
+ end
959
+ end
960
+ end
961
+
962
+ describe 'the :store_as option' do
963
+
964
+ context 'when the option is supported by the association type', if: association_class::VALID_OPTIONS.include?(:store_as) do
965
+
966
+ context 'when :store_as is in the options' do
967
+
968
+ let(:options) do
969
+ {
970
+ store_as: :another_name
971
+ }
972
+ end
973
+
974
+ it 'returns the :store_as value' do
975
+ expect(association.store_as).to eq(options[:store_as].to_s)
976
+ end
977
+ end
978
+
979
+ context 'when :store_as is not in the options' do
980
+
981
+ it 'returns the name as a string' do
982
+ expect(association.store_as).to eq("name")
983
+ end
984
+ end
985
+ end
986
+
987
+ context 'when the option is not supported by the association type', if: !association_class::VALID_OPTIONS.include?(:store_as) do
988
+
989
+ it 'returns nil' do
990
+ expect(association.store_as).to be_nil
991
+ end
992
+
993
+ context 'when the option is provided' do
994
+
995
+ let(:options) do
996
+ {
997
+ store_as: :another_name
998
+ }
999
+ end
1000
+
1001
+ it 'raises a Mongoid::Errors::InvalidRelationOption error' do
1002
+ expect {
1003
+ association
1004
+ }.to raise_exception(Mongoid::Errors::InvalidRelationOption)
1005
+ end
1006
+ end
1007
+ end
1008
+ end
1009
+
1010
+ describe 'the :class_name option' do
1011
+
1012
+ context 'when the option is supported by the association type', if: association_class::VALID_OPTIONS.include?(:class_name) do
1013
+
1014
+ context 'when :class_name is in the options' do
1015
+
1016
+ let(:options) do
1017
+ {
1018
+ class_name: :a_class
1019
+ }
1020
+ end
1021
+
1022
+ it 'returns the :class_name value' do
1023
+ expect(association.class_name).to eq(:a_class)
1024
+ end
1025
+ end
1026
+
1027
+ context 'when :class_name is not in the options' do
1028
+
1029
+ it 'returns the name deduced from the association name' do
1030
+ expect(association.class_name).to eq(ActiveSupport::Inflector.classify(:name))
1031
+ end
1032
+ end
1033
+ end
1034
+
1035
+ context 'when the option is not supported by the association type', if: !association_class::VALID_OPTIONS.include?(:class_name) do
1036
+
1037
+ it 'returns the name deduced from the association name' do
1038
+ expect(association.class_name).to eq(ActiveSupport::Inflector.classify(:name))
1039
+ end
1040
+
1041
+ context 'when the option is provided' do
1042
+
1043
+ let(:options) do
1044
+ {
1045
+ class_name: :a_class
1046
+ }
1047
+ end
1048
+
1049
+ it 'should support the option' do
1050
+ fail('All association types should support this option')
1051
+ end
1052
+ end
1053
+ end
1054
+ end
1055
+
1056
+ describe '#counter_cached?' do
1057
+
1058
+ context 'when the option is supported by the association type', if: association_class::VALID_OPTIONS.include?(:counter_cache) do
1059
+
1060
+ context 'when :counter_cache is in the options' do
1061
+
1062
+ context 'when :counter_cache is true' do
1063
+
1064
+ let(:options) do
1065
+ {
1066
+ counter_cache: true
1067
+ }
1068
+ end
1069
+
1070
+ it 'returns true' do
1071
+ expect(association.counter_cached?).to be(true)
1072
+ end
1073
+ end
1074
+
1075
+ context 'when :counter_cache is false' do
1076
+
1077
+ let(:options) do
1078
+ {
1079
+ counter_cache: false
1080
+ }
1081
+ end
1082
+
1083
+ it 'returns false' do
1084
+ expect(association.counter_cached?).to be(false)
1085
+ end
1086
+ end
1087
+
1088
+ context 'when :counter_cache is nil' do
1089
+
1090
+ let(:options) do
1091
+ {
1092
+ counter_cache: nil
1093
+ }
1094
+ end
1095
+
1096
+ it 'returns false' do
1097
+ expect(association.counter_cached?).to be(false)
1098
+ end
1099
+ end
1100
+ end
1101
+
1102
+ context 'when :counter_cache is not in the options' do
1103
+
1104
+ it 'returns false' do
1105
+ expect(association.counter_cached?).to be(false)
1106
+ end
1107
+ end
1108
+ end
1109
+
1110
+ context 'when the option is not supported by the association type', if: !association_class::VALID_OPTIONS.include?(:counter_cache) do
1111
+
1112
+ it 'returns false' do
1113
+ expect(association.counter_cached?).to be(false)
1114
+ end
1115
+
1116
+ context 'when the option is provided' do
1117
+
1118
+ let(:options) do
1119
+ {
1120
+ counter_cache: :column_name
1121
+ }
1122
+ end
1123
+
1124
+ it 'raises a Mongoid::Errors::InvalidRelationOption error' do
1125
+ expect {
1126
+ association
1127
+ }.to raise_exception(Mongoid::Errors::InvalidRelationOption)
1128
+ end
1129
+ end
1130
+ end
1131
+ end
1132
+
1133
+ describe '#extension' do
1134
+
1135
+ context 'when the option is supported by the association type', if: association_class::VALID_OPTIONS.include?(:extend) do
1136
+
1137
+ context 'when a block is passed' do
1138
+
1139
+ let!(:association) do
1140
+ association_class.new(class_left, :name, options) do; end
1141
+ end
1142
+
1143
+ after do
1144
+ Object.send(:remove_const, :ClassLeft)
1145
+ end
1146
+
1147
+ it 'defines an extension module' do
1148
+ expect(ClassLeft::ClassLeftNameRelationExtension).to be_a(Module)
1149
+ end
1150
+
1151
+ it 'returns the extension' do
1152
+ expect(association.extension).to eq(ClassLeft::ClassLeftNameRelationExtension)
1153
+ end
1154
+ end
1155
+
1156
+ context 'when a module name is passed' do
1157
+
1158
+ before do
1159
+ class ClassLeft; end
1160
+ module ClassLeft::Handle; end
1161
+ end
1162
+
1163
+ let(:options) do
1164
+ {
1165
+ extend: ClassLeft::Handle
1166
+ }
1167
+ end
1168
+
1169
+ let!(:association) do
1170
+ association_class.new(class_left, :name, options)
1171
+ end
1172
+
1173
+ it 'returns the extension' do
1174
+ expect(association.extension).to eq(ClassLeft::Handle)
1175
+ end
1176
+ end
1177
+
1178
+ context 'when a block is not passed' do
1179
+
1180
+ it 'does not define an extension module' do
1181
+ expect(defined?(ClassLeft::ClassLeftNameRelationExtension)).to be_nil
1182
+ end
1183
+
1184
+ it 'returns nil' do
1185
+ expect(association.extension).to be_nil
1186
+ end
1187
+ end
1188
+
1189
+
1190
+ end
1191
+
1192
+ context 'when the option is not supported by the association type', if: !association_class::VALID_OPTIONS.include?(:extend) do
1193
+
1194
+ it 'should support the option' do
1195
+ fail('All association types should support this option')
1196
+ end
1197
+ end
1198
+ end
1199
+
1200
+ describe 'the :inverse_of option' do
1201
+
1202
+ context 'when the option is supported by the association type', if: association_class::VALID_OPTIONS.include?(:inverse_of) do
1203
+
1204
+ context 'when :inverse_of is in the options' do
1205
+
1206
+ let(:options) do
1207
+ {
1208
+ inverse_of: :inverse_name
1209
+ }
1210
+ end
1211
+
1212
+ it 'returns the :inverse_of value' do
1213
+ expect(association.inverse_of).to eq(:inverse_name)
1214
+ end
1215
+ end
1216
+
1217
+ context 'when :inverse_of is not in the options' do
1218
+
1219
+ it 'returns nil' do
1220
+ expect(association.inverse_of).to be_nil
1221
+ end
1222
+ end
1223
+ end
1224
+
1225
+ context 'when the option is not supported by the association type', if: !association_class::VALID_OPTIONS.include?(:inverse_of) do
1226
+
1227
+ it 'returns nil' do
1228
+ expect(association.inverse_of).to be_nil
1229
+ end
1230
+
1231
+
1232
+ context 'when the option is provided' do
1233
+
1234
+ let(:options) do
1235
+ {
1236
+ inverse_of: :inverse_name
1237
+ }
1238
+ end
1239
+
1240
+ it 'should support the option' do
1241
+ fail('All association types should support this option')
1242
+ end
1243
+ end
1244
+ end
1245
+ end
1246
+
1247
+ describe '#validate?' do
1248
+
1249
+ context 'when the option is supported by the association type', if: association_class::VALID_OPTIONS.include?(:validate) do
1250
+
1251
+ context 'when :validate is in the options' do
1252
+
1253
+ context 'when :validate is true' do
1254
+
1255
+ let(:options) do
1256
+ {
1257
+ validate: true
1258
+ }
1259
+ end
1260
+
1261
+ it 'returns true' do
1262
+ expect(association.send(:validate?)).to be(true)
1263
+ end
1264
+ end
1265
+
1266
+ context 'when :validate is false' do
1267
+
1268
+ let(:options) do
1269
+ {
1270
+ validate: false
1271
+ }
1272
+ end
1273
+
1274
+ it 'returns false' do
1275
+ expect(association.send(:validate?)).to be(false)
1276
+ end
1277
+ end
1278
+
1279
+ context 'when :validate is nil' do
1280
+
1281
+ let(:options) do
1282
+ {
1283
+ validate: nil
1284
+ }
1285
+ end
1286
+
1287
+ it 'returns the validation default' do
1288
+ expect(association.send(:validate?)).to be(association.validation_default)
1289
+ end
1290
+ end
1291
+ end
1292
+
1293
+ context 'when :validate is not in the options' do
1294
+
1295
+ it 'returns the validation default' do
1296
+ expect(association.send(:validate?)).to be(association.validation_default)
1297
+ end
1298
+ end
1299
+ end
1300
+
1301
+ context 'when the option is not supported by the association type', if: !association_class::VALID_OPTIONS.include?(:validate) do
1302
+
1303
+ it 'returns false' do
1304
+ expect(association.send(:validate?)).to be(false)
1305
+ end
1306
+
1307
+
1308
+ context 'when the option is provided' do
1309
+
1310
+ let(:options) do
1311
+ {
1312
+ validate: true
1313
+ }
1314
+ end
1315
+
1316
+ it 'should support the option' do
1317
+ fail('All association types should support this option')
1318
+ end
1319
+ end
1320
+ end
1321
+ end
1322
+ end
1323
+ end
1324
+ end