mongoid 6.4.4 → 7.1.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (942) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/CHANGELOG.md +13 -13
  4. data/LICENSE +1 -0
  5. data/README.md +25 -18
  6. data/Rakefile +28 -5
  7. data/lib/config/locales/en.yml +76 -50
  8. data/lib/mongoid/association/accessors.rb +417 -0
  9. data/lib/mongoid/{relations/binding.rb → association/bindable.rb} +39 -57
  10. data/lib/mongoid/association/builders.rb +93 -0
  11. data/lib/mongoid/association/constrainable.rb +46 -0
  12. data/lib/mongoid/association/depending.rb +140 -0
  13. data/lib/mongoid/{relations/eager.rb → association/eager_loadable.rb} +13 -11
  14. data/lib/mongoid/{relations → association}/embedded/batchable.rb +23 -21
  15. data/lib/mongoid/association/embedded/cyclic.rb +111 -0
  16. data/lib/mongoid/association/embedded/embedded_in/binding.rb +59 -0
  17. data/lib/mongoid/association/embedded/embedded_in/buildable.rb +41 -0
  18. data/lib/mongoid/association/embedded/embedded_in/proxy.rb +124 -0
  19. data/lib/mongoid/association/embedded/embedded_in.rb +157 -0
  20. data/lib/mongoid/{relations/bindings/embedded/many.rb → association/embedded/embeds_many/binding.rb} +14 -9
  21. data/lib/mongoid/{relations/builders/embedded/many.rb → association/embedded/embeds_many/buildable.rb} +19 -7
  22. data/lib/mongoid/association/embedded/embeds_many/proxy.rb +555 -0
  23. data/lib/mongoid/association/embedded/embeds_many.rb +214 -0
  24. data/lib/mongoid/{relations/bindings/embedded/one.rb → association/embedded/embeds_one/binding.rb} +15 -10
  25. data/lib/mongoid/association/embedded/embeds_one/buildable.rb +42 -0
  26. data/lib/mongoid/association/embedded/embeds_one/proxy.rb +133 -0
  27. data/lib/mongoid/association/embedded/embeds_one.rb +177 -0
  28. data/lib/mongoid/association/embedded.rb +7 -0
  29. data/lib/mongoid/association/macros.rb +206 -0
  30. data/lib/mongoid/{relations → association}/many.rb +32 -59
  31. data/lib/mongoid/{relations → association}/marshalable.rb +9 -5
  32. data/lib/mongoid/association/nested/many.rb +202 -0
  33. data/lib/mongoid/association/nested/nested_buildable.rb +75 -0
  34. data/lib/mongoid/association/nested/one.rb +129 -0
  35. data/lib/mongoid/association/nested.rb +18 -0
  36. data/lib/mongoid/{relations → association}/one.rb +9 -7
  37. data/lib/mongoid/association/options.rb +155 -0
  38. data/lib/mongoid/{relations → association}/proxy.rb +59 -69
  39. data/lib/mongoid/association/referenced/auto_save.rb +82 -0
  40. data/lib/mongoid/association/referenced/belongs_to/binding.rb +89 -0
  41. data/lib/mongoid/association/referenced/belongs_to/buildable.rb +49 -0
  42. data/lib/mongoid/association/referenced/belongs_to/eager.rb +74 -0
  43. data/lib/mongoid/association/referenced/belongs_to/proxy.rb +138 -0
  44. data/lib/mongoid/association/referenced/belongs_to.rb +251 -0
  45. data/lib/mongoid/association/referenced/counter_cache.rb +165 -0
  46. data/lib/mongoid/association/referenced/eager.rb +184 -0
  47. data/lib/mongoid/association/referenced/has_and_belongs_to_many/binding.rb +77 -0
  48. data/lib/mongoid/association/referenced/has_and_belongs_to_many/buildable.rb +43 -0
  49. data/lib/mongoid/association/referenced/has_and_belongs_to_many/eager.rb +54 -0
  50. data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +319 -0
  51. data/lib/mongoid/association/referenced/has_and_belongs_to_many.rb +297 -0
  52. data/lib/mongoid/{relations/bindings/referenced/many.rb → association/referenced/has_many/binding.rb} +9 -6
  53. data/lib/mongoid/association/referenced/has_many/buildable.rb +41 -0
  54. data/lib/mongoid/association/referenced/has_many/eager.rb +45 -0
  55. data/lib/mongoid/association/referenced/has_many/enumerable.rb +517 -0
  56. data/lib/mongoid/association/referenced/has_many/proxy.rb +581 -0
  57. data/lib/mongoid/association/referenced/has_many.rb +278 -0
  58. data/lib/mongoid/{relations/bindings/referenced/one.rb → association/referenced/has_one/binding.rb} +14 -9
  59. data/lib/mongoid/association/referenced/has_one/buildable.rb +67 -0
  60. data/lib/mongoid/association/referenced/has_one/eager.rb +37 -0
  61. data/lib/mongoid/{relations/builders/nested_attributes/one.rb → association/referenced/has_one/nested_builder.rb} +20 -18
  62. data/lib/mongoid/association/referenced/has_one/proxy.rb +120 -0
  63. data/lib/mongoid/association/referenced/has_one.rb +207 -0
  64. data/lib/mongoid/association/referenced/syncable.rb +172 -0
  65. data/lib/mongoid/association/referenced.rb +10 -0
  66. data/lib/mongoid/association/reflections.rb +70 -0
  67. data/lib/mongoid/association/relatable.rb +514 -0
  68. data/lib/mongoid/association.rb +152 -0
  69. data/lib/mongoid/atomic/modifiers.rb +24 -1
  70. data/lib/mongoid/atomic/paths/embedded/many.rb +5 -3
  71. data/lib/mongoid/atomic/paths/embedded/one.rb +5 -3
  72. data/lib/mongoid/atomic/paths/embedded.rb +3 -1
  73. data/lib/mongoid/atomic/paths/root.rb +4 -2
  74. data/lib/mongoid/atomic/paths.rb +2 -0
  75. data/lib/mongoid/atomic.rb +16 -4
  76. data/lib/mongoid/attributes/dynamic.rb +18 -15
  77. data/lib/mongoid/attributes/nested.rb +29 -16
  78. data/lib/mongoid/attributes/processing.rb +10 -8
  79. data/lib/mongoid/attributes/readonly.rb +5 -5
  80. data/lib/mongoid/attributes.rb +62 -44
  81. data/lib/mongoid/cacheable.rb +3 -1
  82. data/lib/mongoid/changeable.rb +4 -2
  83. data/lib/mongoid/clients/factory.rb +3 -2
  84. data/lib/mongoid/clients/options.rb +17 -13
  85. data/lib/mongoid/clients/sessions.rb +23 -4
  86. data/lib/mongoid/clients/storage_options.rb +7 -5
  87. data/lib/mongoid/clients/validators/storage.rb +2 -0
  88. data/lib/mongoid/clients/validators.rb +2 -0
  89. data/lib/mongoid/clients.rb +2 -0
  90. data/lib/mongoid/composable.rb +8 -6
  91. data/lib/mongoid/config/environment.rb +23 -8
  92. data/lib/mongoid/config/options.rb +20 -12
  93. data/lib/mongoid/config/validators/client.rb +2 -0
  94. data/lib/mongoid/config/validators/option.rb +2 -0
  95. data/lib/mongoid/config/validators.rb +2 -0
  96. data/lib/mongoid/config.rb +53 -9
  97. data/lib/mongoid/contextual/aggregable/memory.rb +3 -1
  98. data/lib/mongoid/contextual/aggregable/mongo.rb +3 -1
  99. data/lib/mongoid/contextual/atomic.rb +24 -6
  100. data/lib/mongoid/contextual/command.rb +2 -0
  101. data/lib/mongoid/contextual/geo_near.rb +6 -4
  102. data/lib/mongoid/contextual/map_reduce.rb +5 -2
  103. data/lib/mongoid/contextual/memory.rb +23 -3
  104. data/lib/mongoid/contextual/mongo.rb +16 -9
  105. data/lib/mongoid/contextual/none.rb +2 -0
  106. data/lib/mongoid/contextual/queryable.rb +2 -0
  107. data/lib/mongoid/contextual.rb +7 -4
  108. data/lib/mongoid/copyable.rb +14 -7
  109. data/lib/mongoid/criteria/findable.rb +11 -1
  110. data/lib/mongoid/criteria/includable.rb +21 -19
  111. data/lib/mongoid/criteria/inspectable.rb +2 -0
  112. data/lib/mongoid/criteria/marshalable.rb +2 -0
  113. data/lib/mongoid/criteria/modifiable.rb +10 -3
  114. data/lib/mongoid/criteria/options.rb +4 -2
  115. data/lib/mongoid/criteria/permission.rb +2 -0
  116. data/lib/mongoid/criteria/queryable/aggregable.rb +2 -0
  117. data/lib/mongoid/criteria/queryable/expandable.rb +93 -0
  118. data/lib/mongoid/criteria/queryable/extensions/array.rb +3 -1
  119. data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +3 -1
  120. data/lib/mongoid/criteria/queryable/extensions/boolean.rb +2 -0
  121. data/lib/mongoid/criteria/queryable/extensions/date.rb +3 -1
  122. data/lib/mongoid/criteria/queryable/extensions/date_time.rb +5 -6
  123. data/lib/mongoid/criteria/queryable/extensions/hash.rb +3 -1
  124. data/lib/mongoid/criteria/queryable/extensions/nil_class.rb +3 -1
  125. data/lib/mongoid/criteria/queryable/extensions/numeric.rb +4 -2
  126. data/lib/mongoid/criteria/queryable/extensions/object.rb +3 -1
  127. data/lib/mongoid/criteria/queryable/extensions/range.rb +3 -1
  128. data/lib/mongoid/criteria/queryable/extensions/regexp.rb +9 -7
  129. data/lib/mongoid/criteria/queryable/extensions/set.rb +3 -1
  130. data/lib/mongoid/criteria/queryable/extensions/string.rb +4 -2
  131. data/lib/mongoid/criteria/queryable/extensions/symbol.rb +3 -1
  132. data/lib/mongoid/criteria/queryable/extensions/time.rb +4 -2
  133. data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +15 -1
  134. data/lib/mongoid/criteria/queryable/extensions.rb +2 -0
  135. data/lib/mongoid/criteria/queryable/key.rb +101 -14
  136. data/lib/mongoid/criteria/queryable/macroable.rb +3 -1
  137. data/lib/mongoid/criteria/queryable/mergeable.rb +158 -15
  138. data/lib/mongoid/criteria/queryable/optional.rb +5 -3
  139. data/lib/mongoid/criteria/queryable/options.rb +2 -0
  140. data/lib/mongoid/criteria/queryable/pipeline.rb +14 -6
  141. data/lib/mongoid/criteria/queryable/selectable.rb +376 -90
  142. data/lib/mongoid/criteria/queryable/selector.rb +43 -36
  143. data/lib/mongoid/criteria/queryable/smash.rb +2 -0
  144. data/lib/mongoid/criteria/queryable/storable.rb +233 -0
  145. data/lib/mongoid/criteria/queryable.rb +7 -2
  146. data/lib/mongoid/criteria/scopable.rb +2 -0
  147. data/lib/mongoid/criteria.rb +27 -6
  148. data/lib/mongoid/document.rb +16 -4
  149. data/lib/mongoid/equality.rb +3 -2
  150. data/lib/mongoid/errors/ambiguous_relationship.rb +4 -2
  151. data/lib/mongoid/errors/callback.rb +2 -0
  152. data/lib/mongoid/errors/criteria_argument_required.rb +19 -0
  153. data/lib/mongoid/errors/delete_restriction.rb +3 -2
  154. data/lib/mongoid/errors/document_not_destroyed.rb +2 -0
  155. data/lib/mongoid/errors/document_not_found.rb +2 -0
  156. data/lib/mongoid/errors/eager_load.rb +6 -2
  157. data/lib/mongoid/errors/in_memory_collation_not_supported.rb +2 -0
  158. data/lib/mongoid/errors/invalid_collection.rb +2 -0
  159. data/lib/mongoid/errors/invalid_config_option.rb +2 -0
  160. data/lib/mongoid/errors/invalid_dependent_strategy.rb +34 -0
  161. data/lib/mongoid/errors/invalid_field.rb +2 -0
  162. data/lib/mongoid/errors/invalid_field_option.rb +2 -0
  163. data/lib/mongoid/errors/invalid_find.rb +2 -0
  164. data/lib/mongoid/errors/invalid_includes.rb +2 -0
  165. data/lib/mongoid/errors/invalid_index.rb +2 -0
  166. data/lib/mongoid/errors/invalid_options.rb +4 -2
  167. data/lib/mongoid/errors/invalid_path.rb +2 -0
  168. data/lib/mongoid/errors/invalid_persistence_option.rb +2 -0
  169. data/lib/mongoid/errors/invalid_relation.rb +4 -2
  170. data/lib/mongoid/errors/invalid_relation_option.rb +31 -0
  171. data/lib/mongoid/errors/invalid_scope.rb +2 -0
  172. data/lib/mongoid/errors/invalid_session_use.rb +2 -0
  173. data/lib/mongoid/errors/invalid_set_polymorphic_relation.rb +6 -4
  174. data/lib/mongoid/errors/invalid_storage_options.rb +2 -0
  175. data/lib/mongoid/errors/invalid_storage_parent.rb +2 -0
  176. data/lib/mongoid/errors/invalid_time.rb +2 -0
  177. data/lib/mongoid/errors/invalid_value.rb +2 -0
  178. data/lib/mongoid/errors/inverse_not_found.rb +3 -1
  179. data/lib/mongoid/errors/mixed_client_configuration.rb +2 -0
  180. data/lib/mongoid/errors/mixed_relations.rb +2 -0
  181. data/lib/mongoid/errors/mongoid_error.rb +2 -0
  182. data/lib/mongoid/errors/nested_attributes_metadata_not_found.rb +3 -1
  183. data/lib/mongoid/errors/no_client_config.rb +4 -2
  184. data/lib/mongoid/errors/no_client_database.rb +2 -0
  185. data/lib/mongoid/errors/no_client_hosts.rb +2 -0
  186. data/lib/mongoid/errors/no_clients_config.rb +2 -0
  187. data/lib/mongoid/errors/no_default_client.rb +3 -1
  188. data/lib/mongoid/errors/no_environment.rb +2 -0
  189. data/lib/mongoid/errors/no_map_reduce_output.rb +2 -0
  190. data/lib/mongoid/errors/no_metadata.rb +2 -0
  191. data/lib/mongoid/errors/no_parent.rb +2 -0
  192. data/lib/mongoid/errors/readonly_attribute.rb +2 -0
  193. data/lib/mongoid/errors/readonly_document.rb +2 -0
  194. data/lib/mongoid/errors/scope_overwrite.rb +2 -0
  195. data/lib/mongoid/errors/too_many_nested_attribute_records.rb +3 -0
  196. data/lib/mongoid/errors/unknown_attribute.rb +2 -0
  197. data/lib/mongoid/errors/unknown_model.rb +27 -0
  198. data/lib/mongoid/errors/unsaved_document.rb +2 -0
  199. data/lib/mongoid/errors/unsupported_javascript.rb +2 -0
  200. data/lib/mongoid/errors/validations.rb +2 -0
  201. data/lib/mongoid/errors.rb +6 -0
  202. data/lib/mongoid/evolvable.rb +3 -1
  203. data/lib/mongoid/extensions/array.rb +28 -11
  204. data/lib/mongoid/extensions/big_decimal.rb +2 -0
  205. data/lib/mongoid/extensions/boolean.rb +2 -0
  206. data/lib/mongoid/extensions/date.rb +13 -3
  207. data/lib/mongoid/extensions/date_time.rb +4 -3
  208. data/lib/mongoid/extensions/decimal128.rb +2 -0
  209. data/lib/mongoid/extensions/false_class.rb +2 -0
  210. data/lib/mongoid/extensions/float.rb +5 -3
  211. data/lib/mongoid/extensions/hash.rb +56 -11
  212. data/lib/mongoid/extensions/integer.rb +5 -3
  213. data/lib/mongoid/extensions/module.rb +2 -0
  214. data/lib/mongoid/extensions/nil_class.rb +2 -0
  215. data/lib/mongoid/extensions/object.rb +20 -8
  216. data/lib/mongoid/extensions/object_id.rb +2 -0
  217. data/lib/mongoid/extensions/range.rb +3 -0
  218. data/lib/mongoid/extensions/regexp.rb +3 -1
  219. data/lib/mongoid/extensions/set.rb +2 -0
  220. data/lib/mongoid/extensions/string.rb +23 -12
  221. data/lib/mongoid/extensions/symbol.rb +2 -0
  222. data/lib/mongoid/extensions/time.rb +14 -0
  223. data/lib/mongoid/extensions/time_with_zone.rb +14 -0
  224. data/lib/mongoid/extensions/true_class.rb +2 -0
  225. data/lib/mongoid/extensions.rb +2 -4
  226. data/lib/mongoid/factory.rb +38 -5
  227. data/lib/mongoid/fields/foreign_key.rb +8 -6
  228. data/lib/mongoid/fields/localized.rb +2 -0
  229. data/lib/mongoid/fields/standard.rb +8 -17
  230. data/lib/mongoid/fields/validators/macro.rb +17 -3
  231. data/lib/mongoid/fields/validators.rb +2 -0
  232. data/lib/mongoid/fields.rb +8 -5
  233. data/lib/mongoid/findable.rb +9 -4
  234. data/lib/mongoid/indexable/specification.rb +3 -1
  235. data/lib/mongoid/indexable/validators/options.rb +2 -0
  236. data/lib/mongoid/indexable.rb +7 -2
  237. data/lib/mongoid/inspectable.rb +3 -1
  238. data/lib/mongoid/interceptable.rb +17 -9
  239. data/lib/mongoid/loggable.rb +13 -7
  240. data/lib/mongoid/matchable/all.rb +6 -3
  241. data/lib/mongoid/matchable/and.rb +3 -1
  242. data/lib/mongoid/matchable/default.rb +73 -24
  243. data/lib/mongoid/matchable/elem_match.rb +11 -3
  244. data/lib/mongoid/matchable/eq.rb +23 -0
  245. data/lib/mongoid/matchable/exists.rb +2 -0
  246. data/lib/mongoid/matchable/gt.rb +2 -0
  247. data/lib/mongoid/matchable/gte.rb +2 -0
  248. data/lib/mongoid/matchable/in.rb +2 -0
  249. data/lib/mongoid/matchable/lt.rb +2 -0
  250. data/lib/mongoid/matchable/lte.rb +2 -0
  251. data/lib/mongoid/matchable/ne.rb +3 -1
  252. data/lib/mongoid/matchable/nin.rb +2 -0
  253. data/lib/mongoid/matchable/nor.rb +2 -1
  254. data/lib/mongoid/matchable/or.rb +2 -0
  255. data/lib/mongoid/matchable/regexp.rb +5 -2
  256. data/lib/mongoid/matchable/size.rb +2 -0
  257. data/lib/mongoid/matchable.rb +19 -16
  258. data/lib/mongoid/persistable/creatable.rb +3 -1
  259. data/lib/mongoid/persistable/deletable.rb +10 -7
  260. data/lib/mongoid/persistable/destroyable.rb +3 -1
  261. data/lib/mongoid/persistable/incrementable.rb +7 -3
  262. data/lib/mongoid/persistable/logical.rb +5 -2
  263. data/lib/mongoid/persistable/poppable.rb +3 -1
  264. data/lib/mongoid/persistable/pullable.rb +3 -1
  265. data/lib/mongoid/persistable/pushable.rb +14 -3
  266. data/lib/mongoid/persistable/renamable.rb +10 -3
  267. data/lib/mongoid/persistable/savable.rb +3 -1
  268. data/lib/mongoid/persistable/settable.rb +60 -13
  269. data/lib/mongoid/persistable/unsettable.rb +8 -3
  270. data/lib/mongoid/persistable/updatable.rb +3 -1
  271. data/lib/mongoid/persistable/upsertable.rb +3 -1
  272. data/lib/mongoid/persistable.rb +136 -19
  273. data/lib/mongoid/persistence_context.rb +47 -20
  274. data/lib/mongoid/positional.rb +3 -1
  275. data/lib/mongoid/query_cache.rb +76 -29
  276. data/lib/mongoid/railtie.rb +3 -1
  277. data/lib/mongoid/railties/controller_runtime.rb +4 -1
  278. data/lib/mongoid/railties/database.rake +9 -0
  279. data/lib/mongoid/reloadable.rb +4 -2
  280. data/lib/mongoid/scopable.rb +2 -1
  281. data/lib/mongoid/selectable.rb +3 -1
  282. data/lib/mongoid/serializable.rb +27 -17
  283. data/lib/mongoid/shardable.rb +60 -6
  284. data/lib/mongoid/stateful.rb +3 -1
  285. data/lib/mongoid/tasks/database.rake +12 -5
  286. data/lib/mongoid/tasks/database.rb +85 -0
  287. data/lib/mongoid/threaded/lifecycle.rb +2 -0
  288. data/lib/mongoid/threaded.rb +2 -0
  289. data/lib/mongoid/timestamps/created/short.rb +2 -0
  290. data/lib/mongoid/timestamps/created.rb +3 -1
  291. data/lib/mongoid/timestamps/short.rb +2 -0
  292. data/lib/mongoid/timestamps/timeless.rb +6 -2
  293. data/lib/mongoid/timestamps/updated/short.rb +2 -0
  294. data/lib/mongoid/timestamps/updated.rb +3 -1
  295. data/lib/mongoid/timestamps.rb +3 -1
  296. data/lib/mongoid/touchable.rb +110 -0
  297. data/lib/mongoid/traversable.rb +7 -5
  298. data/lib/mongoid/validatable/associated.rb +4 -2
  299. data/lib/mongoid/validatable/format.rb +2 -0
  300. data/lib/mongoid/validatable/length.rb +2 -0
  301. data/lib/mongoid/validatable/localizable.rb +2 -0
  302. data/lib/mongoid/validatable/macros.rb +3 -1
  303. data/lib/mongoid/validatable/presence.rb +6 -4
  304. data/lib/mongoid/validatable/queryable.rb +2 -0
  305. data/lib/mongoid/validatable/uniqueness.rb +9 -7
  306. data/lib/mongoid/validatable.rb +15 -13
  307. data/lib/mongoid/version.rb +3 -1
  308. data/lib/mongoid.rb +11 -2
  309. data/lib/rails/generators/mongoid/config/config_generator.rb +2 -0
  310. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +44 -26
  311. data/lib/rails/generators/mongoid/model/model_generator.rb +3 -1
  312. data/lib/rails/generators/mongoid/model/templates/model.rb.tt +1 -1
  313. data/lib/rails/generators/mongoid_generator.rb +2 -0
  314. data/lib/rails/mongoid.rb +4 -2
  315. data/lib/support/ruby_version.rb +3 -0
  316. data/spec/README.md +18 -0
  317. data/spec/app/models/account.rb +3 -0
  318. data/spec/app/models/acolyte.rb +3 -0
  319. data/spec/app/models/actor.rb +3 -0
  320. data/spec/app/models/actress.rb +3 -0
  321. data/spec/app/models/address.rb +3 -0
  322. data/spec/app/models/address_component.rb +3 -0
  323. data/spec/app/models/address_number.rb +3 -0
  324. data/spec/app/models/agency.rb +3 -0
  325. data/spec/app/models/agent.rb +3 -0
  326. data/spec/app/models/album.rb +3 -0
  327. data/spec/app/models/alert.rb +3 -0
  328. data/spec/app/models/animal.rb +5 -1
  329. data/spec/app/models/answer.rb +3 -0
  330. data/spec/app/models/appointment.rb +3 -0
  331. data/spec/app/models/array_field.rb +1 -0
  332. data/spec/app/models/article.rb +3 -0
  333. data/spec/app/models/artist.rb +3 -0
  334. data/spec/app/models/artwork.rb +3 -0
  335. data/spec/app/models/audio.rb +3 -0
  336. data/spec/app/models/augmentation.rb +3 -0
  337. data/spec/app/models/author.rb +3 -0
  338. data/spec/app/models/baby.rb +3 -0
  339. data/spec/app/models/band.rb +3 -0
  340. data/spec/app/models/bar.rb +3 -0
  341. data/spec/app/models/basic.rb +3 -0
  342. data/spec/app/models/bed.rb +3 -0
  343. data/spec/app/models/big_palette.rb +3 -0
  344. data/spec/app/models/birthday.rb +3 -0
  345. data/spec/app/models/bomb.rb +4 -1
  346. data/spec/app/models/book.rb +3 -0
  347. data/spec/app/models/breed.rb +3 -0
  348. data/spec/app/models/browser.rb +3 -0
  349. data/spec/app/models/building.rb +3 -0
  350. data/spec/app/models/building_address.rb +3 -0
  351. data/spec/app/models/bus.rb +3 -0
  352. data/spec/app/models/business.rb +3 -0
  353. data/spec/app/models/callback_test.rb +3 -0
  354. data/spec/app/models/canvas.rb +3 -0
  355. data/spec/app/models/car.rb +3 -0
  356. data/spec/app/models/cat.rb +3 -0
  357. data/spec/app/models/category.rb +3 -0
  358. data/spec/app/models/child.rb +3 -0
  359. data/spec/app/models/child_doc.rb +3 -0
  360. data/spec/app/models/church.rb +3 -0
  361. data/spec/app/models/circle.rb +3 -0
  362. data/spec/app/models/circuit.rb +3 -0
  363. data/spec/app/models/circus.rb +3 -0
  364. data/spec/app/models/code.rb +3 -0
  365. data/spec/app/models/coding/pull_request.rb +12 -0
  366. data/spec/app/models/coding.rb +4 -0
  367. data/spec/app/models/comment.rb +3 -0
  368. data/spec/app/models/company.rb +3 -0
  369. data/spec/app/models/consumption_period.rb +3 -0
  370. data/spec/app/models/contextable_item.rb +3 -0
  371. data/spec/app/models/contractor.rb +3 -0
  372. data/spec/app/models/cookie.rb +3 -0
  373. data/spec/app/models/country_code.rb +3 -0
  374. data/spec/app/models/courier_job.rb +3 -0
  375. data/spec/app/models/customer.rb +11 -0
  376. data/spec/app/models/customer_address.rb +12 -0
  377. data/spec/app/models/definition.rb +3 -0
  378. data/spec/app/models/delegating_patient.rb +16 -0
  379. data/spec/app/models/description.rb +3 -0
  380. data/spec/app/models/dictionary.rb +9 -0
  381. data/spec/app/models/division.rb +3 -0
  382. data/spec/app/models/doctor.rb +3 -0
  383. data/spec/app/models/dog.rb +3 -0
  384. data/spec/app/models/dokument.rb +3 -0
  385. data/spec/app/models/draft.rb +3 -0
  386. data/spec/app/models/dragon.rb +3 -0
  387. data/spec/app/models/driver.rb +3 -0
  388. data/spec/app/models/drug.rb +3 -0
  389. data/spec/app/models/dungeon.rb +3 -0
  390. data/spec/app/models/edit.rb +3 -0
  391. data/spec/app/models/email.rb +3 -0
  392. data/spec/app/models/employer.rb +3 -0
  393. data/spec/app/models/entry.rb +3 -0
  394. data/spec/app/models/eraser.rb +3 -0
  395. data/spec/app/models/even.rb +3 -0
  396. data/spec/app/models/event.rb +3 -0
  397. data/spec/app/models/exhibition.rb +3 -0
  398. data/spec/app/models/exhibitor.rb +3 -0
  399. data/spec/app/models/explosion.rb +3 -0
  400. data/spec/app/models/eye.rb +3 -0
  401. data/spec/app/models/eye_bowl.rb +3 -0
  402. data/spec/app/models/face.rb +3 -0
  403. data/spec/app/models/favorite.rb +3 -0
  404. data/spec/app/models/filesystem.rb +3 -0
  405. data/spec/app/models/fire_hydrant.rb +3 -0
  406. data/spec/app/models/firefox.rb +3 -0
  407. data/spec/app/models/fish.rb +3 -0
  408. data/spec/app/models/folder.rb +3 -0
  409. data/spec/app/models/folder_item.rb +3 -0
  410. data/spec/app/models/fruits.rb +3 -0
  411. data/spec/app/models/game.rb +3 -0
  412. data/spec/app/models/ghost.rb +3 -0
  413. data/spec/app/models/home.rb +3 -0
  414. data/spec/app/models/house.rb +3 -0
  415. data/spec/app/models/html_writer.rb +3 -0
  416. data/spec/app/models/id_key.rb +3 -0
  417. data/spec/app/models/image.rb +3 -0
  418. data/spec/app/models/implant.rb +3 -0
  419. data/spec/app/models/item.rb +3 -0
  420. data/spec/app/models/jar.rb +3 -0
  421. data/spec/app/models/kaleidoscope.rb +3 -0
  422. data/spec/app/models/kangaroo.rb +4 -1
  423. data/spec/app/models/label.rb +3 -0
  424. data/spec/app/models/language.rb +3 -0
  425. data/spec/app/models/lat_lng.rb +3 -0
  426. data/spec/app/models/league.rb +3 -0
  427. data/spec/app/models/learner.rb +3 -0
  428. data/spec/app/models/line_item.rb +3 -0
  429. data/spec/app/models/location.rb +3 -0
  430. data/spec/app/models/login.rb +3 -0
  431. data/spec/app/models/manufacturer.rb +3 -0
  432. data/spec/app/models/meat.rb +3 -0
  433. data/spec/app/models/membership.rb +3 -0
  434. data/spec/app/models/message.rb +4 -1
  435. data/spec/app/models/minim.rb +7 -0
  436. data/spec/app/models/mixed_drink.rb +3 -0
  437. data/spec/app/models/movie.rb +3 -0
  438. data/spec/app/models/my_hash.rb +3 -0
  439. data/spec/app/models/name.rb +3 -0
  440. data/spec/app/models/name_only.rb +9 -0
  441. data/spec/app/models/node.rb +3 -0
  442. data/spec/app/models/note.rb +3 -0
  443. data/spec/app/models/odd.rb +3 -0
  444. data/spec/app/models/ordered_post.rb +3 -0
  445. data/spec/app/models/ordered_preference.rb +3 -0
  446. data/spec/app/models/oscar.rb +3 -0
  447. data/spec/app/models/other_owner_object.rb +5 -0
  448. data/spec/app/models/override.rb +3 -0
  449. data/spec/app/models/ownable.rb +3 -0
  450. data/spec/app/models/owner.rb +3 -0
  451. data/spec/app/models/pack.rb +3 -0
  452. data/spec/app/models/page.rb +3 -0
  453. data/spec/app/models/page_question.rb +3 -0
  454. data/spec/app/models/palette.rb +3 -0
  455. data/spec/app/models/parent.rb +3 -0
  456. data/spec/app/models/parent_doc.rb +3 -0
  457. data/spec/app/models/passport.rb +4 -0
  458. data/spec/app/models/patient.rb +3 -0
  459. data/spec/app/models/pdf_writer.rb +3 -0
  460. data/spec/app/models/pencil.rb +3 -0
  461. data/spec/app/models/person.rb +10 -2
  462. data/spec/app/models/pet.rb +3 -0
  463. data/spec/app/models/pet_owner.rb +3 -0
  464. data/spec/app/models/phone.rb +4 -0
  465. data/spec/app/models/pizza.rb +3 -0
  466. data/spec/app/models/player.rb +3 -0
  467. data/spec/app/models/post.rb +3 -0
  468. data/spec/app/models/post_genre.rb +3 -0
  469. data/spec/app/models/powerup.rb +3 -0
  470. data/spec/app/models/preference.rb +3 -0
  471. data/spec/app/models/princess.rb +3 -0
  472. data/spec/app/models/product.rb +3 -0
  473. data/spec/app/models/profile.rb +3 -0
  474. data/spec/app/models/pronunciation.rb +3 -0
  475. data/spec/app/models/pub.rb +3 -0
  476. data/spec/app/models/publication/encyclopedia.rb +12 -0
  477. data/spec/app/models/publication/review.rb +14 -0
  478. data/spec/app/models/publication.rb +5 -0
  479. data/spec/app/models/purchase.rb +3 -0
  480. data/spec/app/models/question.rb +3 -0
  481. data/spec/app/models/quiz.rb +3 -0
  482. data/spec/app/models/rating.rb +3 -0
  483. data/spec/app/models/record.rb +3 -0
  484. data/spec/app/models/registry.rb +3 -0
  485. data/spec/app/models/role.rb +3 -0
  486. data/spec/app/models/root_category.rb +3 -0
  487. data/spec/app/models/sandwich.rb +3 -0
  488. data/spec/app/models/scheduler.rb +3 -0
  489. data/spec/app/models/seo.rb +3 -0
  490. data/spec/app/models/series.rb +4 -0
  491. data/spec/app/models/server.rb +3 -0
  492. data/spec/app/models/service.rb +3 -0
  493. data/spec/app/models/shape.rb +3 -0
  494. data/spec/app/models/shelf.rb +3 -0
  495. data/spec/app/models/shipment_address.rb +4 -0
  496. data/spec/app/models/shipping_container.rb +3 -0
  497. data/spec/app/models/shipping_pack.rb +3 -0
  498. data/spec/app/models/shop.rb +3 -0
  499. data/spec/app/models/short_agent.rb +3 -0
  500. data/spec/app/models/short_quiz.rb +3 -0
  501. data/spec/app/models/simple.rb +3 -0
  502. data/spec/app/models/slave.rb +3 -0
  503. data/spec/app/models/song.rb +3 -0
  504. data/spec/app/models/sound.rb +3 -0
  505. data/spec/app/models/square.rb +3 -0
  506. data/spec/app/models/staff.rb +3 -0
  507. data/spec/app/models/store_as_dup_test1.rb +3 -0
  508. data/spec/app/models/store_as_dup_test2.rb +3 -0
  509. data/spec/app/models/store_as_dup_test3.rb +8 -0
  510. data/spec/app/models/store_as_dup_test4.rb +8 -0
  511. data/spec/app/models/strategy.rb +3 -0
  512. data/spec/app/models/sub_item.rb +3 -0
  513. data/spec/app/models/subscription.rb +3 -0
  514. data/spec/app/models/survey.rb +3 -0
  515. data/spec/app/models/symptom.rb +3 -0
  516. data/spec/app/models/tag.rb +3 -0
  517. data/spec/app/models/target.rb +3 -0
  518. data/spec/app/models/template.rb +3 -0
  519. data/spec/app/models/thing.rb +3 -0
  520. data/spec/app/models/title.rb +3 -0
  521. data/spec/app/models/tool.rb +3 -0
  522. data/spec/app/models/topping.rb +3 -0
  523. data/spec/app/models/track.rb +3 -0
  524. data/spec/app/models/translation.rb +3 -0
  525. data/spec/app/models/tree.rb +3 -0
  526. data/spec/app/models/truck.rb +3 -0
  527. data/spec/app/models/updatable.rb +8 -0
  528. data/spec/app/models/user.rb +3 -0
  529. data/spec/app/models/user_account.rb +3 -0
  530. data/spec/app/models/validation_callback.rb +3 -0
  531. data/spec/app/models/vehicle.rb +3 -0
  532. data/spec/app/models/version.rb +3 -0
  533. data/spec/app/models/vertex.rb +9 -0
  534. data/spec/app/models/vet_visit.rb +3 -0
  535. data/spec/app/models/video.rb +3 -0
  536. data/spec/app/models/video_game.rb +3 -0
  537. data/spec/app/models/weapon.rb +3 -0
  538. data/spec/app/models/wiki_page.rb +5 -1
  539. data/spec/app/models/word.rb +3 -0
  540. data/spec/app/models/word_origin.rb +3 -0
  541. data/spec/app/models/writer.rb +3 -0
  542. data/spec/config/mongoid.yml +14 -3
  543. data/spec/integration/app_spec.rb +287 -0
  544. data/spec/integration/associations/belongs_to_spec.rb +16 -0
  545. data/spec/integration/associations/embedded_spec.rb +175 -0
  546. data/spec/integration/associations/embeds_many_spec.rb +24 -0
  547. data/spec/integration/associations/embeds_one_spec.rb +24 -0
  548. data/spec/integration/associations/foreign_key_spec.rb +99 -0
  549. data/spec/integration/associations/foreign_key_spec_models.rb +65 -0
  550. data/spec/integration/associations/has_many_spec.rb +76 -0
  551. data/spec/integration/associations/has_one_spec.rb +76 -0
  552. data/spec/integration/associations/reverse_population_spec.rb +35 -0
  553. data/spec/integration/associations/reverse_population_spec_models.rb +37 -0
  554. data/spec/integration/bson_regexp_raw_spec.rb +20 -0
  555. data/spec/integration/callbacks_models.rb +49 -0
  556. data/spec/integration/callbacks_spec.rb +216 -0
  557. data/spec/integration/criteria/date_field_spec.rb +41 -0
  558. data/spec/integration/criteria/default_scope_spec.rb +21 -0
  559. data/spec/integration/criteria/logical_spec.rb +94 -0
  560. data/spec/integration/criteria/time_with_zone_spec.rb +32 -0
  561. data/spec/integration/document_spec.rb +22 -0
  562. data/spec/integration/i18n_fallbacks_spec.rb +90 -0
  563. data/spec/integration/matchable_spec.rb +680 -0
  564. data/spec/integration/shardable_spec.rb +149 -0
  565. data/spec/lite_spec_helper.rb +75 -0
  566. data/spec/mongoid/{relations → association}/accessors_spec.rb +281 -64
  567. data/spec/mongoid/{relations → association}/auto_save_spec.rb +63 -12
  568. data/spec/mongoid/{relations → association}/builders_spec.rb +4 -1
  569. data/spec/mongoid/association/constrainable_spec.rb +118 -0
  570. data/spec/mongoid/{relations → association}/counter_cache_spec.rb +4 -1
  571. data/spec/mongoid/association/depending_spec.rb +869 -0
  572. data/spec/mongoid/{relations → association}/eager_spec.rb +15 -12
  573. data/spec/mongoid/{relations → association/embedded}/cyclic_spec.rb +4 -1
  574. data/spec/mongoid/{relations → association}/embedded/dirty_spec.rb +3 -0
  575. data/spec/mongoid/{relations/bindings/embedded/in_spec.rb → association/embedded/embedded_in/binding_spec.rb} +16 -13
  576. data/spec/mongoid/association/embedded/embedded_in/buildable_spec.rb +37 -0
  577. data/spec/mongoid/{relations/embedded/in_spec.rb → association/embedded/embedded_in/proxy_spec.rb} +58 -77
  578. data/spec/mongoid/association/embedded/embedded_in_spec.rb +904 -0
  579. data/spec/mongoid/{relations/bindings/embedded/many_spec.rb → association/embedded/embeds_many/binding_spec.rb} +6 -3
  580. data/spec/mongoid/{relations/builders/embedded/many_spec.rb → association/embedded/embeds_many/buildable_spec.rb} +20 -45
  581. data/spec/mongoid/{relations/embedded/many_spec.rb → association/embedded/embeds_many/proxy_spec.rb} +127 -182
  582. data/spec/mongoid/association/embedded/embeds_many_models.rb +53 -0
  583. data/spec/mongoid/association/embedded/embeds_many_query_spec.rb +52 -0
  584. data/spec/mongoid/association/embedded/embeds_many_spec.rb +865 -0
  585. data/spec/mongoid/{relations/bindings/embedded/one_spec.rb → association/embedded/embeds_one/binding_spec.rb} +7 -4
  586. data/spec/mongoid/{relations/builders/embedded/one_spec.rb → association/embedded/embeds_one/buildable_spec.rb} +17 -34
  587. data/spec/mongoid/{relations/embedded/one_spec.rb → association/embedded/embeds_one/proxy_spec.rb} +42 -84
  588. data/spec/mongoid/association/embedded/embeds_one_dnl_models.rb +9 -0
  589. data/spec/mongoid/association/embedded/embeds_one_models.rb +54 -0
  590. data/spec/mongoid/association/embedded/embeds_one_query_spec.rb +29 -0
  591. data/spec/mongoid/association/embedded/embeds_one_spec.rb +957 -0
  592. data/spec/mongoid/{relations → association}/macros_spec.rb +151 -73
  593. data/spec/mongoid/{relations/builders/nested_attributes → association/nested}/many_spec.rb +19 -19
  594. data/spec/mongoid/{relations/builders/nested_attributes → association/nested}/one_spec.rb +20 -20
  595. data/spec/mongoid/association/options_spec.rb +1324 -0
  596. data/spec/mongoid/{relations → association}/polymorphic_spec.rb +69 -34
  597. data/spec/mongoid/{relations/bindings/referenced/in_spec.rb → association/referenced/belongs_to/binding_spec.rb} +10 -7
  598. data/spec/mongoid/{relations/builders/referenced/in_spec.rb → association/referenced/belongs_to/buildable_spec.rb} +49 -79
  599. data/spec/mongoid/association/referenced/belongs_to/eager_spec.rb +377 -0
  600. data/spec/mongoid/{relations/referenced/in_spec.rb → association/referenced/belongs_to/proxy_spec.rb} +60 -91
  601. data/spec/mongoid/association/referenced/belongs_to_query_spec.rb +38 -0
  602. data/spec/mongoid/association/referenced/belongs_to_spec.rb +2026 -0
  603. data/spec/mongoid/{relations/bindings/referenced/many_to_many_spec.rb → association/referenced/has_and_belongs_to_many/binding_spec.rb} +8 -5
  604. data/spec/mongoid/association/referenced/has_and_belongs_to_many/buildable_spec.rb +124 -0
  605. data/spec/mongoid/{relations/eager/has_and_belongs_to_many_spec.rb → association/referenced/has_and_belongs_to_many/eager_spec.rb} +42 -7
  606. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_persistence_spec.rb +77 -0
  607. data/spec/mongoid/{relations/referenced/many_to_many_spec.rb → association/referenced/has_and_belongs_to_many/proxy_spec.rb} +283 -112
  608. data/spec/mongoid/association/referenced/has_and_belongs_to_many_models.rb +50 -0
  609. data/spec/mongoid/association/referenced/has_and_belongs_to_many_query_spec.rb +40 -0
  610. data/spec/mongoid/association/referenced/has_and_belongs_to_many_spec.rb +1051 -0
  611. data/spec/mongoid/{relations/bindings/referenced/many_spec.rb → association/referenced/has_many/binding_spec.rb} +8 -5
  612. data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +122 -0
  613. data/spec/mongoid/{relations/eager/has_many_spec.rb → association/referenced/has_many/eager_spec.rb} +43 -13
  614. data/spec/mongoid/{relations/targets → association/referenced/has_many}/enumerable_spec.rb +230 -1
  615. data/spec/mongoid/association/referenced/has_many/proxy_query_spec.rb +24 -0
  616. data/spec/mongoid/{relations/referenced/many_spec.rb → association/referenced/has_many/proxy_spec.rb} +33 -94
  617. data/spec/mongoid/association/referenced/has_many_models.rb +40 -0
  618. data/spec/mongoid/association/referenced/has_many_query_spec.rb +38 -0
  619. data/spec/mongoid/association/referenced/has_many_spec.rb +1228 -0
  620. data/spec/mongoid/{relations/bindings/referenced/one_spec.rb → association/referenced/has_one/binding_spec.rb} +7 -4
  621. data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +116 -0
  622. data/spec/mongoid/{relations/eager/has_one_spec.rb → association/referenced/has_one/eager_spec.rb} +27 -12
  623. data/spec/mongoid/{relations/referenced/one_spec.rb → association/referenced/has_one/proxy_spec.rb} +12 -109
  624. data/spec/mongoid/association/referenced/has_one_models.rb +51 -0
  625. data/spec/mongoid/association/referenced/has_one_query_spec.rb +38 -0
  626. data/spec/mongoid/association/referenced/has_one_spec.rb +1363 -0
  627. data/spec/mongoid/{relations → association}/reflections_spec.rb +4 -12
  628. data/spec/mongoid/{relations/synchronization_spec.rb → association/syncable_spec.rb} +7 -2
  629. data/spec/mongoid/{relations_spec.rb → association_spec.rb} +4 -1
  630. data/spec/mongoid/atomic/modifiers_spec.rb +5 -2
  631. data/spec/mongoid/atomic/paths/embedded/many_spec.rb +3 -0
  632. data/spec/mongoid/atomic/paths/embedded/one_spec.rb +3 -0
  633. data/spec/mongoid/atomic/paths/root_spec.rb +3 -0
  634. data/spec/mongoid/atomic/paths_spec.rb +44 -0
  635. data/spec/mongoid/atomic_spec.rb +7 -4
  636. data/spec/mongoid/attributes/dynamic_spec.rb +153 -0
  637. data/spec/mongoid/attributes/nested_spec.rb +32 -11
  638. data/spec/mongoid/attributes/readonly_spec.rb +83 -125
  639. data/spec/mongoid/attributes_spec.rb +60 -9
  640. data/spec/mongoid/cacheable_spec.rb +3 -0
  641. data/spec/mongoid/changeable_spec.rb +26 -0
  642. data/spec/mongoid/clients/factory_spec.rb +57 -33
  643. data/spec/mongoid/clients/options_spec.rb +81 -56
  644. data/spec/mongoid/clients/sessions_spec.rb +24 -8
  645. data/spec/mongoid/clients/transactions_spec.rb +393 -0
  646. data/spec/mongoid/clients_spec.rb +73 -10
  647. data/spec/mongoid/composable_spec.rb +3 -0
  648. data/spec/mongoid/config/environment_spec.rb +3 -0
  649. data/spec/mongoid/config/options_spec.rb +23 -3
  650. data/spec/mongoid/config_spec.rb +66 -1
  651. data/spec/mongoid/contextual/aggregable/memory_spec.rb +3 -0
  652. data/spec/mongoid/contextual/aggregable/mongo_spec.rb +3 -0
  653. data/spec/mongoid/contextual/atomic_spec.rb +120 -10
  654. data/spec/mongoid/contextual/geo_near_spec.rb +15 -2
  655. data/spec/mongoid/contextual/map_reduce_spec.rb +23 -5
  656. data/spec/mongoid/contextual/memory_spec.rb +22 -0
  657. data/spec/mongoid/contextual/mongo_spec.rb +113 -57
  658. data/spec/mongoid/contextual/none_spec.rb +3 -0
  659. data/spec/mongoid/copyable_spec.rb +93 -6
  660. data/spec/mongoid/copyable_spec_models.rb +20 -0
  661. data/spec/mongoid/criteria/findable_spec.rb +58 -0
  662. data/spec/mongoid/criteria/inspectable_spec.rb +3 -0
  663. data/spec/mongoid/criteria/marshalable_spec.rb +3 -0
  664. data/spec/mongoid/criteria/modifiable_spec.rb +180 -4
  665. data/spec/mongoid/criteria/options_spec.rb +3 -0
  666. data/spec/mongoid/criteria/queryable/aggregable_spec.rb +3 -0
  667. data/spec/mongoid/criteria/queryable/expandable_spec.rb +135 -0
  668. data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +3 -0
  669. data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +3 -0
  670. data/spec/mongoid/criteria/queryable/extensions/bignum_spec.rb +3 -0
  671. data/spec/mongoid/criteria/queryable/extensions/boolean_spec.rb +3 -0
  672. data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +3 -0
  673. data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +36 -17
  674. data/spec/mongoid/criteria/queryable/extensions/fixnum_spec.rb +3 -0
  675. data/spec/mongoid/criteria/queryable/extensions/float_spec.rb +3 -0
  676. data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +3 -0
  677. data/spec/mongoid/criteria/queryable/extensions/integer_spec.rb +3 -0
  678. data/spec/mongoid/criteria/queryable/extensions/nil_class_spec.rb +3 -0
  679. data/spec/mongoid/criteria/queryable/extensions/numeric_spec.rb +54 -0
  680. data/spec/mongoid/criteria/queryable/extensions/object_spec.rb +3 -0
  681. data/spec/mongoid/criteria/queryable/extensions/range_spec.rb +3 -0
  682. data/spec/mongoid/criteria/queryable/extensions/regexp_raw_spec.rb +4 -1
  683. data/spec/mongoid/criteria/queryable/extensions/regexp_spec.rb +10 -7
  684. data/spec/mongoid/criteria/queryable/extensions/set_spec.rb +3 -0
  685. data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +47 -1
  686. data/spec/mongoid/criteria/queryable/extensions/symbol_spec.rb +3 -0
  687. data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +43 -23
  688. data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +31 -1
  689. data/spec/mongoid/criteria/queryable/key_spec.rb +51 -6
  690. data/spec/mongoid/criteria/queryable/mergeable_spec.rb +48 -12
  691. data/spec/mongoid/criteria/queryable/optional_spec.rb +3 -0
  692. data/spec/mongoid/criteria/queryable/options_spec.rb +3 -0
  693. data/spec/mongoid/criteria/queryable/pipeline_spec.rb +15 -0
  694. data/spec/mongoid/criteria/queryable/queryable_spec.rb +3 -0
  695. data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +1865 -0
  696. data/spec/mongoid/criteria/queryable/selectable_spec.rb +1007 -2389
  697. data/spec/mongoid/criteria/queryable/selector_spec.rb +40 -0
  698. data/spec/mongoid/criteria/queryable/smash_spec.rb +3 -0
  699. data/spec/mongoid/criteria/queryable/storable_spec.rb +190 -0
  700. data/spec/mongoid/criteria/scopable_spec.rb +3 -0
  701. data/spec/mongoid/criteria_spec.rb +108 -19
  702. data/spec/mongoid/document_fields_spec.rb +88 -0
  703. data/spec/mongoid/document_persistence_context_spec.rb +33 -0
  704. data/spec/mongoid/document_query_spec.rb +39 -0
  705. data/spec/mongoid/document_spec.rb +32 -4
  706. data/spec/mongoid/equality_spec.rb +3 -0
  707. data/spec/mongoid/errors/ambiguous_relationship_spec.rb +6 -3
  708. data/spec/mongoid/errors/callback_spec.rb +3 -0
  709. data/spec/mongoid/errors/delete_restriction_spec.rb +3 -0
  710. data/spec/mongoid/errors/document_not_destroyed_spec.rb +3 -0
  711. data/spec/mongoid/errors/document_not_found_spec.rb +3 -0
  712. data/spec/mongoid/errors/eager_load_spec.rb +3 -0
  713. data/spec/mongoid/errors/invalid_collection_spec.rb +3 -0
  714. data/spec/mongoid/errors/invalid_config_option_spec.rb +3 -0
  715. data/spec/mongoid/errors/invalid_field_option_spec.rb +3 -0
  716. data/spec/mongoid/errors/invalid_field_spec.rb +3 -0
  717. data/spec/mongoid/errors/invalid_find_spec.rb +3 -0
  718. data/spec/mongoid/errors/invalid_includes_spec.rb +3 -0
  719. data/spec/mongoid/errors/invalid_index_spec.rb +3 -0
  720. data/spec/mongoid/errors/invalid_options_spec.rb +5 -2
  721. data/spec/mongoid/errors/invalid_path_spec.rb +3 -0
  722. data/spec/mongoid/errors/invalid_relation_spec.rb +5 -2
  723. data/spec/mongoid/errors/invalid_scope_spec.rb +3 -0
  724. data/spec/mongoid/errors/invalid_set_polymorphic_relation_spec.rb +3 -0
  725. data/spec/mongoid/errors/invalid_storage_options_spec.rb +3 -0
  726. data/spec/mongoid/errors/invalid_time_spec.rb +3 -0
  727. data/spec/mongoid/errors/inverse_not_found_spec.rb +4 -1
  728. data/spec/mongoid/errors/mixed_client_configuration_spec.rb +3 -0
  729. data/spec/mongoid/errors/mixed_relations_spec.rb +3 -0
  730. data/spec/mongoid/errors/mongoid_error_spec.rb +3 -0
  731. data/spec/mongoid/errors/nested_attributes_metadata_not_found_spec.rb +6 -3
  732. data/spec/mongoid/errors/no_client_config_spec.rb +5 -2
  733. data/spec/mongoid/errors/no_client_database_spec.rb +6 -3
  734. data/spec/mongoid/errors/no_client_hosts_spec.rb +6 -3
  735. data/spec/mongoid/errors/no_clients_config_spec.rb +3 -0
  736. data/spec/mongoid/errors/no_environment_spec.rb +3 -0
  737. data/spec/mongoid/errors/no_map_reduce_output_spec.rb +3 -0
  738. data/spec/mongoid/errors/no_metadata_spec.rb +5 -2
  739. data/spec/mongoid/errors/no_parent_spec.rb +4 -1
  740. data/spec/mongoid/errors/readonly_attribute_spec.rb +3 -0
  741. data/spec/mongoid/errors/readonly_document_spec.rb +3 -0
  742. data/spec/mongoid/errors/scope_overwrite_spec.rb +3 -0
  743. data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +3 -0
  744. data/spec/mongoid/errors/unknown_attribute_spec.rb +3 -0
  745. data/spec/mongoid/errors/unsaved_document_spec.rb +4 -1
  746. data/spec/mongoid/errors/unsupported_javascript_spec.rb +3 -0
  747. data/spec/mongoid/errors/validations_spec.rb +3 -0
  748. data/spec/mongoid/extensions/array_spec.rb +37 -58
  749. data/spec/mongoid/extensions/big_decimal_spec.rb +3 -0
  750. data/spec/mongoid/extensions/binary_spec.rb +3 -0
  751. data/spec/mongoid/extensions/boolean_spec.rb +3 -0
  752. data/spec/mongoid/extensions/date_class_mongoize_spec.rb +336 -0
  753. data/spec/mongoid/extensions/date_spec.rb +9 -160
  754. data/spec/mongoid/extensions/date_time_spec.rb +18 -60
  755. data/spec/mongoid/extensions/decimal128_spec.rb +3 -0
  756. data/spec/mongoid/extensions/false_class_spec.rb +3 -0
  757. data/spec/mongoid/extensions/float_spec.rb +18 -3
  758. data/spec/mongoid/extensions/hash_spec.rb +124 -1
  759. data/spec/mongoid/extensions/integer_spec.rb +15 -2
  760. data/spec/mongoid/extensions/module_spec.rb +3 -0
  761. data/spec/mongoid/extensions/nil_class_spec.rb +3 -0
  762. data/spec/mongoid/extensions/object_id_spec.rb +3 -0
  763. data/spec/mongoid/extensions/object_spec.rb +21 -35
  764. data/spec/mongoid/extensions/range_spec.rb +10 -0
  765. data/spec/mongoid/extensions/regexp_spec.rb +3 -0
  766. data/spec/mongoid/extensions/set_spec.rb +3 -0
  767. data/spec/mongoid/extensions/string_spec.rb +95 -33
  768. data/spec/mongoid/extensions/symbol_spec.rb +3 -0
  769. data/spec/mongoid/extensions/time_spec.rb +30 -0
  770. data/spec/mongoid/extensions/time_with_zone_spec.rb +34 -0
  771. data/spec/mongoid/extensions/true_class_spec.rb +3 -0
  772. data/spec/mongoid/extensions_spec.rb +3 -0
  773. data/spec/mongoid/factory_spec.rb +46 -1
  774. data/spec/mongoid/fields/foreign_key_spec.rb +27 -32
  775. data/spec/mongoid/fields/localized_spec.rb +3 -0
  776. data/spec/mongoid/fields/standard_spec.rb +3 -0
  777. data/spec/mongoid/fields_spec.rb +42 -1
  778. data/spec/mongoid/findable_spec.rb +4 -1
  779. data/spec/mongoid/indexable/specification_spec.rb +3 -0
  780. data/spec/mongoid/indexable_spec.rb +27 -12
  781. data/spec/mongoid/inspectable_spec.rb +3 -0
  782. data/spec/mongoid/interceptable_spec.rb +87 -1
  783. data/spec/mongoid/interceptable_spec_models.rb +76 -0
  784. data/spec/mongoid/loggable_spec.rb +3 -0
  785. data/spec/mongoid/matchable/all_spec.rb +3 -0
  786. data/spec/mongoid/matchable/and_spec.rb +3 -0
  787. data/spec/mongoid/matchable/default_spec.rb +13 -3
  788. data/spec/mongoid/matchable/elem_match_spec.rb +23 -0
  789. data/spec/mongoid/matchable/eq_spec.rb +49 -0
  790. data/spec/mongoid/matchable/exists_spec.rb +3 -0
  791. data/spec/mongoid/matchable/gt_spec.rb +3 -0
  792. data/spec/mongoid/matchable/gte_spec.rb +3 -0
  793. data/spec/mongoid/matchable/in_spec.rb +3 -0
  794. data/spec/mongoid/matchable/lt_spec.rb +3 -0
  795. data/spec/mongoid/matchable/lte_spec.rb +3 -0
  796. data/spec/mongoid/matchable/ne_spec.rb +3 -0
  797. data/spec/mongoid/matchable/nin_spec.rb +3 -0
  798. data/spec/mongoid/matchable/nor_spec.rb +1 -0
  799. data/spec/mongoid/matchable/or_spec.rb +3 -0
  800. data/spec/mongoid/matchable/regexp_spec.rb +5 -2
  801. data/spec/mongoid/matchable/size_spec.rb +3 -0
  802. data/spec/mongoid/matchable_spec.rb +5 -2
  803. data/spec/mongoid/persistable/creatable_spec.rb +3 -0
  804. data/spec/mongoid/persistable/deletable_spec.rb +3 -0
  805. data/spec/mongoid/persistable/destroyable_spec.rb +3 -0
  806. data/spec/mongoid/persistable/incrementable_spec.rb +17 -0
  807. data/spec/mongoid/persistable/logical_spec.rb +17 -0
  808. data/spec/mongoid/persistable/poppable_spec.rb +17 -0
  809. data/spec/mongoid/persistable/pullable_spec.rb +31 -0
  810. data/spec/mongoid/persistable/pushable_spec.rb +86 -1
  811. data/spec/mongoid/persistable/renamable_spec.rb +17 -0
  812. data/spec/mongoid/persistable/savable_spec.rb +5 -2
  813. data/spec/mongoid/persistable/settable_spec.rb +112 -10
  814. data/spec/mongoid/persistable/unsettable_spec.rb +17 -0
  815. data/spec/mongoid/persistable/updatable_spec.rb +3 -0
  816. data/spec/mongoid/persistable/upsertable_spec.rb +3 -0
  817. data/spec/mongoid/persistable_spec.rb +106 -14
  818. data/spec/mongoid/persistence_context_spec.rb +4 -1
  819. data/spec/mongoid/positional_spec.rb +3 -0
  820. data/spec/mongoid/query_cache_middleware_spec.rb +48 -0
  821. data/spec/mongoid/query_cache_spec.rb +131 -65
  822. data/spec/mongoid/relations/proxy_spec.rb +127 -124
  823. data/spec/mongoid/reloadable_spec.rb +3 -0
  824. data/spec/mongoid/scopable_spec.rb +5 -1
  825. data/spec/mongoid/selectable_spec.rb +3 -0
  826. data/spec/mongoid/serializable_spec.rb +132 -18
  827. data/spec/mongoid/shardable_models.rb +61 -0
  828. data/spec/mongoid/shardable_spec.rb +104 -28
  829. data/spec/mongoid/stateful_spec.rb +3 -0
  830. data/spec/mongoid/tasks/database_rake_spec.rb +16 -13
  831. data/spec/mongoid/tasks/database_spec.rb +4 -1
  832. data/spec/mongoid/threaded_spec.rb +3 -0
  833. data/spec/mongoid/timestamps/created/short_spec.rb +3 -0
  834. data/spec/mongoid/timestamps/created_spec.rb +3 -0
  835. data/spec/mongoid/timestamps/timeless_spec.rb +3 -0
  836. data/spec/mongoid/timestamps/updated/short_spec.rb +3 -0
  837. data/spec/mongoid/timestamps/updated_spec.rb +3 -0
  838. data/spec/mongoid/timestamps_spec.rb +3 -0
  839. data/spec/mongoid/{relations/touchable_spec.rb → touchable_spec.rb} +89 -4
  840. data/spec/mongoid/traversable_spec.rb +3 -0
  841. data/spec/mongoid/validatable/associated_spec.rb +4 -1
  842. data/spec/mongoid/validatable/format_spec.rb +3 -0
  843. data/spec/mongoid/validatable/length_spec.rb +3 -0
  844. data/spec/mongoid/validatable/numericality_spec.rb +3 -0
  845. data/spec/mongoid/validatable/presence_spec.rb +10 -6
  846. data/spec/mongoid/validatable/uniqueness_spec.rb +36 -6
  847. data/spec/mongoid/validatable_spec.rb +4 -1
  848. data/spec/mongoid_spec.rb +3 -0
  849. data/spec/rails/controller_extension/controller_runtime_spec.rb +4 -1
  850. data/spec/rails/mongoid_spec.rb +5 -2
  851. data/spec/shared/LICENSE +20 -0
  852. data/spec/shared/lib/mrss/child_process_helper.rb +80 -0
  853. data/spec/shared/lib/mrss/cluster_config.rb +211 -0
  854. data/spec/shared/lib/mrss/constraints.rb +330 -0
  855. data/spec/shared/lib/mrss/docker_runner.rb +262 -0
  856. data/spec/shared/lib/mrss/lite_constraints.rb +175 -0
  857. data/spec/shared/lib/mrss/server_version_registry.rb +69 -0
  858. data/spec/shared/lib/mrss/spec_organizer.rb +149 -0
  859. data/spec/shared/share/Dockerfile.erb +229 -0
  860. data/spec/shared/shlib/distro.sh +73 -0
  861. data/spec/shared/shlib/server.sh +270 -0
  862. data/spec/shared/shlib/set_env.sh +128 -0
  863. data/spec/spec_helper.rb +56 -55
  864. data/spec/support/authorization.rb +3 -0
  865. data/spec/support/child_process_helper.rb +76 -0
  866. data/spec/support/cluster_config.rb +158 -0
  867. data/spec/support/constraints.rb +256 -0
  868. data/spec/support/expectations.rb +22 -3
  869. data/spec/support/helpers.rb +11 -0
  870. data/spec/support/lite_constraints.rb +22 -0
  871. data/spec/support/macros.rb +21 -0
  872. data/spec/support/session_registry.rb +50 -0
  873. data/spec/support/shared/time.rb +54 -0
  874. data/spec/support/spec_config.rb +50 -0
  875. data.tar.gz.sig +2 -1
  876. metadata +737 -550
  877. metadata.gz.sig +0 -0
  878. data/lib/mongoid/criteria/queryable/forwardable.rb +0 -65
  879. data/lib/mongoid/relations/accessors.rb +0 -267
  880. data/lib/mongoid/relations/auto_save.rb +0 -94
  881. data/lib/mongoid/relations/bindings/embedded/in.rb +0 -59
  882. data/lib/mongoid/relations/bindings/referenced/in.rb +0 -65
  883. data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +0 -70
  884. data/lib/mongoid/relations/bindings.rb +0 -9
  885. data/lib/mongoid/relations/builder.rb +0 -57
  886. data/lib/mongoid/relations/builders/embedded/in.rb +0 -29
  887. data/lib/mongoid/relations/builders/embedded/one.rb +0 -30
  888. data/lib/mongoid/relations/builders/nested_attributes/many.rb +0 -199
  889. data/lib/mongoid/relations/builders/referenced/in.rb +0 -26
  890. data/lib/mongoid/relations/builders/referenced/many.rb +0 -26
  891. data/lib/mongoid/relations/builders/referenced/many_to_many.rb +0 -39
  892. data/lib/mongoid/relations/builders/referenced/one.rb +0 -26
  893. data/lib/mongoid/relations/builders.rb +0 -106
  894. data/lib/mongoid/relations/cascading/delete.rb +0 -44
  895. data/lib/mongoid/relations/cascading/destroy.rb +0 -43
  896. data/lib/mongoid/relations/cascading/nullify.rb +0 -35
  897. data/lib/mongoid/relations/cascading/restrict.rb +0 -39
  898. data/lib/mongoid/relations/cascading.rb +0 -56
  899. data/lib/mongoid/relations/constraint.rb +0 -55
  900. data/lib/mongoid/relations/conversions.rb +0 -34
  901. data/lib/mongoid/relations/counter_cache.rb +0 -160
  902. data/lib/mongoid/relations/cyclic.rb +0 -107
  903. data/lib/mongoid/relations/eager/base.rb +0 -153
  904. data/lib/mongoid/relations/eager/belongs_to.rb +0 -31
  905. data/lib/mongoid/relations/eager/has_and_belongs_to_many.rb +0 -47
  906. data/lib/mongoid/relations/eager/has_many.rb +0 -38
  907. data/lib/mongoid/relations/eager/has_one.rb +0 -30
  908. data/lib/mongoid/relations/embedded/in.rb +0 -241
  909. data/lib/mongoid/relations/embedded/many.rb +0 -683
  910. data/lib/mongoid/relations/embedded/one.rb +0 -235
  911. data/lib/mongoid/relations/macros.rb +0 -367
  912. data/lib/mongoid/relations/metadata.rb +0 -1179
  913. data/lib/mongoid/relations/nested_builder.rb +0 -74
  914. data/lib/mongoid/relations/options.rb +0 -49
  915. data/lib/mongoid/relations/polymorphic.rb +0 -39
  916. data/lib/mongoid/relations/referenced/in.rb +0 -304
  917. data/lib/mongoid/relations/referenced/many.rb +0 -812
  918. data/lib/mongoid/relations/referenced/many_to_many.rb +0 -479
  919. data/lib/mongoid/relations/referenced/one.rb +0 -290
  920. data/lib/mongoid/relations/reflections.rb +0 -64
  921. data/lib/mongoid/relations/synchronization.rb +0 -169
  922. data/lib/mongoid/relations/targets/enumerable.rb +0 -493
  923. data/lib/mongoid/relations/targets.rb +0 -2
  924. data/lib/mongoid/relations/touchable.rb +0 -97
  925. data/lib/mongoid/relations.rb +0 -148
  926. data/spec/mongoid/criteria/queryable/forwardable_spec.rb +0 -87
  927. data/spec/mongoid/fields/internal/foreign_keys/array_spec.rb +0 -184
  928. data/spec/mongoid/fields/internal/foreign_keys/object_spec.rb +0 -201
  929. data/spec/mongoid/relations/builders/embedded/in_spec.rb +0 -34
  930. data/spec/mongoid/relations/builders/referenced/many_spec.rb +0 -137
  931. data/spec/mongoid/relations/builders/referenced/many_to_many_spec.rb +0 -178
  932. data/spec/mongoid/relations/builders/referenced/one_spec.rb +0 -111
  933. data/spec/mongoid/relations/cascading/delete_spec.rb +0 -101
  934. data/spec/mongoid/relations/cascading/destroy_spec.rb +0 -47
  935. data/spec/mongoid/relations/cascading/nullify_spec.rb +0 -32
  936. data/spec/mongoid/relations/cascading/restrict_spec.rb +0 -68
  937. data/spec/mongoid/relations/cascading_spec.rb +0 -355
  938. data/spec/mongoid/relations/constraint_spec.rb +0 -75
  939. data/spec/mongoid/relations/conversions_spec.rb +0 -128
  940. data/spec/mongoid/relations/eager/belongs_to_spec.rb +0 -163
  941. data/spec/mongoid/relations/metadata_spec.rb +0 -1985
  942. data/spec/mongoid/relations/options_spec.rb +0 -35
@@ -0,0 +1,50 @@
1
+ # frozen_string_literal: true
2
+ # encoding: utf-8
3
+
4
+ class HabtmmCompany
5
+ include Mongoid::Document
6
+
7
+ field :c_id, type: Integer
8
+ field :e_ids, type: Array
9
+ has_and_belongs_to_many :employees, class_name: 'HabtmmEmployee',
10
+ primary_key: :e_id, foreign_key: :e_ids,
11
+ inverse_primary_key: :c_id, inverse_foreign_key: :c_ids
12
+ end
13
+
14
+ class HabtmmEmployee
15
+ include Mongoid::Document
16
+
17
+ field :e_id, type: Integer
18
+ field :c_ids, type: Array
19
+ field :habtmm_company_ids, type: Array
20
+ has_and_belongs_to_many :companies, class_name: 'HabtmmCompany',
21
+ primary_key: :c_id, foreign_key: :c_ids,
22
+ inverse_primary_key: :e_id, inverse_foreign_key: :e_ids
23
+ end
24
+
25
+ class HabtmmContract
26
+ include Mongoid::Document
27
+
28
+ has_and_belongs_to_many :signatures, class_name: 'HabtmmSignature'
29
+
30
+ field :item, type: String
31
+ end
32
+
33
+ class HabtmmSignature
34
+ include Mongoid::Document
35
+
36
+ has_and_belongs_to_many :contracts, class_name: 'HabtmmContract'
37
+
38
+ field :name, type: String
39
+ field :year, type: Integer
40
+ end
41
+
42
+ class HabtmmTicket
43
+ include Mongoid::Document
44
+ end
45
+
46
+ class HabtmmPerson
47
+ include Mongoid::Document
48
+
49
+ has_and_belongs_to_many :tickets, class_name: 'HabtmmTicket'
50
+ end
@@ -0,0 +1,40 @@
1
+ # frozen_string_literal: true
2
+ # encoding: utf-8
3
+
4
+ require "spec_helper"
5
+ require_relative './has_and_belongs_to_many_models'
6
+
7
+ describe Mongoid::Association::Referenced::HasAndBelongsToMany do
8
+ context 'when projecting with #only' do
9
+ before do
10
+ contract = HabtmmContract.create!(item: 'foo')
11
+ contract.signatures << HabtmmSignature.create!(contracts: [contract], name: 'Dave', year: 2019)
12
+ contract.save!
13
+ end
14
+
15
+ let(:contract) do
16
+ HabtmmContract.where(item: 'foo').only(:signature_ids,
17
+ 'signatures._id', 'signatures.name').first
18
+ end
19
+
20
+ let(:signature) { contract.signatures.first }
21
+
22
+ it 'populates specified fields only' do
23
+ pending 'https://jira.mongodb.org/browse/MONGOID-4704'
24
+
25
+ expect(signature.name).to eq('Dave')
26
+ # has a default value specified in the model
27
+ expect do
28
+ signature.year
29
+ end.to raise_error(ActiveModel::MissingAttributeError)
30
+ expect(signature.attributes.keys).to eq(['_id', 'name'])
31
+ end
32
+
33
+ # Delete this test when https://jira.mongodb.org/browse/MONGOID-4704 is
34
+ # implemented and above test is unpended
35
+ it 'fetches all fields' do
36
+ expect(signature.name).to eq('Dave')
37
+ expect(signature.year).to eq(2019)
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,1051 @@
1
+ # frozen_string_literal: true
2
+ # encoding: utf-8
3
+
4
+ require "spec_helper"
5
+
6
+ describe Mongoid::Association::Referenced::HasAndBelongsToMany do
7
+
8
+ before do
9
+ class HasManyLeftObject; include Mongoid::Document; end
10
+ class HasManyRightObject; include Mongoid::Document; end
11
+ end
12
+
13
+ after do
14
+ Object.send(:remove_const, :HasManyLeftObject)
15
+ Object.send(:remove_const, :HasManyRightObject)
16
+ end
17
+
18
+ let(:has_many_left_class) do
19
+ HasManyLeftObject
20
+ end
21
+
22
+ let(:name) do
23
+ :has_many_right_objects
24
+ end
25
+
26
+ let(:association) do
27
+ has_many_left_class.has_and_belongs_to_many name, options
28
+ end
29
+
30
+ let(:options) do
31
+ { }
32
+ end
33
+
34
+ describe '#relation_complements' do
35
+
36
+ let(:expected_complements) do
37
+ [
38
+ Mongoid::Association::Referenced::HasAndBelongsToMany,
39
+ ]
40
+ end
41
+
42
+ it 'returns the relation complements' do
43
+ expect(association.relation_complements).to eq(expected_complements)
44
+ end
45
+ end
46
+
47
+ describe '#setup!' do
48
+
49
+ it 'sets up a getter for the relation' do
50
+ expect(Mongoid::Association::Accessors).to receive(:define_getter!).with(association)
51
+ association.setup!
52
+ end
53
+
54
+ it 'sets up a setter for the relation' do
55
+ expect(Mongoid::Association::Accessors).to receive(:define_setter!).with(association)
56
+ association.setup!
57
+ end
58
+
59
+ it 'sets up an existence check for the relation' do
60
+ expect(Mongoid::Association::Accessors).to receive(:define_existence_check!).with(association)
61
+ association.setup!
62
+ end
63
+
64
+ context 'autosave' do
65
+
66
+ context 'when the :autosave option is true' do
67
+
68
+ let(:options) do
69
+ {
70
+ autosave: true
71
+ }
72
+ end
73
+
74
+ let(:association) do
75
+ # Note that it is necessary to create the association directly, otherwise the
76
+ # setup! method will be called by the :has_many macro
77
+ described_class.new(has_many_left_class, name, options)
78
+ end
79
+
80
+ it 'sets up autosave' do
81
+ expect(Mongoid::Association::Referenced::AutoSave).to receive(:define_autosave!).with(association)
82
+ association.setup!
83
+ end
84
+ end
85
+
86
+ context 'when the :autosave option is false' do
87
+
88
+ let(:options) do
89
+ {
90
+ autosave: false
91
+ }
92
+ end
93
+
94
+ it 'does not set up autosave' do
95
+ expect(Mongoid::Association::Referenced::AutoSave).not_to receive(:define_autosave!)
96
+ association.setup!
97
+ end
98
+ end
99
+
100
+ context 'when the :autosave option is not provided' do
101
+
102
+ let(:association) do
103
+ # Note that it is necessary to create the association directly, otherwise the
104
+ # setup! method will be called by the :has_many macro
105
+ described_class.new(has_many_left_class, name, options)
106
+ end
107
+
108
+ it 'does not set up autosave' do
109
+ expect(Mongoid::Association::Referenced::AutoSave).not_to receive(:define_autosave!)
110
+ association.setup!
111
+ end
112
+ end
113
+ end
114
+
115
+ context 'when the :validate option is true' do
116
+
117
+ let(:options) do
118
+ {
119
+ validate: true
120
+ }
121
+ end
122
+
123
+ let(:association) do
124
+ # Note that it is necessary to create the association directly, otherwise the
125
+ # setup! method will be called by the :has_and_belongs_to_many macro
126
+ described_class.new(has_many_left_class, name, options)
127
+ end
128
+
129
+ it 'sets up validation' do
130
+ expect(has_many_left_class).to receive(:validates_associated).with(name).and_call_original
131
+ association.setup!
132
+ end
133
+ end
134
+
135
+ context 'when the :validate option is false' do
136
+
137
+ let(:options) do
138
+ {
139
+ validate: false
140
+ }
141
+ end
142
+
143
+ it 'does not set up validation' do
144
+ expect(has_many_left_class).not_to receive(:validates_associated)
145
+ association.setup!
146
+ end
147
+ end
148
+
149
+ context 'when the :validate option is not provided' do
150
+
151
+ let(:association) do
152
+ # Note that it is necessary to create the association directly, otherwise the
153
+ # setup! method will be called by the :has_many macro
154
+ described_class.new(has_many_left_class, name, options)
155
+ end
156
+
157
+ it 'sets up the validation because it uses the validation default (true)' do
158
+ expect(has_many_left_class).to receive(:validates_associated).with(name).and_call_original
159
+ association.setup!
160
+ end
161
+ end
162
+
163
+ context 'foreign key field' do
164
+
165
+ before do
166
+ association
167
+ end
168
+
169
+ it 'sets up the foreign key field' do
170
+ expect(has_many_left_class.fields.keys).to include(association.foreign_key)
171
+ end
172
+ end
173
+
174
+ context 'index' do
175
+
176
+ before do
177
+ association
178
+ end
179
+
180
+ context 'when index is true' do
181
+
182
+ let(:options) do
183
+ {
184
+ index: true
185
+ }
186
+ end
187
+
188
+ it 'sets up the index with the key' do
189
+ expect(has_many_left_class.index_specifications.first.fields).to match_array([association.key.to_sym])
190
+ end
191
+ end
192
+
193
+ context 'when index is false' do
194
+
195
+
196
+ it 'does not set up an index' do
197
+ expect(has_many_left_class.index_specifications).to eq([])
198
+ end
199
+ end
200
+ end
201
+
202
+ context 'dependent' do
203
+
204
+ context 'when the dependent option is provided' do
205
+
206
+ context 'when the dependent option is :delete_all' do
207
+
208
+ let(:options) do
209
+ {
210
+ dependent: :delete_all
211
+ }
212
+ end
213
+
214
+ let(:association) do
215
+ # Note that it is necessary to create the association directly, otherwise the
216
+ # setup! method will be called by the :belongs_to macro
217
+ described_class.new(has_many_left_class, name, options)
218
+ end
219
+
220
+ it 'sets up the dependency' do
221
+ expect(Mongoid::Association::Depending).to receive(:define_dependency!)
222
+ association.setup!
223
+ end
224
+ end
225
+
226
+ context 'when the dependent option is :destroy' do
227
+
228
+ let(:options) do
229
+ {
230
+ dependent: :destroy
231
+ }
232
+ end
233
+
234
+ let(:association) do
235
+ # Note that it is necessary to create the association directly, otherwise the
236
+ # setup! method will be called by the :belongs_to macro
237
+ described_class.new(has_many_left_class, name, options)
238
+ end
239
+
240
+ it 'sets up the dependency' do
241
+ expect(Mongoid::Association::Depending).to receive(:define_dependency!)
242
+ association.setup!
243
+ end
244
+ end
245
+
246
+ context 'when the dependent option is :nullify' do
247
+
248
+ let(:options) do
249
+ {
250
+ dependent: :nullify
251
+ }
252
+ end
253
+
254
+ let(:association) do
255
+ # Note that it is necessary to create the association directly, otherwise the
256
+ # setup! method will be called by the :belongs_to macro
257
+ described_class.new(has_many_left_class, name, options)
258
+ end
259
+
260
+ it 'sets up the dependency' do
261
+ expect(Mongoid::Association::Depending).to receive(:define_dependency!)
262
+ association.setup!
263
+ end
264
+ end
265
+
266
+ context 'when the dependent option is :restrict_with_exception' do
267
+
268
+ let(:options) do
269
+ {
270
+ dependent: :restrict_with_exception
271
+ }
272
+ end
273
+
274
+ let(:association) do
275
+ # Note that it is necessary to create the association directly, otherwise the
276
+ # setup! method will be called by the :belongs_to macro
277
+ described_class.new(has_many_left_class, name, options)
278
+ end
279
+
280
+ it 'sets up the dependency' do
281
+ expect(Mongoid::Association::Depending).to receive(:define_dependency!)
282
+ association.setup!
283
+ end
284
+ end
285
+
286
+ context 'when the dependent option is :restrict_with_error' do
287
+
288
+ let(:options) do
289
+ {
290
+ dependent: :restrict_with_error
291
+ }
292
+ end
293
+
294
+ let(:association) do
295
+ # Note that it is necessary to create the association directly, otherwise the
296
+ # setup! method will be called by the :belongs_to macro
297
+ described_class.new(has_many_left_class, name, options)
298
+ end
299
+
300
+ it 'sets up the dependency' do
301
+ expect(Mongoid::Association::Depending).to receive(:define_dependency!)
302
+ association.setup!
303
+ end
304
+ end
305
+ end
306
+
307
+ context 'when the dependent option is not provided' do
308
+
309
+ it 'does not set up the dependency' do
310
+ expect(Mongoid::Association::Depending).not_to receive(:define_dependency!)
311
+ association.setup!
312
+ end
313
+ end
314
+ end
315
+ end
316
+
317
+ describe '#type' do
318
+
319
+ it 'returns nil' do
320
+ expect(association.type).to be_nil
321
+ end
322
+ end
323
+
324
+ describe '#inverse_type' do
325
+
326
+ it 'returns nil' do
327
+ expect(association.inverse_type).to be_nil
328
+ end
329
+ end
330
+
331
+ describe '#inverse_type_setter' do
332
+
333
+ it 'returns nil' do
334
+ expect(association.inverse_type_setter).to be_nil
335
+ end
336
+ end
337
+
338
+ describe '#foreign_key' do
339
+
340
+ context 'when options has foreign_key specified' do
341
+
342
+ let(:options) do
343
+ { foreign_key: :other_object_id }
344
+ end
345
+
346
+ it 'raises returns the foreign key as a String' do
347
+ expect(association.foreign_key).to eq(options[:foreign_key].to_s)
348
+ end
349
+ end
350
+
351
+ context 'when options does not have foreign_key specified' do
352
+
353
+ it 'returns the default foreign key, the name of the inverse followed by "_ids"' do
354
+ expect(association.foreign_key).to eq("#{name.to_s.singularize}_ids")
355
+ end
356
+ end
357
+ end
358
+
359
+ describe '#embedded?' do
360
+
361
+ it 'returns false' do
362
+ expect(association.embedded?).to be(false)
363
+ end
364
+ end
365
+
366
+ describe '#primary_key' do
367
+
368
+ context 'when the :primary_key option is specified' do
369
+
370
+ let(:options) do
371
+ {
372
+ primary_key: 'guid'
373
+ }
374
+ end
375
+
376
+ it 'returns the primary_key' do
377
+ expect(association.primary_key).to eq(options[:primary_key])
378
+ end
379
+ end
380
+
381
+ context 'when the :primary_key option is not specified' do
382
+
383
+ it 'returns the primary_key default' do
384
+ expect(association.primary_key).to eq(Mongoid::Association::Relatable::PRIMARY_KEY_DEFAULT)
385
+ end
386
+ end
387
+ end
388
+
389
+ describe '#indexed?' do
390
+
391
+ context 'when :index is specified in the options' do
392
+
393
+ context 'when :index is true' do
394
+
395
+ let(:options) do
396
+ {
397
+ index: true
398
+ }
399
+ end
400
+
401
+ it 'returns true' do
402
+ expect(association.indexed?).to be(true)
403
+ end
404
+ end
405
+
406
+ context 'when :index is false' do
407
+
408
+ let(:options) do
409
+ {
410
+ index: false
411
+ }
412
+ end
413
+
414
+ it 'returns false' do
415
+ expect(association.indexed?).to be(false)
416
+ end
417
+ end
418
+ end
419
+
420
+ context 'when :index is not specified in the options' do
421
+
422
+ it 'returns nil' do
423
+ expect(association.indexed?).to be(false)
424
+ end
425
+ end
426
+ end
427
+
428
+ describe '#relation' do
429
+
430
+ it 'returns Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy' do
431
+ expect(association.relation).to be(Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy)
432
+ end
433
+ end
434
+
435
+ describe '#validation_default' do
436
+
437
+ it 'returns true' do
438
+ expect(association.validation_default).to be(true)
439
+ end
440
+ end
441
+
442
+ describe '#name' do
443
+
444
+ it 'returns the name of the relation' do
445
+ expect(association.name).to be(name)
446
+ end
447
+ end
448
+
449
+ describe '#options' do
450
+
451
+ it 'returns the options' do
452
+ expect(association.options).to be(options)
453
+ end
454
+ end
455
+
456
+ describe '#merge!' do
457
+
458
+ end
459
+
460
+ describe '#store_as' do
461
+
462
+ it 'returns nil' do
463
+ expect(association.store_as).to be_nil
464
+ end
465
+ end
466
+
467
+ describe '#touchable?' do
468
+
469
+ it 'return false' do
470
+ expect(association.send(:touchable?)).to be(false)
471
+ end
472
+ end
473
+
474
+ describe '#order' do
475
+
476
+ context 'when order is specified in the options' do
477
+
478
+ let(:options) do
479
+ {
480
+ order: :rating.desc
481
+ }
482
+ end
483
+
484
+ it 'returns a Criteria Queryable Key' do
485
+ expect(association.order).to be_a(Mongoid::Criteria::Queryable::Key)
486
+ end
487
+ end
488
+
489
+ context 'when order is not specified in the options' do
490
+
491
+ it 'returns nil' do
492
+ expect(association.order).to be_nil
493
+ end
494
+ end
495
+ end
496
+
497
+ describe '#as' do
498
+
499
+ it 'returns nil' do
500
+ expect(association.as).to be_nil
501
+ end
502
+ end
503
+
504
+ describe '#polymorphic?' do
505
+
506
+ it 'returns false' do
507
+ expect(association.polymorphic?).to be(false)
508
+ end
509
+ end
510
+
511
+ describe '#type_setter' do
512
+
513
+ it 'returns nil' do
514
+ expect(association.type).to be_nil
515
+ end
516
+ end
517
+
518
+ describe '#dependent' do
519
+
520
+ it 'returns nil' do
521
+ expect(association.dependent).to be_nil
522
+ end
523
+ end
524
+
525
+ describe '#bindable?' do
526
+
527
+ it 'returns false' do
528
+ expect(association.bindable?(Person.new)).to be(false)
529
+ end
530
+ end
531
+
532
+ describe '#inverses' do
533
+
534
+ before do
535
+ HasManyRightObject.has_and_belongs_to_many :has_many_left_objects
536
+ end
537
+
538
+ context 'when inverse_of is specified' do
539
+
540
+ before do
541
+ options.merge!(inverse_of: :inverse_name)
542
+ end
543
+
544
+ it 'returns the :inverse_of value' do
545
+ expect(association.inverses).to eq([:inverse_name])
546
+ end
547
+ end
548
+
549
+ context 'when inverse_of is not specified' do
550
+
551
+ it 'uses the inverse class to find the inverse name' do
552
+ expect(association.inverses).to eq([:has_many_left_objects])
553
+ end
554
+ end
555
+
556
+ context 'when :cyclic is specified' do
557
+
558
+ it 'returns the cyclic inverse name' do
559
+
560
+ end
561
+ end
562
+ end
563
+
564
+ describe '##inverse' do
565
+
566
+ before do
567
+ HasManyRightObject.has_and_belongs_to_many :has_many_left_objects
568
+ end
569
+
570
+ context 'when inverse_of is specified' do
571
+
572
+ before do
573
+ options.merge!(inverse_of: :inverse_name)
574
+ end
575
+
576
+ it 'returns the :inverse_of value' do
577
+ expect(association.inverse).to eq(:inverse_name)
578
+ end
579
+ end
580
+
581
+ context 'when inverse_of is not specified' do
582
+
583
+ it 'uses the inverse class to find the inverse name' do
584
+ expect(association.inverse).to eq(:has_many_left_objects)
585
+ end
586
+ end
587
+
588
+ context 'when :cyclic is specified' do
589
+
590
+ it 'returns the cyclic inverse name' do
591
+
592
+ end
593
+ end
594
+ end
595
+
596
+ describe '#inverse_association' do
597
+
598
+ end
599
+
600
+ describe '#autosave' do
601
+
602
+ context 'when the autosave option is specified' do
603
+
604
+ context 'when the autosave option is true' do
605
+
606
+ let(:options) do
607
+ {
608
+ autosave: true
609
+ }
610
+ end
611
+
612
+ it 'returns true' do
613
+ expect(association.autosave).to be(true)
614
+ end
615
+ end
616
+
617
+ context 'when the autosave option is false' do
618
+
619
+ let(:options) do
620
+ {
621
+ autosave: false
622
+ }
623
+ end
624
+
625
+ it 'returns false' do
626
+ expect(association.autosave).to be(false)
627
+ end
628
+ end
629
+ end
630
+
631
+ context 'when the autosave option is not specified' do
632
+
633
+ it 'returns false' do
634
+ expect(association.autosave).to be(false)
635
+ end
636
+ end
637
+ end
638
+
639
+ describe '#relation_class_name' do
640
+
641
+ context 'when the :class_name option is specified' do
642
+
643
+ let(:options) do
644
+ { class_name: 'OtherHasManyRightObject' }
645
+ end
646
+
647
+ it 'returns the class name option' do
648
+ expect(association.relation_class_name).to eq('OtherHasManyRightObject')
649
+ end
650
+ end
651
+
652
+ context 'when the class_name option is not specified' do
653
+
654
+ it 'uses the name of the relation to deduce the class name' do
655
+ expect(association.relation_class_name).to eq('HasManyRightObject')
656
+ end
657
+ end
658
+ end
659
+
660
+ describe '#relation_class' do
661
+
662
+ context 'when the :class_name option is specified' do
663
+
664
+ let!(:_class) do
665
+ class OtherHasManyRightObject; end
666
+ OtherHasManyRightObject
667
+ end
668
+
669
+ let(:options) do
670
+ { class_name: 'OtherHasManyRightObject' }
671
+ end
672
+
673
+ it 'returns the class name option' do
674
+ expect(association.relation_class).to eq(_class)
675
+ end
676
+ end
677
+
678
+ context 'when the class_name option is not specified' do
679
+
680
+ it 'uses the name of the relation to deduce the class name' do
681
+ expect(association.relation_class).to eq(HasManyRightObject)
682
+ end
683
+ end
684
+ end
685
+
686
+ describe '#inverse_class_name' do
687
+
688
+ it 'returns the name of the owner class' do
689
+ expect(association.inverse_class_name).to eq(HasManyLeftObject.name)
690
+ end
691
+ end
692
+
693
+ describe '#inverse_class' do
694
+
695
+ it 'returns the owner class' do
696
+ expect(association.inverse_class).to be(HasManyLeftObject)
697
+ end
698
+ end
699
+
700
+ describe '#inverse_of' do
701
+
702
+ context 'when :inverse_of is specified in the options' do
703
+
704
+ let(:options) do
705
+ { inverse_of: :a_has_many_left_object }
706
+ end
707
+
708
+ it 'returns the inverse_of value' do
709
+ expect(association.inverse_of).to eq(options[:inverse_of])
710
+ end
711
+ end
712
+
713
+ context 'when :inverse_of is not specified in the options' do
714
+
715
+ it 'returns nil' do
716
+ expect(association.inverse_of).to be_nil
717
+ end
718
+ end
719
+ end
720
+
721
+ # describe '#key' do
722
+ #
723
+ # it 'returns the primary key' do
724
+ # expect(association.key).to eq(association.primary_key)
725
+ # end
726
+ # end
727
+
728
+ describe '#setter' do
729
+
730
+ it 'returns a string of the name followed by =' do
731
+ expect(association.setter).to eq("#{name}=")
732
+ end
733
+ end
734
+
735
+ describe '#validate?' do
736
+
737
+ context 'when :validate is specified in the options' do
738
+
739
+ context 'when validate is true' do
740
+
741
+ let(:options) do
742
+ { validate: true }
743
+ end
744
+
745
+ it 'returns true' do
746
+ expect(association.send(:validate?)).to be(true)
747
+ end
748
+ end
749
+
750
+ context 'when validate is false' do
751
+
752
+ let(:options) do
753
+ { validate: false }
754
+ end
755
+
756
+ it 'returns false' do
757
+ expect(association.send(:validate?)).to be(false)
758
+ end
759
+ end
760
+ end
761
+
762
+ context 'when :validate is not specified in the options' do
763
+
764
+ it 'returns the validation_default' do
765
+ expect(association.send(:validate?)).to eq(association.validation_default)
766
+ end
767
+ end
768
+ end
769
+
770
+ describe '#forced_nil_inverse?' do
771
+
772
+ context 'when inverse_of is specified in the options' do
773
+
774
+ context 'when :inverse_of is nil' do
775
+
776
+ let(:options) do
777
+ {
778
+ inverse_of: nil
779
+ }
780
+ end
781
+
782
+ it 'returns true' do
783
+ expect(association.forced_nil_inverse?).to be(true)
784
+ end
785
+ end
786
+
787
+ context 'when :inverse_of is a symbol' do
788
+
789
+ let(:options) do
790
+ {
791
+ inverse_of: :inverse_name
792
+ }
793
+ end
794
+
795
+ it 'returns false' do
796
+ expect(association.forced_nil_inverse?).to be(false)
797
+ end
798
+ end
799
+
800
+ context 'when :inverse_of is false' do
801
+
802
+ let(:options) do
803
+ {
804
+ inverse_of: false
805
+ }
806
+ end
807
+
808
+ it 'returns true' do
809
+ expect(association.forced_nil_inverse?).to be(true)
810
+ end
811
+ end
812
+ end
813
+
814
+ context 'when :inverse_of is not specified in the options' do
815
+
816
+ it 'returns false' do
817
+ expect(association.forced_nil_inverse?).to be(false)
818
+ end
819
+ end
820
+ end
821
+
822
+ describe '#stores_foreign_key?' do
823
+
824
+ it 'returns false' do
825
+ expect(association.stores_foreign_key?).to be(true)
826
+ end
827
+ end
828
+
829
+ describe '#inverse_setter' do
830
+
831
+ context 'when an inverse can be determined' do
832
+
833
+ before do
834
+ HasManyRightObject.has_and_belongs_to_many :has_many_left_objects
835
+ end
836
+
837
+ it 'returns the name of the inverse followed by =' do
838
+ expect(association.inverse_setter).to eq('has_many_left_objects=')
839
+ end
840
+ end
841
+
842
+ context 'when an inverse cannot be determined' do
843
+
844
+ it 'returns nil' do
845
+ expect(association.inverse_setter).to be_nil
846
+ end
847
+ end
848
+ end
849
+
850
+ describe '#extension' do
851
+
852
+ context 'when a block is passed' do
853
+
854
+ let(:association) do
855
+ has_many_left_class.has_and_belongs_to_many name, options do; end
856
+ end
857
+
858
+ it 'defines an extension module' do
859
+ expect(association.extension).to be_a(Module)
860
+ end
861
+
862
+ it 'returns the extension' do
863
+ expect(association.extension).to eq(
864
+ "#{has_many_left_class.name}::#{has_many_left_class.name}#{name.to_s.camelize}RelationExtension".constantize)
865
+ end
866
+ end
867
+
868
+ context 'when an :extension is not specified in the options' do
869
+
870
+ it 'returns false' do
871
+ expect(association.extension).to be_nil
872
+ end
873
+ end
874
+ end
875
+
876
+ describe '#foreign_key_setter' do
877
+
878
+ it 'returns the foreign key followed by "="' do
879
+ expect(association.foreign_key_setter).to eq("#{association.foreign_key}=")
880
+ end
881
+ end
882
+
883
+ describe '#criteria' do
884
+
885
+ it 'returns a criteria object' do
886
+ expect(association.criteria(BSON::ObjectId.new, HasManyLeftObject)).to be_a(Mongoid::Criteria)
887
+ end
888
+ end
889
+
890
+ describe '#destructive?' do
891
+
892
+ context 'when the dependent option is provided' do
893
+
894
+ context 'when the dependent option is :delete_all' do
895
+
896
+ let(:options) do
897
+ {
898
+ dependent: :delete_all
899
+ }
900
+ end
901
+
902
+ it 'returns true' do
903
+ expect(association.destructive?).to be(true)
904
+ end
905
+ end
906
+
907
+ context 'when the dependent option is :destroy' do
908
+
909
+ let(:options) do
910
+ {
911
+ dependent: :destroy
912
+ }
913
+ end
914
+
915
+ it 'returns true' do
916
+ expect(association.destructive?).to be(true)
917
+ end
918
+ end
919
+
920
+ context 'when the dependent option is :nullify' do
921
+
922
+ let(:options) do
923
+ {
924
+ dependent: :nullify
925
+ }
926
+ end
927
+
928
+ it 'returns false' do
929
+ expect(association.destructive?).to be(false)
930
+ end
931
+ end
932
+
933
+ context 'when the dependent option is :restrict_with_exception' do
934
+
935
+ let(:options) do
936
+ {
937
+ dependent: :restrict_with_exception
938
+ }
939
+ end
940
+
941
+ it 'returns false' do
942
+ expect(association.destructive?).to be(false)
943
+ end
944
+ end
945
+
946
+ context 'when the dependent option is :restrict_with_error' do
947
+
948
+ let(:options) do
949
+ {
950
+ dependent: :restrict_with_error
951
+ }
952
+ end
953
+
954
+ it 'returns false' do
955
+ expect(association.destructive?).to be(false)
956
+ end
957
+ end
958
+ end
959
+
960
+ context 'when the dependent option is not provided' do
961
+
962
+ it 'returns false' do
963
+ expect(association.destructive?).to be(false)
964
+ end
965
+ end
966
+ end
967
+
968
+ describe '#nested_builder' do
969
+
970
+ it 'returns an instance of Association::Nested::Many' do
971
+ expect(association.nested_builder({}, {})).to be_a(Mongoid::Association::Nested::Many)
972
+ end
973
+ end
974
+
975
+ describe '#cascading_callbacks?' do
976
+
977
+ it 'returns false' do
978
+ expect(association.cascading_callbacks?).to be(false)
979
+ end
980
+ end
981
+
982
+ describe '#path' do
983
+
984
+ it 'returns an instance of Mongoid::Atomic::Paths::Root' do
985
+ expect(association.path(double)).to be_a(Mongoid::Atomic::Paths::Root)
986
+ end
987
+ end
988
+
989
+ describe '#foreign_key_check' do
990
+
991
+ it 'returns the foreign_key followed by "_changed?"' do
992
+ expect(association.foreign_key_check).to eq('has_many_right_object_ids_changed?')
993
+ end
994
+ end
995
+
996
+ describe '#create_relation' do
997
+
998
+ let(:left_object) do
999
+ HasManyLeftObject.new
1000
+ end
1001
+
1002
+ let(:target) do
1003
+ [ HasManyRightObject.new ]
1004
+ end
1005
+
1006
+ before do
1007
+ association
1008
+ HasManyRightObject.has_and_belongs_to_many :has_many_left_objects
1009
+ end
1010
+
1011
+ it 'returns an the target' do
1012
+ expect(Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy).to receive(:new).and_call_original
1013
+ expect(association.create_relation(left_object, target)).to be_a(Array)
1014
+ end
1015
+ end
1016
+
1017
+ describe '#inverse_foreign_key' do
1018
+
1019
+ it 'returns generated key' do
1020
+ expect(association.inverse_foreign_key).to eq('has_many_left_object_ids')
1021
+ end
1022
+
1023
+ context 'with inverse given' do
1024
+ let(:options) do
1025
+ { inverse_of: 'foo' }
1026
+ end
1027
+
1028
+ it 'returns configured key' do
1029
+ expect(association.inverse_foreign_key).to eq('foo_ids')
1030
+ end
1031
+ end
1032
+
1033
+ context 'with primary_key and foreign_key given' do
1034
+ let(:options) do
1035
+ { primary_key: 'foo', foreign_key: 'foo_ref',
1036
+ inverse_primary_key: 'bar', inverse_foreign_key: 'bar_ref' }
1037
+ end
1038
+
1039
+ it 'returns configured key' do
1040
+ expect(association.inverse_foreign_key).to eq('bar_ref')
1041
+ end
1042
+ end
1043
+ end
1044
+
1045
+ describe '#inverse_foreign_key_setter' do
1046
+
1047
+ it 'returns generated method name' do
1048
+ expect(association.inverse_foreign_key_setter).to eq('has_many_left_object_ids=')
1049
+ end
1050
+ end
1051
+ end